tree-ssa-dom.h (loop_depth_of_name): Remove.

2014-07-08  Richard Biener  <rguenther@suse.de>

	* tree-ssa-dom.h (loop_depth_of_name): Remove.
	* tree-ssa-dom.c (record_equivalences_from_phis): Remove
	restriction on loop depth difference.
	(record_equality): Likewise.
	(propagate_rhs_into_lhs): Likewise.  Simplify condition.
	(loop_depth_of_name): Remove.
	* tree-ssa-copy.c (copy_prop_visit_phi_node): Remove
	restriction on loop depth difference.
	(init_copy_prop): Likewise.

	* gcc.dg/tree-ssa/ssa-pre-16.c: Adjust expected eliminations.

From-SVN: r212352
This commit is contained in:
Richard Biener 2014-07-08 09:22:54 +00:00 committed by Richard Biener
parent 70f633c5b3
commit a59d8e8eb6
6 changed files with 36 additions and 67 deletions

View File

@ -1,3 +1,15 @@
2014-07-08 Richard Biener <rguenther@suse.de>
* tree-ssa-dom.h (loop_depth_of_name): Remove.
* tree-ssa-dom.c (record_equivalences_from_phis): Remove
restriction on loop depth difference.
(record_equality): Likewise.
(propagate_rhs_into_lhs): Likewise. Simplify condition.
(loop_depth_of_name): Remove.
* tree-ssa-copy.c (copy_prop_visit_phi_node): Remove
restriction on loop depth difference.
(init_copy_prop): Likewise.
2014-07-08 Jan Hubicka <hubicka@ucw.cz>
* tree-ssa-alias.c (walk_aliased_vdefs_1): Add FUNCTION_ENTRY_REACHED

View File

@ -1,3 +1,15 @@
2014-07-08 Richard Biener <rguenther@suse.de>
* tree-ssa-dom.h (loop_depth_of_name): Remove.
* tree-ssa-dom.c (record_equivalences_from_phis): Remove
restriction on loop depth difference.
(record_equality): Likewise.
(propagate_rhs_into_lhs): Likewise. Simplify condition.
(loop_depth_of_name): Remove.
* tree-ssa-copy.c (copy_prop_visit_phi_node): Remove
restriction on loop depth difference.
(init_copy_prop): Likewise.
2014-07-08 Richard Biener <rguenther@suse.de>
PR tree-optimization/61681

View File

@ -11,5 +11,5 @@ int foo(int k, int *x)
} while (++j<k);
return res;
}
/* { dg-final { scan-tree-dump-times "Eliminated: 2" 1 "pre"} } */
/* { dg-final { scan-tree-dump-times "Eliminated: 1" 1 "pre"} } */
/* { dg-final { cleanup-tree-dump "pre" } } */

View File

@ -400,15 +400,11 @@ copy_prop_visit_phi_node (gimple phi)
else
arg_value = valueize_val (arg);
/* Avoid copy propagation from an inner into an outer loop.
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
&& (loop_depth_of_name (arg_value) > loop_depth_of_name (lhs)
|| (loops_state_satisfies_p (LOOP_CLOSED_SSA)
&& loop_exit_edge_p (e->src->loop_father, e))))
/* In loop-closed SSA form do not copy-propagate SSA-names across
loop exit edges. */
if (loops_state_satisfies_p (LOOP_CLOSED_SSA)
&& TREE_CODE (arg_value) == SSA_NAME
&& loop_exit_edge_p (e->src->loop_father, e))
{
phi_val.value = lhs;
break;
@ -470,7 +466,6 @@ init_copy_prop (void)
FOR_EACH_BB_FN (bb, cfun)
{
gimple_stmt_iterator si;
int depth = bb_loop_depth (bb);
for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
{
@ -481,21 +476,10 @@ init_copy_prop (void)
/* The only statements that we care about are those that may
generate useful copies. We also need to mark conditional
jumps so that their outgoing edges are added to the work
lists of the propagator.
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.
??? This doesn't make sense. */
lists of the propagator. */
if (stmt_ends_bb_p (stmt))
prop_set_simulate_again (stmt, true);
else if (stmt_may_generate_copy (stmt)
/* Since we are iterating over the statements in
BB, not the phi nodes, STMT will always be an
assignment. */
&& loop_depth_of_name (gimple_assign_rhs1 (stmt)) <= depth)
else if (stmt_may_generate_copy (stmt))
prop_set_simulate_again (stmt, true);
else
prop_set_simulate_again (stmt, false);

View File

@ -1235,12 +1235,7 @@ record_equivalences_from_phis (basic_block bb)
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)
/* 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)))
&& may_propagate_copy (lhs, rhs))
set_ssa_name_value (lhs, rhs);
}
}
@ -1575,33 +1570,6 @@ record_const_or_copy_1 (tree x, tree y, tree prev_x)
const_and_copies_stack.quick_push (x);
}
/* Return the loop depth of the basic block of the defining statement of X.
This number should not be treated as absolutely correct because the loop
information may not be completely up-to-date when dom runs. However, it
will be relatively correct, and as more passes are taught to keep loop info
up to date, the result will become more and more accurate. */
int
loop_depth_of_name (tree x)
{
gimple defstmt;
basic_block defbb;
/* If it's not an SSA_NAME, we have no clue where the definition is. */
if (TREE_CODE (x) != SSA_NAME)
return 0;
/* Otherwise return the loop depth of the defining statement's bb.
Note that there may not actually be a bb for this statement, if the
ssa_name is live on entry. */
defstmt = SSA_NAME_DEF_STMT (x);
defbb = gimple_bb (defstmt);
if (!defbb)
return 0;
return bb_loop_depth (defbb);
}
/* Record that X is equal to Y in const_and_copies. Record undo
information in the block-local vector. */
@ -1641,8 +1609,7 @@ record_equality (tree x, tree y)
long as we canonicalize on one value. */
if (is_gimple_min_invariant (y))
;
else if (is_gimple_min_invariant (x)
|| (loop_depth_of_name (x) <= loop_depth_of_name (y)))
else if (is_gimple_min_invariant (x))
prev_x = x, x = y, y = prev_x, prev_x = prev_y;
else if (prev_x && is_gimple_min_invariant (prev_x))
x = y, y = prev_x, prev_x = prev_y;
@ -2686,13 +2653,8 @@ get_lhs_or_phi_result (gimple stmt)
static void
propagate_rhs_into_lhs (gimple stmt, tree lhs, tree rhs, bitmap interesting_names)
{
/* First verify that propagation is valid and isn't going to move a
loop variant variable outside its loop. */
if (! SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs)
&& (TREE_CODE (rhs) != SSA_NAME
|| ! SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs))
&& may_propagate_copy (lhs, rhs)
&& loop_depth_of_name (lhs) >= loop_depth_of_name (rhs))
/* First verify that propagation is valid. */
if (may_propagate_copy (lhs, rhs))
{
use_operand_p use_p;
imm_use_iterator iter;

View File

@ -22,7 +22,6 @@ along with GCC; see the file COPYING3. If not see
extern void dump_dominator_optimization_stats (FILE *);
extern void debug_dominator_optimization_stats (void);
extern int loop_depth_of_name (tree);
extern bool simple_iv_increment_p (gimple);
#endif /* GCC_TREE_SSA_DOM_H */