]> granicus.if.org Git - php/commitdiff
Fixed SSA construction for CFG with unreachable BB
authorDmitry Stogov <dmitry@zend.com>
Wed, 23 Dec 2015 00:52:38 +0000 (03:52 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 23 Dec 2015 00:52:38 +0000 (03:52 +0300)
ext/opcache/Optimizer/zend_ssa.c
ext/opcache/tests/ssa_bug_001.phpt [new file with mode: 0644]

index 46c3928106ac3329afe7cc83e7cfe5b98a823adc..d9e85165d90cd83251906dfe162e98a202365a55 100644 (file)
@@ -495,7 +495,7 @@ int zend_build_ssa(zend_arena **arena, const zend_op_array *op_array, uint32_t b
                                zend_bitset_copy(tmp, gen + (j * set_size), set_size);
                                for (k = 0; k < blocks[j].predecessors_count; k++) {
                                        i = ssa->cfg.predecessors[blocks[j].predecessor_offset + k];
-                                       while (i != blocks[j].idom) {
+                                       while (i != -1 && i != blocks[j].idom) {
                                                zend_bitset_union_with_intersection(tmp, tmp, gen + (i * set_size), in + (j * set_size), set_size);
                                                i = blocks[i].idom;
                                        }
@@ -530,7 +530,7 @@ int zend_build_ssa(zend_arena **arena, const zend_op_array *op_array, uint32_t b
                        } else {
                                for (k = 0; k < blocks[j].predecessors_count; k++) {
                                        i = ssa->cfg.predecessors[blocks[j].predecessor_offset + k];
-                                       while (i != blocks[j].idom) {
+                                       while (i != -1 && i != blocks[j].idom) {
                                                zend_bitset_union_with_intersection(tmp, tmp, gen + (i * set_size), in + (j * set_size), set_size);
                                                i = blocks[i].idom;
                                        }
@@ -802,7 +802,7 @@ int zend_build_ssa(zend_arena **arena, const zend_op_array *op_array, uint32_t b
                        } else {
                                for (k = 0; k < blocks[j].predecessors_count; k++) {
                                        i = ssa->cfg.predecessors[blocks[j].predecessor_offset + k];
-                                       while (i != blocks[j].idom) {
+                                       while (i != -1 && i != blocks[j].idom) {
                                                zend_ssa_phi *p = ssa_blocks[i].phis;
                                                while (p) {
                                                        if (p) {
diff --git a/ext/opcache/tests/ssa_bug_001.phpt b/ext/opcache/tests/ssa_bug_001.phpt
new file mode 100644 (file)
index 0000000..56757f5
--- /dev/null
@@ -0,0 +1,19 @@
+--TEST--
+SSA constrution for CFG with unreachable basic blocks
+--FILE--
+<?php
+class X {
+    public function __get($n) {
+      if ($n === 'type') {
+        trigger_error('Deprecated type property called; use instanceof', E_USER_NOTICE);
+        switch (get_class($this)) {
+          case 'HTMLPurifier_Token_Start':      return 'start';
+          default: return null;
+        }
+      }
+    }
+}
+?>
+OK
+--EXPECT--
+OK