re PR tree-optimization/61607 (DOM missed jump threading and destroyed loops)

2014-06-26  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/61607
	* tree-ssa-copy.c (copy_prop_visit_phi_node): Adjust comment
	explaining why we restrict copies on loop depth.
	* tree-ssa-dom.c (cprop_operand): Remove restriction on
	on loop depth.
	(record_equivalences_from_phis): Instead add it here.

	* gcc.dg/tree-ssa/ssa-dom-thread-5.c: New testcase.

From-SVN: r212026
This commit is contained in:
Richard Biener 2014-06-26 11:29:34 +00:00 committed by Richard Biener
parent 1d805a56b6
commit 73c7d6bc25
5 changed files with 46 additions and 14 deletions

View File

@ -1,3 +1,12 @@
2014-06-26 Richard Biener <rguenther@suse.de>
PR tree-optimization/61607
* tree-ssa-copy.c (copy_prop_visit_phi_node): Adjust comment
explaining why we restrict copies on loop depth.
* tree-ssa-dom.c (cprop_operand): Remove restriction on
on loop depth.
(record_equivalences_from_phis): Instead add it here.
2014-06-26 Bernd Schmidt <bernds@codesourcery.com>
* Makefile.in (COLLECT2_OBJS): Add collect-utils.o.

View File

@ -1,3 +1,8 @@
2014-06-26 Richard Biener <rguenther@suse.de>
PR tree-optimization/61607
* gcc.dg/tree-ssa/ssa-dom-thread-5.c: New testcase.
2014-06-26 Vidya Praveen <vidyapraveen@arm.com>
* gcc.dg/inline-22.c: Add bind_pic_locally.

View File

@ -0,0 +1,23 @@
/* { dg-do compile } */
/* { dg-options "-Os -fno-tree-fre -fdump-tree-dom1-details" } */
void foo(int *);
void f2(int dst[3], int R)
{
int i, inter[2];
_Bool inter0p = 0;
_Bool inter1p = 0;
for (i = 1; i < R; i++)
{
inter0p = 1;
inter1p = 1;
}
if (inter0p)
inter[0] = 1;
if (inter1p)
inter[1] = 1;
foo(inter);
}
/* { dg-final { scan-tree-dump "Threaded jump" "dom1" } } */
/* { dg-final { cleanup-tree-dump "dom1" } } */

View File

@ -401,11 +401,8 @@ copy_prop_visit_phi_node (gimple phi)
arg_value = valueize_val (arg);
/* Avoid copy propagation from an inner into an outer loop.
Otherwise, this may move loop variant variables outside of
their loops and prevent coalescing opportunities. If the
value was loop invariant, it will be hoisted by LICM and
exposed for copy propagation.
??? The value will be always loop invariant.
Otherwise, this may introduce uses of loop variant variables
outside of their loops and prevent coalescing opportunities.
In loop-closed SSA form do not copy-propagate through
PHI nodes in blocks with a loop exit edge predecessor. */
if (TREE_CODE (arg_value) == SSA_NAME

View File

@ -1234,7 +1234,13 @@ record_equivalences_from_phis (basic_block bb)
this, since this is a true assignment and not an equivalence
inferred from a comparison. All uses of this ssa name are dominated
by this assignment, so unwinding just costs time and space. */
if (i == gimple_phi_num_args (phi) && may_propagate_copy (lhs, rhs))
if (i == gimple_phi_num_args (phi)
&& may_propagate_copy (lhs, rhs)
/* Do not propagate copies if the propagated value is at a deeper loop
depth than the propagatee. Otherwise, this may introduce uses
of loop variant variables outside of their loops and prevent
coalescing opportunities. */
&& !(loop_depth_of_name (rhs) > loop_depth_of_name (lhs)))
set_ssa_name_value (lhs, rhs);
}
}
@ -2247,14 +2253,6 @@ cprop_operand (gimple stmt, use_operand_p op_p)
if (!may_propagate_copy (op, val))
return;
/* Do not propagate copies if the propagated value is at a deeper loop
depth than the propagatee. Otherwise, this may move loop variant
variables outside of their loops and prevent coalescing
opportunities. If the value was loop invariant, it will be hoisted
by LICM and exposed for copy propagation. */
if (loop_depth_of_name (val) > loop_depth_of_name (op))
return;
/* Do not propagate copies into simple IV increment statements.
See PR23821 for how this can disturb IV analysis. */
if (TREE_CODE (val) != INTEGER_CST