@@ -436,18 +436,11 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
436
436
Tsource [VAR_NUM (opline -> op1 .var )] = NULL ;
437
437
break ;
438
438
}
439
- ZEND_FALLTHROUGH ;
440
-
441
- case ZEND_IS_EQUAL :
442
- case ZEND_IS_NOT_EQUAL :
443
439
if (opline -> op1_type == IS_CONST &&
444
440
opline -> op2_type == IS_CONST ) {
445
441
goto optimize_constant_binary_op ;
446
442
}
447
- /* IS_EQ(TRUE, X) => BOOL(X)
448
- * IS_EQ(FALSE, X) => BOOL_NOT(X)
449
- * IS_NOT_EQ(TRUE, X) => BOOL_NOT(X)
450
- * IS_NOT_EQ(FALSE, X) => BOOL(X)
443
+ /*
451
444
* CASE(TRUE, X) => BOOL(X)
452
445
* CASE(FALSE, X) => BOOL_NOT(X)
453
446
*/
@@ -478,6 +471,21 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
478
471
goto optimize_bool ;
479
472
}
480
473
break ;
474
+
475
+ case ZEND_IS_EQUAL :
476
+ case ZEND_IS_NOT_EQUAL :
477
+ if (opline -> op1_type == IS_CONST &&
478
+ opline -> op2_type == IS_CONST ) {
479
+ goto optimize_constant_binary_op ;
480
+ }
481
+ /* IS_EQ(TRUE, X) => BOOL(X)
482
+ * IS_EQ(FALSE, X) => BOOL_NOT(X)
483
+ * IS_NOT_EQ(TRUE, X) => BOOL_NOT(X)
484
+ * IS_NOT_EQ(FALSE, X) => BOOL(X)
485
+ * Those optimizations are not safe if the other operand ends up being NAN
486
+ * as BOOL/BOOL_NOT will warn, while IS_EQUAL/IS_NOT_EQUAL do not.
487
+ */
488
+ break ;
481
489
case ZEND_IS_IDENTICAL :
482
490
if (opline -> op1_type == IS_CONST &&
483
491
opline -> op2_type == IS_CONST ) {
0 commit comments