diff options
-rw-r--r-- | Zend/tests/bug80255.phpt | 24 | ||||
-rw-r--r-- | ext/opcache/Optimizer/block_pass.c | 8 |
2 files changed, 28 insertions, 4 deletions
diff --git a/Zend/tests/bug80255.phpt b/Zend/tests/bug80255.phpt new file mode 100644 index 0000000000..d3fc6b7abe --- /dev/null +++ b/Zend/tests/bug80255.phpt @@ -0,0 +1,24 @@ +--TEST-- +Bug #80255: Opcache bug (bad condition result) in 8.0.0rc1 +--FILE-- +<?php + +function test($a, $b, $c) { + do { + if ($a && !$b) { + break; + } else if ($b) { + echo "foo\n"; + } + echo "bar\n"; + } while ($c); + echo "baz\n"; +} + +test(true, true, false); + +?> +--EXPECT-- +foo +bar +baz diff --git a/ext/opcache/Optimizer/block_pass.c b/ext/opcache/Optimizer/block_pass.c index 5b6870ed0a..bad814ed6e 100644 --- a/ext/opcache/Optimizer/block_pass.c +++ b/ext/opcache/Optimizer/block_pass.c @@ -1516,16 +1516,16 @@ optimize_jmpznz: target = op_array->opcodes + follow_block->start; if (target->opcode == ZEND_JMP) { - /* JMPZNZ(X, L1, L2), L1: JMP(L3) -> JMPZNZ(X, L3, L2) */ + /* JMPZNZ(X, L1, L2), L2: JMP(L3) -> JMPZNZ(X, L1, L3) */ next = follow_block->successors[0]; } else if (target->opcode == ZEND_JMPNZ && SAME_VAR(target->op1, last_op->op1)) { - /* JMPZNZ(X, L1, L2), L1: X = JMPNZ(X, L3) -> JMPZNZ(X, L1+1, L2) */ + /* JMPZNZ(X, L1, L2), L2: X = JMPNZ(X, L3) -> JMPZNZ(X, L1, L3) */ next = follow_block->successors[0]; } else if ((target->opcode == ZEND_JMPZ || target->opcode == ZEND_JMPZNZ) && SAME_VAR(target->op1, last_op->op1)) { - /* JMPZNZ(X, L1, L2), L1: JMPZ(X, L3) -> JMPZNZ(X, L3, L2) */ - next = target_block->successors[1]; + /* JMPZNZ(X, L1, L2), L2: JMPZ(X, L3) -> JMPZNZ(X, L1, L2+1) */ + next = follow_block->successors[1]; } else { break; } |