@@ -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 ]) {
0 commit comments