]> granicus.if.org Git - php/commitdiff
Fixed ZEND_CAST related optimizations (now it returns IS_VAR instead of IS_TMP_VAR)
authorDmitry Stogov <dmitry@zend.com>
Thu, 17 Apr 2014 07:12:47 +0000 (11:12 +0400)
committerDmitry Stogov <dmitry@zend.com>
Thu, 17 Apr 2014 07:12:47 +0000 (11:12 +0400)
ext/opcache/Optimizer/block_pass.c
ext/opcache/Optimizer/pass1_5.c

index 86db53f1da62c5e81807fa1f797673d6d4da4ed0..708bdd454a9a71f0f60d4859b57268b246450aa2 100644 (file)
@@ -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) {
index 9edff53d396e67e5e034f32bcbc4ad63857bea7f..c2551df5906c863b1331e2b0eafe82f5c53ab5fd 100644 (file)
@@ -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;