Commit 601f64e2 by Richard Guenther Committed by Richard Biener

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
parent 1aeee5ad
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> 2011-09-07 Eric Botcazou <ebotcazou@adacore.com>
Iain Sandoe <iains@gcc.gnu.org> Iain Sandoe <iains@gcc.gnu.org>
...@@ -597,6 +597,7 @@ extern void dump_dominator_optimization_stats (FILE *); ...@@ -597,6 +597,7 @@ extern void dump_dominator_optimization_stats (FILE *);
extern void debug_dominator_optimization_stats (void); extern void debug_dominator_optimization_stats (void);
int loop_depth_of_name (tree); int loop_depth_of_name (tree);
tree degenerate_phi_result (gimple); tree degenerate_phi_result (gimple);
bool simple_iv_increment_p (gimple);
/* In tree-ssa-copy.c */ /* In tree-ssa-copy.c */
extern void propagate_value (use_operand_p, tree); extern void propagate_value (use_operand_p, tree);
......
...@@ -1409,9 +1409,10 @@ record_equality (tree x, tree y) ...@@ -1409,9 +1409,10 @@ record_equality (tree x, tree y)
i_1 = phi (..., i_2) i_1 = phi (..., i_2)
i_2 = i_1 +/- ... */ i_2 = i_1 +/- ... */
static bool bool
simple_iv_increment_p (gimple stmt) simple_iv_increment_p (gimple stmt)
{ {
enum tree_code code;
tree lhs, preinc; tree lhs, preinc;
gimple phi; gimple phi;
size_t i; size_t i;
...@@ -1423,12 +1424,13 @@ simple_iv_increment_p (gimple stmt) ...@@ -1423,12 +1424,13 @@ simple_iv_increment_p (gimple stmt)
if (TREE_CODE (lhs) != SSA_NAME) if (TREE_CODE (lhs) != SSA_NAME)
return false; return false;
if (gimple_assign_rhs_code (stmt) != PLUS_EXPR code = gimple_assign_rhs_code (stmt);
&& gimple_assign_rhs_code (stmt) != MINUS_EXPR) if (code != PLUS_EXPR
&& code != MINUS_EXPR
&& code != POINTER_PLUS_EXPR)
return false; return false;
preinc = gimple_assign_rhs1 (stmt); preinc = gimple_assign_rhs1 (stmt);
if (TREE_CODE (preinc) != SSA_NAME) if (TREE_CODE (preinc) != SSA_NAME)
return false; return false;
......
...@@ -2377,21 +2377,23 @@ ssa_forward_propagate_and_combine (void) ...@@ -2377,21 +2377,23 @@ ssa_forward_propagate_and_combine (void)
else else
gsi_next (&gsi); 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 /* ??? Better adjust the interface to that function
instead of building new trees here. */ instead of building new trees here. */
&& forward_propagate_addr_expr && forward_propagate_addr_expr
(lhs, (lhs,
build1 (ADDR_EXPR, build1_loc (gimple_location (stmt),
TREE_TYPE (rhs), ADDR_EXPR, TREE_TYPE (rhs),
fold_build2 (MEM_REF, fold_build2 (MEM_REF,
TREE_TYPE (TREE_TYPE (rhs)), TREE_TYPE (TREE_TYPE (rhs)),
rhs, rhs,
fold_convert fold_convert (ptr_type_node,
(ptr_type_node, off)))))
gimple_assign_rhs2 (stmt))))))
{ {
release_defs (stmt); release_defs (stmt);
todoflags |= TODO_remove_unused_locals; todoflags |= TODO_remove_unused_locals;
......
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