Skip to content

Commit b0e7706

Browse files
committed
Fixed JIT for BINARY_OP with expected overflow
1 parent fbf153a commit b0e7706

File tree

1 file changed

+25
-10
lines changed

1 file changed

+25
-10
lines changed

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4185,7 +4185,7 @@ static int zend_jit_math_long_long(dasm_State **Dst,
41854185
zend_bool same_ops = zend_jit_same_addr(op1_addr, op2_addr);
41864186
zend_reg result_reg;
41874187

4188-
if (Z_MODE(res_addr) == IS_REG) {
4188+
if (Z_MODE(res_addr) == IS_REG && (res_info & MAY_BE_LONG)) {
41894189
result_reg = Z_REG(res_addr);
41904190
} else if (Z_MODE(op1_addr) == IS_REG && Z_LAST_USE(op1_addr)) {
41914191
result_reg = Z_REG(op1_addr);
@@ -4255,13 +4255,23 @@ static int zend_jit_math_long_long(dasm_State **Dst,
42554255
if (res_info & MAY_BE_GUARD) {
42564256
int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0);
42574257
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
4258-
| jo &exit_addr
4258+
if ((res_info & MAY_BE_ANY) == MAY_BE_LONG) {
4259+
| jo &exit_addr
4260+
} else if ((res_info & MAY_BE_ANY) == MAY_BE_DOUBLE) {
4261+
| jno &exit_addr
4262+
} else {
4263+
ZEND_UNREACHABLE();
4264+
}
42594265
} else {
4260-
| jo >1
4266+
if (res_info & MAY_BE_LONG) {
4267+
| jo >1
4268+
} else {
4269+
| jno >1
4270+
}
42614271
}
42624272
}
42634273

4264-
if (Z_MODE(res_addr) == IS_MEM_ZVAL) {
4274+
if (Z_MODE(res_addr) == IS_MEM_ZVAL && (res_info & MAY_BE_LONG)) {
42654275
| SET_ZVAL_LVAL res_addr, Ra(result_reg)
42664276
if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != Z_REG(res_addr) || Z_OFFSET(op1_addr) != Z_OFFSET(res_addr)) {
42674277
if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF|MAY_BE_GUARD)) != MAY_BE_LONG) {
@@ -4270,12 +4280,14 @@ static int zend_jit_math_long_long(dasm_State **Dst,
42704280
}
42714281
}
42724282

4273-
if (may_overflow && !(res_info & MAY_BE_GUARD)) {
4283+
if (may_overflow && (!(res_info & MAY_BE_GUARD) || (res_info & MAY_BE_ANY) == MAY_BE_DOUBLE)) {
42744284
zend_reg tmp_reg1 = ZREG_XMM0;
42754285
zend_reg tmp_reg2 = ZREG_XMM1;
42764286

4277-
|.cold_code
4278-
|1:
4287+
if (res_info & MAY_BE_LONG) {
4288+
|.cold_code
4289+
|1:
4290+
}
42794291

42804292
do {
42814293
if ((Z_MODE(op1_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op1_addr)) == 1) ||
@@ -4311,11 +4323,14 @@ static int zend_jit_math_long_long(dasm_State **Dst,
43114323
| SSE_SET_ZVAL_DVAL res_addr, tmp_reg1
43124324
} while (0);
43134325

4314-
if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF|MAY_BE_GUARD)) != MAY_BE_DOUBLE) {
4326+
if (Z_MODE(res_addr) == IS_MEM_ZVAL
4327+
&& (res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF|MAY_BE_GUARD)) != MAY_BE_DOUBLE) {
43154328
| SET_ZVAL_TYPE_INFO res_addr, IS_DOUBLE
43164329
}
4317-
| jmp >2
4318-
|.code
4330+
if (res_info & MAY_BE_LONG) {
4331+
| jmp >2
4332+
|.code
4333+
}
43194334
|2:
43204335
}
43214336

0 commit comments

Comments
 (0)