Skip to content

Commit 41efd21

Browse files
[mypyc] feat: support constant folding in try_optimize_int_floor_divide (#19973)
This PR attempts to constant fold the divisor value in `try_optimize_int_floor_divide` I'm not sure any test changes are warranted for a small PR of this nature.
1 parent baabf49 commit 41efd21

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

mypyc/irbuild/expression.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,7 @@ def transform_op_expr(builder: IRBuilder, expr: OpExpr) -> Value:
558558
# Special case some int ops to allow borrowing operands.
559559
if is_int_rprimitive(ltype) and is_int_rprimitive(rtype):
560560
if expr.op == "//":
561-
expr = try_optimize_int_floor_divide(expr)
561+
expr = try_optimize_int_floor_divide(builder, expr)
562562
if expr.op in int_borrow_friendly_op:
563563
borrow_left = is_borrow_friendly_expr(builder, expr.right)
564564
borrow_right = True
@@ -571,11 +571,11 @@ def transform_op_expr(builder: IRBuilder, expr: OpExpr) -> Value:
571571
return builder.binary_op(left, right, expr.op, expr.line)
572572

573573

574-
def try_optimize_int_floor_divide(expr: OpExpr) -> OpExpr:
574+
def try_optimize_int_floor_divide(builder: IRBuilder, expr: OpExpr) -> OpExpr:
575575
"""Replace // with a power of two with a right shift, if possible."""
576-
if not isinstance(expr.right, IntExpr):
576+
divisor = constant_fold_expr(builder, expr.right)
577+
if not isinstance(divisor, int):
577578
return expr
578-
divisor = expr.right.value
579579
shift = divisor.bit_length() - 1
580580
if 0 < shift < 28 and divisor == (1 << shift):
581581
return OpExpr(">>", expr.left, IntExpr(shift))

0 commit comments

Comments
 (0)