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:
parent
1aeee5ad50
commit
601f64e2e9
|
@ -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>
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue