diff options
author | Richard Biener <rguenther@suse.de> | 2015-11-23 15:21:32 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-11-23 15:21:32 +0000 |
commit | 3789bf8412fb7ecde28694552d6c1f35a4e8ce52 (patch) | |
tree | ed35bdd54ea7057eb9acff643f542abc99f99c4d /gcc | |
parent | 78cc43a2ab49c6ce1c730503cff73ea2e3a597bc (diff) | |
download | gcc-3789bf8412fb7ecde28694552d6c1f35a4e8ce52.zip gcc-3789bf8412fb7ecde28694552d6c1f35a4e8ce52.tar.gz gcc-3789bf8412fb7ecde28694552d6c1f35a4e8ce52.tar.bz2 |
re PR tree-optimization/68465 (pass_lim doesn't detect identical loop entry conditions)
2015-11-23 Richard Biener <rguenther@suse.de>
PR tree-optimization/68465
* tree-ssa-sccvn.c (sccvn_dom_walker::before_dom_children):
Also record equalities from multiple predecessor blocks if
only one non-backedge exists.
* gcc.dg/tree-ssa/ssa-fre-52.c: New testcase.
From-SVN: r230764
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-52.c | 26 | ||||
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 28 |
4 files changed, 59 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1fcb0f5..61cbac9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-11-23 Richard Biener <rguenther@suse.de> + + PR tree-optimization/68465 + * tree-ssa-sccvn.c (sccvn_dom_walker::before_dom_children): + Also record equalities from multiple predecessor blocks if + only one non-backedge exists. + 2015-11-23 Kyrylo Tkachov <kyrylo.tkachov@arm.com> PR target/68363 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e14bebf..dd7f96a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-11-23 Richard Biener <rguenther@suse.de> + + PR tree-optimization/68465 + * gcc.dg/tree-ssa/ssa-fre-52.c: New testcase. + 2015-11-23 Kyrylo Tkachov <kyrylo.tkachov@arm.com> PR target/68363 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-52.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-52.c new file mode 100644 index 0000000..8b607d5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-52.c @@ -0,0 +1,26 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-fre1" } */ + +void bar (); +void foo (int n) +{ + if (n > 0) + { + int j = 0; + do + { + if (n > 0) + { + int i = 0; + do + { + bar (); + } + while (i < n); + } + } + while (j < n); + } +} + +/* { dg-final { scan-tree-dump-times "if" 1 "fre1" } } */ diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 2ac3828..9a55b5b 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -4357,20 +4357,34 @@ sccvn_dom_walker::before_dom_children (basic_block bb) /* If we have a single predecessor record the equivalence from a possible condition on the predecessor edge. */ - if (single_pred_p (bb)) + edge pred_e = NULL; + FOR_EACH_EDGE (e, ei, bb->preds) + { + /* Ignore simple backedges from this to allow recording conditions + in loop headers. */ + if (dominated_by_p (CDI_DOMINATORS, e->src, e->dest)) + continue; + if (! pred_e) + pred_e = e; + else + { + pred_e = NULL; + break; + } + } + if (pred_e) { - edge e = single_pred_edge (bb); /* Check if there are multiple executable successor edges in the source block. Otherwise there is no additional info to be recorded. */ edge e2; - FOR_EACH_EDGE (e2, ei, e->src->succs) - if (e2 != e + FOR_EACH_EDGE (e2, ei, pred_e->src->succs) + if (e2 != pred_e && e2->flags & EDGE_EXECUTABLE) break; if (e2 && (e2->flags & EDGE_EXECUTABLE)) { - gimple *stmt = last_stmt (e->src); + gimple *stmt = last_stmt (pred_e->src); if (stmt && gimple_code (stmt) == GIMPLE_COND) { @@ -4378,11 +4392,11 @@ sccvn_dom_walker::before_dom_children (basic_block bb) tree lhs = gimple_cond_lhs (stmt); tree rhs = gimple_cond_rhs (stmt); record_conds (bb, code, lhs, rhs, - (e->flags & EDGE_TRUE_VALUE) != 0); + (pred_e->flags & EDGE_TRUE_VALUE) != 0); code = invert_tree_comparison (code, HONOR_NANS (lhs)); if (code != ERROR_MARK) record_conds (bb, code, lhs, rhs, - (e->flags & EDGE_TRUE_VALUE) == 0); + (pred_e->flags & EDGE_TRUE_VALUE) == 0); } } } |