mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-17 00:20:50 +08:00
cfghooks.c (copy_bbs): Add update_dominance argument.
2013-05-16 Steve Ellcey <sellcey@imgtec.com> * cfghooks.c (copy_bbs): Add update_dominance argument. * cfghooks.h (copy_bbs): Update prototype. * tree-cfg.c (gimple_duplicate_sese_region): Add update_dominance argument. * tree-flow.h (gimple_duplicate_sese_region): Update prototype. * tree-ssa-loop-ch.c (copy_loop_headers): Update gimple_duplicate_sese_region call. * tree-vect-loop-manip.c (slpeel_tree_duplicate_loop_to_edge_cfg): Update copy_bbs call. * cfgloopmanip.c (duplicate_loop_to_header_edge): Ditto. * trans-mem.c (ipa_uninstrument_transaction): Ditto. From-SVN: r198980
This commit is contained in:
parent
45f9820f00
commit
f14540b635
@ -1,3 +1,17 @@
|
||||
2013-05-16 Steve Ellcey <sellcey@imgtec.com>
|
||||
|
||||
* cfghooks.c (copy_bbs): Add update_dominance argument.
|
||||
* cfghooks.h (copy_bbs): Update prototype.
|
||||
* tree-cfg.c (gimple_duplicate_sese_region):
|
||||
Add update_dominance argument.
|
||||
* tree-flow.h (gimple_duplicate_sese_region): Update prototype.
|
||||
* tree-ssa-loop-ch.c (copy_loop_headers): Update
|
||||
gimple_duplicate_sese_region call.
|
||||
* tree-vect-loop-manip.c (slpeel_tree_duplicate_loop_to_edge_cfg):
|
||||
Update copy_bbs call.
|
||||
* cfgloopmanip.c (duplicate_loop_to_header_edge): Ditto.
|
||||
* trans-mem.c (ipa_uninstrument_transaction): Ditto.
|
||||
|
||||
2013-05-16 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* tree-vectorizer.h (NUM_PATTERNS): Increment.
|
||||
|
@ -1282,12 +1282,17 @@ end:
|
||||
|
||||
/* Duplicates N basic blocks stored in array BBS. Newly created basic blocks
|
||||
are placed into array NEW_BBS in the same order. Edges from basic blocks
|
||||
in BBS are also duplicated and copies of those of them
|
||||
that lead into BBS are redirected to appropriate newly created block. The
|
||||
function assigns bbs into loops (copy of basic block bb is assigned to
|
||||
bb->loop_father->copy loop, so this must be set up correctly in advance)
|
||||
and updates dominators locally (LOOPS structure that contains the information
|
||||
about dominators is passed to enable this).
|
||||
in BBS are also duplicated and copies of those that lead into BBS are
|
||||
redirected to appropriate newly created block. The function assigns bbs
|
||||
into loops (copy of basic block bb is assigned to bb->loop_father->copy
|
||||
loop, so this must be set up correctly in advance)
|
||||
|
||||
If UPDATE_DOMINANCE is true then this function updates dominators locally
|
||||
(LOOPS structure that contains the information about dominators is passed
|
||||
to enable this), otherwise it does not update the dominator information
|
||||
and it assumed that the caller will do this, perhaps by destroying and
|
||||
recreating it instead of trying to do an incremental update like this
|
||||
function does when update_dominance is true.
|
||||
|
||||
BASE is the superloop to that basic block belongs; if its header or latch
|
||||
is copied, we do not set the new blocks as header or latch.
|
||||
@ -1301,7 +1306,7 @@ end:
|
||||
void
|
||||
copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs,
|
||||
edge *edges, unsigned num_edges, edge *new_edges,
|
||||
struct loop *base, basic_block after)
|
||||
struct loop *base, basic_block after, bool update_dominance)
|
||||
{
|
||||
unsigned i, j;
|
||||
basic_block bb, new_bb, dom_bb;
|
||||
@ -1327,16 +1332,19 @@ copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs,
|
||||
}
|
||||
|
||||
/* Set dominators. */
|
||||
for (i = 0; i < n; i++)
|
||||
if (update_dominance)
|
||||
{
|
||||
bb = bbs[i];
|
||||
new_bb = new_bbs[i];
|
||||
|
||||
dom_bb = get_immediate_dominator (CDI_DOMINATORS, bb);
|
||||
if (dom_bb->flags & BB_DUPLICATED)
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
dom_bb = get_bb_copy (dom_bb);
|
||||
set_immediate_dominator (CDI_DOMINATORS, new_bb, dom_bb);
|
||||
bb = bbs[i];
|
||||
new_bb = new_bbs[i];
|
||||
|
||||
dom_bb = get_immediate_dominator (CDI_DOMINATORS, bb);
|
||||
if (dom_bb->flags & BB_DUPLICATED)
|
||||
{
|
||||
dom_bb = get_bb_copy (dom_bb);
|
||||
set_immediate_dominator (CDI_DOMINATORS, new_bb, dom_bb);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -201,7 +201,7 @@ extern void lv_add_condition_to_bb (basic_block, basic_block, basic_block,
|
||||
extern bool can_copy_bbs_p (basic_block *, unsigned);
|
||||
extern void copy_bbs (basic_block *, unsigned, basic_block *,
|
||||
edge *, unsigned, edge *, struct loop *,
|
||||
basic_block);
|
||||
basic_block, bool);
|
||||
|
||||
void account_profile_record (struct profile_record *, int);
|
||||
|
||||
|
@ -1300,7 +1300,7 @@ duplicate_loop_to_header_edge (struct loop *loop, edge e,
|
||||
|
||||
/* Copy bbs. */
|
||||
copy_bbs (bbs, n, new_bbs, spec_edges, 2, new_spec_edges, loop,
|
||||
place_after);
|
||||
place_after, true);
|
||||
place_after = new_spec_edges[SE_LATCH]->src;
|
||||
|
||||
if (flags & DLTHE_RECORD_COPY_NUMBER)
|
||||
|
@ -3978,7 +3978,8 @@ ipa_uninstrument_transaction (struct tm_region *region,
|
||||
int n = queue.length ();
|
||||
basic_block *new_bbs = XNEWVEC (basic_block, n);
|
||||
|
||||
copy_bbs (queue.address (), n, new_bbs, NULL, 0, NULL, NULL, transaction_bb);
|
||||
copy_bbs (queue.address (), n, new_bbs, NULL, 0, NULL, NULL, transaction_bb,
|
||||
true);
|
||||
edge e = make_edge (transaction_bb, new_bbs[0], EDGE_TM_UNINSTRUMENTED);
|
||||
add_phi_args_after_copy (new_bbs, n, e);
|
||||
|
||||
|
@ -5686,16 +5686,19 @@ add_phi_args_after_copy (basic_block *region_copy, unsigned n_region,
|
||||
inside region is live over the other exit edges of the region. All entry
|
||||
edges to the region must go to ENTRY->dest. The edge ENTRY is redirected
|
||||
to the duplicate of the region. Dominance and loop information is
|
||||
updated, but not the SSA web. The new basic blocks are stored to
|
||||
REGION_COPY in the same order as they had in REGION, provided that
|
||||
REGION_COPY is not NULL.
|
||||
updated if UPDATE_DOMINANCE is true, but not the SSA web. If
|
||||
UPDATE_DOMINANCE is false then we assume that the caller will update the
|
||||
dominance information after calling this function. The new basic
|
||||
blocks are stored to REGION_COPY in the same order as they had in REGION,
|
||||
provided that REGION_COPY is not NULL.
|
||||
The function returns false if it is unable to copy the region,
|
||||
true otherwise. */
|
||||
|
||||
bool
|
||||
gimple_duplicate_sese_region (edge entry, edge exit,
|
||||
basic_block *region, unsigned n_region,
|
||||
basic_block *region_copy)
|
||||
basic_block *region_copy,
|
||||
bool update_dominance)
|
||||
{
|
||||
unsigned i;
|
||||
bool free_region_copy = false, copying_header = false;
|
||||
@ -5749,12 +5752,15 @@ gimple_duplicate_sese_region (edge entry, edge exit,
|
||||
free_region_copy = true;
|
||||
}
|
||||
|
||||
/* Record blocks outside the region that are dominated by something
|
||||
inside. */
|
||||
doms.create (0);
|
||||
initialize_original_copy_tables ();
|
||||
|
||||
doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
|
||||
/* Record blocks outside the region that are dominated by something
|
||||
inside. */
|
||||
if (update_dominance)
|
||||
{
|
||||
doms.create (0);
|
||||
doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
|
||||
}
|
||||
|
||||
if (entry->dest->count)
|
||||
{
|
||||
@ -5778,7 +5784,7 @@ gimple_duplicate_sese_region (edge entry, edge exit,
|
||||
}
|
||||
|
||||
copy_bbs (region, n_region, region_copy, &exit, 1, &exit_copy, loop,
|
||||
split_edge_bb_loc (entry));
|
||||
split_edge_bb_loc (entry), update_dominance);
|
||||
if (total_count)
|
||||
{
|
||||
scale_bbs_frequencies_gcov_type (region, n_region,
|
||||
@ -5809,10 +5815,13 @@ gimple_duplicate_sese_region (edge entry, edge exit,
|
||||
for entry block and its copy. Anything that is outside of the
|
||||
region, but was dominated by something inside needs recounting as
|
||||
well. */
|
||||
set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src);
|
||||
doms.safe_push (get_bb_original (entry->dest));
|
||||
iterate_fix_dominators (CDI_DOMINATORS, doms, false);
|
||||
doms.release ();
|
||||
if (update_dominance)
|
||||
{
|
||||
set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src);
|
||||
doms.safe_push (get_bb_original (entry->dest));
|
||||
iterate_fix_dominators (CDI_DOMINATORS, doms, false);
|
||||
doms.release ();
|
||||
}
|
||||
|
||||
/* Add the other PHI node arguments. */
|
||||
add_phi_args_after_copy (region_copy, n_region, NULL);
|
||||
@ -5944,7 +5953,7 @@ gimple_duplicate_sese_tail (edge entry ATTRIBUTE_UNUSED, edge exit ATTRIBUTE_UNU
|
||||
}
|
||||
|
||||
copy_bbs (region, n_region, region_copy, exits, 2, nexits, orig_loop,
|
||||
split_edge_bb_loc (exit));
|
||||
split_edge_bb_loc (exit), true);
|
||||
if (total_count)
|
||||
{
|
||||
scale_bbs_frequencies_gcov_type (region, n_region,
|
||||
|
@ -395,7 +395,7 @@ extern void verify_gimple_in_cfg (struct function *);
|
||||
extern tree gimple_block_label (basic_block);
|
||||
extern void extract_true_false_edges_from_block (basic_block, edge *, edge *);
|
||||
extern bool gimple_duplicate_sese_region (edge, edge, basic_block *, unsigned,
|
||||
basic_block *);
|
||||
basic_block *, bool);
|
||||
extern bool gimple_duplicate_sese_tail (edge, edge, basic_block *, unsigned,
|
||||
basic_block *);
|
||||
extern void gather_blocks_in_sese_region (basic_block entry, basic_block exit,
|
||||
|
@ -197,7 +197,8 @@ copy_loop_headers (void)
|
||||
entry = loop_preheader_edge (loop);
|
||||
|
||||
propagate_threaded_block_debug_into (exit->dest, entry->dest);
|
||||
if (!gimple_duplicate_sese_region (entry, exit, bbs, n_bbs, copied_bbs))
|
||||
if (!gimple_duplicate_sese_region (entry, exit, bbs, n_bbs, copied_bbs,
|
||||
true))
|
||||
{
|
||||
fprintf (dump_file, "Duplication failed.\n");
|
||||
continue;
|
||||
|
@ -735,7 +735,7 @@ slpeel_tree_duplicate_loop_to_edge_cfg (struct loop *loop, edge e)
|
||||
|
||||
copy_bbs (bbs, loop->num_nodes + 1, new_bbs,
|
||||
&exit, 1, &new_exit, NULL,
|
||||
e->src);
|
||||
e->src, true);
|
||||
basic_block new_preheader = new_bbs[loop->num_nodes];
|
||||
|
||||
add_phi_args_after_copy (new_bbs, loop->num_nodes + 1, NULL);
|
||||
|
Loading…
x
Reference in New Issue
Block a user