[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
This commit is contained in:
parent
a6fa947e82
commit
b9e59e4f11
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
/*
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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"} } */
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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. */
|
||||
|
|
Loading…
Reference in New Issue