aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2015-10-26 09:36:04 -0600
committerJeff Law <law@gcc.gnu.org>2015-10-26 09:36:04 -0600
commitc67e5194634c5c3dfd16580e862fb9d4a4552bc9 (patch)
treea68e04085366e1abc4cc40f951f5ad25faa89a6e /gcc
parent335dde2981e5680619d25bf934527c9549959569 (diff)
downloadgcc-c67e5194634c5c3dfd16580e862fb9d4a4552bc9.zip
gcc-c67e5194634c5c3dfd16580e862fb9d4a4552bc9.tar.gz
gcc-c67e5194634c5c3dfd16580e862fb9d4a4552bc9.tar.bz2
[PATCH] [PR tree-optimization/68013] Make sure first block in FSM path
is in VISITED_BBs PR tree-optimization/68013 * tree-ssa-threadbackward.c (fsm_find_control_statement_thread_paths): Make sure the first block in the path is in VISITED_BBs. PR tree-optimization/68013 * gcc.c-torture/compile/pr68013.c: New test. From-SVN: r229375
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr68013.c16
-rw-r--r--gcc/tree-ssa-threadbackward.c5
4 files changed, 33 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 95479f3..b5cfa1e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2015-10-26 Jeff Law <law@redhat.com>
+
+ PR tree-optimization/68013
+ * tree-ssa-threadbackward.c
+ (fsm_find_control_statement_thread_paths): Make sure the first block
+ in the path is in VISITED_BBs.
+
2015-10-26 Richard Biener <rguenther@suse.de>
Dominik Vogt <vogt@linux.vnet.ibm.com>
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index fd5ade4..688f745 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-10-26 Jeff Law <law@redhat.com>
+
+ PR tree-optimization/68013
+ * gcc.c-torture/compile/pr68013.c: New test.
+
2015-10-26 Richard Biener <rguenther@suse.de>
Dominik Vogt <vogt@linux.vnet.ibm.com>
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr68013.c b/gcc/testsuite/gcc.c-torture/compile/pr68013.c
new file mode 100644
index 0000000..cc500da
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr68013.c
@@ -0,0 +1,16 @@
+int a, b, c, d, e, f;
+
+void
+fn1 ()
+{
+ for (; e;)
+ {
+ e = f;
+ for (; b;)
+ {
+ b = a;
+ f = a || d ? 0 : c;
+ }
+ d = 0;
+ }
+}
diff --git a/gcc/tree-ssa-threadbackward.c b/gcc/tree-ssa-threadbackward.c
index 9128094..cfb4ace 100644
--- a/gcc/tree-ssa-threadbackward.c
+++ b/gcc/tree-ssa-threadbackward.c
@@ -136,6 +136,11 @@ fsm_find_control_statement_thread_paths (tree name,
vec<basic_block, va_gc> *next_path;
vec_alloc (next_path, n_basic_blocks_for_fn (cfun));
+ /* When VAR_BB == LAST_BB_IN_PATH, then the first block in the path
+ will already be in VISITED_BBS. When they are not equal, then we
+ must ensure that first block is accounted for to ensure we do not
+ create bogus jump threading paths. */
+ visited_bbs->add ((*path)[0]);
FOR_EACH_EDGE (e, ei, last_bb_in_path->preds)
{
hash_set<basic_block> *visited_bbs = new hash_set<basic_block>;