Skip to content

Commit 537c71a

Browse files
committed
Infer value is not undef within foreach; Speed up ZEND_IS_IDENTICAL
Add a specialized opcode handler to use for `===`/`!==` when: 1. At least one side is a $cv, and the other is a $cv or CONST (avoids the need to free operands) 2. Neither operand can be undefined or a reference (avoids the need for error handling and dereferencing) A separate bug in opcache discovered while working on this is that opcache infers that the variable can be undefined within the loop body. This seems to be unnecessary - the sources of blocks outside of the loop body include both FE_FETCH_R and FE_FETCH_RW. - My PR could probably be more precise for type inference. TODO: Are there any edge cases to consider for the global scope, and how would those be fixed? ``` // Elapsed time decreased from 0.275 seconds to 0.243 seconds function count_same(array $values) { $same = 0; foreach ($values as $x) { foreach ($values as $y) { if ($y === $x) { $same++; } } } return $same; } $values = range(0, 5000); $values[] = new stdClass(); $values[] = null; $values[] = 3; $start = microtime(true); $total = count_same($values); ```
1 parent 2ede8db commit 537c71a

File tree

4 files changed

+391
-251
lines changed

4 files changed

+391
-251
lines changed

Zend/zend_vm_def.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8751,6 +8751,35 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_NOT_EQUAL|ZEND_IS_NOT_IDENTICAL, (op1_info
87518751
ZEND_VM_SMART_BRANCH(result, 0);
87528752
}
87538753

