Skip to content

Commit cefe9e4

Browse files
committed
Merge branch 'PHP-8.2' into PHP-8.3
* PHP-8.2: Backport fix for incorrect assumption about in-memory zval type
2 parents 76112a1 + 4b82ed4 commit cefe9e4

File tree

2 files changed

+42
-19
lines changed

2 files changed

+42
-19
lines changed

ext/opcache/jit/zend_jit_trace.c

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4950,14 +4950,11 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
49504950
}
49514951
op2_addr = OP2_REG_ADDR();
49524952
op2_info = OP2_INFO();
4953-
if (ra
4954-
&& ssa_op->op2_def >= 0
4955-
&& (!ssa->vars[ssa_op->op2_def].no_val
4956-
|| (zend_jit_trace_type_to_info(STACK_MEM_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var))) & MAY_BE_ANY) !=
4957-
(op2_info & MAY_BE_ANY))) {
4958-
op2_def_addr = OP2_DEF_REG_ADDR();
4959-
} else {
4953+
4954+
if (ssa_op->op2_def < 0 || (Z_MODE(op2_addr) == IS_REG && ssa->vars[ssa_op->op2_def].no_val)) {
49604955
op2_def_addr = op2_addr;
4956+
} else {
4957+
op2_def_addr = OP2_DEF_REG_ADDR();
49614958
}
49624959
CHECK_OP2_TRACE_TYPE();
49634960
op1_info = OP1_INFO();
@@ -5053,12 +5050,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
50535050
ZEND_FALLTHROUGH;
50545051
case ZEND_QM_ASSIGN:
50555052
op1_addr = OP1_REG_ADDR();
5056-
if (ra
5057-
&& ssa_op->op1_def >= 0
5058-
&& !ssa->vars[ssa_op->op1_def].no_val) {
5059-
op1_def_addr = OP1_DEF_REG_ADDR();
5060-
} else {
5053+
if (ssa_op->op1_def < 0 || (Z_MODE(op1_addr) == IS_REG && ssa->vars[ssa_op->op1_def].no_val)) {
50615054
op1_def_addr = op1_addr;
5055+
} else {
5056+
op1_def_addr = OP1_DEF_REG_ADDR();
50625057
}
50635058
op1_info = OP1_INFO();
50645059
CHECK_OP1_TRACE_TYPE();
@@ -5149,12 +5144,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
51495144
break;
51505145
}
51515146
op1_addr = OP1_REG_ADDR();
5152-
if (ra
5153-
&& ssa_op->op1_def >= 0
5154-
&& !ssa->vars[ssa_op->op1_def].no_val) {
5155-
op1_def_addr = OP1_DEF_REG_ADDR();
5156-
} else {
5147+
if (ssa_op->op1_def < 0 || (Z_MODE(op1_addr) == IS_REG && ssa->vars[ssa_op->op1_def].no_val)) {
51575148
op1_def_addr = op1_addr;
5149+
} else {
5150+
op1_def_addr = OP1_DEF_REG_ADDR();
51585151
}
51595152
op1_info = OP1_INFO();
51605153
CHECK_OP1_TRACE_TYPE();
@@ -6332,7 +6325,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
63326325
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op1.var), type,
63336326
(gen_handler || type == IS_UNKNOWN || !ra ||
63346327
(!ra[ssa_op->op1_def] &&
6335-
(opline->opcode == ZEND_ASSIGN || !ssa->vars[ssa_op->op1_def].no_val))));
6328+
!(ssa->vars[ssa_op->op1_def].no_val &&
6329+
Z_MODE(OP1_REG_ADDR()) == IS_REG &&
6330+
(opline->opcode == ZEND_QM_ASSIGN ||
6331+
opline->opcode == ZEND_SEND_VAR ||
6332+
opline->opcode == ZEND_SEND_VAR_EX ||
6333+
opline->opcode == ZEND_SEND_VAR_NO_REF ||
6334+
opline->opcode == ZEND_SEND_VAR_NO_REF_EX ||
6335+
opline->opcode == ZEND_SEND_FUNC_ARG)))));
63366336
if (type != IS_UNKNOWN) {
63376337
ssa->var_info[ssa_op->op1_def].type &= ~MAY_BE_GUARD;
63386338
if (ra && ra[ssa_op->op1_def]) {
@@ -6378,7 +6378,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
63786378
}
63796379
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var), type,
63806380
(gen_handler || type == IS_UNKNOWN || !ra ||
6381-
(!ra[ssa_op->op2_def] /*&& !ssa->vars[ssa_op->op2_def].no_val*/)));
6381+
(!ra[ssa_op->op2_def] &&
6382+
!(ssa->vars[ssa_op->op2_def].no_val &&
6383+
Z_MODE(OP2_REG_ADDR()) == IS_REG &&
6384+
opline->opcode == ZEND_ASSIGN))));
63826385
if (type != IS_UNKNOWN) {
63836386
ssa->var_info[ssa_op->op2_def].type &= ~MAY_BE_GUARD;
63846387
if (ra && ra[ssa_op->op2_def]) {
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
--TEST--
2+
JIT ASSIGN_DIM: 017
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 test() {
11+
for($i = 0; $i < 10; $i++) {
12+
$a[] = 0;
13+
$a = false;
14+
}
15+
}
16+
@test();
17+
?>
18+
DONE
19+
--EXPECT--
20+
DONE

0 commit comments

Comments
 (0)