diff mbox

[PR,tree-optimization/68013] Make sure first block in FSM path is in VISITED_BBs

Message ID 562E4886.4060909@redhat.com
State New
Headers show

Commit Message

Jeff Law Oct. 26, 2015, 3:36 p.m. UTC
The problem here is the first block in an FSM path may not be added to 
VISITED_BBs.  That in turn results in the threader finding a path which 
passes through that initial block a second time, reaching a different 
destination the second time through.

This is caught by the assertion (to avoid generating incorrect code). 
Fixing is simple.  But...

I'm not real happy with how the affected code is structured, but I'm at 
a loss right now how to reorganize it in the immediate term.  I'm hoping 
to get some clarity as I continue to look to replace the EDGE_DFS_BACK 
support in the old threader with the FSM threader, fixing 67892 along 
the way).

Anyway, bootstrapped and regression tested on x86_64-linux-gnu. 
Installed on the trunk.

Jeff
commit 803e64f4cf1221027844db60db0a480e64653664
Author: law <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Date:   Mon Oct 26 15:36:04 2015 +0000

    [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.
    
    git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@229375 138bc75d-0d04-0410-961f-82ee72b054a4
diff mbox

Patch

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>;