aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-ssa-sccopy.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/gimple-ssa-sccopy.cc')
-rw-r--r--gcc/gimple-ssa-sccopy.cc20
1 files changed, 12 insertions, 8 deletions
diff --git a/gcc/gimple-ssa-sccopy.cc b/gcc/gimple-ssa-sccopy.cc
index ee2a7fa..c933745 100644
--- a/gcc/gimple-ssa-sccopy.cc
+++ b/gcc/gimple-ssa-sccopy.cc
@@ -464,7 +464,7 @@ class scc_copy_prop
public:
scc_copy_prop ();
~scc_copy_prop ();
- void propagate ();
+ bool propagate ();
private:
/* Bitmap tracking statements which were propagated so that they can be
@@ -474,15 +474,16 @@ private:
void visit_op (tree op, hash_set<tree> &outer_ops,
hash_set<gimple *> &scc_set, bool &is_inner,
tree &last_outer_op);
- void replace_scc_by_value (vec<gimple *> scc, tree val);
+ bool replace_scc_by_value (vec<gimple *> scc, tree val);
};
/* For each statement from given SCC, replace its usages by value
VAL. */
-void
+bool
scc_copy_prop::replace_scc_by_value (vec<gimple *> scc, tree val)
{
+ bool didsomething = false;
for (gimple *stmt : scc)
{
tree name = gimple_get_lhs (stmt);
@@ -497,10 +498,12 @@ scc_copy_prop::replace_scc_by_value (vec<gimple *> scc, tree val)
}
replace_uses_by (name, val);
bitmap_set_bit (dead_stmts, SSA_NAME_VERSION (name));
+ didsomething = true;
}
if (dump_file)
fprintf (dump_file, "Replacing SCC of size %d\n", scc.length ());
+ return didsomething;
}
/* Part of 'scc_copy_prop::propagate ()'. */
@@ -566,9 +569,10 @@ scc_copy_prop::visit_op (tree op, hash_set<tree> &outer_ops,
Braun, Buchwald, Hack, Leissa, Mallon, Zwinkau, 2013, LNCS vol. 7791,
Section 3.2. */
-void
+bool
scc_copy_prop::propagate ()
{
+ bool didsomething = false;
auto_vec<gimple *> useful_stmts = get_all_stmt_may_generate_copy ();
scc_discovery discovery;
@@ -636,7 +640,7 @@ scc_copy_prop::propagate ()
{
/* The only operand in outer_ops. */
tree outer_op = last_outer_op;
- replace_scc_by_value (scc, outer_op);
+ didsomething |= replace_scc_by_value (scc, outer_op);
}
else if (outer_ops.elements () > 1)
{
@@ -651,6 +655,7 @@ scc_copy_prop::propagate ()
scc.release ();
}
+ return didsomething;
}
scc_copy_prop::scc_copy_prop ()
@@ -683,7 +688,7 @@ const pass_data pass_data_sccopy =
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
- TODO_update_ssa | TODO_cleanup_cfg, /* todo_flags_finish */
+ 0, /* todo_flags_finish */
};
class pass_sccopy : public gimple_opt_pass
@@ -703,8 +708,7 @@ unsigned
pass_sccopy::execute (function *)
{
scc_copy_prop sccopy;
- sccopy.propagate ();
- return 0;
+ return sccopy.propagate () ? TODO_cleanup_cfg : 0;
}
} // anon namespace