@@ -3433,7 +3433,7 @@ static void zend_jit_trace_update_condition_ranges(const zend_op *opline, const
3433
3433
}
3434
3434
}
3435
3435
3436
- static zend_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 )
3436
+ static zend_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 )
3437
3437
{
3438
3438
zend_uchar prev_opcode ;
3439
3439
@@ -3442,18 +3442,23 @@ static zend_bool zend_jit_may_skip_comparison(const zend_op *opline, const zend_
3442
3442
&& Z_LVAL_P (RT_CONSTANT (opline , opline -> op1 )) == 0 ) {
3443
3443
if (ssa_op -> op2_use >= 0 ) {
3444
3444
if ((ssa_op - 1 )-> op1_def == ssa_op -> op2_use ) {
3445
- prev_opcode = ssa_opcodes [(ssa_op - ssa -> ops ) - 1 ]-> opcode ;
3445
+ ssa_op -- ;
3446
+ opline = ssa_opcodes [ssa_op - ssa -> ops ];
3447
+ prev_opcode = opline -> opcode ;
3446
3448
if (prev_opcode == ZEND_PRE_INC
3447
3449
|| prev_opcode == ZEND_PRE_DEC
3448
3450
|| prev_opcode == ZEND_POST_INC
3449
3451
|| prev_opcode == ZEND_POST_DEC ) {
3450
- return 1 ;
3452
+ return ( OP1_INFO () & (( MAY_BE_UNDEF | MAY_BE_ANY | MAY_BE_REF ) - MAY_BE_LONG )) == 0 ;
3451
3453
}
3452
3454
} else if ((ssa_op - 1 )-> result_def == ssa_op -> op2_use ) {
3453
- prev_opcode = ssa_opcodes [(ssa_op - ssa -> ops ) - 1 ]-> opcode ;
3455
+ ssa_op -- ;
3456
+ opline = ssa_opcodes [ssa_op - ssa -> ops ];
3457
+ prev_opcode = opline -> opcode ;
3454
3458
if (prev_opcode == ZEND_ADD
3455
3459
|| prev_opcode == ZEND_SUB ) {
3456
- return 1 ;
3460
+ return (OP1_INFO () & ((MAY_BE_UNDEF |MAY_BE_ANY |MAY_BE_REF )- MAY_BE_LONG )) == 0 &&
3461
+ (OP2_INFO () & ((MAY_BE_UNDEF |MAY_BE_ANY |MAY_BE_REF )- MAY_BE_LONG )) == 0 ;
3457
3462
}
3458
3463
}
3459
3464
}
@@ -3462,18 +3467,23 @@ static zend_bool zend_jit_may_skip_comparison(const zend_op *opline, const zend_
3462
3467
&& Z_LVAL_P (RT_CONSTANT (opline , opline -> op2 )) == 0 ) {
3463
3468
if (ssa_op -> op1_use >= 0 ) {
3464
3469
if ((ssa_op - 1 )-> op1_def == ssa_op -> op1_use ) {
3465
- prev_opcode = ssa_opcodes [(ssa_op - ssa -> ops ) - 1 ]-> opcode ;
3470
+ ssa_op -- ;
3471
+ opline = ssa_opcodes [ssa_op - ssa -> ops ];
3472
+ prev_opcode = opline -> opcode ;
3466
3473
if (prev_opcode == ZEND_PRE_INC
3467
3474
|| prev_opcode == ZEND_PRE_DEC
3468
3475
|| prev_opcode == ZEND_POST_INC
3469
3476
|| prev_opcode == ZEND_POST_DEC ) {
3470
- return 1 ;
3477
+ return ( OP1_INFO () & (( MAY_BE_UNDEF | MAY_BE_ANY | MAY_BE_REF ) - MAY_BE_LONG )) == 0 ;
3471
3478
}
3472
3479
} else if ((ssa_op - 1 )-> result_def == ssa_op -> op1_use ) {
3473
- prev_opcode = ssa_opcodes [(ssa_op - ssa -> ops ) - 1 ]-> opcode ;
3480
+ ssa_op -- ;
3481
+ opline = ssa_opcodes [ssa_op - ssa -> ops ];
3482
+ prev_opcode = opline -> opcode ;
3474
3483
if (prev_opcode == ZEND_ADD
3475
3484
|| prev_opcode == ZEND_SUB ) {
3476
- return 1 ;
3485
+ return (OP1_INFO () & ((MAY_BE_UNDEF |MAY_BE_ANY |MAY_BE_REF )- MAY_BE_LONG )) == 0 &&
3486
+ (OP2_INFO () & ((MAY_BE_UNDEF |MAY_BE_ANY |MAY_BE_REF )- MAY_BE_LONG )) == 0 ;
3477
3487
}
3478
3488
}
3479
3489
}
@@ -4777,9 +4787,9 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4777
4787
op2_info = OP2_INFO ();
4778
4788
skip_comparison =
4779
4789
ssa_op != ssa -> ops &&
4780
- (op1_info & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_LONG &&
4781
- (op2_info & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_LONG &&
4782
- zend_jit_may_skip_comparison (opline , ssa_op , ssa , ssa_opcodes );
4790
+ (op1_info & (MAY_BE_ANY |MAY_BE_UNDEF | MAY_BE_GUARD )) == MAY_BE_LONG &&
4791
+ (op2_info & (MAY_BE_ANY |MAY_BE_UNDEF | MAY_BE_GUARD )) == MAY_BE_LONG &&
4792
+ zend_jit_may_skip_comparison (opline , ssa_op , ssa , ssa_opcodes , op_array );
4783
4793
CHECK_OP1_TRACE_TYPE ();
4784
4794
CHECK_OP2_TRACE_TYPE ();
4785
4795
if ((opline -> result_type & (IS_SMART_BRANCH_JMPZ |IS_SMART_BRANCH_JMPNZ )) != 0 ) {
@@ -4825,9 +4835,9 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4825
4835
op2_info = OP2_INFO ();
4826
4836
skip_comparison =
4827
4837
ssa_op != ssa -> ops &&
4828
- (op1_info & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_LONG &&
4829
- (op2_info & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_LONG &&
4830
- zend_jit_may_skip_comparison (opline , ssa_op , ssa , ssa_opcodes );
4838
+ (op1_info & (MAY_BE_ANY |MAY_BE_UNDEF | MAY_BE_GUARD )) == MAY_BE_LONG &&
4839
+ (op2_info & (MAY_BE_ANY |MAY_BE_UNDEF | MAY_BE_GUARD )) == MAY_BE_LONG &&
4840
+ zend_jit_may_skip_comparison (opline , ssa_op , ssa , ssa_opcodes , op_array );
4831
4841
CHECK_OP1_TRACE_TYPE ();
4832
4842
CHECK_OP2_TRACE_TYPE ();
4833
4843
if ((opline -> result_type & (IS_SMART_BRANCH_JMPZ |IS_SMART_BRANCH_JMPNZ )) != 0 ) {
0 commit comments