summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2017-11-27 10:16:16 +0300
committerDmitry Stogov <dmitry@zend.com>2017-11-27 10:16:16 +0300
commit776bef8447f2848c043e4716a1e08c4ac5a88fdb (patch)
tree7c05086afd724d33e76837005af3ca4f9324440e
parentfee6c812c400d5c68b8851cec2a95686dc06129b (diff)
downloadphp-git-776bef8447f2848c043e4716a1e08c4ac5a88fdb.tar.gz
Fixed bug in type inference
-rw-r--r--ext/opcache/Optimizer/zend_inference.c3
-rw-r--r--ext/opcache/tests/ssa_bug_011.phpt19
2 files changed, 21 insertions, 1 deletions
diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c
index 5d27c9413b..ef821350ee 100644
--- a/ext/opcache/Optimizer/zend_inference.c
+++ b/ext/opcache/Optimizer/zend_inference.c
@@ -3079,7 +3079,8 @@ static int zend_update_type_info(const zend_op_array *op_array,
UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def);
} else {
/* invalid key type */
- UPDATE_SSA_TYPE(t1, ssa_ops[i].op1_def);
+ tmp = (tmp & (MAY_BE_RC1|MAY_BE_RCN)) | (t1 & ~(MAY_BE_RC1|MAY_BE_RCN));
+ UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def);
}
COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def);
}
diff --git a/ext/opcache/tests/ssa_bug_011.phpt b/ext/opcache/tests/ssa_bug_011.phpt
new file mode 100644
index 0000000000..58f39807fc
--- /dev/null
+++ b/ext/opcache/tests/ssa_bug_011.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Type inference warning
+--FILE--
+<?php
+function renderRawGraph(array $parents) {
+ $graph = array();
+ foreach ($parents as $p) {
+ foreach ($graph as $v) {
+ $graph[$v]['line'] = 1;
+ }
+ $graph[] = array(
+ 'line' => 1,
+ );
+ }
+}
+?>
+OK
+--EXPECT--
+OK