+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>
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);
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;
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;
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;