@@ -4383,18 +4383,18 @@ static int zend_jit_inc_dec(zend_jit_ctx *jit, const zend_op *opline, uint32_t o
43834383 old_op1_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var));
43844384 SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op1.var), IS_DOUBLE, 0);
43854385 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));
43874387 } 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));
43894389 }
43904390 if (opline->result_type != IS_UNUSED) {
43914391 old_res_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var));
43924392 if (opline->opcode == ZEND_PRE_INC) {
43934393 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));
43954395 } else if (opline->opcode == ZEND_PRE_DEC) {
43964396 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));
43984398 } else if (opline->opcode == ZEND_POST_INC) {
43994399 SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_LONG, 0);
44004400 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,
46974697 && Z_MODE(op2_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op2_addr)) == 1) {
46984698 old_res_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var));
46994699 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));
47014701 exit_point = zend_jit_trace_get_exit_point(opline + 1, 0);
47024702 SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var), old_res_info);
47034703 } else if (opline->opcode == ZEND_SUB
47044704 && Z_MODE(op2_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op2_addr)) == 1) {
47054705 old_res_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var));
47064706 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));
47084708 exit_point = zend_jit_trace_get_exit_point(opline + 1, 0);
47094709 SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var), old_res_info);
47104710 } else {
@@ -4964,6 +4964,18 @@ static int zend_jit_math_helper(zend_jit_ctx *jit,
49644964 ir_refs_init(end_inputs, 6);
49654965 ir_refs_init(res_inputs, 6);
49664966
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+
49674979 if (Z_MODE(res_addr) == IS_REG) {
49684980 jit->delay_var = Z_SSA_VAR(res_addr);
49694981 jit->delay_refs = res_inputs;
@@ -6565,6 +6577,18 @@ static int zend_jit_cmp(zend_jit_ctx *jit,
65656577
65666578 ir_refs_init(end_inputs, 8);
65676579
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+
65686592 if ((op1_info & MAY_BE_LONG) && (op2_info & MAY_BE_LONG)) {
65696593 if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_LONG)) {
65706594 if_op1_long = jit_if_Z_TYPE(jit, op1_addr, IS_LONG);
0 commit comments