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