com php-src: Fixed ZEND_CAST related optimizations (n ow it returns IS_VAR instead of IS_TMP_VAR) : ext/opcache/Optimizer/block_pass.c
ext/opcache/Opti mizer/pass1_5.c

From: Date: Thu, 17 Apr 2014 07:12:47 +0000
Subject: com php-src: Fixed ZEND_CAST related optimizations (n ow it returns IS_VAR instead of IS_TMP_VAR) : ext/opcache/Optimizer/block_pass.c
ext/opcache/Opti mizer/pass1_5.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-77358@lists.php.net to get a copy of this message
Commit: c92dd8eedf95f204520a3b2a15668d56a1aefbde Author: Dmitry Stogov <dmitry@zend.com> Thu, 17 Apr 2014 11:12:47 +0400 Parents: dfaf8b6d28442a7de74cff07bd7258b072a45b31 Branches: phpng Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=c92dd8eedf95f204520a3b2a15668d56a1aefbde Log: Fixed ZEND_CAST related optimizations (now it returns IS_VAR instead of IS_TMP_VAR) Changed paths: M ext/opcache/Optimizer/block_pass.c M ext/opcache/Optimizer/pass1_5.c Diff: diff --git a/ext/opcache/Optimizer/block_pass.c b/ext/opcache/Optimizer/block_pass.c index 86db53f..708bdd4 100644 --- a/ext/opcache/Optimizer/block_pass.c +++ b/ext/opcache/Optimizer/block_pass.c @@ -683,7 +683,7 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array, /* T = CAST(X, String), ECHO(T) => NOP, ECHO(X) */ if ((opline->opcode == ZEND_ECHO || opline->opcode == ZEND_PRINT) && - ZEND_OP1_TYPE(opline) == IS_TMP_VAR && + ZEND_OP1_TYPE(opline) & (IS_TMP_VAR|IS_VAR) && VAR_SOURCE(opline->op1) && VAR_SOURCE(opline->op1)->opcode == ZEND_CAST && VAR_SOURCE(opline->op1)->extended_value == IS_STRING) { @@ -1118,6 +1118,10 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array, opline->opcode = ZEND_CONCAT; literal_dtor(&ZEND_OP2_LITERAL(src)); /* will take care of empty_string too */ MAKE_NOP(src); +//??? This optimization can't work anymore because ADD_VAR returns IS_TMP_VAR +//??? and ZEND_CAST returns IS_VAR. +//??? BTW: it wan't used for long time, because we don't use INIT_STRING +#if 0 } else if (opline->opcode == ZEND_ADD_VAR && ZEND_OP1_TYPE(opline) == IS_TMP_VAR && VAR_SOURCE(opline->op1) && @@ -1130,11 +1134,12 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array, MAKE_NOP(src); opline->opcode = ZEND_CAST; opline->extended_value = IS_STRING; +#endif } else if ((opline->opcode == ZEND_ADD_STRING || opline->opcode == ZEND_ADD_CHAR || opline->opcode == ZEND_ADD_VAR || opline->opcode == ZEND_CONCAT) && - ZEND_OP1_TYPE(opline) == IS_TMP_VAR && + ZEND_OP1_TYPE(opline) == (IS_TMP_VAR|IS_VAR) && VAR_SOURCE(opline->op1) && VAR_SOURCE(opline->op1)->opcode == ZEND_CAST && VAR_SOURCE(opline->op1)->extended_value == IS_STRING) { diff --git a/ext/opcache/Optimizer/pass1_5.c b/ext/opcache/Optimizer/pass1_5.c index 9edff53..c2551df 100644 --- a/ext/opcache/Optimizer/pass1_5.c +++ b/ext/opcache/Optimizer/pass1_5.c @@ -102,7 +102,11 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) { literal_dtor(&ZEND_OP1_LITERAL(opline)); MAKE_NOP(opline); - replace_tmp_by_const(op_array, opline + 1, tv, &res TSRMLS_CC); + if (opline->result_type == IS_TMP_VAR) { + replace_tmp_by_const(op_array, opline + 1, tv, &res TSRMLS_CC); + } else /* if (opline->result_type == IS_VAR) */ { + replace_var_by_const(op_array, opline + 1, tv, &res TSRMLS_CC); + } } else if (opline->extended_value == IS_BOOL) { /* T = CAST(X, IS_BOOL) => T = BOOL(X) */ opline->opcode = ZEND_BOOL;

« previous php.cvs (#77358) next »