summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-12-10 09:00:09 +0100
committerNikita Popov <nikita.ppv@gmail.com>2019-12-10 09:00:09 +0100
commit87691e74e54ab4303d6f6ea826b7bc1555112e4d (patch)
treeb183dec319eb9038bf368bf8f5c2e87f2bf36b67
parent17a9f1401aeb35fe1e3657b38102a410d151d42f (diff)
downloadphp-git-87691e74e54ab4303d6f6ea826b7bc1555112e4d.tar.gz
Fix DCE with FE_FETCH
For now, don't treat FE_FETCH op2 as no-val use. See GH-4982.
-rw-r--r--ext/opcache/Optimizer/zend_ssa.h5
-rw-r--r--ext/opcache/tests/fe_fetch_dce.phpt22
2 files changed, 25 insertions, 2 deletions
diff --git a/ext/opcache/Optimizer/zend_ssa.h b/ext/opcache/Optimizer/zend_ssa.h
index 4ee442dcab..4707e3807a 100644
--- a/ext/opcache/Optimizer/zend_ssa.h
+++ b/ext/opcache/Optimizer/zend_ssa.h
@@ -217,9 +217,10 @@ static zend_always_inline zend_bool zend_ssa_is_no_val_use(const zend_op *opline
if (opline->opcode == ZEND_ASSIGN || opline->opcode == ZEND_UNSET_CV) {
return ssa_op->op1_use == var && ssa_op->op2_use != var;
}
- if (opline->opcode == ZEND_FE_FETCH_R) {
+ // TODO: Reenable this after changing the SSA structure.
+ /*if (opline->opcode == ZEND_FE_FETCH_R) {
return ssa_op->op2_use == var && ssa_op->op1_use != var;
- }
+ }*/
if (ssa_op->result_use == var && opline->opcode != ZEND_ADD_ARRAY_ELEMENT) {
return ssa_op->op1_use != var && ssa_op->op2_use != var;
}
diff --git a/ext/opcache/tests/fe_fetch_dce.phpt b/ext/opcache/tests/fe_fetch_dce.phpt
new file mode 100644
index 0000000000..f7ff0203d7
--- /dev/null
+++ b/ext/opcache/tests/fe_fetch_dce.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Incorrect DCE with FE_FETCH
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+--FILE--
+<?php
+
+function test() {
+ $a = ["3"];
+ $x = 1;
+ foreach ($a as $x) {
+ $x = 2.0;
+ }
+ var_dump($x);
+}
+test();
+
+?>
+--EXPECT--
+float(2)