@@ -3682,7 +3682,7 @@ static void zend_jit_trace_update_condition_ranges(const zend_op *opline, const
3682
3682
}
3683
3683
}
3684
3684
3685
- static bool zend_jit_may_skip_comparison (const zend_op * opline , const zend_ssa_op * ssa_op , const zend_ssa * ssa , const zend_op * * ssa_opcodes )
3685
+ static bool zend_jit_may_skip_comparison (const zend_op * opline , const zend_ssa_op * ssa_op , const zend_ssa * ssa , const zend_op * * ssa_opcodes , const zend_op_array * op_array )
3686
3686
{
3687
3687
zend_uchar prev_opcode ;
3688
3688
@@ -3691,18 +3691,23 @@ static bool zend_jit_may_skip_comparison(const zend_op *opline, const zend_ssa_o
3691
3691
&& Z_LVAL_P (RT_CONSTANT (opline , opline -> op1 )) == 0 ) {
3692
3692
if (ssa_op -> op2_use >= 0 ) {
3693
3693
if ((ssa_op - 1 )-> op1_def == ssa_op -> op2_use ) {
3694
- prev_opcode = ssa_opcodes [(ssa_op - ssa -> ops ) - 1 ]-> opcode ;
3694
+ ssa_op -- ;
3695
+ opline = ssa_opcodes [ssa_op - ssa -> ops ];
3696
+ prev_opcode = opline -> opcode ;
3695
3697
if (prev_opcode == ZEND_PRE_INC
3696
3698
|| prev_opcode == ZEND_PRE_DEC
3697
3699
|| prev_opcode == ZEND_POST_INC
3698
3700
|| prev_opcode == ZEND_POST_DEC ) {
3699
- return 1 ;
3701
+ return ( OP1_INFO () & (( MAY_BE_UNDEF | MAY_BE_ANY | MAY_BE_REF ) - MAY_BE_LONG )) == 0 ;
3700
3702
}
3701
3703
} else if ((ssa_op - 1 )-> result_def == ssa_op -> op2_use ) {
3702
- prev_opcode = ssa_opcodes [(ssa_op - ssa -> ops ) - 1 ]-> opcode ;
3704
+ ssa_op -- ;
3705
+ opline = ssa_opcodes [ssa_op - ssa -> ops ];
3706
+ prev_opcode = opline -> opcode ;
3703
3707
if (prev_opcode == ZEND_ADD
3704
3708
|| prev_opcode == ZEND_SUB ) {
3705
- return 1 ;
3709
+ return (OP1_INFO () & ((MAY_BE_UNDEF |MAY_BE_ANY |MAY_BE_REF )- MAY_BE_LONG )) == 0 &&
3710
+ (OP2_INFO () & ((MAY_BE_UNDEF |MAY_BE_ANY |MAY_BE_REF )- MAY_BE_LONG )) == 0 ;
3706
3711
}
3707
3712
}
3708
3713
}
@@ -3711,18 +3716,23 @@ static bool zend_jit_may_skip_comparison(const zend_op *opline, const zend_ssa_o
3711
3716
&& Z_LVAL_P (RT_CONSTANT (opline , opline -> op2 )) == 0 ) {
3712
3717
if (ssa_op -> op1_use >= 0 ) {
3713
3718
if ((ssa_op - 1 )-> op1_def == ssa_op -> op1_use ) {
3714
- prev_opcode = ssa_opcodes [(ssa_op - ssa -> ops ) - 1 ]-> opcode ;
3719
+ ssa_op -- ;
3720
+ opline = ssa_opcodes [ssa_op - ssa -> ops ];
3721
+ prev_opcode = opline -> opcode ;
3715
3722
if (prev_opcode == ZEND_PRE_INC
3716
3723
|| prev_opcode == ZEND_PRE_DEC
3717
3724
|| prev_opcode == ZEND_POST_INC
3718
3725
|| prev_opcode == ZEND_POST_DEC ) {
3719
- return 1 ;
3726
+ return ( OP1_INFO () & (( MAY_BE_UNDEF | MAY_BE_ANY | MAY_BE_REF ) - MAY_BE_LONG )) == 0 ;
3720
3727
}
3721
3728
} else if ((ssa_op - 1 )-> result_def == ssa_op -> op1_use ) {
3722
- prev_opcode = ssa_opcodes [(ssa_op - ssa -> ops ) - 1 ]-> opcode ;
3729
+ ssa_op -- ;
3730
+ opline = ssa_opcodes [ssa_op - ssa -> ops ];
3731
+ prev_opcode = opline -> opcode ;
3723
3732
if (prev_opcode == ZEND_ADD
3724
3733
|| prev_opcode == ZEND_SUB ) {
3725
- return 1 ;
3734
+ return (OP1_INFO () & ((MAY_BE_UNDEF |MAY_BE_ANY |MAY_BE_REF )- MAY_BE_LONG )) == 0 &&
3735
+ (OP2_INFO () & ((MAY_BE_UNDEF |MAY_BE_ANY |MAY_BE_REF )- MAY_BE_LONG )) == 0 ;
3726
3736
}
3727
3737
}
3728
3738
}
@@ -4977,9 +4987,9 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4977
4987
op2_info = OP2_INFO ();
4978
4988
skip_comparison =
4979
4989
ssa_op != ssa -> ops &&
4980
- (op1_info & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_LONG &&
4981
- (op2_info & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_LONG &&
4982
- zend_jit_may_skip_comparison (opline , ssa_op , ssa , ssa_opcodes );
4990
+ (op1_info & (MAY_BE_ANY |MAY_BE_UNDEF | MAY_BE_GUARD )) == MAY_BE_LONG &&
4991
+ (op2_info & (MAY_BE_ANY |MAY_BE_UNDEF | MAY_BE_GUARD )) == MAY_BE_LONG &&
4992
+ zend_jit_may_skip_comparison (opline , ssa_op , ssa , ssa_opcodes , op_array );
4983
4993
CHECK_OP1_TRACE_TYPE ();
4984
4994
CHECK_OP2_TRACE_TYPE ();
4985
4995
if ((opline -> result_type & (IS_SMART_BRANCH_JMPZ |IS_SMART_BRANCH_JMPNZ )) != 0 ) {
@@ -5025,9 +5035,9 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5025
5035
op2_info = OP2_INFO ();
5026
5036
skip_comparison =
5027
5037
ssa_op != ssa -> ops &&
5028
- (op1_info & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_LONG &&
5029
- (op2_info & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_LONG &&
5030
- zend_jit_may_skip_comparison (opline , ssa_op , ssa , ssa_opcodes );
5038
+ (op1_info & (MAY_BE_ANY |MAY_BE_UNDEF | MAY_BE_GUARD )) == MAY_BE_LONG &&
5039
+ (op2_info & (MAY_BE_ANY |MAY_BE_UNDEF | MAY_BE_GUARD )) == MAY_BE_LONG &&
5040
+ zend_jit_may_skip_comparison (opline , ssa_op , ssa , ssa_opcodes , op_array );
5031
5041
CHECK_OP1_TRACE_TYPE ();
5032
5042
CHECK_OP2_TRACE_TYPE ();
5033
5043
if ((opline -> result_type & (IS_SMART_BRANCH_JMPZ |IS_SMART_BRANCH_JMPNZ )) != 0 ) {
0 commit comments