Skip to content

Commit 56afe82

Browse files
committed
Merge branch 'PHP-8.6'
* PHP-8.6: Fix GH-23991: JIT generates invalid IR for multiple recursive calls
2 parents cd8312e + 1ab6d6b commit 56afe82

2 files changed

Lines changed: 36 additions & 8 deletions

File tree

‎ext/opcache/jit/zend_jit_ir.c‎

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10440,14 +10440,6 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
1044010440
insn->inputs_count = 3;
1044110441
insn->op3 = end;
1044210442
break;
10443-
} else if (insn->op == IR_LOOP_BEGIN && insn->inputs_count == 3) {
10444-
ZEND_ASSERT(jit->ctx.ir_base[insn->op3].op == IR_LOOP_END);
10445-
jit->ctx.ir_base[insn->op3].op = IR_END;
10446-
ir_MERGE_2(insn->op3, ir_END());
10447-
end = ir_LOOP_END();
10448-
insn = &jit->ctx.ir_base[begin];
10449-
insn->op3 = end;
10450-
break;
1045110443
}
1045210444
}
1045310445
/* fallback to indirect JMP or RETURN */

‎ext/opcache/tests/jit/gh23991.phpt‎

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
--TEST--
2+
GH-23991 (JIT generates invalid IR for multiple recursive calls converted into loop)
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.jit_buffer_size=64M
7+
opcache.jit=1235
8+
opcache.jit_hot_func=1
9+
--EXTENSIONS--
10+
opcache
11+
--FILE--
12+
<?php
13+
function f($value, $recurse, $param = '') {
14+
if (is_array($value)) {
15+
if ($recurse) {
16+
foreach ($value as $k => $v) {
17+
$value[$k] = f($v, $recurse, $param);
18+
}
19+
}
20+
foreach ($value as $k => $v) {
21+
if ($undef) {
22+
$value[$k] = f($v, $recurse, $param);
23+
}
24+
}
25+
}
26+
return $value;
27+
}
28+
var_dump(f([[]], true));
29+
?>
30+
--EXPECTF--
31+
Warning: Undefined variable $undef in %s on line %d
32+
array(1) {
33+
[0]=>
34+
array(0) {
35+
}
36+
}

0 commit comments

Comments
 (0)