@@ -40040,6 +40040,34 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_CV_CONST_HANDLER
40040
40040
ZEND_VM_SMART_BRANCH(result, 1);
40041
40041
}
40042
40042
40043
+ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
40044
+ {
40045
+ /* This is declared below the specializations for MAY_BE_LONG/MAY_BE_DOUBLE so those will be used instead if possible. */
40046
+ /* This optimizes $x === SOME_CONST_EXPR and $x === $y for non-refs and non-arrays, which can't throw. */
40047
+ USE_OPLINE
40048
+ zval *op1, *op2;
40049
+ zend_bool result;
40050
+
40051
+ op1 = EX_VAR(opline->op1.var);
40052
+ op2 = RT_CONSTANT(opline, opline->op2);
40053
+ result = fast_is_identical_function(op1, op2);
40054
+ /* Free is a no-op for const/cv */
40055
+ ZEND_VM_SMART_BRANCH(result, 0);
40056
+ }
40057
+
40058
+ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
40059
+ {
40060
+ USE_OPLINE
40061
+ zval *op1, *op2;
40062
+ zend_bool result;
40063
+
40064
+ op1 = EX_VAR(opline->op1.var);
40065
+ op2 = RT_CONSTANT(opline, opline->op2);
40066
+ result = fast_is_identical_function(op1, op2);
40067
+ /* Free is a no-op for const/cv */
40068
+ ZEND_VM_SMART_BRANCH(!result, 0);
40069
+ }
40070
+
40043
40071
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
40044
40072
{
40045
40073
USE_OPLINE
@@ -48119,6 +48147,34 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_
48119
48147
ZEND_VM_RETURN();
48120
48148
}
48121
48149
48150
+ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
48151
+ {
48152
+ /* This is declared below the specializations for MAY_BE_LONG/MAY_BE_DOUBLE so those will be used instead if possible. */
48153
+ /* This optimizes $x === SOME_CONST_EXPR and $x === $y for non-refs and non-arrays, which can't throw. */
48154
+ USE_OPLINE
48155
+ zval *op1, *op2;
48156
+ zend_bool result;
48157
+
48158
+ op1 = EX_VAR(opline->op1.var);
48159
+ op2 = EX_VAR(opline->op2.var);
48160
+ result = fast_is_identical_function(op1, op2);
48161
+ /* Free is a no-op for const/cv */
48162
+ ZEND_VM_SMART_BRANCH(result, 0);
48163
+ }
48164
+
48165
+ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
48166
+ {
48167
+ USE_OPLINE
48168
+ zval *op1, *op2;
48169
+ zend_bool result;
48170
+
48171
+ op1 = EX_VAR(opline->op1.var);
48172
+ op2 = EX_VAR(opline->op2.var);
48173
+ result = fast_is_identical_function(op1, op2);
48174
+ /* Free is a no-op for const/cv */
48175
+ ZEND_VM_SMART_BRANCH(!result, 0);
48176
+ }
48177
+
48122
48178
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
48123
48179
{
48124
48180
USE_OPLINE
@@ -50998,6 +51054,16 @@ ZEND_API void execute_ex(zend_execute_data *ex)
50998
51054
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
50999
51055
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
51000
51056
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
51057
+ (void*)&&ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST_LABEL,
51058
+ (void*)&&ZEND_NULL_LABEL,
51059
+ (void*)&&ZEND_NULL_LABEL,
51060
+ (void*)&&ZEND_NULL_LABEL,
51061
+ (void*)&&ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV_LABEL,
51062
+ (void*)&&ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST_LABEL,
51063
+ (void*)&&ZEND_NULL_LABEL,
51064
+ (void*)&&ZEND_NULL_LABEL,
51065
+ (void*)&&ZEND_NULL_LABEL,
51066
+ (void*)&&ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV_LABEL,
51001
51067
(void*)&&ZEND_NULL_LABEL,
51002
51068
(void*)&&ZEND_NULL_LABEL,
51003
51069
(void*)&&ZEND_NULL_LABEL,
@@ -55003,6 +55069,14 @@ ZEND_API void execute_ex(zend_execute_data *ex)
55003
55069
VM_TRACE(ZEND_IN_ARRAY_SPEC_CV_CONST)
55004
55070
ZEND_IN_ARRAY_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
55005
55071
HYBRID_BREAK();
55072
+ HYBRID_CASE(ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST):
55073
+ VM_TRACE(ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST)
55074
+ ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
55075
+ HYBRID_BREAK();
55076
+ HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST):
55077
+ VM_TRACE(ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST)
55078
+ ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
55079
+ HYBRID_BREAK();
55006
55080
HYBRID_CASE(ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST):
55007
55081
VM_TRACE(ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST)
55008
55082
ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -55575,6 +55649,14 @@ ZEND_API void execute_ex(zend_execute_data *ex)
55575
55649
VM_TRACE(ZEND_YIELD_SPEC_CV_CV)
55576
55650
ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
55577
55651
HYBRID_BREAK();
55652
+ HYBRID_CASE(ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV):
55653
+ VM_TRACE(ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV)
55654
+ ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
55655
+ HYBRID_BREAK();
55656
+ HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV):
55657
+ VM_TRACE(ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV)
55658
+ ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
55659
+ HYBRID_BREAK();
55578
55660
HYBRID_CASE(HYBRID_HALT):
55579
55661
#ifdef ZEND_VM_FP_GLOBAL_REG
55580
55662
execute_data = orig_execute_data;
@@ -58486,6 +58568,16 @@ void zend_vm_init(void)
58486
58568
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
58487
58569
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
58488
58570
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
58571
+ ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST_HANDLER,
58572
+ ZEND_NULL_HANDLER,
58573
+ ZEND_NULL_HANDLER,
58574
+ ZEND_NULL_HANDLER,
58575
+ ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV_HANDLER,
58576
+ ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST_HANDLER,
58577
+ ZEND_NULL_HANDLER,
58578
+ ZEND_NULL_HANDLER,
58579
+ ZEND_NULL_HANDLER,
58580
+ ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV_HANDLER,
58489
58581
ZEND_NULL_HANDLER,
58490
58582
ZEND_NULL_HANDLER,
58491
58583
ZEND_NULL_HANDLER,
@@ -59050,7 +59142,7 @@ void zend_vm_init(void)
59050
59142
2280,
59051
59143
2281 | SPEC_RULE_OP1,
59052
59144
2286 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
59053
- 3203
59145
+ 3213
59054
59146
};
59055
59147
#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
59056
59148
zend_opcode_handler_funcs = labels;
@@ -59285,6 +59377,8 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
59285
59377
break;
59286
59378
}
59287
59379
spec = 2612 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
59380
+ } 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))) {
59381
+ spec = 2837 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
59288
59382
}
59289
59383
break;
59290
59384
case ZEND_IS_NOT_IDENTICAL:
@@ -59301,6 +59395,8 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
59301
59395
break;
59302
59396
}
59303
59397
spec = 2762 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
59398
+ } 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))) {
59399
+ spec = 2842 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
59304
59400
}
59305
59401
break;
59306
59402
case ZEND_IS_EQUAL:
@@ -59340,62 +59436,62 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
59340
59436
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
59341
59437
break;
59342
59438
}
59343
- spec = 2837 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
59439
+ spec = 2847 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
59344
59440
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
59345
59441
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
59346
59442
break;
59347
59443
}
59348
- spec = 2912 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
59444
+ spec = 2922 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
59349
59445
}
59350
59446
break;
59351
59447
case ZEND_IS_SMALLER_OR_EQUAL:
59352
59448
if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
59353
59449
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
59354
59450
break;
59355
59451
}
59356
- spec = 2987 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
59452
+ spec = 2997 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
59357
59453
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
59358
59454
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
59359
59455
break;
59360
59456
}
59361
- spec = 3062 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
59457
+ spec = 3072 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
59362
59458
}
59363
59459
break;
59364
59460
case ZEND_QM_ASSIGN:
59365
59461
if (op1_info == MAY_BE_LONG) {
59366
- spec = 3149 | SPEC_RULE_OP1;
59462
+ spec = 3159 | SPEC_RULE_OP1;
59367
59463
} else if (op1_info == MAY_BE_DOUBLE) {
59368
- spec = 3154 | SPEC_RULE_OP1;
59464
+ spec = 3164 | SPEC_RULE_OP1;
59369
59465
} 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))))) {
59370
- spec = 3159 | SPEC_RULE_OP1;
59466
+ spec = 3169 | SPEC_RULE_OP1;
59371
59467
}
59372
59468
break;
59373
59469
case ZEND_PRE_INC:
59374
59470
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
59375
- spec = 3137 | SPEC_RULE_RETVAL;
59471
+ spec = 3147 | SPEC_RULE_RETVAL;
59376
59472
} else if (op1_info == MAY_BE_LONG) {
59377
- spec = 3139 | SPEC_RULE_RETVAL;
59473
+ spec = 3149 | SPEC_RULE_RETVAL;
59378
59474
}
59379
59475
break;
59380
59476
case ZEND_PRE_DEC:
59381
59477
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
59382
- spec = 3141 | SPEC_RULE_RETVAL;
59478
+ spec = 3151 | SPEC_RULE_RETVAL;
59383
59479
} else if (op1_info == MAY_BE_LONG) {
59384
- spec = 3143 | SPEC_RULE_RETVAL;
59480
+ spec = 3153 | SPEC_RULE_RETVAL;
59385
59481
}
59386
59482
break;
59387
59483
case ZEND_POST_INC:
59388
59484
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
59389
- spec = 3145 ;
59485
+ spec = 3155 ;
59390
59486
} else if (op1_info == MAY_BE_LONG) {
59391
- spec = 3146 ;
59487
+ spec = 3156 ;
59392
59488
}
59393
59489
break;
59394
59490
case ZEND_POST_DEC:
59395
59491
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
59396
- spec = 3147 ;
59492
+ spec = 3157 ;
59397
59493
} else if (op1_info == MAY_BE_LONG) {
59398
- spec = 3148 ;
59494
+ spec = 3158 ;
59399
59495
}
59400
59496
break;
59401
59497
case ZEND_JMP:
@@ -59405,35 +59501,35 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
59405
59501
break;
59406
59502
case ZEND_SEND_VAL:
59407
59503
if (op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) {
59408
- spec = 3199 ;
59504
+ spec = 3209 ;
59409
59505
}
59410
59506
break;
59411
59507
case ZEND_SEND_VAR_EX:
59412
59508
if (op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
59413
- spec = 3194 | SPEC_RULE_OP1;
59509
+ spec = 3204 | SPEC_RULE_OP1;
59414
59510
}
59415
59511
break;
59416
59512
case ZEND_FE_FETCH_R:
59417
59513
if (op->op2_type == IS_CV && (op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY) {
59418
- spec = 3201 | SPEC_RULE_RETVAL;
59514
+ spec = 3211 | SPEC_RULE_RETVAL;
59419
59515
}
59420
59516
break;
59421
59517
case ZEND_FETCH_DIM_R:
59422
59518
if (!(op2_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) {
59423
59519
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
59424
59520
break;
59425
59521
}
59426
- spec = 3164 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
59522
+ spec = 3174 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
59427
59523
}
59428
59524
break;
59429
59525
case ZEND_SEND_VAL_EX:
59430
59526
if (op->op2.num <= MAX_ARG_FLAG_NUM && op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) {
59431
- spec = 3200 ;
59527
+ spec = 3210 ;
59432
59528
}
59433
59529
break;
59434
59530
case ZEND_SEND_VAR:
59435
59531
if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
59436
- spec = 3189 | SPEC_RULE_OP1;
59532
+ spec = 3199 | SPEC_RULE_OP1;
59437
59533
}
59438
59534
break;
59439
59535
case ZEND_BW_OR:
0 commit comments