diff mbox

Allow vrp to thread across backedges using FSM threader

Message ID 563D373D.5030406@redhat.com
State New
Headers show

Commit Message

Jeff Law Nov. 6, 2015, 11:26 p.m. UTC
This is in preparation for removing a blob of code in the old threader 
that knew how to thread across backedges.

Essentially this just allows us to try FSM threading in VRP's instance 
of threader.  So certain jump threading happens earlier in the pipeline.

It also tightens up the ssa-dom-thread-7 test a bit.  It was previously 
just counting the number of jump threads registered.  Now it tracks the 
number of jump threads actually realized.  I verified the actually 
realized jump threads were the same before/after -- several just moved 
from DOM1 to VRP1.

This does not effect 68198, which will be the top of my todo list after 
a few more small cleanups take place prior to stage1 close.

Bootstrapped and regression tested on x86-64-linux-gnu.  Installed on 
the trunk.



Jeff
commit f6a3449159568d1b352e9b3d49b1df0ba8b25a6f
Author: law <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Date:   Fri Nov 6 23:26:20 2015 +0000

    [PATCH] Allow vrp to thread across backedges using FSM threader
    
    	* cfg-flags.def (IGNORE): New edge flag.
    	* tree-vrp.c (identify_jump_threads): Mark and clear edges
    	scheduled for removal with EDGE_IGNORE around call into
    	jump threader.  Do no thread across edges with EDGE_IGNORE,
    	but do allow threading across those with EDGE_DFS_BACK.
    
    	* gcc.dg/tree-ssa/ssa-dom-thread-7.c: Adjust to look for
    	realized jump threads.
    	* gcc.dg/tree-ssa-pr66752-3.c: Look in vrp1 dump for jump
    	threads rather than dom1 dump.
    
    git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@229902 138bc75d-0d04-0410-961f-82ee72b054a4
diff mbox

Patch

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e2f588b..552c51b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@ 
+2015-11-06  Jeff Law <jeff@redhat.com>
+
+	* cfg-flags.def (IGNORE): New edge flag.
+	* tree-vrp.c (identify_jump_threads): Mark and clear edges
+	scheduled for removal with EDGE_IGNORE around call into
+	jump threader.  Do no thread across edges with EDGE_IGNORE,
+	but do allow threading across those with EDGE_DFS_BACK.
+
 2015-11-06  David Wohlferd  <dw@LimeGreenSocks.com>
 
 	* doc/md.texi (multi-alternative constraints): Don't document
diff --git a/gcc/cfg-flags.def b/gcc/cfg-flags.def
index eedcd69..e2bfbed 100644
--- a/gcc/cfg-flags.def
+++ b/gcc/cfg-flags.def
@@ -78,7 +78,7 @@  DEF_BASIC_BLOCK_FLAG(RTL, 9)
 DEF_BASIC_BLOCK_FLAG(FORWARDER_BLOCK, 10)
 
 /* Set on blocks that cannot be threaded through.
-   Only used in cfgcleanup.c.  */
+   Only used for jump threading.  */
 DEF_BASIC_BLOCK_FLAG(NONTHREADABLE_BLOCK, 11)
 
 /* Set on blocks that were modified in some way.  This bit is set in
@@ -177,6 +177,11 @@  DEF_EDGE_FLAG(TM_UNINSTRUMENTED, 15)
 /* Abort (over) edge out of a GIMPLE_TRANSACTION statement.  */
 DEF_EDGE_FLAG(TM_ABORT, 16)
 
+/* An edge we should ignore.  It should be entirely local to
+   passes.  ie, it is never set on any edge upon the completion
+   of any pass.  */
+DEF_EDGE_FLAG(IGNORE, 17)
+
 #endif
 
 /*
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 80221c1..af4a738 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@ 
+2015-11-06  Jeff Law  <law@redhat.com>
+
+	* gcc.dg/tree-ssa/ssa-dom-thread-7.c: Adjust to look for
+	realized jump threads.
+	* gcc.dg/tree-ssa-pr66752-3.c: Look in vrp1 dump for jump
+	threads rather than dom1 dump.
+
 2015-11-06  Michael Collison  <michael.collison@linaro.org
 	    Ramana Radhakrishnan  <ramana.radhakrishnan@linaro.org>
 
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr66752-3.c b/gcc/testsuite/gcc.dg/tree-ssa/pr66752-3.c
index f15b598..577a489 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr66752-3.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr66752-3.c
@@ -1,5 +1,5 @@ 
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-dom1-details -fdump-tree-optimized" } */
+/* { dg-options "-O2 -fdump-tree-vrp1-details -fdump-tree-optimized" } */
 
 extern int status, pt;
 extern int count;
@@ -33,7 +33,7 @@  foo (int N, int c, int b, int *a)
 }
 
 /* There are 3 FSM jump threading opportunities.  */
-/* { dg-final { scan-tree-dump-times "FSM" 3 "dom1"} } */
+/* { dg-final { scan-tree-dump-times "FSM" 3 "vrp1"} } */
 
 /* There should be no assignments or references to FLAG.  */
 /* { dg-final { scan-tree-dump-not "flag" "optimized"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-7.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-7.c
index 445f250..ac12b6c 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-7.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-7.c
@@ -1,6 +1,8 @@ 
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-dom1-details" } */
-/* { dg-final { scan-tree-dump-times "FSM" 38 "dom1" } } */
+/* { dg-options "-O2 -fdump-tree-vrp1-stats -fdump-tree-dom1-stats -fdump-tree-dom2-stats" } */
+/* { dg-final { scan-tree-dump "Jumps threaded: 7"  "vrp1" } } */
+/* { dg-final { scan-tree-dump "Jumps threaded: 12" "dom1" } } */
+/* { dg-final { scan-tree-dump "Jumps threaded: 3"  "dom2" } } */
 
 enum STATE {
   S0=0,
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index c0b6cfc..87c0265 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -10076,9 +10076,9 @@  identify_jump_threads (void)
   mark_dfs_back_edges ();
 
   /* Do not thread across edges we are about to remove.  Just marking
-     them as EDGE_DFS_BACK will do.  */
+     them as EDGE_IGNORE will do.  */
   FOR_EACH_VEC_ELT (to_remove_edges, i, e)
-    e->flags |= EDGE_DFS_BACK;
+    e->flags |= EDGE_IGNORE;
 
   /* Allocate our unwinder stack to unwind any temporary equivalences
      that might be recorded.  */
@@ -10135,9 +10135,9 @@  identify_jump_threads (void)
 	     it to a specific successor.  */
 	  FOR_EACH_EDGE (e, ei, bb->preds)
 	    {
-	      /* Do not thread across back edges or abnormal edges
-		 in the CFG.  */
-	      if (e->flags & (EDGE_DFS_BACK | EDGE_COMPLEX))
+	      /* Do not thread across edges marked to ignoreor abnormal
+		 edges in the CFG.  */
+	      if (e->flags & (EDGE_IGNORE | EDGE_COMPLEX))
 		continue;
 
 	      thread_across_edge (dummy, e, true, equiv_stack, NULL,
@@ -10146,6 +10146,10 @@  identify_jump_threads (void)
 	}
     }
 
+  /* Clear EDGE_IGNORE.  */
+  FOR_EACH_VEC_ELT (to_remove_edges, i, e)
+    e->flags &= ~EDGE_IGNORE;
+
   /* We do not actually update the CFG or SSA graphs at this point as
      ASSERT_EXPRs are still in the IL and cfg cleanup code does not yet
      handle ASSERT_EXPRs gracefully.  */