@@ -40258,6 +40258,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_CV_CONST_HANDLER
40258
40258
ZEND_VM_SMART_BRANCH(result, 1);
40259
40259
}
40260
40260
40261
+ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
40262
+ {
40263
+ /* This is declared below the specializations for MAY_BE_LONG/MAY_BE_DOUBLE so those will be used instead if possible. */
40264
+ /* This optimizes $x === SOME_CONST_EXPR and $x === $y for non-refs and non-undef, which can't throw. */
40265
+ /* (Infinite recursion when comparing arrays is an uncatchable fatal error) */
40266
+ USE_OPLINE
40267
+ zval *op1, *op2;
40268
+ zend_bool result;
40269
+
40270
+ op1 = EX_VAR(opline->op1.var);
40271
+ op2 = RT_CONSTANT(opline, opline->op2);
40272
+ result = fast_is_identical_function(op1, op2);
40273
+ /* Free is a no-op for const/cv */
40274
+ ZEND_VM_SMART_BRANCH(result, 0);
40275
+ }
40276
+
40277
+ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
40278
+ {
40279
+ USE_OPLINE
40280
+ zval *op1, *op2;
40281
+ zend_bool result;
40282
+
40283
+ op1 = EX_VAR(opline->op1.var);
40284
+ op2 = RT_CONSTANT(opline, opline->op2);
40285
+ result = fast_is_identical_function(op1, op2);
40286
+ /* Free is a no-op for const/cv */
40287
+ ZEND_VM_SMART_BRANCH(!result, 0);
40288
+ }
40289
+
40261
40290
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
40262
40291
{
40263
40292
USE_OPLINE
@@ -48385,6 +48414,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_
48385
48414
ZEND_VM_RETURN();
48386
48415
}
48387
48416
48417
+ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
48418
+ {
48419
+ /* This is declared below the specializations for MAY_BE_LONG/MAY_BE_DOUBLE so those will be used instead if possible. */
48420
+ /* This optimizes $x === SOME_CONST_EXPR and $x === $y for non-refs and non-undef, which can't throw. */
48421
+ /* (Infinite recursion when comparing arrays is an uncatchable fatal error) */
48422
+ USE_OPLINE
48423
+ zval *op1, *op2;
48424
+ zend_bool result;
48425
+
48426
+ op1 = EX_VAR(opline->op1.var);
48427
+ op2 = EX_VAR(opline->op2.var);
48428
+ result = fast_is_identical_function(op1, op2);
48429
+ /* Free is a no-op for const/cv */
48430
+ ZEND_VM_SMART_BRANCH(result, 0);
48431
+ }
48432
+
48433
+ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
48434
+ {
48435
+ USE_OPLINE
48436
+ zval *op1, *op2;
48437
+ zend_bool result;
48438
+
48439
+ op1 = EX_VAR(opline->op1.var);
48440
+ op2 = EX_VAR(opline->op2.var);
48441
+ result = fast_is_identical_function(op1, op2);
48442
+ /* Free is a no-op for const/cv */
48443
+ ZEND_VM_SMART_BRANCH(!result, 0);
48444
+ }
48445
+
48388
48446
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
48389
48447
{
48390
48448
USE_OPLINE
@@ -51265,6 +51323,16 @@ ZEND_API void execute_ex(zend_execute_data *ex)
51265
51323
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
51266
51324
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
51267
51325
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
51326
+ (void*)&&ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST_LABEL,
51327
+ (void*)&&ZEND_NULL_LABEL,
51328
+ (void*)&&ZEND_NULL_LABEL,
51329
+ (void*)&&ZEND_NULL_LABEL,
51330
+ (void*)&&ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV_LABEL,
51331
+ (void*)&&ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST_LABEL,
51332
+ (void*)&&ZEND_NULL_LABEL,
51333
+ (void*)&&ZEND_NULL_LABEL,
51334
+ (void*)&&ZEND_NULL_LABEL,
51335
+ (void*)&&ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV_LABEL,
51268
51336
(void*)&&ZEND_NULL_LABEL,
51269
51337
(void*)&&ZEND_NULL_LABEL,
51270
51338
(void*)&&ZEND_NULL_LABEL,
@@ -55291,6 +55359,14 @@ ZEND_API void execute_ex(zend_execute_data *ex)
55291
55359
VM_TRACE(ZEND_IN_ARRAY_SPEC_CV_CONST)
55292
55360
ZEND_IN_ARRAY_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
55293
55361
HYBRID_BREAK();
55362
+ HYBRID_CASE(ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST):
55363
+ VM_TRACE(ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST)
55364
+ ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
55365
+ HYBRID_BREAK();
55366
+ HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST):
55367
+ VM_TRACE(ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST)
55368
+ ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
55369
+ HYBRID_BREAK();
55294
55370
HYBRID_CASE(ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST):
55295
55371
VM_TRACE(ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST)
55296
55372
ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -55863,6 +55939,14 @@ ZEND_API void execute_ex(zend_execute_data *ex)
55863
55939
VM_TRACE(ZEND_YIELD_SPEC_CV_CV)
55864
55940
ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
55865
55941
HYBRID_BREAK();
55942
+ HYBRID_CASE(ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV):
55943
+ VM_TRACE(ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV)
55944
+ ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
55945
+ HYBRID_BREAK();
55946
+ HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV):
55947
+ VM_TRACE(ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV)
55948
+ ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
55949
+ HYBRID_BREAK();
55866
55950
HYBRID_CASE(HYBRID_HALT):
55867
55951
#ifdef ZEND_VM_FP_GLOBAL_REG
55868
55952
execute_data = orig_execute_data;
@@ -58775,6 +58859,16 @@ void zend_vm_init(void)
58775
58859
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
58776
58860
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
58777
58861
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
58862
+ ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST_HANDLER,
58863
+ ZEND_NULL_HANDLER,
58864
+ ZEND_NULL_HANDLER,
58865
+ ZEND_NULL_HANDLER,
58866
+ ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV_HANDLER,
58867
+ ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST_HANDLER,
58868
+ ZEND_NULL_HANDLER,
58869
+ ZEND_NULL_HANDLER,
58870
+ ZEND_NULL_HANDLER,
58871
+ ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV_HANDLER,
58778
58872
ZEND_NULL_HANDLER,
58779
58873
ZEND_NULL_HANDLER,
58780
58874
ZEND_NULL_HANDLER,
@@ -59339,7 +59433,7 @@ void zend_vm_init(void)
59339
59433
2280,
59340
59434
2281 | SPEC_RULE_OP1,
59341
59435
2286 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
59342
- 3204
59436
+ 3214
59343
59437
};
59344
59438
#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
59345
59439
zend_opcode_handler_funcs = labels;
@@ -59574,6 +59668,8 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
59574
59668
break;
59575
59669
}
59576
59670
spec = 2613 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
59671
+ } else if (op->op1_type == IS_CV && (op->op2_type & (IS_CONST|IS_CV)) && !(op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_REF))) {
59672
+ spec = 2838 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
59577
59673
}
59578
59674
break;
59579
59675
case ZEND_IS_NOT_IDENTICAL:
@@ -59590,6 +59686,8 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
59590
59686
break;
59591
59687
}
59592
59688
spec = 2763 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
59689
+ } else if (op->op1_type == IS_CV && (op->op2_type & (IS_CONST|IS_CV)) && !(op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_REF))) {
59690
+ spec = 2843 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
59593
59691
}
59594
59692
break;
59595
59693
case ZEND_IS_EQUAL:
@@ -59629,62 +59727,62 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
59629
59727
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
59630
59728
break;
59631
59729
}
59632
- spec = 2838 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
59730
+ spec = 2848 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
59633
59731
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
59634
59732
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
59635
59733
break;
59636
59734
}
59637
- spec = 2913 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
59735
+ spec = 2923 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
59638
59736
}
59639
59737
break;
59640
59738
case ZEND_IS_SMALLER_OR_EQUAL:
59641
59739
if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
59642
59740
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
59643
59741
break;
59644
59742
}
59645
- spec = 2988 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
59743
+ spec = 2998 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
59646
59744
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
59647
59745
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
59648
59746
break;
59649
59747
}
59650
- spec = 3063 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
59748
+ spec = 3073 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
59651
59749
}
59652
59750
break;
59653
59751
case ZEND_QM_ASSIGN:
59654
59752
if (op1_info == MAY_BE_LONG) {
59655
- spec = 3150 | SPEC_RULE_OP1;
59753
+ spec = 3160 | SPEC_RULE_OP1;
59656
59754
} else if (op1_info == MAY_BE_DOUBLE) {
59657
- spec = 3155 | SPEC_RULE_OP1;
59755
+ spec = 3165 | SPEC_RULE_OP1;
59658
59756
} else if ((op->op1_type == IS_CONST) ? !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1)) : (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE))))) {
59659
- spec = 3160 | SPEC_RULE_OP1;
59757
+ spec = 3170 | SPEC_RULE_OP1;
59660
59758
}
59661
59759
break;
59662
59760
case ZEND_PRE_INC:
59663
59761
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
59664
- spec = 3138 | SPEC_RULE_RETVAL;
59762
+ spec = 3148 | SPEC_RULE_RETVAL;
59665
59763
} else if (op1_info == MAY_BE_LONG) {
59666
- spec = 3140 | SPEC_RULE_RETVAL;
59764
+ spec = 3150 | SPEC_RULE_RETVAL;
59667
59765
}
59668
59766
break;
59669
59767
case ZEND_PRE_DEC:
59670
59768
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
59671
- spec = 3142 | SPEC_RULE_RETVAL;
59769
+ spec = 3152 | SPEC_RULE_RETVAL;
59672
59770
} else if (op1_info == MAY_BE_LONG) {
59673
- spec = 3144 | SPEC_RULE_RETVAL;
59771
+ spec = 3154 | SPEC_RULE_RETVAL;
59674
59772
}
59675
59773
break;
59676
59774
case ZEND_POST_INC:
59677
59775
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
59678
- spec = 3146 ;
59776
+ spec = 3156 ;
59679
59777
} else if (op1_info == MAY_BE_LONG) {
59680
- spec = 3147 ;
59778
+ spec = 3157 ;
59681
59779
}
59682
59780
break;
59683
59781
case ZEND_POST_DEC:
59684
59782
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
59685
- spec = 3148 ;
59783
+ spec = 3158 ;
59686
59784
} else if (op1_info == MAY_BE_LONG) {
59687
- spec = 3149 ;
59785
+ spec = 3159 ;
59688
59786
}
59689
59787
break;
59690
59788
case ZEND_JMP:
@@ -59699,35 +59797,35 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
59699
59797
break;
59700
59798
case ZEND_SEND_VAL:
59701
59799
if (op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) {
59702
- spec = 3200 ;
59800
+ spec = 3210 ;
59703
59801
}
59704
59802
break;
59705
59803
case ZEND_SEND_VAR_EX:
59706
59804
if (op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
59707
- spec = 3195 | SPEC_RULE_OP1;
59805
+ spec = 3205 | SPEC_RULE_OP1;
59708
59806
}
59709
59807
break;
59710
59808
case ZEND_FE_FETCH_R:
59711
59809
if (op->op2_type == IS_CV && (op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY) {
59712
- spec = 3202 | SPEC_RULE_RETVAL;
59810
+ spec = 3212 | SPEC_RULE_RETVAL;
59713
59811
}
59714
59812
break;
59715
59813
case ZEND_FETCH_DIM_R:
59716
59814
if (!(op2_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) {
59717
59815
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
59718
59816
break;
59719
59817
}
59720
- spec = 3165 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
59818
+ spec = 3175 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
59721
59819
}
59722
59820
break;
59723
59821
case ZEND_SEND_VAL_EX:
59724
59822
if (op->op2.num <= MAX_ARG_FLAG_NUM && op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) {
59725
- spec = 3201 ;
59823
+ spec = 3211 ;
59726
59824
}
59727
59825
break;
59728
59826
case ZEND_SEND_VAR:
59729
59827
if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
59730
- spec = 3190 | SPEC_RULE_OP1;
59828
+ spec = 3200 | SPEC_RULE_OP1;
59731
59829
}
59732
59830
break;
59733
59831
case ZEND_BW_OR:
0 commit comments