Skip to content

Commit 4b82ed4

Browse files
committed
Merge branch 'PHP-8.1' into PHP-8.2
* PHP-8.1: Backport fix for incorrect assumption about in-memory zval type
2 parents 0035242 + 455a967 commit 4b82ed4

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
@@ -4946,14 +4946,11 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
49464946
}
49474947
op2_addr = OP2_REG_ADDR();
49484948
op2_info = OP2_INFO();
4949-
if (ra
4950-
&& ssa_op->op2_def >= 0
4951-
&& (!ssa->vars[ssa_op->op2_def].no_val
4952-
|| (zend_jit_trace_type_to_info(STACK_MEM_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var))) & MAY_BE_ANY) !=
4953-
(op2_info & MAY_BE_ANY))) {
4954-
op2_def_addr = OP2_DEF_REG_ADDR();
4955-
} else {
4949+
4950+
if (ssa_op->op2_def < 0 || (Z_MODE(op2_addr) == IS_REG && ssa->vars[ssa_op->op2_def].no_val)) {
49564951
op2_def_addr = op2_addr;
4952+
} else {
4953+
op2_def_addr = OP2_DEF_REG_ADDR();
49574954
}
49584955
CHECK_OP2_TRACE_TYPE();
49594956
op1_info = OP1_INFO();
@@ -5049,12 +5046,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
50495046
ZEND_FALLTHROUGH;
50505047
case ZEND_QM_ASSIGN:
50515048
op1_addr = OP1_REG_ADDR();
5052-
if (ra
5053-
&& ssa_op->op1_def >= 0
5054-
&& !ssa->vars[ssa_op->op1_def].no_val) {
5055-
op1_def_addr = OP1_DEF_REG_ADDR();
5056-
} else {
5049+
if (ssa_op->op1_def < 0 || (Z_MODE(op1_addr) == IS_REG && ssa->vars[ssa_op->op1_def].no_val)) {
50575050
op1_def_addr = op1_addr;
5051+
} else {
5052+
op1_def_addr = OP1_DEF_REG_ADDR();
50585053
}
50595054
op1_info = OP1_INFO();
50605055
CHECK_OP1_TRACE_TYPE();
@@ -5145,12 +5140,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
51455140
break;
51465141
}
51475142
op1_addr = OP1_REG_ADDR();
5148-
if (ra
5149-
&& ssa_op->op1_def >= 0
5150-
&& !ssa->vars[ssa_op->op1_def].no_val) {
5151-
op1_def_addr = OP1_DEF_REG_ADDR();
5152-
} else {
5143+
if (ssa_op->op1_def < 0 || (Z_MODE(op1_addr) == IS_REG && ssa->vars[ssa_op->op1_def].no_val)) {
51535144
op1_def_addr = op1_addr;
5145+
} else {
5146+
op1_def_addr = OP1_DEF_REG_ADDR();
51545147
}
51555148
op1_info = OP1_INFO();
51565149
CHECK_OP1_TRACE_TYPE();
@@ -6328,7 +6321,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
63286321
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op1.var), type,
63296322
(gen_handler || type == IS_UNKNOWN || !ra ||
63306323
(!ra[ssa_op->op1_def] &&
6331-
(opline->opcode == ZEND_ASSIGN || !ssa->vars[ssa_op->op1_def].no_val))));
6324+
!(ssa->vars[ssa_op->op1_def].no_val &&
6325+
Z_MODE(OP1_REG_ADDR()) == IS_REG &&
6326+
(opline->opcode == ZEND_QM_ASSIGN ||
6327+
opline->opcode == ZEND_SEND_VAR ||
6328+
opline->opcode == ZEND_SEND_VAR_EX ||
6329+
opline->opcode == ZEND_SEND_VAR_NO_REF ||
6330+
opline->opcode == ZEND_SEND_VAR_NO_REF_EX ||
6331+
opline->opcode == ZEND_SEND_FUNC_ARG)))));
63326332
if (type != IS_UNKNOWN) {
63336333
ssa->var_info[ssa_op->op1_def].type &= ~MAY_BE_GUARD;
63346334
if (ra && ra[ssa_op->op1_def]) {
@@ -6374,7 +6374,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
63746374
}
63756375
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var), type,
63766376
(gen_handler || type == IS_UNKNOWN || !ra ||
6377-
(!ra[ssa_op->op2_def] /*&& !ssa->vars[ssa_op->op2_def].no_val*/)));
6377+
(!ra[ssa_op->op2_def] &&
6378+
!(ssa->vars[ssa_op->op2_def].no_val &&
6379+
Z_MODE(OP2_REG_ADDR()) == IS_REG &&
6380+
opline->opcode == ZEND_ASSIGN))));
63786381
if (type != IS_UNKNOWN) {
63796382
ssa->var_info[ssa_op->op2_def].type &= ~MAY_BE_GUARD;
63806383
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)