8754+
ZEND_VM_TYPE_SPEC_HANDLER(ZEND_IS_IDENTICAL, 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)), ZEND_IS_IDENTICAL_NOTHROW, CV, CONST|CV, SPEC(COMMUTATIVE))
8755+
{
8756+
/* This is declared below the specializations for MAY_BE_LONG/MAY_BE_DOUBLE so those will be used instead if possible. */
8757+
/* This optimizes $x === SOME_CONST_EXPR and $x === $y for non-refs and non-undef, which can't throw. */
8758+
/* (Infinite recursion when comparing arrays is an uncatchable fatal error) */
8759+
USE_OPLINE
8760+
zval *op1, *op2;
8761+
zend_bool result;
8762+
8763+
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
8764+
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
8765+
result = fast_is_identical_function(op1, op2);
8766+
/* Free is a no-op for const/cv */
8767+
ZEND_VM_SMART_BRANCH(result, 0);
8768+
}
8769+
8770+
ZEND_VM_TYPE_SPEC_HANDLER(ZEND_IS_NOT_IDENTICAL, 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)), ZEND_IS_NOT_IDENTICAL_NOTHROW, CV, CONST|CV, SPEC(COMMUTATIVE))
8771+
{
8772+
USE_OPLINE
8773+
zval *op1, *op2;
8774+
zend_bool result;
8775+
8776+
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
8777+
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
8778+
result = fast_is_identical_function(op1, op2);
8779+
/* Free is a no-op for const/cv */
8780+
ZEND_VM_SMART_BRANCH(!result, 0);
8781+
}
8782+
87548783
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_SMALLER, (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_IS_SMALLER_LONG, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH,NO_CONST_CONST))
87558784
{
87568785
USE_OPLINE

Zend/zend_vm_execute.h

Lines changed: 118 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -40040,6 +40040,34 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_CV_CONST_HANDLER
4004040040
ZEND_VM_SMART_BRANCH(result, 1);
4004140041
}
4004240042

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+
4004340071
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4004440072
{
4004540073
USE_OPLINE
@@ -48119,6 +48147,34 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_
4811948147
ZEND_VM_RETURN();
4812048148
}
4812148149

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+
4812248178
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4812348179
{
4812448180
USE_OPLINE
@@ -50998,6 +51054,16 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5099851054
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
5099951055
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
5100051056
(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,
5100151067
(void*)&&ZEND_NULL_LABEL,
5100251068
(void*)&&ZEND_NULL_LABEL,
5100351069
(void*)&&ZEND_NULL_LABEL,
@@ -55003,6 +55069,14 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5500355069
VM_TRACE(ZEND_IN_ARRAY_SPEC_CV_CONST)
5500455070
ZEND_IN_ARRAY_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
5500555071
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();
5500655080
HYBRID_CASE(ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST):
5500755081
VM_TRACE(ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST)
5500855082
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)
5557555649
VM_TRACE(ZEND_YIELD_SPEC_CV_CV)
5557655650
ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
5557755651
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();
5557855660
HYBRID_CASE(HYBRID_HALT):
5557955661
#ifdef ZEND_VM_FP_GLOBAL_REG
5558055662
execute_data = orig_execute_data;
@@ -58486,6 +58568,16 @@ void zend_vm_init(void)
5848658568
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
5848758569
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
5848858570
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,
5848958581
ZEND_NULL_HANDLER,
5849058582
ZEND_NULL_HANDLER,
5849158583
ZEND_NULL_HANDLER,
@@ -59050,7 +59142,7 @@ void zend_vm_init(void)
5905059142
2280,
5905159143
2281 | SPEC_RULE_OP1,
5905259144
2286 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
59053-
3203
59145+
3213
5905459146
};
5905559147
#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
5905659148
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
5928559377
break;
5928659378
}
5928759379
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;
5928859382
}
5928959383
break;
5929059384
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
5930159395
break;
5930259396
}
5930359397
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;
5930459400
}
5930559401
break;
5930659402
case ZEND_IS_EQUAL:
@@ -59340,62 +59436,62 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
5934059436
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
5934159437
break;
5934259438
}
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;
5934459440
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
5934559441
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
5934659442
break;
5934759443
}
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;
5934959445
}
5935059446
break;
5935159447
case ZEND_IS_SMALLER_OR_EQUAL:
5935259448
if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
5935359449
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
5935459450
break;
5935559451
}
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;
5935759453
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
5935859454
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
5935959455
break;
5936059456
}
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;
5936259458
}
5936359459
break;
5936459460
case ZEND_QM_ASSIGN:
5936559461
if (op1_info == MAY_BE_LONG) {
59366-
spec = 3149 | SPEC_RULE_OP1;
59462+
spec = 3159 | SPEC_RULE_OP1;
5936759463
} else if (op1_info == MAY_BE_DOUBLE) {
59368-
spec = 3154 | SPEC_RULE_OP1;
59464+
spec = 3164 | SPEC_RULE_OP1;
5936959465
} 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;
5937159467
}
5937259468
break;
5937359469
case ZEND_PRE_INC:
5937459470
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
59375-
spec = 3137 | SPEC_RULE_RETVAL;
59471+
spec = 3147 | SPEC_RULE_RETVAL;
5937659472
} else if (op1_info == MAY_BE_LONG) {
59377-
spec = 3139 | SPEC_RULE_RETVAL;
59473+
spec = 3149 | SPEC_RULE_RETVAL;
5937859474
}
5937959475
break;
5938059476
case ZEND_PRE_DEC:
5938159477
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
59382-
spec = 3141 | SPEC_RULE_RETVAL;
59478+
spec = 3151 | SPEC_RULE_RETVAL;
5938359479
} else if (op1_info == MAY_BE_LONG) {
59384-
spec = 3143 | SPEC_RULE_RETVAL;
59480+
spec = 3153 | SPEC_RULE_RETVAL;
5938559481
}
5938659482
break;
5938759483
case ZEND_POST_INC:
5938859484
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
59389-
spec = 3145;
59485+
spec = 3155;
5939059486
} else if (op1_info == MAY_BE_LONG) {
59391-
spec = 3146;
59487+
spec = 3156;
5939259488
}
5939359489
break;
5939459490
case ZEND_POST_DEC:
5939559491
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
59396-
spec = 3147;
59492+
spec = 3157;
5939759493
} else if (op1_info == MAY_BE_LONG) {
59398-
spec = 3148;
59494+
spec = 3158;
5939959495
}
5940059496
break;
5940159497
case ZEND_JMP:
@@ -59405,35 +59501,35 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
5940559501
break;
5940659502
case ZEND_SEND_VAL:
5940759503
if (op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) {
59408-
spec = 3199;
59504+
spec = 3209;
5940959505
}
5941059506
break;
5941159507
case ZEND_SEND_VAR_EX:
5941259508
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;
5941459510
}
5941559511
break;
5941659512
case ZEND_FE_FETCH_R:
5941759513
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;
5941959515
}
5942059516
break;
5942159517
case ZEND_FETCH_DIM_R:
5942259518
if (!(op2_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) {
5942359519
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
5942459520
break;
5942559521
}
59426-
spec = 3164 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
59522+
spec = 3174 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
5942759523
}
5942859524
break;
5942959525
case ZEND_SEND_VAL_EX:
5943059526
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;
5943259528
}
5943359529
break;
5943459530
case ZEND_SEND_VAR:
5943559531
if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
59436-
spec = 3189 | SPEC_RULE_OP1;
59532+
spec = 3199 | SPEC_RULE_OP1;
5943759533
}
5943859534
break;
5943959535
case ZEND_BW_OR:

0 commit comments

Comments
 (0)