@@ -4946,14 +4946,11 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4946
4946
}
4947
4947
op2_addr = OP2_REG_ADDR ();
4948
4948
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 )) {
4956
4951
op2_def_addr = op2_addr ;
4952
+ } else {
4953
+ op2_def_addr = OP2_DEF_REG_ADDR ();
4957
4954
}
4958
4955
CHECK_OP2_TRACE_TYPE ();
4959
4956
op1_info = OP1_INFO ();
@@ -5049,12 +5046,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5049
5046
ZEND_FALLTHROUGH ;
5050
5047
case ZEND_QM_ASSIGN :
5051
5048
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 )) {
5057
5050
op1_def_addr = op1_addr ;
5051
+ } else {
5052
+ op1_def_addr = OP1_DEF_REG_ADDR ();
5058
5053
}
5059
5054
op1_info = OP1_INFO ();
5060
5055
CHECK_OP1_TRACE_TYPE ();
@@ -5145,12 +5140,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5145
5140
break ;
5146
5141
}
5147
5142
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 )) {
5153
5144
op1_def_addr = op1_addr ;
5145
+ } else {
5146
+ op1_def_addr = OP1_DEF_REG_ADDR ();
5154
5147
}
5155
5148
op1_info = OP1_INFO ();
5156
5149
CHECK_OP1_TRACE_TYPE ();
@@ -6328,7 +6321,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
6328
6321
SET_STACK_TYPE (stack , EX_VAR_TO_NUM (opline -> op1 .var ), type ,
6329
6322
(gen_handler || type == IS_UNKNOWN || !ra ||
6330
6323
(!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 )))));
6332
6332
if (type != IS_UNKNOWN ) {
6333
6333
ssa -> var_info [ssa_op -> op1_def ].type &= ~MAY_BE_GUARD ;
6334
6334
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
6374
6374
}
6375
6375
SET_STACK_TYPE (stack , EX_VAR_TO_NUM (opline -> op2 .var ), type ,
6376
6376
(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 ))));
6378
6381
if (type != IS_UNKNOWN ) {
6379
6382
ssa -> var_info [ssa_op -> op2_def ].type &= ~MAY_BE_GUARD ;
6380
6383
if (ra && ra [ssa_op -> op2_def ]) {
0 commit comments