@@ -4564,6 +4564,16 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4564
4564
op2_info = OP2_INFO ();
4565
4565
CHECK_OP2_TRACE_TYPE ();
4566
4566
op1_info = OP1_INFO ();
4567
+ if (ssa -> vars [ssa_op -> op1_use ].no_val ) {
4568
+ if ((op1_info & (MAY_BE_ANY |MAY_BE_UNDEF |MAY_BE_GUARD )) == MAY_BE_LONG
4569
+ || (op1_info & (MAY_BE_ANY |MAY_BE_UNDEF |MAY_BE_GUARD )) == MAY_BE_DOUBLE ) {
4570
+ if (STACK_MEM_TYPE (stack , EX_VAR_TO_NUM (opline -> op1 .var )) != IS_LONG
4571
+ && STACK_MEM_TYPE (stack , EX_VAR_TO_NUM (opline -> op1 .var )) != IS_DOUBLE ) {
4572
+ /* type may be not set */
4573
+ op1_info |= MAY_BE_NULL ;
4574
+ }
4575
+ }
4576
+ }
4567
4577
CHECK_OP1_TRACE_TYPE ();
4568
4578
op1_def_info = OP1_DEF_INFO ();
4569
4579
op1_addr = OP1_REG_ADDR ();
@@ -5887,7 +5897,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5887
5897
type = STACK_TYPE (stack , EX_VAR_TO_NUM (opline -> op1 .var ));
5888
5898
}
5889
5899
SET_STACK_TYPE (stack , EX_VAR_TO_NUM (opline -> op1 .var ), type ,
5890
- (type == IS_UNKNOWN || !ra || !ra [ssa_op -> op1_def ]));
5900
+ (type == IS_UNKNOWN || !ra ||
5901
+ (!ra [ssa_op -> op1_def ] && !ssa -> vars [ssa_op -> op1_def ].no_val )));
5891
5902
if (type != IS_UNKNOWN ) {
5892
5903
ssa -> var_info [ssa_op -> op1_def ].type &= ~MAY_BE_GUARD ;
5893
5904
if (ra && ra [ssa_op -> op1_def ]) {
@@ -5930,7 +5941,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5930
5941
type = STACK_TYPE (stack , EX_VAR_TO_NUM (opline -> op2 .var ));
5931
5942
}
5932
5943
SET_STACK_TYPE (stack , EX_VAR_TO_NUM (opline -> op2 .var ), type ,
5933
- (type == IS_UNKNOWN || !ra || !ra [ssa_op -> op2_def ]));
5944
+ (type == IS_UNKNOWN || !ra ||
5945
+ (!ra [ssa_op -> op2_def ] && !ssa -> vars [ssa_op -> op2_def ].no_val )));
5934
5946
if (type != IS_UNKNOWN ) {
5935
5947
ssa -> var_info [ssa_op -> op2_def ].type &= ~MAY_BE_GUARD ;
5936
5948
if (ra && ra [ssa_op -> op2_def ]) {
0 commit comments