Skip to content

Commit caa1d8f

Browse files
committed
Use explicit type conversion & force load values to registerts
1 parent ca47fb8 commit caa1d8f

File tree

1 file changed

+30
-6
lines changed

1 file changed

+30
-6
lines changed

ext/opcache/jit/zend_jit_ir.c

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)