Skip to content

Commit 52480b3

Browse files
committedOct 30, 2023
Fixed incorrect assumption about in-memory zval type
1 parent 8b840b9 commit 52480b3

File tree

2 files changed

+41
-21
lines changed

2 files changed

+41
-21
lines changed
 

‎ext/opcache/jit/zend_jit_trace.c

+21-21
Original file line numberDiff line numberDiff line change
@@ -4808,14 +4808,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
48084808
op2_info = OP2_INFO();
48094809
zend_jit_addr ref_addr = 0;
48104810

4811-
if (ra
4812-
&& ssa_op->op2_def >= 0
4813-
&& (!ssa->vars[ssa_op->op2_def].no_val
4814-
|| (zend_jit_trace_type_to_info(STACK_MEM_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var))) & MAY_BE_ANY) !=
4815-
(op2_info & MAY_BE_ANY))) {
4816-
op2_def_addr = OP2_DEF_REG_ADDR();
4817-
} else {
4811+
if (ssa_op->op2_def < 0 || (Z_MODE(op2_addr) == IS_REG && ssa->vars[ssa_op->op2_def].no_val)) {
48184812
op2_def_addr = op2_addr;
4813+
} else {
4814+
op2_def_addr = OP2_DEF_REG_ADDR();
48194815
}
48204816
CHECK_OP2_TRACE_TYPE();
48214817
op1_info = OP1_INFO();
@@ -4910,12 +4906,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
49104906
ZEND_FALLTHROUGH;
49114907
case ZEND_QM_ASSIGN:
49124908
op1_addr = OP1_REG_ADDR();
4913-
if (ra
4914-
&& ssa_op->op1_def >= 0
4915-
&& !ssa->vars[ssa_op->op1_def].no_val) {
4916-
op1_def_addr = OP1_DEF_REG_ADDR();
4917-
} else {
4909+
if (ssa_op->op1_def < 0 || (Z_MODE(op1_addr) == IS_REG && ssa->vars[ssa_op->op1_def].no_val)) {
49184910
op1_def_addr = op1_addr;
4911+
} else {
4912+
op1_def_addr = OP1_DEF_REG_ADDR();
49194913
}
49204914
op1_info = OP1_INFO();
49214915
CHECK_OP1_TRACE_TYPE();
@@ -5008,14 +5002,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
50085002
break;
50095003
}
50105004
op1_addr = OP1_REG_ADDR();
5011-
if (ra
5012-
&& ssa_op->op1_def >= 0
5013-
&& (!ssa->vars[ssa_op->op1_def].no_val
5014-
|| STACK_MEM_TYPE(stack, EX_VAR_TO_NUM(opline->op1.var)) == IS_UNKNOWN
5015-
|| STACK_MEM_TYPE(stack, EX_VAR_TO_NUM(opline->op1.var)) >= IS_STRING)) {
5016-
op1_def_addr = OP1_DEF_REG_ADDR();
5017-
} else {
5005+
if (ssa_op->op1_def < 0 || (Z_MODE(op1_addr) == IS_REG && ssa->vars[ssa_op->op1_def].no_val)) {
50185006
op1_def_addr = op1_addr;
5007+
} else {
5008+
op1_def_addr = OP1_DEF_REG_ADDR();
50195009
}
50205010
op1_info = OP1_INFO();
50215011
CHECK_OP1_TRACE_TYPE();
@@ -6195,7 +6185,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
61956185
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op1.var), type,
61966186
(gen_handler || type == IS_UNKNOWN || !ra ||
61976187
(!RA_HAS_REG(ssa_op->op1_def) &&
6198-
(opline->opcode == ZEND_ASSIGN || !ssa->vars[ssa_op->op1_def].no_val))));
6188+
!(ssa->vars[ssa_op->op1_def].no_val &&
6189+
Z_MODE(OP1_REG_ADDR()) == IS_REG &&
6190+
(opline->opcode == ZEND_QM_ASSIGN ||
6191+
opline->opcode == ZEND_SEND_VAR ||
6192+
opline->opcode == ZEND_SEND_VAR_EX ||
6193+
opline->opcode == ZEND_SEND_VAR_NO_REF ||
6194+
opline->opcode == ZEND_SEND_VAR_NO_REF_EX ||
6195+
opline->opcode == ZEND_SEND_FUNC_ARG)))));
61996196
if (type != IS_UNKNOWN) {
62006197
ssa->var_info[ssa_op->op1_def].type &= ~MAY_BE_GUARD;
62016198
if (ra && RA_HAS_REG(ssa_op->op1_def)) {
@@ -6241,7 +6238,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
62416238
}
62426239
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var), type,
62436240
(gen_handler || type == IS_UNKNOWN || !ra ||
6244-
(!RA_HAS_REG(ssa_op->op2_def) /*&& !ssa->vars[ssa_op->op2_def].no_val*/)));
6241+
(!RA_HAS_REG(ssa_op->op2_def) &&
6242+
!(ssa->vars[ssa_op->op2_def].no_val &&
6243+
Z_MODE(OP2_REG_ADDR()) == IS_REG &&
6244+
opline->opcode == ZEND_ASSIGN))));
62456245
if (type != IS_UNKNOWN) {
62466246
ssa->var_info[ssa_op->op2_def].type &= ~MAY_BE_GUARD;
62476247
if (ra && RA_HAS_REG(ssa_op->op2_def)) {
+20
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)
Please sign in to comment.