diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index d3ce786aaca..fbc9c364484 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -1968,13 +1968,17 @@ static int zend_jit_compute_liveness(const zend_op_array *op_array, zend_ssa *ss if (ssa->ops[line].op1_use >= 0 && intervals[ssa->ops[line].op1_use] && ssa->ops[line].op1_use_chain < 0 && - !ssa->vars[ssa->ops[line].op1_use].phi_use_chain) { + !ssa->vars[ssa->ops[line].op1_use].phi_use_chain && + (ssa->var_info[i].type & MAY_BE_ANY) == + (ssa->var_info[ssa->ops[line].op1_use].type & MAY_BE_ANY)) { zend_jit_add_hint(intervals, i, ssa->ops[line].op1_use); } else if (opline->opcode != ZEND_SUB && ssa->ops[line].op2_use >= 0 && intervals[ssa->ops[line].op2_use] && ssa->ops[line].op2_use_chain < 0 && - !ssa->vars[ssa->ops[line].op2_use].phi_use_chain) { + !ssa->vars[ssa->ops[line].op2_use].phi_use_chain && + (ssa->var_info[i].type & MAY_BE_ANY) == + (ssa->var_info[ssa->ops[line].op2_use].type & MAY_BE_ANY)) { zend_jit_add_hint(intervals, i, ssa->ops[line].op2_use); } } diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index ff0bfdcff34..9c346bf10e4 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -3202,7 +3202,9 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace if (ssa->ops[line].op1_use >= 0 && intervals[ssa->ops[line].op1_use] && ssa->ops[line].op1_use_chain < 0 && - !ssa->vars[ssa->ops[line].op1_use].phi_use_chain) { + !ssa->vars[ssa->ops[line].op1_use].phi_use_chain && + (ssa->var_info[i].type & MAY_BE_ANY) == + (ssa->var_info[ssa->ops[line].op1_use].type & MAY_BE_ANY)) { zend_ssa_phi *phi = ssa->vars[ssa->ops[line].op1_use].definition_phi; if (phi && @@ -3215,7 +3217,9 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace ssa->ops[line].op2_use >= 0 && intervals[ssa->ops[line].op2_use] && ssa->ops[line].op2_use_chain < 0 && - !ssa->vars[ssa->ops[line].op2_use].phi_use_chain) { + !ssa->vars[ssa->ops[line].op2_use].phi_use_chain && + (ssa->var_info[i].type & MAY_BE_ANY) == + (ssa->var_info[ssa->ops[line].op2_use].type & MAY_BE_ANY)) { zend_ssa_phi *phi = ssa->vars[ssa->ops[line].op2_use].definition_phi; if (phi && diff --git a/ext/opcache/tests/jit/add_013.phpt b/ext/opcache/tests/jit/add_013.phpt new file mode 100644 index 00000000000..e2baa69566a --- /dev/null +++ b/ext/opcache/tests/jit/add_013.phpt @@ -0,0 +1,20 @@ +--TEST-- +JIT ADD: 013 register allocation (incorrect hinting) +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +--FILE-- + 4) break; + } +} +?> +DONE +--EXPECT-- +DONE \ No newline at end of file