@@ -4808,14 +4808,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4808
4808
op2_info = OP2_INFO ();
4809
4809
zend_jit_addr ref_addr = 0 ;
4810
4810
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 )) {
4818
4812
op2_def_addr = op2_addr ;
4813
+ } else {
4814
+ op2_def_addr = OP2_DEF_REG_ADDR ();
4819
4815
}
4820
4816
CHECK_OP2_TRACE_TYPE ();
4821
4817
op1_info = OP1_INFO ();
@@ -4910,12 +4906,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4910
4906
ZEND_FALLTHROUGH ;
4911
4907
case ZEND_QM_ASSIGN :
4912
4908
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 )) {
4918
4910
op1_def_addr = op1_addr ;
4911
+ } else {
4912
+ op1_def_addr = OP1_DEF_REG_ADDR ();
4919
4913
}
4920
4914
op1_info = OP1_INFO ();
4921
4915
CHECK_OP1_TRACE_TYPE ();
@@ -5008,14 +5002,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5008
5002
break ;
5009
5003
}
5010
5004
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 )) {
5018
5006
op1_def_addr = op1_addr ;
5007
+ } else {
5008
+ op1_def_addr = OP1_DEF_REG_ADDR ();
5019
5009
}
5020
5010
op1_info = OP1_INFO ();
5021
5011
CHECK_OP1_TRACE_TYPE ();
@@ -6195,7 +6185,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
6195
6185
SET_STACK_TYPE (stack , EX_VAR_TO_NUM (opline -> op1 .var ), type ,
6196
6186
(gen_handler || type == IS_UNKNOWN || !ra ||
6197
6187
(!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 )))));
6199
6196
if (type != IS_UNKNOWN ) {
6200
6197
ssa -> var_info [ssa_op -> op1_def ].type &= ~MAY_BE_GUARD ;
6201
6198
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
6241
6238
}
6242
6239
SET_STACK_TYPE (stack , EX_VAR_TO_NUM (opline -> op2 .var ), type ,
6243
6240
(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 ))));
6245
6245
if (type != IS_UNKNOWN ) {
6246
6246
ssa -> var_info [ssa_op -> op2_def ].type &= ~MAY_BE_GUARD ;
6247
6247
if (ra && RA_HAS_REG (ssa_op -> op2_def )) {
0 commit comments