From: Dmitry Stogov Date: Wed, 1 Jul 2015 13:31:20 +0000 (+0300) Subject: Cleanup (updated comments about optimization of comparison with IS_NULL) X-Git-Tag: php-7.1.0alpha3~25^2~83 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a0b55e6a3703268871dd53bd295d6bbc1fd890b0;p=php Cleanup (updated comments about optimization of comparison with IS_NULL) --- 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;