@@ -4383,18 +4383,18 @@ static int zend_jit_inc_dec(zend_jit_ctx *jit, const zend_op *opline, uint32_t o
4383
4383
old_op1_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var));
4384
4384
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op1.var), IS_DOUBLE, 0);
4385
4385
if (opline->opcode == ZEND_PRE_INC || opline->opcode == ZEND_POST_INC) {
4386
- SET_STACK_REF(stack, EX_VAR_TO_NUM(opline->op1.var), ir_CONST_DOUBLE(ZEND_LONG_MAX + 1.0));
4386
+ SET_STACK_REF(stack, EX_VAR_TO_NUM(opline->op1.var), ir_CONST_DOUBLE((double) ZEND_LONG_MAX + 1.0));
4387
4387
} else {
4388
- SET_STACK_REF(stack, EX_VAR_TO_NUM(opline->op1.var), ir_CONST_DOUBLE(ZEND_LONG_MIN - 1.0));
4388
+ SET_STACK_REF(stack, EX_VAR_TO_NUM(opline->op1.var), ir_CONST_DOUBLE((double) ZEND_LONG_MIN - 1.0));
4389
4389
}
4390
4390
if (opline->result_type != IS_UNUSED) {
4391
4391
old_res_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var));
4392
4392
if (opline->opcode == ZEND_PRE_INC) {
4393
4393
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_DOUBLE, 0);
4394
- SET_STACK_REF(stack, EX_VAR_TO_NUM(opline->result.var), ir_CONST_DOUBLE(ZEND_LONG_MAX + 1.0));
4394
+ SET_STACK_REF(stack, EX_VAR_TO_NUM(opline->result.var), ir_CONST_DOUBLE((double) ZEND_LONG_MAX + 1.0));
4395
4395
} else if (opline->opcode == ZEND_PRE_DEC) {
4396
4396
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_DOUBLE, 0);
4397
- SET_STACK_REF(stack, EX_VAR_TO_NUM(opline->result.var), ir_CONST_DOUBLE(ZEND_LONG_MIN - 1.0));
4397
+ SET_STACK_REF(stack, EX_VAR_TO_NUM(opline->result.var), ir_CONST_DOUBLE((double) ZEND_LONG_MIN - 1.0));
4398
4398
} else if (opline->opcode == ZEND_POST_INC) {
4399
4399
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_LONG, 0);
4400
4400
SET_STACK_REF(stack, EX_VAR_TO_NUM(opline->result.var), ir_CONST_LONG(ZEND_LONG_MAX));
@@ -4697,14 +4697,14 @@ static int zend_jit_math_long_long(zend_jit_ctx *jit,
4697
4697
&& Z_MODE(op2_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op2_addr)) == 1) {
4698
4698
old_res_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var));
4699
4699
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_DOUBLE, 0);
4700
- SET_STACK_REF(stack, EX_VAR_TO_NUM(opline->result.var), ir_CONST_DOUBLE(ZEND_LONG_MAX + 1.0));
4700
+ SET_STACK_REF(stack, EX_VAR_TO_NUM(opline->result.var), ir_CONST_DOUBLE((double) ZEND_LONG_MAX + 1.0));
4701
4701
exit_point = zend_jit_trace_get_exit_point(opline + 1, 0);
4702
4702
SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var), old_res_info);
4703
4703
} else if (opline->opcode == ZEND_SUB
4704
4704
&& Z_MODE(op2_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op2_addr)) == 1) {
4705
4705
old_res_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var));
4706
4706
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_DOUBLE, 0);
4707
- SET_STACK_REF(stack, EX_VAR_TO_NUM(opline->result.var), ir_CONST_DOUBLE(ZEND_LONG_MIN - 1.0));
4707
+ SET_STACK_REF(stack, EX_VAR_TO_NUM(opline->result.var), ir_CONST_DOUBLE((double) ZEND_LONG_MIN - 1.0));
4708
4708
exit_point = zend_jit_trace_get_exit_point(opline + 1, 0);
4709
4709
SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var), old_res_info);
4710
4710
} else {
@@ -4964,6 +4964,18 @@ static int zend_jit_math_helper(zend_jit_ctx *jit,
4964
4964
ir_refs_init(end_inputs, 6);
4965
4965
ir_refs_init(res_inputs, 6);
4966
4966
4967
+ if (Z_MODE(op1_addr) == IS_REG) {
4968
+ if (!has_concrete_type(op2_info & MAY_BE_ANY) && jit->ra[Z_SSA_VAR(op1_addr)].ref == IR_NULL) {
4969
+ /* Force load */
4970
+ zend_jit_use_reg(jit, op1_addr);
4971
+ }
4972
+ } else if (Z_MODE(op2_addr) == IS_REG) {
4973
+ if (!has_concrete_type(op1_info & MAY_BE_ANY) && jit->ra[Z_SSA_VAR(op2_addr)].ref == IR_NULL) {
4974
+ /* Force load */
4975
+ zend_jit_use_reg(jit, op2_addr);
4976
+ }
4977
+ }
4978
+
4967
4979
if (Z_MODE(res_addr) == IS_REG) {
4968
4980
jit->delay_var = Z_SSA_VAR(res_addr);
4969
4981
jit->delay_refs = res_inputs;
@@ -6565,6 +6577,18 @@ static int zend_jit_cmp(zend_jit_ctx *jit,
6565
6577
6566
6578
ir_refs_init(end_inputs, 8);
6567
6579
6580
+ if (Z_MODE(op1_addr) == IS_REG) {
6581
+ if (!has_concrete_type(op2_info & MAY_BE_ANY) && jit->ra[Z_SSA_VAR(op1_addr)].ref == IR_NULL) {
6582
+ /* Force load */
6583
+ zend_jit_use_reg(jit, op1_addr);
6584
+ }
6585
+ } else if (Z_MODE(op2_addr) == IS_REG) {
6586
+ if (!has_concrete_type(op1_info & MAY_BE_ANY) && jit->ra[Z_SSA_VAR(op2_addr)].ref == IR_NULL) {
6587
+ /* Force load */
6588
+ zend_jit_use_reg(jit, op2_addr);
6589
+ }
6590
+ }
6591
+
6568
6592
if ((op1_info & MAY_BE_LONG) && (op2_info & MAY_BE_LONG)) {
6569
6593
if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_LONG)) {
6570
6594
if_op1_long = jit_if_Z_TYPE(jit, op1_addr, IS_LONG);
0 commit comments