Skip to content

Commit f4a3868

Browse files
committed
Merge branch 'PHP-8.0' into PHP-8.1
* PHP-8.0: Fix incorrect register allocation
2 parents 34c2324 + f711c96 commit f4a3868

File tree

3 files changed

+32
-4
lines changed

3 files changed

+32
-4
lines changed

ext/opcache/jit/zend_jit.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1968,13 +1968,17 @@ static int zend_jit_compute_liveness(const zend_op_array *op_array, zend_ssa *ss
19681968
if (ssa->ops[line].op1_use >= 0 &&
19691969
intervals[ssa->ops[line].op1_use] &&
19701970
ssa->ops[line].op1_use_chain < 0 &&
1971-
!ssa->vars[ssa->ops[line].op1_use].phi_use_chain) {
1971+
!ssa->vars[ssa->ops[line].op1_use].phi_use_chain &&
1972+
(ssa->var_info[i].type & MAY_BE_ANY) ==
1973+
(ssa->var_info[ssa->ops[line].op1_use].type & MAY_BE_ANY)) {
19721974
zend_jit_add_hint(intervals, i, ssa->ops[line].op1_use);
19731975
} else if (opline->opcode != ZEND_SUB &&
19741976
ssa->ops[line].op2_use >= 0 &&
19751977
intervals[ssa->ops[line].op2_use] &&
19761978
ssa->ops[line].op2_use_chain < 0 &&
1977-
!ssa->vars[ssa->ops[line].op2_use].phi_use_chain) {
1979+
!ssa->vars[ssa->ops[line].op2_use].phi_use_chain &&
1980+
(ssa->var_info[i].type & MAY_BE_ANY) ==
1981+
(ssa->var_info[ssa->ops[line].op2_use].type & MAY_BE_ANY)) {
19781982
zend_jit_add_hint(intervals, i, ssa->ops[line].op2_use);
19791983
}
19801984
}

ext/opcache/jit/zend_jit_trace.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3202,7 +3202,9 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
32023202
if (ssa->ops[line].op1_use >= 0 &&
32033203
intervals[ssa->ops[line].op1_use] &&
32043204
ssa->ops[line].op1_use_chain < 0 &&
3205-
!ssa->vars[ssa->ops[line].op1_use].phi_use_chain) {
3205+
!ssa->vars[ssa->ops[line].op1_use].phi_use_chain &&
3206+
(ssa->var_info[i].type & MAY_BE_ANY) ==
3207+
(ssa->var_info[ssa->ops[line].op1_use].type & MAY_BE_ANY)) {
32063208

32073209
zend_ssa_phi *phi = ssa->vars[ssa->ops[line].op1_use].definition_phi;
32083210
if (phi &&
@@ -3215,7 +3217,9 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
32153217
ssa->ops[line].op2_use >= 0 &&
32163218
intervals[ssa->ops[line].op2_use] &&
32173219
ssa->ops[line].op2_use_chain < 0 &&
3218-
!ssa->vars[ssa->ops[line].op2_use].phi_use_chain) {
3220+
!ssa->vars[ssa->ops[line].op2_use].phi_use_chain &&
3221+
(ssa->var_info[i].type & MAY_BE_ANY) ==
3222+
(ssa->var_info[ssa->ops[line].op2_use].type & MAY_BE_ANY)) {
32193223

32203224
zend_ssa_phi *phi = ssa->vars[ssa->ops[line].op2_use].definition_phi;
32213225
if (phi &&

ext/opcache/tests/jit/add_013.phpt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
--TEST--
2+
JIT ADD: 013 register allocation (incorrect hinting)
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.file_update_protection=0
7+
opcache.jit_buffer_size=1M
8+
--FILE--
9+
<?php
10+
function y(){
11+
$j = 2;
12+
for (; $a = $j - 7 + $y = $a - 7; $a = $a + 1 / 3) {
13+
$j++;
14+
if ($j > 4) break;
15+
}
16+
}
17+
?>
18+
DONE
19+
--EXPECT--
20+
DONE

0 commit comments

Comments
 (0)