Commit ff8b369a by J"orn Rennecke Committed by Joern Rennecke

bt-load.c (btr_def_s): New member own_end;

	* bt-load.c (btr_def_s): New member own_end;
	(add_btr_to_live_range): Add second parameter.  Changed caller.
	(clear_btr_from_live_range): Clear btrs_live_at_end bit
	for the register its definition basic block if own_end is set.
	(augment_live_range): Also take btrs_live_at_end into account.
	(combine_btr_defs): Don't bother with
	other_def->other_btr_uses_after_use if it pertains to a different
	register.
	(move_btr_def): Set def->other_btr_uses_before_def after
	calling combine_btr_defs."

	* bt-load.c (augment_live_range): New argument full_range.
	Changed all callers.

	* bt-load.c (move_tr_def): Set other_tr_uses_before_def
	taking new btr assignment into account.

From-SVN: r91780
parent e21cb773
2004-12-06 J"orn Rennecke <joern.rennecke@st.com>
* bt-load.c (btr_def_s): New member own_end;
(add_btr_to_live_range): Add second parameter. Changed caller.
(clear_btr_from_live_range): Clear btrs_live_at_end bit
for the register its definition basic block if own_end is set.
(augment_live_range): Also take btrs_live_at_end into account.
(combine_btr_defs): Don't bother with
other_def->other_btr_uses_after_use if it pertains to a different
register.
(move_btr_def): Set def->other_btr_uses_before_def after
calling combine_btr_defs."
* bt-load.c (augment_live_range): New argument full_range.
Changed all callers.
* bt-load.c (move_tr_def): Set other_tr_uses_before_def
taking new btr assignment into account.
2004-12-05 Daniel Berlin <dberlin@dberlin.org> 2004-12-05 Daniel Berlin <dberlin@dberlin.org>
* tree-ssa-alias.c (create_global_var): Use void_type_node, * tree-ssa-alias.c (create_global_var): Use void_type_node,
......
...@@ -98,6 +98,10 @@ typedef struct btr_def_s ...@@ -98,6 +98,10 @@ typedef struct btr_def_s
as appropriate. */ as appropriate. */
char other_btr_uses_before_def; char other_btr_uses_before_def;
char other_btr_uses_after_use; char other_btr_uses_after_use;
/* We set own_end when we have moved a definition into a dominator.
Thus, when a later combination removes this definition again, we know
to clear out trs_live_at_end again. */
char own_end;
bitmap live_range; bitmap live_range;
} *btr_def; } *btr_def;
...@@ -123,9 +127,9 @@ static void link_btr_uses (btr_def *, btr_user *, sbitmap *, sbitmap *, int); ...@@ -123,9 +127,9 @@ static void link_btr_uses (btr_def *, btr_user *, sbitmap *, sbitmap *, int);
static void build_btr_def_use_webs (fibheap_t); static void build_btr_def_use_webs (fibheap_t);
static int block_at_edge_of_live_range_p (int, btr_def); static int block_at_edge_of_live_range_p (int, btr_def);
static void clear_btr_from_live_range (btr_def def); static void clear_btr_from_live_range (btr_def def);
static void add_btr_to_live_range (btr_def); static void add_btr_to_live_range (btr_def, int);
static void augment_live_range (bitmap, HARD_REG_SET *, basic_block, static void augment_live_range (bitmap, HARD_REG_SET *, basic_block,
basic_block); basic_block, int);
static int choose_btr (HARD_REG_SET); static int choose_btr (HARD_REG_SET);
static void combine_btr_defs (btr_def, HARD_REG_SET *); static void combine_btr_defs (btr_def, HARD_REG_SET *);
static void btr_def_live_range (btr_def, HARD_REG_SET *); static void btr_def_live_range (btr_def, HARD_REG_SET *);
...@@ -832,14 +836,18 @@ clear_btr_from_live_range (btr_def def) ...@@ -832,14 +836,18 @@ clear_btr_from_live_range (btr_def def)
dump_btrs_live (bb); dump_btrs_live (bb);
} }
} }
if (def->own_end)
CLEAR_HARD_REG_BIT (btrs_live_at_end[def->bb->index], def->btr);
} }
/* We are adding the def/use web DEF. Add the target register used /* We are adding the def/use web DEF. Add the target register used
in this web to the live set of all of the basic blocks that contain in this web to the live set of all of the basic blocks that contain
the live range of the web. */ the live range of the web.
If OWN_END is set, also show that the register is live from our
definitions at the end of the basic block where it is defined. */
static void static void
add_btr_to_live_range (btr_def def) add_btr_to_live_range (btr_def def, int own_end)
{ {
unsigned bb; unsigned bb;
bitmap_iterator bi; bitmap_iterator bi;
...@@ -851,6 +859,11 @@ add_btr_to_live_range (btr_def def) ...@@ -851,6 +859,11 @@ add_btr_to_live_range (btr_def def)
if (dump_file) if (dump_file)
dump_btrs_live (bb); dump_btrs_live (bb);
} }
if (own_end)
{
SET_HARD_REG_BIT (btrs_live_at_end[def->bb->index], def->btr);
def->own_end = 1;
}
} }
/* Update a live range to contain the basic block NEW_BLOCK, and all /* Update a live range to contain the basic block NEW_BLOCK, and all
...@@ -859,19 +872,30 @@ add_btr_to_live_range (btr_def def) ...@@ -859,19 +872,30 @@ add_btr_to_live_range (btr_def def)
all other blocks in the existing live range. all other blocks in the existing live range.
Also add to the set BTRS_LIVE_IN_RANGE all target registers that Also add to the set BTRS_LIVE_IN_RANGE all target registers that
are live in the blocks that we add to the live range. are live in the blocks that we add to the live range.
If FULL_RANGE is set, include the full live range of NEW_BB;
otherwise, if NEW_BB dominates HEAD_BB, only add registers that
are life at the end of NEW_BB for NEW_BB itself.
It is a precondition that either NEW_BLOCK dominates HEAD,or It is a precondition that either NEW_BLOCK dominates HEAD,or
HEAD dom NEW_BLOCK. This is used to speed up the HEAD dom NEW_BLOCK. This is used to speed up the
implementation of this function. */ implementation of this function. */
static void static void
augment_live_range (bitmap live_range, HARD_REG_SET *btrs_live_in_range, augment_live_range (bitmap live_range, HARD_REG_SET *btrs_live_in_range,
basic_block head_bb, basic_block new_bb) basic_block head_bb, basic_block new_bb, int full_range)
{ {
basic_block *worklist, *tos; basic_block *worklist, *tos;
tos = worklist = xmalloc (sizeof (basic_block) * (n_basic_blocks + 1)); tos = worklist = xmalloc (sizeof (basic_block) * (n_basic_blocks + 1));
if (dominated_by_p (CDI_DOMINATORS, new_bb, head_bb)) if (dominated_by_p (CDI_DOMINATORS, new_bb, head_bb))
*tos++ = new_bb; {
if (new_bb == head_bb)
{
if (full_range)
IOR_HARD_REG_SET (*btrs_live_in_range, btrs_live[new_bb->index]);
return;
}
*tos++ = new_bb;
}
else else
{ {
edge e; edge e;
...@@ -880,14 +904,14 @@ augment_live_range (bitmap live_range, HARD_REG_SET *btrs_live_in_range, ...@@ -880,14 +904,14 @@ augment_live_range (bitmap live_range, HARD_REG_SET *btrs_live_in_range,
gcc_assert (dominated_by_p (CDI_DOMINATORS, head_bb, new_bb)); gcc_assert (dominated_by_p (CDI_DOMINATORS, head_bb, new_bb));
IOR_HARD_REG_SET (*btrs_live_in_range, btrs_live[head_bb->index]);
bitmap_set_bit (live_range, new_block); bitmap_set_bit (live_range, new_block);
if (flag_btr_bb_exclusive) /* A previous btr migration could have caused a register to be
live just at the end of new_block which we need in full, so
use trs_live_at_end even if full_range is set. */
IOR_HARD_REG_SET (*btrs_live_in_range, btrs_live_at_end[new_block]);
if (full_range)
IOR_HARD_REG_SET (*btrs_live_in_range, btrs_live[new_block]); IOR_HARD_REG_SET (*btrs_live_in_range, btrs_live[new_block]);
else
{
IOR_HARD_REG_SET (*btrs_live_in_range, btrs_live_at_end[new_block]);
IOR_HARD_REG_SET (*btrs_live_in_range, btrs_live[head_bb->index]);
}
if (dump_file) if (dump_file)
{ {
fprintf (dump_file, fprintf (dump_file,
...@@ -912,6 +936,10 @@ augment_live_range (bitmap live_range, HARD_REG_SET *btrs_live_in_range, ...@@ -912,6 +936,10 @@ augment_live_range (bitmap live_range, HARD_REG_SET *btrs_live_in_range,
bitmap_set_bit (live_range, bb->index); bitmap_set_bit (live_range, bb->index);
IOR_HARD_REG_SET (*btrs_live_in_range, IOR_HARD_REG_SET (*btrs_live_in_range,
btrs_live[bb->index]); btrs_live[bb->index]);
/* A previous btr migration could have caused a register to be
live just at the end of a block which we need in full. */
IOR_HARD_REG_SET (*btrs_live_in_range,
btrs_live_at_end[bb->index]);
if (dump_file) if (dump_file)
{ {
fprintf (dump_file, fprintf (dump_file,
...@@ -977,7 +1005,10 @@ btr_def_live_range (btr_def def, HARD_REG_SET *btrs_live_in_range) ...@@ -977,7 +1005,10 @@ btr_def_live_range (btr_def def, HARD_REG_SET *btrs_live_in_range)
for (user = def->uses; user != NULL; user = user->next) for (user = def->uses; user != NULL; user = user->next)
augment_live_range (def->live_range, btrs_live_in_range, augment_live_range (def->live_range, btrs_live_in_range,
def->bb, user->bb); def->bb, user->bb,
(flag_btr_bb_exclusive
|| user->insn != BB_END (def->bb)
|| GET_CODE (user->insn) != JUMP_INSN));
} }
else else
{ {
...@@ -1038,7 +1069,10 @@ combine_btr_defs (btr_def def, HARD_REG_SET *btrs_live_in_range) ...@@ -1038,7 +1069,10 @@ combine_btr_defs (btr_def def, HARD_REG_SET *btrs_live_in_range)
for (user = other_def->uses; user != NULL; user = user->next) for (user = other_def->uses; user != NULL; user = user->next)
augment_live_range (combined_live_range, &combined_btrs_live, augment_live_range (combined_live_range, &combined_btrs_live,
def->bb, user->bb); def->bb, user->bb,
(flag_btr_bb_exclusive
|| user->insn != BB_END (def->bb)
|| GET_CODE (user->insn) != JUMP_INSN));
btr = choose_btr (combined_btrs_live); btr = choose_btr (combined_btrs_live);
if (btr != -1) if (btr != -1)
...@@ -1072,7 +1106,7 @@ combine_btr_defs (btr_def def, HARD_REG_SET *btrs_live_in_range) ...@@ -1072,7 +1106,7 @@ combine_btr_defs (btr_def def, HARD_REG_SET *btrs_live_in_range)
clear_btr_from_live_range (other_def); clear_btr_from_live_range (other_def);
other_def->uses = NULL; other_def->uses = NULL;
bitmap_copy (def->live_range, combined_live_range); bitmap_copy (def->live_range, combined_live_range);
if (other_def->other_btr_uses_after_use) if (other_def->btr == btr && other_def->other_btr_uses_after_use)
def->other_btr_uses_after_use = 1; def->other_btr_uses_after_use = 1;
COPY_HARD_REG_SET (*btrs_live_in_range, combined_btrs_live); COPY_HARD_REG_SET (*btrs_live_in_range, combined_btrs_live);
...@@ -1119,12 +1153,12 @@ move_btr_def (basic_block new_def_bb, int btr, btr_def def, bitmap live_range, ...@@ -1119,12 +1153,12 @@ move_btr_def (basic_block new_def_bb, int btr, btr_def def, bitmap live_range,
def->bb = new_def_bb; def->bb = new_def_bb;
def->luid = 0; def->luid = 0;
def->cost = basic_block_freq (new_def_bb); def->cost = basic_block_freq (new_def_bb);
def->other_btr_uses_before_def
= TEST_HARD_REG_BIT (btrs_live[b->index], btr) ? 1 : 0;
bitmap_copy (def->live_range, live_range); bitmap_copy (def->live_range, live_range);
combine_btr_defs (def, btrs_live_in_range); combine_btr_defs (def, btrs_live_in_range);
btr = def->btr; btr = def->btr;
add_btr_to_live_range (def); def->other_btr_uses_before_def
= TEST_HARD_REG_BIT (btrs_live[b->index], btr) ? 1 : 0;
add_btr_to_live_range (def, 1);
if (LABEL_P (insp)) if (LABEL_P (insp))
insp = NEXT_INSN (insp); insp = NEXT_INSN (insp);
/* N.B.: insp is expected to be NOTE_INSN_BASIC_BLOCK now. Some /* N.B.: insp is expected to be NOTE_INSN_BASIC_BLOCK now. Some
...@@ -1292,7 +1326,8 @@ migrate_btr_def (btr_def def, int min_cost) ...@@ -1292,7 +1326,8 @@ migrate_btr_def (btr_def def, int min_cost)
|| (try_freq == def_basic_block_freq && btr_used_near_def)) || (try_freq == def_basic_block_freq && btr_used_near_def))
{ {
int btr; int btr;
augment_live_range (live_range, &btrs_live_in_range, def->bb, try); augment_live_range (live_range, &btrs_live_in_range, def->bb, try,
flag_btr_bb_exclusive);
if (dump_file) if (dump_file)
{ {
fprintf (dump_file, "Now btrs live in range are: "); fprintf (dump_file, "Now btrs live in range are: ");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment