@@ -4950,14 +4950,11 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
49504950 }
49514951 op2_addr = OP2_REG_ADDR ();
49524952 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 )) {
49604955 op2_def_addr = op2_addr ;
4956+ } else {
4957+ op2_def_addr = OP2_DEF_REG_ADDR ();
49614958 }
49624959 CHECK_OP2_TRACE_TYPE ();
49634960 op1_info = OP1_INFO ();
@@ -5053,12 +5050,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
50535050 ZEND_FALLTHROUGH ;
50545051 case ZEND_QM_ASSIGN :
50555052 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 )) {
50615054 op1_def_addr = op1_addr ;
5055+ } else {
5056+ op1_def_addr = OP1_DEF_REG_ADDR ();
50625057 }
50635058 op1_info = OP1_INFO ();
50645059 CHECK_OP1_TRACE_TYPE ();
@@ -5149,12 +5144,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
51495144 break ;
51505145 }
51515146 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 )) {
51575148 op1_def_addr = op1_addr ;
5149+ } else {
5150+ op1_def_addr = OP1_DEF_REG_ADDR ();
51585151 }
51595152 op1_info = OP1_INFO ();
51605153 CHECK_OP1_TRACE_TYPE ();
@@ -6332,7 +6325,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
63326325 SET_STACK_TYPE (stack , EX_VAR_TO_NUM (opline -> op1 .var ), type ,
63336326 (gen_handler || type == IS_UNKNOWN || !ra ||
63346327 (!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 )))));
63366336 if (type != IS_UNKNOWN ) {
63376337 ssa -> var_info [ssa_op -> op1_def ].type &= ~MAY_BE_GUARD ;
63386338 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
63786378 }
63796379 SET_STACK_TYPE (stack , EX_VAR_TO_NUM (opline -> op2 .var ), type ,
63806380 (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 ))));
63826385 if (type != IS_UNKNOWN ) {
63836386 ssa -> var_info [ssa_op -> op2_def ].type &= ~MAY_BE_GUARD ;
63846387 if (ra && ra [ssa_op -> op2_def ]) {
0 commit comments