com php-src: Prevent wrong optimization: ext/opcache/Optimizer/ block_pass.c
| From: | Dmitry Stogov | Date: | Wed, 13 Jul 2016 12:05:11 +0000 |
| Subject: | com php-src: Prevent wrong optimization: ext/opcache/Optimizer/ block_pass.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-92994@lists.php.net to get a copy of this message | ||
Commit: 0da7c08e39ec5f722a9a888906f146c97d48bdea
Author: Dmitry Stogov <dmitry@zend.com> Wed, 13 Jul 2016 15:05:11 +0300
Parents: fdc1f2e48f57c3bfc1479625b5f2e1b6e38e20d4
Branches: master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=0da7c08e39ec5f722a9a888906f146c97d48bdea
Log:
Prevent wrong optimization
Changed paths:
M ext/opcache/Optimizer/block_pass.c
Diff:
diff --git a/ext/opcache/Optimizer/block_pass.c b/ext/opcache/Optimizer/block_pass.c
index 02fb819..3bd86e6 100644
--- a/ext/opcache/Optimizer/block_pass.c
+++ b/ext/opcache/Optimizer/block_pass.c
@@ -733,10 +733,26 @@ optimize_const_unary_op:
if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) {
src = VAR_SOURCE(opline->op1);
if (src && src->opcode == ZEND_QM_ASSIGN) {
- /* T = QM_ASSIGN(X), RETURN(T) to NOP, RETURN(X) */
- VAR_SOURCE(opline->op1) = NULL;
- COPY_NODE(opline->op1, src->op1);
- MAKE_NOP(src);
+ zend_op *op = src + 1;
+ zend_bool optimize = 1;
+
+ while (op < opline) {
+ if ((op->op1_type == opline->op1_type
+ && op->op1.var == opline->op1.var)
+ || (op->op2_type == opline->op1_type
+ && op->op2.var == opline->op1.var)) {
+ optimize = 0;
+ break;
+ }
+ op++;
+ }
+
+ if (optimize) {
+ /* T = QM_ASSIGN(X), RETURN(T) to NOP, RETURN(X) */
+ VAR_SOURCE(opline->op1) = NULL;
+ COPY_NODE(opline->op1, src->op1);
+ MAKE_NOP(src);
+ }
}
}
break;