@@ -436,18 +436,11 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
436436 Tsource [VAR_NUM (opline -> op1 .var )] = NULL ;
437437 break ;
438438 }
439- ZEND_FALLTHROUGH ;
440-
441- case ZEND_IS_EQUAL :
442- case ZEND_IS_NOT_EQUAL :
443439 if (opline -> op1_type == IS_CONST &&
444440 opline -> op2_type == IS_CONST ) {
445441 goto optimize_constant_binary_op ;
446442 }
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+ /*
451444 * CASE(TRUE, X) => BOOL(X)
452445 * CASE(FALSE, X) => BOOL_NOT(X)
453446 */
@@ -478,6 +471,21 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
478471 goto optimize_bool ;
479472 }
480473 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 ;
481489 case ZEND_IS_IDENTICAL :
482490 if (opline -> op1_type == IS_CONST &&
483491 opline -> op2_type == IS_CONST ) {
0 commit comments