From a0b55e6a3703268871dd53bd295d6bbc1fd890b0 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 1 Jul 2015 16:31:20 +0300 Subject: [PATCH] Cleanup (updated comments about optimization of comparison with IS_NULL) --- ext/opcache/Optimizer/block_pass.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/ext/opcache/Optimizer/block_pass.c b/ext/opcache/Optimizer/block_pass.c index f4753ed080..a810829628 100644 --- a/ext/opcache/Optimizer/block_pass.c +++ b/ext/opcache/Optimizer/block_pass.c @@ -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; -- 2.50.1