aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-propagate.c
diff options
context:
space:
mode:
authorKai Tietz <ktietz@redhat.com>2011-07-21 09:42:04 +0000
committerKai Tietz <ktietz@redhat.com>2011-07-21 09:42:04 +0000
commit3ef570104681eae02993ce8a51220f3feb558f98 (patch)
tree65239fc507c029f4659438c9ef167e619cbd2d4c /gcc/tree-ssa-propagate.c
parent48efaacfff20ead53e4e9fc4097055d602226974 (diff)
2011-07-21 Kai Tietz <ktietz@redhat.com>
* tree-ssa-propagate.c (substitute_and_fold): Use do_dce flag to deside, if BB's statements are scanned in last to first, or first to last order. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@176556 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-propagate.c')
-rw-r--r--gcc/tree-ssa-propagate.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c
index 64c3fdfe570..7741db88686 100644
--- a/gcc/tree-ssa-propagate.c
+++ b/gcc/tree-ssa-propagate.c
@@ -966,6 +966,9 @@ replace_phi_args_in (gimple phi, ssa_prop_get_value_fn get_value)
DO_DCE is true if trivially dead stmts can be removed.
+ If DO_DCE is true, the statements within a BB are walked from
+ last to first element. Otherwise we scan from first to last element.
+
Return TRUE when something changed. */
bool
@@ -1046,9 +1049,10 @@ substitute_and_fold (ssa_prop_get_value_fn get_value_fn,
for (i = gsi_start_phis (bb); !gsi_end_p (i); gsi_next (&i))
replace_phi_args_in (gsi_stmt (i), get_value_fn);
- /* Propagate known values into stmts. Do a backward walk to expose
- more trivially deletable stmts. */
- for (i = gsi_last_bb (bb); !gsi_end_p (i);)
+ /* Propagate known values into stmts. Do a backward walk if
+ do_dce is true. In some case it exposes
+ more trivially deletable stmts to walk backward. */
+ for (i = (do_dce ? gsi_last_bb (bb) : gsi_start_bb (bb)); !gsi_end_p (i);)
{
bool did_replace;
gimple stmt = gsi_stmt (i);
@@ -1057,7 +1061,10 @@ substitute_and_fold (ssa_prop_get_value_fn get_value_fn,
gimple_stmt_iterator oldi;
oldi = i;
- gsi_prev (&i);
+ if (do_dce)
+ gsi_prev (&i);
+ else
+ gsi_next (&i);
/* Ignore ASSERT_EXPRs. They are used by VRP to generate
range information for names and they are discarded