com php-src: Prevent wrong optimization: ext/opcache/Optimizer/ block_pass.c

From: 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;

« previous php.cvs (#92994) next »