This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Allow vrp to thread across backedges using FSM threader
- From: Jeff Law <law at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 6 Nov 2015 16:26:53 -0700
- Subject: [PATCH] Allow vrp to thread across backedges using FSM threader
- Authentication-results: sourceware.org; auth=none
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 --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. */