@@ -3906,6 +3906,15 @@ static int zend_jit_load_var(dasm_State **Dst, uint32_t info, int var, zend_reg
3906
3906
return zend_jit_load_reg(Dst, src, dst, info);
3907
3907
}
3908
3908
3909
+ static int zend_jit_invalidate_var_if_necessary(dasm_State **Dst, zend_uchar op_type, zend_jit_addr addr, znode_op op)
3910
+ {
3911
+ if ((op_type & (IS_TMP_VAR|IS_VAR)) && Z_MODE(addr) == IS_REG && !Z_LOAD(addr) && !Z_STORE(addr)) {
3912
+ zend_jit_addr dst = ZEND_ADDR_MEM_ZVAL(ZREG_FP, op.var);
3913
+ | SET_ZVAL_TYPE_INFO dst, IS_UNDEF
3914
+ }
3915
+ return 1;
3916
+ }
3917
+
3909
3918
static int zend_jit_update_regs(dasm_State **Dst, uint32_t var, zend_jit_addr src, zend_jit_addr dst, uint32_t info)
3910
3919
{
3911
3920
if (!zend_jit_same_addr(src, dst)) {
@@ -5024,6 +5033,8 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
5024
5033
if (EXPECTED(op2_lval > 0)) {
5025
5034
| xor Ra(result_reg), Ra(result_reg)
5026
5035
} else {
5036
+ zend_jit_invalidate_var_if_necessary(Dst, op1_type, op1_addr, op1);
5037
+ zend_jit_invalidate_var_if_necessary(Dst, op2_type, op2_addr, op2);
5027
5038
| SET_EX_OPLINE opline, r0
5028
5039
| jmp ->negative_shift
5029
5040
}
@@ -5047,6 +5058,8 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
5047
5058
| cmp r1, 0
5048
5059
| mov Ra(result_reg), 0
5049
5060
| jg >1
5061
+ zend_jit_invalidate_var_if_necessary(Dst, op1_type, op1_addr, op1);
5062
+ zend_jit_invalidate_var_if_necessary(Dst, op2_type, op2_addr, op2);
5050
5063
| SET_EX_OPLINE opline, r0
5051
5064
| jmp ->negative_shift
5052
5065
|.code
@@ -5064,6 +5077,8 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
5064
5077
if (EXPECTED(op2_lval > 0)) {
5065
5078
| sar Ra(result_reg), (SIZEOF_ZEND_LONG * 8) - 1
5066
5079
} else {
5080
+ zend_jit_invalidate_var_if_necessary(Dst, op1_type, op1_addr, op1);
5081
+ zend_jit_invalidate_var_if_necessary(Dst, op2_type, op2_addr, op2);
5067
5082
| SET_EX_OPLINE opline, r0
5068
5083
| jmp ->negative_shift
5069
5084
}
@@ -5084,6 +5099,8 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
5084
5099
| cmp r1, 0
5085
5100
| mov r1, (SIZEOF_ZEND_LONG * 8) - 1
5086
5101
| jg >1
5102
+ zend_jit_invalidate_var_if_necessary(Dst, op1_type, op1_addr, op1);
5103
+ zend_jit_invalidate_var_if_necessary(Dst, op2_type, op2_addr, op2);
5087
5104
| SET_EX_OPLINE opline, r0
5088
5105
| jmp ->negative_shift
5089
5106
|.code
@@ -5096,6 +5113,8 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
5096
5113
zend_long op2_lval = Z_LVAL_P(Z_ZV(op2_addr));
5097
5114
5098
5115
if (op2_lval == 0) {
5116
+ zend_jit_invalidate_var_if_necessary(Dst, op1_type, op1_addr, op1);
5117
+ zend_jit_invalidate_var_if_necessary(Dst, op2_type, op2_addr, op2);
5099
5118
| SET_EX_OPLINE opline, r0
5100
5119
| jmp ->mod_by_zero
5101
5120
} else if (zend_long_is_power_of_two(op2_lval) && op1_range && op1_range->min >= 0) {
@@ -5135,6 +5154,8 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
5135
5154
| jz >1
5136
5155
|.cold_code
5137
5156
|1:
5157
+ zend_jit_invalidate_var_if_necessary(Dst, op1_type, op1_addr, op1);
5158
+ zend_jit_invalidate_var_if_necessary(Dst, op2_type, op2_addr, op2);
5138
5159
| SET_EX_OPLINE opline, r0
5139
5160
| jmp ->mod_by_zero
5140
5161
|.code
0 commit comments