]> granicus.if.org Git - php/commitdiff
Cleanup (updated comments about optimization of comparison with IS_NULL)
authorDmitry Stogov <dmitry@zend.com>
Wed, 1 Jul 2015 13:31:20 +0000 (16:31 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 1 Jul 2015 13:31:20 +0000 (16:31 +0300)
ext/opcache/Optimizer/block_pass.c

index f4753ed0801718b8825a1e94c711539b2633df4f..a8108296286ca8afc1870bda3763c5b03aae91a1 100644 (file)
@@ -764,26 +764,30 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array,
                        opline->opcode == ZEND_IS_NOT_EQUAL ||
                        opline->opcode == ZEND_CASE) {
                        if (ZEND_OP1_TYPE(opline) == IS_CONST &&
-// TODO: Optimization of comparison with null may be not safe ???
-#if 1
                                (Z_TYPE(ZEND_OP1_LITERAL(opline)) == IS_FALSE ||
                                 Z_TYPE(ZEND_OP1_LITERAL(opline)) == IS_TRUE)) {
-#else
-                                Z_TYPE(ZEND_OP1_LITERAL(opline)) <= IS_TRUE) {
-#endif
+                               /* T = IS_EQUAL(TRUE,  X)     => T = BOOL(X) */
+                               /* T = IS_EQUAL(FALSE, X)     => T = BOOL_NOT(X) */
+                               /* T = IS_NOT_EQUAL(TRUE,  X) => T = BOOL_NOT(X) */
+                               /* T = IS_NOT_EQUAL(FALSE, X) => T = BOOL(X) */
+                               /* Optimization of comparison with "null" is not safe,
+                                * because ("0" == null) is not equal to !("0")
+                                */
                                opline->opcode =
                                        ((opline->opcode != ZEND_IS_NOT_EQUAL) == ((Z_TYPE(ZEND_OP1_LITERAL(opline))) == IS_TRUE)) ?
                                        ZEND_BOOL : ZEND_BOOL_NOT;
                                COPY_NODE(opline->op1, opline->op2);
                                SET_UNUSED(opline->op2);
                        } else if (ZEND_OP2_TYPE(opline) == IS_CONST &&
-// TODO: Optimization of comparison with null may be not safe ???
-#if 1
                                           (Z_TYPE(ZEND_OP2_LITERAL(opline)) == IS_FALSE ||
                                            Z_TYPE(ZEND_OP2_LITERAL(opline)) == IS_TRUE)) {
-#else
-                                           Z_TYPE(ZEND_OP2_LITERAL(opline)) <= IS_TRUE) {
-#endif
+                               /* T = IS_EQUAL(X, TRUE)      => T = BOOL(X) */
+                               /* T = IS_EQUAL(X, FALSE)     => T = BOOL_NOT(X) */
+                               /* T = IS_NOT_EQUAL(X, TRUE)  => T = BOOL_NOT(X) */
+                               /* T = IS_NOT_EQUAL(X, FALSE) => T = BOOL(X) */
+                               /* Optimization of comparison with "null" is not safe,
+                                * because ("0" == null) is not equal to !("0")
+                                */
                                opline->opcode =
                                        ((opline->opcode != ZEND_IS_NOT_EQUAL) == ((Z_TYPE(ZEND_OP2_LITERAL(opline))) == IS_TRUE)) ?
                                        ZEND_BOOL : ZEND_BOOL_NOT;