aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-pre.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2017-10-25 07:08:12 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-10-25 07:08:12 +0000
commit57904e87b934e9dd8f94e9a0c4b3e10f3a4863ec (patch)
tree75021edfd0419e395f052dee1f961ad3af69e707 /gcc/tree-ssa-pre.c
parente921c7e5a670ccc758bf58d82065d224a98671d9 (diff)
downloadgcc-57904e87b934e9dd8f94e9a0c4b3e10f3a4863ec.zip
gcc-57904e87b934e9dd8f94e9a0c4b3e10f3a4863ec.tar.gz
gcc-57904e87b934e9dd8f94e9a0c4b3e10f3a4863ec.tar.bz2
tree-ssa-pre.c (need_eh_cleanup, [...]): Move inside...
2017-10-25 Richard Biener <rguenther@suse.de> * tree-ssa-pre.c (need_eh_cleanup, need_ab_cleanup, el_to_remove, el_to_fixup, el_todo, el_avail, el_avail_stack, eliminate_avail, eliminate_push_avail, eliminate_insert): Move inside... (class eliminate_dom_walker): ... this class in preparation of move. (fini_eliminate): Remove by merging with ... (eliminate): ... this function. Adjust for class changes. (pass_pre::execute): Remove fini_eliminate call. (pass_fre::execute): Likewise. From-SVN: r254068
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r--gcc/tree-ssa-pre.c178
1 files changed, 83 insertions, 95 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index 7bf8701..ad7a0f1 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -551,12 +551,6 @@ static unsigned int get_expr_value_id (pre_expr);
static object_allocator<bitmap_set> bitmap_set_pool ("Bitmap sets");
static bitmap_obstack grand_bitmap_obstack;
-/* Set of blocks with statements that have had their EH properties changed. */
-static bitmap need_eh_cleanup;
-
-/* Set of blocks with statements that have had their AB properties changed. */
-static bitmap need_ab_cleanup;
-
/* A three tuple {e, pred, v} used to cache phi translations in the
phi_translate_table. */
@@ -4042,27 +4036,61 @@ compute_avail (void)
free (worklist);
}
+class eliminate_dom_walker : public dom_walker
+{
+public:
+ eliminate_dom_walker (cdi_direction direction, bool do_pre_);
+ ~eliminate_dom_walker ();
+
+ virtual edge before_dom_children (basic_block);
+ virtual void after_dom_children (basic_block);
+
+ tree eliminate_avail (tree op);
+ void eliminate_push_avail (tree op);
+ tree eliminate_insert (gimple_stmt_iterator *gsi, tree val);
+
+ bool do_pre;
+ unsigned int el_todo;
+
+ /* Blocks with statements that have had their EH properties changed. */
+ bitmap need_eh_cleanup;
+
+ /* Blocks with statements that have had their AB properties changed. */
+ bitmap need_ab_cleanup;
-/* Local state for the eliminate domwalk. */
-static vec<gimple *> el_to_remove;
-static vec<gimple *> el_to_fixup;
-static unsigned int el_todo;
-static vec<tree> el_avail;
-static vec<tree> el_avail_stack;
+ auto_vec<gimple *> to_remove;
+ auto_vec<gimple *> to_fixup;
+ auto_vec<tree> avail;
+ auto_vec<tree> avail_stack;
+};
+
+eliminate_dom_walker::eliminate_dom_walker (cdi_direction direction,
+ bool do_pre_)
+ : dom_walker (direction), do_pre (do_pre_), el_todo (0)
+{
+ need_eh_cleanup = BITMAP_ALLOC (NULL);
+ need_ab_cleanup = BITMAP_ALLOC (NULL);
+}
+
+eliminate_dom_walker::~eliminate_dom_walker ()
+{
+ BITMAP_FREE (need_eh_cleanup);
+ BITMAP_FREE (need_ab_cleanup);
+}
/* Return a leader for OP that is available at the current point of the
eliminate domwalk. */
-static tree
-eliminate_avail (tree op)
+tree
+eliminate_dom_walker::eliminate_avail (tree op)
{
tree valnum = VN_INFO (op)->valnum;
if (TREE_CODE (valnum) == SSA_NAME)
{
if (SSA_NAME_IS_DEFAULT_DEF (valnum))
return valnum;
- if (el_avail.length () > SSA_NAME_VERSION (valnum))
- return el_avail[SSA_NAME_VERSION (valnum)];
+ if (avail.length () > SSA_NAME_VERSION (valnum))
+ return avail[SSA_NAME_VERSION (valnum)];
}
else if (is_gimple_min_invariant (valnum))
return valnum;
@@ -4071,27 +4099,27 @@ eliminate_avail (tree op)
/* At the current point of the eliminate domwalk make OP available. */
-static void
-eliminate_push_avail (tree op)
+void
+eliminate_dom_walker::eliminate_push_avail (tree op)
{
tree valnum = VN_INFO (op)->valnum;
if (TREE_CODE (valnum) == SSA_NAME)
{
- if (el_avail.length () <= SSA_NAME_VERSION (valnum))
- el_avail.safe_grow_cleared (SSA_NAME_VERSION (valnum) + 1);
+ if (avail.length () <= SSA_NAME_VERSION (valnum))
+ avail.safe_grow_cleared (SSA_NAME_VERSION (valnum) + 1);
tree pushop = op;
- if (el_avail[SSA_NAME_VERSION (valnum)])
- pushop = el_avail[SSA_NAME_VERSION (valnum)];
- el_avail_stack.safe_push (pushop);
- el_avail[SSA_NAME_VERSION (valnum)] = op;
+ if (avail[SSA_NAME_VERSION (valnum)])
+ pushop = avail[SSA_NAME_VERSION (valnum)];
+ avail_stack.safe_push (pushop);
+ avail[SSA_NAME_VERSION (valnum)] = op;
}
}
/* Insert the expression recorded by SCCVN for VAL at *GSI. Returns
the leader for the expression if insertion was successful. */
-static tree
-eliminate_insert (gimple_stmt_iterator *gsi, tree val)
+tree
+eliminate_dom_walker::eliminate_insert (gimple_stmt_iterator *gsi, tree val)
{
/* We can insert a sequence with a single assignment only. */
gimple_seq stmts = VN_INFO (val)->expr;
@@ -4171,17 +4199,7 @@ eliminate_insert (gimple_stmt_iterator *gsi, tree val)
return res;
}
-class eliminate_dom_walker : public dom_walker
-{
-public:
- eliminate_dom_walker (cdi_direction direction, bool do_pre_)
- : dom_walker (direction), do_pre (do_pre_) {}
- virtual edge before_dom_children (basic_block);
- virtual void after_dom_children (basic_block);
-
- bool do_pre;
-};
/* Perform elimination for the basic-block B during the domwalk. */
@@ -4189,7 +4207,7 @@ edge
eliminate_dom_walker::before_dom_children (basic_block b)
{
/* Mark new bb. */
- el_avail_stack.safe_push (NULL_TREE);
+ avail_stack.safe_push (NULL_TREE);
/* Skip unreachable blocks marked unreachable during the SCCVN domwalk. */
edge_iterator ei;
@@ -4236,7 +4254,7 @@ eliminate_dom_walker::before_dom_children (basic_block b)
if (may_propagate_copy (res, sprime))
{
/* Mark the PHI for removal. */
- el_to_remove.safe_push (phi);
+ to_remove.safe_push (phi);
gsi_next (&gsi);
continue;
}
@@ -4378,7 +4396,7 @@ eliminate_dom_walker::before_dom_children (basic_block b)
if (may_propagate_copy (lhs, sprime))
{
/* Mark it for removal. */
- el_to_remove.safe_push (stmt);
+ to_remove.safe_push (stmt);
/* ??? Don't count copy/constant propagations. */
if (gimple_assign_single_p (stmt)
@@ -4493,7 +4511,7 @@ eliminate_dom_walker::before_dom_children (basic_block b)
}
/* Queue stmt for removal. */
- el_to_remove.safe_push (stmt);
+ to_remove.safe_push (stmt);
continue;
}
}
@@ -4601,7 +4619,7 @@ eliminate_dom_walker::before_dom_children (basic_block b)
stmt = gsi_stmt (gsi);
/* In case we folded the stmt away schedule the NOP for removal. */
if (gimple_nop_p (stmt))
- el_to_remove.safe_push (stmt);
+ to_remove.safe_push (stmt);
}
/* Visit indirect calls and turn them into direct calls if
@@ -4668,7 +4686,7 @@ eliminate_dom_walker::before_dom_children (basic_block b)
is needed to fix up the noreturn call. */
if (!was_noreturn
&& is_gimple_call (stmt) && gimple_call_noreturn_p (stmt))
- el_to_fixup.safe_push (stmt);
+ to_fixup.safe_push (stmt);
/* When changing a condition or switch into one we know what
edge will be executed, schedule a cfg cleanup. */
if ((gimple_code (stmt) == GIMPLE_COND
@@ -4734,14 +4752,14 @@ void
eliminate_dom_walker::after_dom_children (basic_block)
{
tree entry;
- while ((entry = el_avail_stack.pop ()) != NULL_TREE)
+ while ((entry = avail_stack.pop ()) != NULL_TREE)
{
tree valnum = VN_INFO (entry)->valnum;
- tree old = el_avail[SSA_NAME_VERSION (valnum)];
+ tree old = avail[SSA_NAME_VERSION (valnum)];
if (old == entry)
- el_avail[SSA_NAME_VERSION (valnum)] = NULL_TREE;
+ avail[SSA_NAME_VERSION (valnum)] = NULL_TREE;
else
- el_avail[SSA_NAME_VERSION (valnum)] = entry;
+ avail[SSA_NAME_VERSION (valnum)] = entry;
}
}
@@ -4750,40 +4768,18 @@ eliminate_dom_walker::after_dom_children (basic_block)
static unsigned int
eliminate (bool do_pre)
{
- need_eh_cleanup = BITMAP_ALLOC (NULL);
- need_ab_cleanup = BITMAP_ALLOC (NULL);
-
- el_to_remove.create (0);
- el_to_fixup.create (0);
- el_todo = 0;
- el_avail.create (num_ssa_names);
- el_avail_stack.create (0);
+ eliminate_dom_walker el (CDI_DOMINATORS, do_pre);
+ el.avail.reserve (num_ssa_names);
- eliminate_dom_walker (CDI_DOMINATORS,
- do_pre).walk (cfun->cfg->x_entry_block_ptr);
-
- el_avail.release ();
- el_avail_stack.release ();
-
- return el_todo;
-}
-
-/* Perform CFG cleanups made necessary by elimination. */
-
-static unsigned
-fini_eliminate (void)
-{
- gimple_stmt_iterator gsi;
- gimple *stmt;
- unsigned todo = 0;
+ el.walk (cfun->cfg->x_entry_block_ptr);
/* We cannot remove stmts during BB walk, especially not release SSA
names there as this confuses the VN machinery. The stmts ending
- up in el_to_remove are either stores or simple copies.
+ up in to_remove are either stores or simple copies.
Remove stmts in reverse order to make debug stmt creation possible. */
- while (!el_to_remove.is_empty ())
+ while (!el.to_remove.is_empty ())
{
- stmt = el_to_remove.pop ();
+ gimple *stmt = el.to_remove.pop ();
if (dump_file && (dump_flags & TDF_DETAILS))
{
@@ -4791,7 +4787,7 @@ fini_eliminate (void)
print_gimple_stmt (dump_file, stmt, 0, 0);
}
- gsi = gsi_for_stmt (stmt);
+ gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
if (gimple_code (stmt) == GIMPLE_PHI)
remove_phi_node (&gsi, true);
else
@@ -4799,24 +4795,23 @@ fini_eliminate (void)
basic_block bb = gimple_bb (stmt);
unlink_stmt_vdef (stmt);
if (gsi_remove (&gsi, true))
- bitmap_set_bit (need_eh_cleanup, bb->index);
+ bitmap_set_bit (el.need_eh_cleanup, bb->index);
if (is_gimple_call (stmt) && stmt_can_make_abnormal_goto (stmt))
- bitmap_set_bit (need_ab_cleanup, bb->index);
+ bitmap_set_bit (el.need_ab_cleanup, bb->index);
release_defs (stmt);
}
/* Removing a stmt may expose a forwarder block. */
- todo |= TODO_cleanup_cfg;
+ el.el_todo |= TODO_cleanup_cfg;
}
- el_to_remove.release ();
/* Fixup stmts that became noreturn calls. This may require splitting
blocks and thus isn't possible during the dominator walk. Do this
in reverse order so we don't inadvertedly remove a stmt we want to
fixup by visiting a dominating now noreturn call first. */
- while (!el_to_fixup.is_empty ())
+ while (!el.to_fixup.is_empty ())
{
- stmt = el_to_fixup.pop ();
+ gimple *stmt = el.to_fixup.pop ();
if (dump_file && (dump_flags & TDF_DETAILS))
{
@@ -4825,25 +4820,21 @@ fini_eliminate (void)
}
if (fixup_noreturn_call (stmt))
- todo |= TODO_cleanup_cfg;
+ el.el_todo |= TODO_cleanup_cfg;
}
- el_to_fixup.release ();
- bool do_eh_cleanup = !bitmap_empty_p (need_eh_cleanup);
- bool do_ab_cleanup = !bitmap_empty_p (need_ab_cleanup);
+ bool do_eh_cleanup = !bitmap_empty_p (el.need_eh_cleanup);
+ bool do_ab_cleanup = !bitmap_empty_p (el.need_ab_cleanup);
if (do_eh_cleanup)
- gimple_purge_all_dead_eh_edges (need_eh_cleanup);
+ gimple_purge_all_dead_eh_edges (el.need_eh_cleanup);
if (do_ab_cleanup)
- gimple_purge_all_dead_abnormal_call_edges (need_ab_cleanup);
-
- BITMAP_FREE (need_eh_cleanup);
- BITMAP_FREE (need_ab_cleanup);
+ gimple_purge_all_dead_abnormal_call_edges (el.need_ab_cleanup);
if (do_eh_cleanup || do_ab_cleanup)
- todo |= TODO_cleanup_cfg;
- return todo;
+ el.el_todo |= TODO_cleanup_cfg;
+ return el.el_todo;
}
/* Cheap DCE of a known set of possibly dead stmts.
@@ -5043,7 +5034,6 @@ pass_pre::execute (function *fun)
clear_expression_ids ();
scev_finalize ();
- todo |= fini_eliminate ();
remove_dead_inserted_code ();
fini_pre ();
loop_optimizer_finalize ();
@@ -5121,8 +5111,6 @@ pass_fre::execute (function *fun)
/* Remove all the redundant expressions. */
todo |= eliminate (false);
- todo |= fini_eliminate ();
-
scc_vn_restore_ssa_info ();
free_scc_vn ();