From: Dmitry Stogov Date: Thu, 17 Apr 2014 07:12:47 +0000 (+0400) Subject: Fixed ZEND_CAST related optimizations (now it returns IS_VAR instead of IS_TMP_VAR) X-Git-Tag: POST_PHPNG_MERGE~412^2~82^2~13 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c92dd8eedf95f204520a3b2a15668d56a1aefbde;p=php Fixed ZEND_CAST related optimizations (now it returns IS_VAR instead of IS_TMP_VAR) --- diff --git a/ext/opcache/Optimizer/block_pass.c b/ext/opcache/Optimizer/block_pass.c index 86db53f1da..708bdd454a 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 9edff53d39..c2551df590 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;