Commit b9e59e4f by Jeff Law

[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.

From-SVN: r229902
parent a6fa947e
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> 2015-11-06 David Wohlferd <dw@LimeGreenSocks.com>
* doc/md.texi (multi-alternative constraints): Don't document * doc/md.texi (multi-alternative constraints): Don't document
...@@ -78,7 +78,7 @@ DEF_BASIC_BLOCK_FLAG(RTL, 9) ...@@ -78,7 +78,7 @@ DEF_BASIC_BLOCK_FLAG(RTL, 9)
DEF_BASIC_BLOCK_FLAG(FORWARDER_BLOCK, 10) DEF_BASIC_BLOCK_FLAG(FORWARDER_BLOCK, 10)
/* Set on blocks that cannot be threaded through. /* 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) DEF_BASIC_BLOCK_FLAG(NONTHREADABLE_BLOCK, 11)
/* Set on blocks that were modified in some way. This bit is set in /* Set on blocks that were modified in some way. This bit is set in
...@@ -177,6 +177,11 @@ DEF_EDGE_FLAG(TM_UNINSTRUMENTED, 15) ...@@ -177,6 +177,11 @@ DEF_EDGE_FLAG(TM_UNINSTRUMENTED, 15)
/* Abort (over) edge out of a GIMPLE_TRANSACTION statement. */ /* Abort (over) edge out of a GIMPLE_TRANSACTION statement. */
DEF_EDGE_FLAG(TM_ABORT, 16) 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 #endif
/* /*
......
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 2015-11-06 Michael Collison <michael.collison@linaro.org
Ramana Radhakrishnan <ramana.radhakrishnan@linaro.org> Ramana Radhakrishnan <ramana.radhakrishnan@linaro.org>
......
/* { dg-do compile } */ /* { 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 status, pt;
extern int count; extern int count;
...@@ -33,7 +33,7 @@ foo (int N, int c, int b, int *a) ...@@ -33,7 +33,7 @@ foo (int N, int c, int b, int *a)
} }
/* There are 3 FSM jump threading opportunities. */ /* 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. */ /* There should be no assignments or references to FLAG. */
/* { dg-final { scan-tree-dump-not "flag" "optimized"} } */ /* { dg-final { scan-tree-dump-not "flag" "optimized"} } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-dom1-details" } */ /* { dg-options "-O2 -fdump-tree-vrp1-stats -fdump-tree-dom1-stats -fdump-tree-dom2-stats" } */
/* { dg-final { scan-tree-dump-times "FSM" 38 "dom1" } } */ /* { 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 { enum STATE {
S0=0, S0=0,
......
...@@ -10076,9 +10076,9 @@ identify_jump_threads (void) ...@@ -10076,9 +10076,9 @@ identify_jump_threads (void)
mark_dfs_back_edges (); mark_dfs_back_edges ();
/* Do not thread across edges we are about to remove. Just marking /* 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) 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 /* Allocate our unwinder stack to unwind any temporary equivalences
that might be recorded. */ that might be recorded. */
...@@ -10135,9 +10135,9 @@ identify_jump_threads (void) ...@@ -10135,9 +10135,9 @@ identify_jump_threads (void)
it to a specific successor. */ it to a specific successor. */
FOR_EACH_EDGE (e, ei, bb->preds) FOR_EACH_EDGE (e, ei, bb->preds)
{ {
/* Do not thread across back edges or abnormal edges /* Do not thread across edges marked to ignoreor abnormal
in the CFG. */ edges in the CFG. */
if (e->flags & (EDGE_DFS_BACK | EDGE_COMPLEX)) if (e->flags & (EDGE_IGNORE | EDGE_COMPLEX))
continue; continue;
thread_across_edge (dummy, e, true, equiv_stack, NULL, thread_across_edge (dummy, e, true, equiv_stack, NULL,
...@@ -10146,6 +10146,10 @@ identify_jump_threads (void) ...@@ -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 /* 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 ASSERT_EXPRs are still in the IL and cfg cleanup code does not yet
handle ASSERT_EXPRs gracefully. */ handle ASSERT_EXPRs gracefully. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment