Skip to content

Commit f711c96

Browse files
committed
Fix incorrect register allocation
Fixes oss-fuzz #44006
1 parent 965dafe commit f711c96

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
@@ -1394,13 +1394,17 @@ static int zend_jit_compute_liveness(const zend_op_array *op_array, zend_ssa *ss
13941394
if (ssa->ops[line].op1_use >= 0 &&
13951395
intervals[ssa->ops[line].op1_use] &&
13961396
ssa->ops[line].op1_use_chain < 0 &&
1397-
!ssa->vars[ssa->ops[line].op1_use].phi_use_chain) {
1397+
!ssa->vars[ssa->ops[line].op1_use].phi_use_chain &&
1398+
(ssa->var_info[i].type & MAY_BE_ANY) ==
1399+
(ssa->var_info[ssa->ops[line].op1_use].type & MAY_BE_ANY)) {
13981400
zend_jit_add_hint(intervals, i, ssa->ops[line].op1_use);
13991401
} else if (opline->opcode != ZEND_SUB &&
14001402
ssa->ops[line].op2_use >= 0 &&
14011403
intervals[ssa->ops[line].op2_use] &&
14021404
ssa->ops[line].op2_use_chain < 0 &&
1403-
!ssa->vars[ssa->ops[line].op2_use].phi_use_chain) {
1405+
!ssa->vars[ssa->ops[line].op2_use].phi_use_chain &&
1406+
(ssa->var_info[i].type & MAY_BE_ANY) ==
1407+
(ssa->var_info[ssa->ops[line].op2_use].type & MAY_BE_ANY)) {
14041408
zend_jit_add_hint(intervals, i, ssa->ops[line].op2_use);
14051409
}
14061410
}

ext/opcache/jit/zend_jit_trace.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2945,7 +2945,9 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
29452945
if (ssa->ops[line].op1_use >= 0 &&
29462946
intervals[ssa->ops[line].op1_use] &&
29472947
ssa->ops[line].op1_use_chain < 0 &&
2948-
!ssa->vars[ssa->ops[line].op1_use].phi_use_chain) {
2948+
!ssa->vars[ssa->ops[line].op1_use].phi_use_chain &&
2949+
(ssa->var_info[i].type & MAY_BE_ANY) ==
2950+
(ssa->var_info[ssa->ops[line].op1_use].type & MAY_BE_ANY)) {
29492951

29502952
zend_ssa_phi *phi = ssa->vars[ssa->ops[line].op1_use].definition_phi;
29512953
if (phi &&
@@ -2958,7 +2960,9 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
29582960
ssa->ops[line].op2_use >= 0 &&
29592961
intervals[ssa->ops[line].op2_use] &&
29602962
ssa->ops[line].op2_use_chain < 0 &&
2961-
!ssa->vars[ssa->ops[line].op2_use].phi_use_chain) {
2963+
!ssa->vars[ssa->ops[line].op2_use].phi_use_chain &&
2964+
(ssa->var_info[i].type & MAY_BE_ANY) ==
2965+
(ssa->var_info[ssa->ops[line].op2_use].type & MAY_BE_ANY)) {
29622966

29632967
zend_ssa_phi *phi = ssa->vars[ssa->ops[line].op2_use].definition_phi;
29642968
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)