diff --git a/ext/opcache/jit/zend_jit_ir.c b/ext/opcache/jit/zend_jit_ir.c index 92a068dbfaca..8111c18f9c1e 100644 --- a/ext/opcache/jit/zend_jit_ir.c +++ b/ext/opcache/jit/zend_jit_ir.c @@ -5926,6 +5926,9 @@ static int zend_jit_long_math_helper(zend_jit_ctx *jit, if (Z_MODE(res_addr) == IS_REG) { ref = ir_CONST_LONG(0); // dead code } + } else if (op2_lval == -1) { + /* Prevent overflow error/crash if op1 == LONG_MIN */ + ref = ir_CONST_LONG(0); } else if (zend_long_is_power_of_two(op2_lval) && op1_range && op1_range->min >= 0) { ref = ir_AND_L(jit_Z_LVAL(jit, op1_addr), ir_CONST_LONG(op2_lval - 1)); } else { diff --git a/ext/opcache/tests/jit/mod_002.phpt b/ext/opcache/tests/jit/mod_002.phpt index b1d163b94d5f..10dcae8440bc 100644 --- a/ext/opcache/tests/jit/mod_002.phpt +++ b/ext/opcache/tests/jit/mod_002.phpt @@ -32,6 +32,7 @@ var_dump(modNeg33(125)); var_dump(modNeg33(-125)); try { var_dump(modNeg1(125)); + var_dump(modNeg1(PHP_INT_MIN)); } catch (Throwable $e) { echo "Exception " . $e->getMessage() . "\n"; } @@ -49,4 +50,5 @@ int(-29) int(26) int(-26) int(0) +int(0) Exception (DivisionByZeroError): Modulo by zero