@@ -470,7 +470,36 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
470
470
goto optimize_bool ;
471
471
}
472
472
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
+ }
473
478
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
+
474
503
case ZEND_BOOL :
475
504
case ZEND_BOOL_NOT :
476
505
optimize_bool :
@@ -803,7 +832,6 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
803
832
case ZEND_SR :
804
833
case ZEND_IS_SMALLER :
805
834
case ZEND_IS_SMALLER_OR_EQUAL :
806
- case ZEND_IS_IDENTICAL :
807
835
case ZEND_IS_NOT_IDENTICAL :
808
836
case ZEND_BOOL_XOR :
809
837
case ZEND_BW_OR :
0 commit comments