@@ -470,7 +470,36 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
470470 goto optimize_bool ;
471471 }
472472 break ;
473+ case ZEND_IS_IDENTICAL :
474+ if (opline -> op1_type == IS_CONST &&
475+ opline -> op2_type == IS_CONST ) {
476+ goto optimize_constant_binary_op ;
477+ }
473478
479+ if (opline -> op1_type == IS_CONST &&
480+ (Z_TYPE (ZEND_OP1_LITERAL (opline )) <= IS_TRUE && Z_TYPE (ZEND_OP1_LITERAL (opline )) >= IS_NULL )) {
481+ /* IS_IDENTICAL(TRUE, T) => TYPE_CHECK(T, TRUE)
482+ * IS_IDENTICAL(FALSE, T) => TYPE_CHECK(T, FALSE)
483+ * IS_IDENTICAL(NULL, T) => TYPE_CHECK(T, NULL)
484+ */
485+ opline -> opcode = ZEND_TYPE_CHECK ;
486+ opline -> extended_value = (1 << Z_TYPE (ZEND_OP1_LITERAL (opline )));
487+ COPY_NODE (opline -> op1 , opline -> op2 );
488+ SET_UNUSED (opline -> op2 );
489+ ++ (* opt_count );
490+ } else if (opline -> op2_type == IS_CONST &&
491+ (Z_TYPE (ZEND_OP2_LITERAL (opline )) <= IS_TRUE && Z_TYPE (ZEND_OP2_LITERAL (opline )) >= IS_NULL )) {
492+ /* IS_IDENTICAL(T, TRUE) => TYPE_CHECK(T, TRUE)
493+ * IS_IDENTICAL(T, FALSE) => TYPE_CHECK(T, FALSE)
494+ * IS_IDENTICAL(T, NULL) => TYPE_CHECK(T, NULL)
495+ */
496+ opline -> opcode = ZEND_TYPE_CHECK ;
497+ opline -> extended_value = (1 << Z_TYPE (ZEND_OP2_LITERAL (opline )));
498+ SET_UNUSED (opline -> op2 );
499+ ++ (* opt_count );
500+ }
501+ break ;
502+
474503 case ZEND_BOOL :
475504 case ZEND_BOOL_NOT :
476505 optimize_bool :
@@ -803,7 +832,6 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
803832 case ZEND_SR :
804833 case ZEND_IS_SMALLER :
805834 case ZEND_IS_SMALLER_OR_EQUAL :
806- case ZEND_IS_IDENTICAL :
807835 case ZEND_IS_NOT_IDENTICAL :
808836 case ZEND_BOOL_XOR :
809837 case ZEND_BW_OR :
0 commit comments