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