@@ -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 )
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