re PR tree-optimization/50213 (Regression in space-optimized code relative to 4.5.x)

2011-09-07  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/50213
	* tree-flow.h (simple_iv_increment_p): Declare.
	* tree-ssa-dom.c (simple_iv_increment_p): Export.  Also handle
	POINTER_PLUS_EXPR.
	* tree-ssa-forwprop.c (ssa_forward_propagate_and_combine): Do
	not propagate simple IV counter increments.

From-SVN: r178633
This commit is contained in:
Richard Guenther 2011-09-07 11:28:39 +00:00 committed by Richard Biener
parent 1aeee5ad50
commit 601f64e2e9
4 changed files with 29 additions and 15 deletions

View File

@ -1,3 +1,12 @@
2011-09-07 Richard Guenther <rguenther@suse.de>
PR tree-optimization/50213
* tree-flow.h (simple_iv_increment_p): Declare.
* tree-ssa-dom.c (simple_iv_increment_p): Export. Also handle
POINTER_PLUS_EXPR.
* tree-ssa-forwprop.c (ssa_forward_propagate_and_combine): Do
not propagate simple IV counter increments.
2011-09-07 Eric Botcazou <ebotcazou@adacore.com>
Iain Sandoe <iains@gcc.gnu.org>

View File

@ -597,6 +597,7 @@ extern void dump_dominator_optimization_stats (FILE *);
extern void debug_dominator_optimization_stats (void);
int loop_depth_of_name (tree);
tree degenerate_phi_result (gimple);
bool simple_iv_increment_p (gimple);
/* In tree-ssa-copy.c */
extern void propagate_value (use_operand_p, tree);

View File

@ -1409,9 +1409,10 @@ record_equality (tree x, tree y)
i_1 = phi (..., i_2)
i_2 = i_1 +/- ... */
static bool
bool
simple_iv_increment_p (gimple stmt)
{
enum tree_code code;
tree lhs, preinc;
gimple phi;
size_t i;
@ -1423,12 +1424,13 @@ simple_iv_increment_p (gimple stmt)
if (TREE_CODE (lhs) != SSA_NAME)
return false;
if (gimple_assign_rhs_code (stmt) != PLUS_EXPR
&& gimple_assign_rhs_code (stmt) != MINUS_EXPR)
code = gimple_assign_rhs_code (stmt);
if (code != PLUS_EXPR
&& code != MINUS_EXPR
&& code != POINTER_PLUS_EXPR)
return false;
preinc = gimple_assign_rhs1 (stmt);
if (TREE_CODE (preinc) != SSA_NAME)
return false;

View File

@ -2377,21 +2377,23 @@ ssa_forward_propagate_and_combine (void)
else
gsi_next (&gsi);
}
else if (code == POINTER_PLUS_EXPR && can_propagate_from (stmt))
else if (code == POINTER_PLUS_EXPR)
{
if (TREE_CODE (gimple_assign_rhs2 (stmt)) == INTEGER_CST
tree off = gimple_assign_rhs2 (stmt);
if (TREE_CODE (off) == INTEGER_CST
&& can_propagate_from (stmt)
&& !simple_iv_increment_p (stmt)
/* ??? Better adjust the interface to that function
instead of building new trees here. */
&& forward_propagate_addr_expr
(lhs,
build1 (ADDR_EXPR,
TREE_TYPE (rhs),
fold_build2 (MEM_REF,
TREE_TYPE (TREE_TYPE (rhs)),
rhs,
fold_convert
(ptr_type_node,
gimple_assign_rhs2 (stmt))))))
(lhs,
build1_loc (gimple_location (stmt),
ADDR_EXPR, TREE_TYPE (rhs),
fold_build2 (MEM_REF,
TREE_TYPE (TREE_TYPE (rhs)),
rhs,
fold_convert (ptr_type_node,
off)))))
{
release_defs (stmt);
todoflags |= TODO_remove_unused_locals;