Commit 3789bf84 by Richard Biener Committed by Richard Biener

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
parent 78cc43a2
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> 2015-11-23 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR target/68363 PR target/68363
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> 2015-11-23 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR target/68363 PR target/68363
......
/* { 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" } } */
...@@ -4357,20 +4357,34 @@ sccvn_dom_walker::before_dom_children (basic_block bb) ...@@ -4357,20 +4357,34 @@ sccvn_dom_walker::before_dom_children (basic_block bb)
/* If we have a single predecessor record the equivalence from a /* If we have a single predecessor record the equivalence from a
possible condition on the predecessor edge. */ 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 /* Check if there are multiple executable successor edges in
the source block. Otherwise there is no additional info the source block. Otherwise there is no additional info
to be recorded. */ to be recorded. */
edge e2; edge e2;
FOR_EACH_EDGE (e2, ei, e->src->succs) FOR_EACH_EDGE (e2, ei, pred_e->src->succs)
if (e2 != e if (e2 != pred_e
&& e2->flags & EDGE_EXECUTABLE) && e2->flags & EDGE_EXECUTABLE)
break; break;
if (e2 && (e2->flags & EDGE_EXECUTABLE)) if (e2 && (e2->flags & EDGE_EXECUTABLE))
{ {
gimple *stmt = last_stmt (e->src); gimple *stmt = last_stmt (pred_e->src);
if (stmt if (stmt
&& gimple_code (stmt) == GIMPLE_COND) && gimple_code (stmt) == GIMPLE_COND)
{ {
...@@ -4378,11 +4392,11 @@ sccvn_dom_walker::before_dom_children (basic_block bb) ...@@ -4378,11 +4392,11 @@ sccvn_dom_walker::before_dom_children (basic_block bb)
tree lhs = gimple_cond_lhs (stmt); tree lhs = gimple_cond_lhs (stmt);
tree rhs = gimple_cond_rhs (stmt); tree rhs = gimple_cond_rhs (stmt);
record_conds (bb, code, lhs, rhs, 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)); code = invert_tree_comparison (code, HONOR_NANS (lhs));
if (code != ERROR_MARK) if (code != ERROR_MARK)
record_conds (bb, code, lhs, rhs, record_conds (bb, code, lhs, rhs,
(e->flags & EDGE_TRUE_VALUE) == 0); (pred_e->flags & EDGE_TRUE_VALUE) == 0);
} }
} }
} }
......
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