aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-cfg.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2011-12-14 09:50:38 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2011-12-14 09:50:38 +0000
commit552d2db5659aae080edbfdb27f446a98334b323d (patch)
tree0fe3c6bb0adea1b37f66e4eb87136caedcb29f4a /gcc/tree-cfg.c
parent4f9c574a92e4d1f43c7e9c038a54384cdc07b264 (diff)
downloadgcc-552d2db5659aae080edbfdb27f446a98334b323d.zip
gcc-552d2db5659aae080edbfdb27f446a98334b323d.tar.gz
gcc-552d2db5659aae080edbfdb27f446a98334b323d.tar.bz2
tree-cfg.c (replace_uses_by): Only mark blocks altered that will make a difference.
2011-12-14 Richard Guenther <rguenther@suse.de> * tree-cfg.c (replace_uses_by): Only mark blocks altered that will make a difference. Only recompute ADDR_EXPR invariantness if it could possibly have changed. Do so before folding the statement. From-SVN: r182327
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r--gcc/tree-cfg.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index db10daf..3d1b775 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -1592,7 +1592,7 @@ replace_uses_by (tree name, tree val)
/* This can only occur for virtual operands, since
for the real ones SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
would prevent replacement. */
- gcc_assert (!is_gimple_reg (name));
+ gcc_checking_assert (!is_gimple_reg (name));
SSA_NAME_OCCURS_IN_ABNORMAL_PHI (val) = 1;
}
}
@@ -1604,28 +1604,37 @@ replace_uses_by (tree name, tree val)
gimple orig_stmt = stmt;
size_t i;
- fold_stmt (&gsi);
- stmt = gsi_stmt (gsi);
- if (cfgcleanup_altered_bbs && !is_gimple_debug (stmt))
+ /* Mark the block if we changed the last stmt in it. */
+ if (cfgcleanup_altered_bbs
+ && stmt_ends_bb_p (stmt))
bitmap_set_bit (cfgcleanup_altered_bbs, gimple_bb (stmt)->index);
- /* FIXME. This should go in update_stmt. */
- for (i = 0; i < gimple_num_ops (stmt); i++)
+ /* FIXME. It shouldn't be required to keep TREE_CONSTANT
+ on ADDR_EXPRs up-to-date on GIMPLE. Propagation will
+ only change sth from non-invariant to invariant, and only
+ when propagating integer constants. */
+ if (TREE_CODE (val) == INTEGER_CST)
+ for (i = 0; i < gimple_num_ops (stmt); i++)
+ {
+ tree op = gimple_op (stmt, i);
+ /* Operands may be empty here. For example, the labels
+ of a GIMPLE_COND are nulled out following the creation
+ of the corresponding CFG edges. */
+ if (op && TREE_CODE (op) == ADDR_EXPR)
+ recompute_tree_invariant_for_addr_expr (op);
+ }
+
+ if (fold_stmt (&gsi))
{
- tree op = gimple_op (stmt, i);
- /* Operands may be empty here. For example, the labels
- of a GIMPLE_COND are nulled out following the creation
- of the corresponding CFG edges. */
- if (op && TREE_CODE (op) == ADDR_EXPR)
- recompute_tree_invariant_for_addr_expr (op);
+ stmt = gsi_stmt (gsi);
+ maybe_clean_or_replace_eh_stmt (orig_stmt, stmt);
}
- maybe_clean_or_replace_eh_stmt (orig_stmt, stmt);
update_stmt (stmt);
}
}
- gcc_assert (has_zero_uses (name));
+ gcc_checking_assert (has_zero_uses (name));
/* Also update the trees stored in loop structures. */
if (current_loops)