Commit 73c7d6bc by Richard Biener Committed by Richard Biener

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
parent 1d805a56
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> 2014-06-26 Bernd Schmidt <bernds@codesourcery.com>
* Makefile.in (COLLECT2_OBJS): Add collect-utils.o. * Makefile.in (COLLECT2_OBJS): Add collect-utils.o.
......
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> 2014-06-26 Vidya Praveen <vidyapraveen@arm.com>
* gcc.dg/inline-22.c: Add bind_pic_locally. * gcc.dg/inline-22.c: Add bind_pic_locally.
......
/* { 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" } } */
...@@ -401,11 +401,8 @@ copy_prop_visit_phi_node (gimple phi) ...@@ -401,11 +401,8 @@ copy_prop_visit_phi_node (gimple phi)
arg_value = valueize_val (arg); arg_value = valueize_val (arg);
/* Avoid copy propagation from an inner into an outer loop. /* Avoid copy propagation from an inner into an outer loop.
Otherwise, this may move loop variant variables outside of Otherwise, this may introduce uses of loop variant variables
their loops and prevent coalescing opportunities. If the outside of their loops and prevent coalescing opportunities.
value was loop invariant, it will be hoisted by LICM and
exposed for copy propagation.
??? The value will be always loop invariant.
In loop-closed SSA form do not copy-propagate through In loop-closed SSA form do not copy-propagate through
PHI nodes in blocks with a loop exit edge predecessor. */ PHI nodes in blocks with a loop exit edge predecessor. */
if (TREE_CODE (arg_value) == SSA_NAME if (TREE_CODE (arg_value) == SSA_NAME
......
...@@ -1234,7 +1234,13 @@ record_equivalences_from_phis (basic_block bb) ...@@ -1234,7 +1234,13 @@ record_equivalences_from_phis (basic_block bb)
this, since this is a true assignment and not an equivalence this, since this is a true assignment and not an equivalence
inferred from a comparison. All uses of this ssa name are dominated inferred from a comparison. All uses of this ssa name are dominated
by this assignment, so unwinding just costs time and space. */ 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); set_ssa_name_value (lhs, rhs);
} }
} }
...@@ -2247,14 +2253,6 @@ cprop_operand (gimple stmt, use_operand_p op_p) ...@@ -2247,14 +2253,6 @@ cprop_operand (gimple stmt, use_operand_p op_p)
if (!may_propagate_copy (op, val)) if (!may_propagate_copy (op, val))
return; 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. /* Do not propagate copies into simple IV increment statements.
See PR23821 for how this can disturb IV analysis. */ See PR23821 for how this can disturb IV analysis. */
if (TREE_CODE (val) != INTEGER_CST if (TREE_CODE (val) != INTEGER_CST
......
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