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: | Dmitry Stogov | 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;