@@ -4950,14 +4950,11 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4950
4950
}
4951
4951
op2_addr = OP2_REG_ADDR ();
4952
4952
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 )) {
4960
4955
op2_def_addr = op2_addr ;
4956
+ } else {
4957
+ op2_def_addr = OP2_DEF_REG_ADDR ();
4961
4958
}
4962
4959
CHECK_OP2_TRACE_TYPE ();
4963
4960
op1_info = OP1_INFO ();
@@ -5053,12 +5050,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5053
5050
ZEND_FALLTHROUGH ;
5054
5051
case ZEND_QM_ASSIGN :
5055
5052
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 )) {
5061
5054
op1_def_addr = op1_addr ;
5055
+ } else {
5056
+ op1_def_addr = OP1_DEF_REG_ADDR ();
5062
5057
}
5063
5058
op1_info = OP1_INFO ();
5064
5059
CHECK_OP1_TRACE_TYPE ();
@@ -5149,12 +5144,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5149
5144
break ;
5150
5145
}
5151
5146
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 )) {
5157
5148
op1_def_addr = op1_addr ;
5149
+ } else {
5150
+ op1_def_addr = OP1_DEF_REG_ADDR ();
5158
5151
}
5159
5152
op1_info = OP1_INFO ();
5160
5153
CHECK_OP1_TRACE_TYPE ();
@@ -6332,7 +6325,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
6332
6325
SET_STACK_TYPE (stack , EX_VAR_TO_NUM (opline -> op1 .var ), type ,
6333
6326
(gen_handler || type == IS_UNKNOWN || !ra ||
6334
6327
(!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 )))));
6336
6336
if (type != IS_UNKNOWN ) {
6337
6337
ssa -> var_info [ssa_op -> op1_def ].type &= ~MAY_BE_GUARD ;
6338
6338
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
6378
6378
}
6379
6379
SET_STACK_TYPE (stack , EX_VAR_TO_NUM (opline -> op2 .var ), type ,
6380
6380
(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 ))));
6382
6385
if (type != IS_UNKNOWN ) {
6383
6386
ssa -> var_info [ssa_op -> op2_def ].type &= ~MAY_BE_GUARD ;
6384
6387
if (ra && ra [ssa_op -> op2_def ]) {
0 commit comments