Commit 1a43c33f by Richard Kenner Committed by Richard Kenner

regrename.c: Minor cleanups, including changing some variables to unsigned int.

	* regrename.c: Minor cleanups, including changing some variables
	to unsigned int.

From-SVN: r33053
parent 61474454
Mon Apr 10 07:21:13 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* regrename.c: Minor cleanups, including chang some variables
to unsigned int.
2000-04-10 Neil Booth <NeilB@earthling.net> 2000-04-10 Neil Booth <NeilB@earthling.net>
* cpplex.c (skip_block_comment): Use pointer arithmetic rather * cpplex.c (skip_block_comment): Use pointer arithmetic rather
......
...@@ -75,13 +75,16 @@ ext_basic_blocks; ...@@ -75,13 +75,16 @@ ext_basic_blocks;
#define DESTINATION 1 #define DESTINATION 1
#define SOURCE 2 #define SOURCE 2
static void build_def_use PARAMS ((int, ext_basic_blocks *, HARD_REG_SET *, static void build_def_use PARAMS ((int, ext_basic_blocks *,
def_uses *, sbitmap *)); HARD_REG_SET *, def_uses *,
static int replace_reg_in_block sbitmap *));
PARAMS ((def_uses *, varray_type *, int, rtx, int)); static int replace_reg_in_block PARAMS ((def_uses *, varray_type *,
int, rtx, unsigned int));
static int consider_def PARAMS ((rtx, int, def_uses *, int)); static int consider_def PARAMS ((rtx, int, def_uses *, int));
static int consider_available PARAMS ((rtx, int, HARD_REG_SET *, int, def_uses *, int)); static int consider_available PARAMS ((rtx, int, HARD_REG_SET *,
static rtx rr_replace_reg PARAMS ((rtx, rtx, rtx, int, rtx, int *)); int, def_uses *, int));
static rtx rr_replace_reg PARAMS ((rtx, rtx, rtx, int, rtx,
int *));
static int consider_use PARAMS ((rtx, int, int, int)); static int consider_use PARAMS ((rtx, int, int, int));
static int condmove_p PARAMS ((rtx)); static int condmove_p PARAMS ((rtx));
static void dump_def_use_chain PARAMS ((HARD_REG_SET *, def_uses *, static void dump_def_use_chain PARAMS ((HARD_REG_SET *, def_uses *,
...@@ -90,8 +93,9 @@ static void dump_ext_bb_info PARAMS ((int, ext_basic_blocks *)); ...@@ -90,8 +93,9 @@ static void dump_ext_bb_info PARAMS ((int, ext_basic_blocks *));
static void find_ext_basic_blocks PARAMS ((ext_basic_blocks *)); static void find_ext_basic_blocks PARAMS ((ext_basic_blocks *));
static void find_one_ext_basic_block PARAMS ((int, basic_block, sbitmap *, static void find_one_ext_basic_block PARAMS ((int, basic_block, sbitmap *,
ext_basic_blocks *)); ext_basic_blocks *));
static enum reg_class get_reg_class PARAMS ((rtx, rtx, int, enum reg_class)); static enum reg_class get_reg_class PARAMS ((rtx, rtx, int,
static rtx regno_first_use_in PARAMS ((int, rtx)); enum reg_class));
static rtx regno_first_use_in PARAMS ((unsigned int, rtx));
void void
regrename_optimize () regrename_optimize ()
...@@ -101,7 +105,6 @@ regrename_optimize () ...@@ -101,7 +105,6 @@ regrename_optimize ()
def_uses du; def_uses du;
ext_basic_blocks ebb; ext_basic_blocks ebb;
/* Registers used in a given class */ /* Registers used in a given class */
HARD_REG_SET class_regs; HARD_REG_SET class_regs;
...@@ -133,11 +136,11 @@ regrename_optimize () ...@@ -133,11 +136,11 @@ regrename_optimize ()
VARRAY_RTX_INIT (uid_ruid, UID_RUID_HIGH_BOUND + 1, "uid_ruid"); VARRAY_RTX_INIT (uid_ruid, UID_RUID_HIGH_BOUND + 1, "uid_ruid");
VARRAY_LONG_INIT (uid_rbid, UID_RUID_HIGH_BOUND + 1, "uid_rbid"); VARRAY_LONG_INIT (uid_rbid, UID_RUID_HIGH_BOUND + 1, "uid_rbid");
ebb.basic_block = ebb.basic_block
sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks); = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
sbitmap_vector_zero (ebb.basic_block, n_basic_blocks); sbitmap_vector_zero (ebb.basic_block, n_basic_blocks);
ebb.exit = ebb.exit
sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks); = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
sbitmap_vector_zero (ebb.exit, n_basic_blocks); sbitmap_vector_zero (ebb.exit, n_basic_blocks);
find_ext_basic_blocks (&ebb); find_ext_basic_blocks (&ebb);
...@@ -149,26 +152,27 @@ regrename_optimize () ...@@ -149,26 +152,27 @@ regrename_optimize ()
if (TEST_BIT (ebb.basic_block[b], b)) if (TEST_BIT (ebb.basic_block[b], b))
{ {
for (eb = du.high_bound = 0; eb < n_basic_blocks; eb++) for (eb = du.high_bound = 0; eb < n_basic_blocks; eb++)
{
if (TEST_BIT (ebb.basic_block[b], eb)) if (TEST_BIT (ebb.basic_block[b], eb))
{ {
basic_block bb = BASIC_BLOCK (eb); basic_block bb = BASIC_BLOCK (eb);
/* Calculate high bound for uid_ruid and allocate if necessary */ /* Calculate high bound for uid_ruid and allocate if necessary */
for (insn = bb->head; for (insn = bb->head;
insn != NEXT_INSN (bb->end); insn != NEXT_INSN (bb->end);
du.high_bound++, insn = NEXT_INSN (insn)) du.high_bound++, insn = NEXT_INSN (insn))
{ {
int uid_ruid_high_bound = VARRAY_SIZE (uid_ruid); int uid_ruid_high_bound = VARRAY_SIZE (uid_ruid);
if (du.high_bound + 4 >= uid_ruid_high_bound) if (du.high_bound + 4 >= uid_ruid_high_bound)
{ {
VARRAY_GROW (uid_ruid, uid_ruid_high_bound * 2); VARRAY_GROW (uid_ruid, uid_ruid_high_bound * 2);
VARRAY_GROW (uid_rbid, uid_ruid_high_bound * 2); VARRAY_GROW (uid_rbid, uid_ruid_high_bound * 2);
} }
VARRAY_RTX (uid_ruid, du.high_bound) = insn; VARRAY_RTX (uid_ruid, du.high_bound) = insn;
VARRAY_LONG (uid_rbid, du.high_bound) = eb; VARRAY_LONG (uid_rbid, du.high_bound) = eb;
} }
} }
}
CLEAR_HARD_REG_SET (null_bitmap); CLEAR_HARD_REG_SET (null_bitmap);
CLEAR_HARD_REG_SET (class_regs); CLEAR_HARD_REG_SET (class_regs);
...@@ -177,27 +181,28 @@ regrename_optimize () ...@@ -177,27 +181,28 @@ regrename_optimize ()
CLEAR_HARD_REG_SET (tmp_bitmap); CLEAR_HARD_REG_SET (tmp_bitmap);
CLEAR_HARD_REG_SET (renamed_regs); CLEAR_HARD_REG_SET (renamed_regs);
du.defs = du.defs
sbitmap_vector_alloc (FIRST_PSEUDO_REGISTER, du.high_bound + 1); = sbitmap_vector_alloc (FIRST_PSEUDO_REGISTER, du.high_bound + 1);
sbitmap_vector_zero (du.defs, FIRST_PSEUDO_REGISTER); sbitmap_vector_zero (du.defs, FIRST_PSEUDO_REGISTER);
du.uses = du.uses
sbitmap_vector_alloc (FIRST_PSEUDO_REGISTER, du.high_bound + 1); = sbitmap_vector_alloc (FIRST_PSEUDO_REGISTER, du.high_bound + 1);
sbitmap_vector_zero (du.uses, FIRST_PSEUDO_REGISTER); sbitmap_vector_zero (du.uses, FIRST_PSEUDO_REGISTER);
du.require_call_save_reg = sbitmap_alloc (du.high_bound + 1); du.require_call_save_reg = sbitmap_alloc (du.high_bound + 1);
sbitmap_zero (du.require_call_save_reg); sbitmap_zero (du.require_call_save_reg);
defs_live_exit = sbitmap_alloc (du.high_bound + 1); defs_live_exit = sbitmap_alloc (du.high_bound + 1);
sbitmap_zero (defs_live_exit); sbitmap_zero (defs_live_exit);
du.def_class = xrealloc du.def_class
(du.def_class, = xrealloc (du.def_class,
sizeof (enum reg_class) * FIRST_PSEUDO_REGISTER * du.high_bound); (sizeof (enum reg_class) * FIRST_PSEUDO_REGISTER
* du.high_bound));
du.use_class = xrealloc du.use_class
(du.use_class, = xrealloc (du.use_class,
sizeof (enum reg_class) * FIRST_PSEUDO_REGISTER * du.high_bound); (sizeof (enum reg_class) * FIRST_PSEUDO_REGISTER
* du.high_bound));
build_def_use (b, &ebb, &regs_used, &du, build_def_use (b, &ebb, &regs_used, &du, &defs_live_exit);
&defs_live_exit);
if (rtl_dump_file) if (rtl_dump_file)
{ {
...@@ -211,17 +216,18 @@ regrename_optimize () ...@@ -211,17 +216,18 @@ regrename_optimize ()
as it just treats them as a big basic block. */ as it just treats them as a big basic block. */
COPY_HARD_REG_SET (tmp_bitmap, regs_used); COPY_HARD_REG_SET (tmp_bitmap, regs_used);
REG_SET_TO_HARD_REG_SET (global_live_at_start, BASIC_BLOCK (b)->global_live_at_start); REG_SET_TO_HARD_REG_SET (global_live_at_start,
BASIC_BLOCK (b)->global_live_at_start);
IOR_HARD_REG_SET (tmp_bitmap, global_live_at_start); IOR_HARD_REG_SET (tmp_bitmap, global_live_at_start);
for (eb = 0; eb < n_basic_blocks; eb++) for (eb = 0; eb < n_basic_blocks; eb++)
{
if (TEST_BIT (ebb.basic_block[b], eb)) if (TEST_BIT (ebb.basic_block[b], eb))
{ {
basic_block bb = BASIC_BLOCK (eb); basic_block bb = BASIC_BLOCK (eb);
REG_SET_TO_HARD_REG_SET (global_live_at_end, bb->global_live_at_end);
REG_SET_TO_HARD_REG_SET (global_live_at_end,
bb->global_live_at_end);
IOR_HARD_REG_SET (tmp_bitmap, global_live_at_end); IOR_HARD_REG_SET (tmp_bitmap, global_live_at_end);
} }
}
def_idx = xcalloc (du.high_bound, sizeof (int)); def_idx = xcalloc (du.high_bound, sizeof (int));
...@@ -239,20 +245,15 @@ regrename_optimize () ...@@ -239,20 +245,15 @@ regrename_optimize ()
/* Find def_idx[N] where hbound of N is the number of /* Find def_idx[N] where hbound of N is the number of
definitions of this register in this block. and def_idx definitions of this register in this block. and def_idx
is the ordinal position of this insn in the block. */ is the ordinal position of this insn in the block. */
for (i = 0, def_idx[def_cnt] = 0; for (i = 0, def_idx[def_cnt] = 0; i < du.high_bound; i++)
i < du.high_bound;
i++)
{
if (TEST_BIT (du.defs[r], i) if (TEST_BIT (du.defs[r], i)
&& consider_def (VARRAY_RTX (uid_ruid, i), r, && consider_def (VARRAY_RTX (uid_ruid, i), r, &du, i))
&du, i))
{ {
int first_use = 1; int first_use = 1;
def_idx[def_cnt] = i; def_idx[def_cnt] = i;
/* Only consider definitions that have a use. */ /* Only consider definitions that have a use. */
for (use_idx = i + 1; use_idx < du.high_bound; for (use_idx = i + 1; use_idx < du.high_bound; use_idx++)
use_idx++)
{ {
if (TEST_BIT (du.uses[r], use_idx)) if (TEST_BIT (du.uses[r], use_idx))
{ {
...@@ -268,27 +269,29 @@ regrename_optimize () ...@@ -268,27 +269,29 @@ regrename_optimize ()
} }
else else
{ {
/* Don't consider def if we don't want this use */ /* Don't consider def if we don't want this
use. */
if (!first_use) if (!first_use)
def_cnt--; def_cnt--;
break; break;
} }
} }
if (TEST_BIT (du.defs[r], use_idx)) if (TEST_BIT (du.defs[r], use_idx))
break; break;
} }
/* Scan until the next def to avoid renaming /* Scan until the next def to avoid renaming
parameter registers. */ parameter registers. */
/* ??? consider using CALL_INSN_FUNCTION_USAGE */ /* ??? consider using CALL_INSN_FUNCTION_USAGE */
for (call_idx = i; call_idx <= use_idx; call_idx++) for (call_idx = i; call_idx <= use_idx; call_idx++)
if (VARRAY_RTX (uid_ruid, call_idx) if (VARRAY_RTX (uid_ruid, call_idx)
&& GET_CODE (VARRAY_RTX (uid_ruid, call_idx)) && (GET_CODE (VARRAY_RTX (uid_ruid, call_idx))
== CALL_INSN) == CALL_INSN))
{
SET_BIT (du.require_call_save_reg, i); SET_BIT (du.require_call_save_reg, i);
} }
}
}
if (def_cnt < 2) if (def_cnt < 2)
continue; continue;
...@@ -303,7 +306,8 @@ regrename_optimize () ...@@ -303,7 +306,8 @@ regrename_optimize ()
(GET_CODE (VARRAY_RTX (uid_ruid, (GET_CODE (VARRAY_RTX (uid_ruid,
def_idx[def]))) == 'i')) def_idx[def]))) == 'i'))
{ {
rtx reg_use = regno_first_use_in rtx reg_use
= regno_first_use_in
(r, PATTERN (VARRAY_RTX (uid_ruid, def_idx[def]))); (r, PATTERN (VARRAY_RTX (uid_ruid, def_idx[def])));
if (!reg_use) if (!reg_use)
...@@ -323,25 +327,26 @@ regrename_optimize () ...@@ -323,25 +327,26 @@ regrename_optimize ()
/* No available registers in this class */ /* No available registers in this class */
GO_IF_HARD_REG_EQUAL (avail_regs, null_bitmap, GO_IF_HARD_REG_EQUAL (avail_regs, null_bitmap,
no_available_regs); no_available_regs);
for (ar_idx = 0; ar_idx < FIRST_PSEUDO_REGISTER for (ar_idx = 0; ar_idx < FIRST_PSEUDO_REGISTER
&& TEST_HARD_REG_BIT (avail_regs, ar_idx); ar_idx++) && TEST_HARD_REG_BIT (avail_regs, ar_idx); ar_idx++)
; ;
if (ar_idx == FIRST_PSEUDO_REGISTER) if (ar_idx == FIRST_PSEUDO_REGISTER)
goto no_available_regs; goto no_available_regs;
/* Only try register renaming if there is an available /* Only try register renaming if there is an available
register in this class. */ register in this class. */
for (ar_idx = 0; for (ar_idx = 0; ar_idx < FIRST_PSEUDO_REGISTER; ar_idx++)
ar_idx < FIRST_PSEUDO_REGISTER;
ar_idx++)
{ {
#ifdef REG_ALLOC_ORDER #ifdef REG_ALLOC_ORDER
avail_reg = reg_alloc_order[ar_idx]; avail_reg = reg_alloc_order[ar_idx];
#else #else
avail_reg = ar_idx; avail_reg = ar_idx;
#endif #endif
if (consider_available (reg_use, avail_reg, &avail_regs, if (consider_available (reg_use, avail_reg,
rc, &du, def_idx[def])) &avail_regs, rc, &du,
def_idx[def]))
break; break;
} }
...@@ -360,8 +365,11 @@ regrename_optimize () ...@@ -360,8 +365,11 @@ regrename_optimize ()
if (TEST_BIT (du.require_call_save_reg, if (TEST_BIT (du.require_call_save_reg,
def_idx[def])) def_idx[def]))
fprintf (rtl_dump_file, " crosses a call"); fprintf (rtl_dump_file, " crosses a call");
fprintf (rtl_dump_file, ". No available registers\n");
fprintf (rtl_dump_file,
". No available registers\n");
} }
goto try_next_def; goto try_next_def;
} }
...@@ -371,8 +379,10 @@ regrename_optimize () ...@@ -371,8 +379,10 @@ regrename_optimize ()
/* Replace in destination. Replace in source for /* Replace in destination. Replace in source for
remainder of block until new register is defined remainder of block until new register is defined
again */ again */
replace_ok = replace_reg_in_block replace_ok
(&du, &uid_ruid, def_idx[def], reg_use, avail_reg); = replace_reg_in_block (&du, &uid_ruid, def_idx[def],
reg_use, avail_reg);
/* Replace failed, so restore previous register */ /* Replace failed, so restore previous register */
if (!replace_ok) if (!replace_ok)
{ {
...@@ -380,26 +390,40 @@ regrename_optimize () ...@@ -380,26 +390,40 @@ regrename_optimize ()
gen_rtx_REG (GET_MODE (reg_use), gen_rtx_REG (GET_MODE (reg_use),
avail_reg), avail_reg),
REGNO (reg_use)); REGNO (reg_use));
if (rtl_dump_file) if (rtl_dump_file)
{
fprintf (rtl_dump_file, fprintf (rtl_dump_file,
"Register %s in class %s Renaming as %s would not satisfy constraints\n", "Register %s in class %s Renaming as %s ",
reg_names[r], reg_class_names[rc], reg_names[r], reg_class_names[rc],
reg_names[avail_reg]); reg_names[avail_reg]);
fprintf (rtl_dump_file,
"would not satisfy constraints\n");
} }
}
else if (rtl_dump_file) else if (rtl_dump_file)
{
fprintf (rtl_dump_file, fprintf (rtl_dump_file,
"Register %s in class %s Renamed as %s at insn %d\n", "Register %s in class %s Renamed as %s ",
reg_names[r], reg_class_names[rc], reg_names[r], reg_class_names[rc],
reg_names[avail_reg], reg_names[avail_reg]);
INSN_UID (VARRAY_RTX (uid_ruid, def_idx[def]))); fprintf (rtl_dump_file, "at insn %d\n",
INSN_UID (VARRAY_RTX (uid_ruid,
def_idx[def])));
} }
}
try_next_def: try_next_def:
continue; continue;
} }
sbitmap_zero (du.defs[r]); sbitmap_zero (du.defs[r]);
no_available_regs: no_available_regs:
continue; continue;
} }
free (def_idx); free (def_idx);
sbitmap_vector_free (du.defs); sbitmap_vector_free (du.defs);
sbitmap_vector_free (du.uses); sbitmap_vector_free (du.uses);
...@@ -429,7 +453,8 @@ build_def_use (b, ebb, regs_used, du, defs_live_exit) ...@@ -429,7 +453,8 @@ build_def_use (b, ebb, regs_used, du, defs_live_exit)
sbitmap *defs_live_exit; sbitmap *defs_live_exit;
{ {
rtx insn; rtx insn;
int eb, inum, r; int eb, inum;
unsigned int r;
inum = 0; inum = 0;
for (eb = 0; eb < n_basic_blocks; eb++) for (eb = 0; eb < n_basic_blocks; eb++)
...@@ -452,9 +477,7 @@ build_def_use (b, ebb, regs_used, du, defs_live_exit) ...@@ -452,9 +477,7 @@ build_def_use (b, ebb, regs_used, du, defs_live_exit)
CLEAR_RESOURCE (&insn_sets); CLEAR_RESOURCE (&insn_sets);
mark_set_resources (insn, &insn_sets, 0, MARK_DEST); mark_set_resources (insn, &insn_sets, 0, MARK_DEST);
for (r = 0; for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)
r < FIRST_PSEUDO_REGISTER;
r++)
{ {
if (!TEST_HARD_REG_BIT (insn_sets.regs, r)) if (!TEST_HARD_REG_BIT (insn_sets.regs, r))
continue; continue;
...@@ -462,31 +485,32 @@ build_def_use (b, ebb, regs_used, du, defs_live_exit) ...@@ -462,31 +485,32 @@ build_def_use (b, ebb, regs_used, du, defs_live_exit)
SET_HARD_REG_BIT (*regs_used, r); SET_HARD_REG_BIT (*regs_used, r);
if (REGNO_REG_SET_P (bb->global_live_at_end, r)) if (REGNO_REG_SET_P (bb->global_live_at_end, r))
SET_BIT (*defs_live_exit, inum); SET_BIT (*defs_live_exit, inum);
if (!insn_sets.memory) if (!insn_sets.memory)
SET_BIT (du->defs[r], inum); SET_BIT (du->defs[r], inum);
DU_REG_CLASS (du->def_class, r, du->high_bound, inum) = get_reg_class
(insn, regno_first_use_in (r, PATTERN (insn)), DU_REG_CLASS (du->def_class, r, du->high_bound, inum)
= get_reg_class (insn, regno_first_use_in (r, PATTERN (insn)),
DESTINATION, NO_REGS); DESTINATION, NO_REGS);
} }
CLEAR_RESOURCE (&insn_res); CLEAR_RESOURCE (&insn_res);
mark_referenced_resources (insn, &insn_res, 0); mark_referenced_resources (insn, &insn_res, 0);
for (r = 0; for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)
r < FIRST_PSEUDO_REGISTER;
r++)
{ {
if (!TEST_HARD_REG_BIT (insn_res.regs, r)) if (!TEST_HARD_REG_BIT (insn_res.regs, r))
continue; continue;
SET_HARD_REG_BIT (*regs_used, r); SET_HARD_REG_BIT (*regs_used, r);
SET_BIT (du->uses[r], inum); SET_BIT (du->uses[r], inum);
DU_REG_CLASS (du->use_class, r, du->high_bound, inum) = get_reg_class DU_REG_CLASS (du->use_class, r, du->high_bound, inum)
(insn, regno_use_in (r, PATTERN (insn)), = get_reg_class (insn, regno_use_in (r, PATTERN (insn)),
SOURCE, NO_REGS); SOURCE, NO_REGS);
} }
} }
} }
free_resource_info (); free_resource_info ();
} }
...@@ -499,23 +523,24 @@ replace_reg_in_block (du, uid_ruid, def, reg_def, avail_reg) ...@@ -499,23 +523,24 @@ replace_reg_in_block (du, uid_ruid, def, reg_def, avail_reg)
varray_type *uid_ruid; varray_type *uid_ruid;
int def; int def;
rtx reg_def; rtx reg_def;
int avail_reg; unsigned int avail_reg;
{ {
int du_idx, status = 1; int du_idx, status = 1;
int r = REGNO (reg_def); unsigned int r = REGNO (reg_def);
rtx death_note; rtx death_note;
rtx new_reg = gen_rtx_REG (GET_MODE (reg_def), avail_reg); rtx new_reg = gen_rtx_REG (GET_MODE (reg_def), avail_reg);
rr_replace_reg (PATTERN (VARRAY_RTX (*uid_ruid, def)), reg_def, new_reg,
DESTINATION, VARRAY_RTX (*uid_ruid, def), &status);
rr_replace_reg (PATTERN (VARRAY_RTX (*uid_ruid, def)), reg_def,
new_reg, DESTINATION, VARRAY_RTX (*uid_ruid, def),
&status);
if (!status) if (!status)
return status; return status;
death_note = find_reg_note (VARRAY_RTX (*uid_ruid, def), REG_DEAD, reg_def); death_note = find_reg_note (VARRAY_RTX (*uid_ruid, def), REG_DEAD, reg_def);
if (!death_note) if (!death_note)
death_note = find_reg_note (VARRAY_RTX (*uid_ruid, def), REG_UNUSED, reg_def); death_note = find_reg_note (VARRAY_RTX (*uid_ruid, def), REG_UNUSED,
reg_def);
if (death_note) if (death_note)
rr_replace_reg (death_note, reg_def, new_reg, 0, rr_replace_reg (death_note, reg_def, new_reg, 0,
VARRAY_RTX (*uid_ruid, def), &status); VARRAY_RTX (*uid_ruid, def), &status);
...@@ -524,10 +549,11 @@ replace_reg_in_block (du, uid_ruid, def, reg_def, avail_reg) ...@@ -524,10 +549,11 @@ replace_reg_in_block (du, uid_ruid, def, reg_def, avail_reg)
{ {
rtx reg_use; rtx reg_use;
rtx new_reg; rtx new_reg;
if (GET_RTX_CLASS (GET_CODE (VARRAY_RTX (*uid_ruid, du_idx))) != 'i') if (GET_RTX_CLASS (GET_CODE (VARRAY_RTX (*uid_ruid, du_idx))) != 'i')
continue; continue;
reg_use = regno_use_in (r, PATTERN (VARRAY_RTX (*uid_ruid, du_idx)));
reg_use = regno_use_in (r, PATTERN (VARRAY_RTX (*uid_ruid, du_idx)));
if (reg_use && TEST_BIT (du->uses[r], du_idx)) if (reg_use && TEST_BIT (du->uses[r], du_idx))
{ {
new_reg = gen_rtx_REG (GET_MODE (reg_use), avail_reg); new_reg = gen_rtx_REG (GET_MODE (reg_use), avail_reg);
...@@ -542,14 +568,17 @@ replace_reg_in_block (du, uid_ruid, def, reg_def, avail_reg) ...@@ -542,14 +568,17 @@ replace_reg_in_block (du, uid_ruid, def, reg_def, avail_reg)
if (death_note) if (death_note)
rr_replace_reg (death_note, reg_use, new_reg, 0, rr_replace_reg (death_note, reg_use, new_reg, 0,
VARRAY_RTX (*uid_ruid, def), &status); VARRAY_RTX (*uid_ruid, def), &status);
SET_BIT (du->uses[avail_reg], du_idx); SET_BIT (du->uses[avail_reg], du_idx);
RESET_BIT (du->uses[r], du_idx); RESET_BIT (du->uses[r], du_idx);
if (!status) if (!status)
return status; return status;
} }
if (TEST_BIT (du->defs[r], du_idx)) if (TEST_BIT (du->defs[r], du_idx))
break; break;
} }
return status; return status;
} }
...@@ -584,6 +613,7 @@ rr_replace_reg (x, reg_use, reg_sub, replace_type, insn, status) ...@@ -584,6 +613,7 @@ rr_replace_reg (x, reg_use, reg_sub, replace_type, insn, status)
else else
return gen_rtx_REG (GET_MODE (x), REGNO (reg_use)); return gen_rtx_REG (GET_MODE (x), REGNO (reg_use));
} }
return x; return x;
case SET: case SET:
...@@ -592,15 +622,15 @@ rr_replace_reg (x, reg_use, reg_sub, replace_type, insn, status) ...@@ -592,15 +622,15 @@ rr_replace_reg (x, reg_use, reg_sub, replace_type, insn, status)
replace_type, insn, status); replace_type, insn, status);
else if (replace_type == SOURCE) else if (replace_type == SOURCE)
{ {
int dest_subregno; unsigned int dest_subregno;
int had_subreg = GET_CODE (SET_DEST (x)) == SUBREG;
if (GET_CODE (SET_DEST (x)) == SUBREG) if (had_subreg)
dest_subregno = REGNO (XEXP (SET_DEST (x), 0)); dest_subregno = REGNO (XEXP (SET_DEST (x), 0));
else
dest_subregno = 0;
SET_SRC (x) = rr_replace_reg (SET_SRC (x), reg_use, reg_sub, SET_SRC (x) = rr_replace_reg (SET_SRC (x), reg_use, reg_sub,
replace_type, insn, status); replace_type, insn, status);
/* If the replacement register is not part of the source /* If the replacement register is not part of the source
then it may be part of a source mem operand. */ then it may be part of a source mem operand. */
if (GET_CODE (SET_DEST (x)) == MEM if (GET_CODE (SET_DEST (x)) == MEM
...@@ -609,9 +639,8 @@ rr_replace_reg (x, reg_use, reg_sub, replace_type, insn, status) ...@@ -609,9 +639,8 @@ rr_replace_reg (x, reg_use, reg_sub, replace_type, insn, status)
|| GET_CODE (SET_DEST (x)) == STRICT_LOW_PART) || GET_CODE (SET_DEST (x)) == STRICT_LOW_PART)
SET_DEST (x) = rr_replace_reg (SET_DEST (x), reg_use, reg_sub, SET_DEST (x) = rr_replace_reg (SET_DEST (x), reg_use, reg_sub,
replace_type, insn, status); replace_type, insn, status);
/* shared rtl sanity check */ /* Shared rtl sanity check. */
if (dest_subregno if (had_subreg && dest_subregno != REGNO (XEXP (SET_DEST (x), 0)))
&& dest_subregno != REGNO (XEXP (SET_DEST (x), 0)))
{ {
*status = 0; *status = 0;
return x; return x;
...@@ -622,16 +651,18 @@ rr_replace_reg (x, reg_use, reg_sub, replace_type, insn, status) ...@@ -622,16 +651,18 @@ rr_replace_reg (x, reg_use, reg_sub, replace_type, insn, status)
if (n >= 0) if (n >= 0)
{ {
int id; int id;
extract_insn (insn); extract_insn (insn);
/* Any MATCH_DUP's which are REGs must still match */ /* Any MATCH_DUP's which are REGs must still match */
for (id = insn_data[n].n_dups - 1; id >= 0; id--) for (id = insn_data[n].n_dups - 1; id >= 0; id--)
{ {
int opno = recog_data.dup_num[id]; int opno = recog_data.dup_num[id];
if (GET_CODE (*recog_data.dup_loc[id]) == REG if (GET_CODE (*recog_data.dup_loc[id]) == REG
&& GET_CODE (*recog_data.operand_loc[opno]) == REG && GET_CODE (*recog_data.operand_loc[opno]) == REG
&& (REGNO (*recog_data.dup_loc[id]) != && (REGNO (*recog_data.dup_loc[id])
REGNO (*recog_data.operand_loc[opno]))) != REGNO (*recog_data.operand_loc[opno])))
*status = 0; *status = 0;
} }
...@@ -659,6 +690,7 @@ rr_replace_reg (x, reg_use, reg_sub, replace_type, insn, status) ...@@ -659,6 +690,7 @@ rr_replace_reg (x, reg_use, reg_sub, replace_type, insn, status)
if (fmt[i] == 'E') if (fmt[i] == 'E')
{ {
register int xv; register int xv;
for (xv = 0; xv < XVECLEN (x, i); xv++) for (xv = 0; xv < XVECLEN (x, i); xv++)
{ {
XVECEXP (x, i, xv) = rr_replace_reg (XVECEXP (x, i, xv), reg_use, XVECEXP (x, i, xv) = rr_replace_reg (XVECEXP (x, i, xv), reg_use,
...@@ -679,6 +711,7 @@ rr_replace_reg (x, reg_use, reg_sub, replace_type, insn, status) ...@@ -679,6 +711,7 @@ rr_replace_reg (x, reg_use, reg_sub, replace_type, insn, status)
} }
} }
} }
return x; return x;
} }
...@@ -689,8 +722,8 @@ static int ...@@ -689,8 +722,8 @@ static int
consider_def (insn, regno, du, inum) consider_def (insn, regno, du, inum)
rtx insn; rtx insn;
int regno; int regno;
def_uses *du; def_uses *du ATTRIBUTE_UNUSED;
int inum; int inum ATTRIBUTE_UNUSED;
{ {
/* Don't rename windowed registers across a call */ /* Don't rename windowed registers across a call */
#ifdef INCOMING_REGNO #ifdef INCOMING_REGNO
...@@ -733,12 +766,11 @@ consider_use (insn, regno, def_block, use_block) ...@@ -733,12 +766,11 @@ consider_use (insn, regno, def_block, use_block)
then insure another predecessor does not also define this register */ then insure another predecessor does not also define this register */
if (def_block != use_block) if (def_block != use_block)
for (e = ub->pred; e; e = e->pred_next) for (e = ub->pred; e; e = e->pred_next)
{
if (e->src->index != def_block if (e->src->index != def_block
&& e->src->index != -1 && e->src->index != -1
&& REGNO_REG_SET_P (BASIC_BLOCK (e->src->index)->global_live_at_end, regno)) && REGNO_REG_SET_P (BASIC_BLOCK (e->src->index)->global_live_at_end,
regno))
return 0; return 0;
}
/* Don't consider conditional moves. Predicate architectures may /* Don't consider conditional moves. Predicate architectures may
use two complementary conditional moves and the regno shouldn't change */ use two complementary conditional moves and the regno shouldn't change */
...@@ -755,11 +787,8 @@ consider_use (insn, regno, def_block, use_block) ...@@ -755,11 +787,8 @@ consider_use (insn, regno, def_block, use_block)
return 0; return 0;
/* Don't consider register if the only use is in a USE */ /* Don't consider register if the only use is in a USE */
if (reg_mentioned_p (gen_rtx_USE (VOIDmode, reg_use), return ! reg_mentioned_p (gen_rtx_USE (VOIDmode, reg_use),
PATTERN (insn))) PATTERN (insn));
return 0;
else
return 1;
} }
else else
return 0; return 0;
...@@ -810,17 +839,13 @@ consider_available (reg_use, avail_reg, avail_regs, rc, du, inum) ...@@ -810,17 +839,13 @@ consider_available (reg_use, avail_reg, avail_regs, rc, du, inum)
#endif #endif
) )
|| (TEST_BIT (du->require_call_save_reg, inum) || (TEST_BIT (du->require_call_save_reg, inum)
&& (call_used_regs[avail_reg] || call_used_regs[REGNO (reg_use)] && (call_used_regs[avail_reg] || call_used_regs[REGNO (reg_use)])))
)))
return 0; return 0;
/* If register is a callee-saved register it must be saved in the frame. /* If register is a callee-saved register it must be saved in the frame.
call saved registers can not be added to regs_ever_live after reload, call saved registers can not be added to regs_ever_live after reload,
as it would invalidate most elimination offsets */ as it would invalidate most elimination offsets */
if (regs_ever_live[avail_reg] || call_used_regs[avail_reg]) return regs_ever_live[avail_reg] || call_used_regs[avail_reg];
return 1;
return 0;
} }
/* Return 1 if INSN is a conditional move */ /* Return 1 if INSN is a conditional move */
...@@ -829,11 +854,9 @@ static int ...@@ -829,11 +854,9 @@ static int
condmove_p (insn) condmove_p (insn)
rtx insn; rtx insn;
{ {
if (GET_CODE (insn) == INSN return (GET_CODE (insn) == INSN
&& GET_CODE (PATTERN (insn)) == SET && GET_CODE (PATTERN (insn)) == SET
&& GET_CODE (SET_SRC (PATTERN (insn))) == IF_THEN_ELSE) && GET_CODE (SET_SRC (PATTERN (insn))) == IF_THEN_ELSE);
return 1;
return 0;
} }
/* Searches X for the first reference to REGNO, returning the rtx of the /* Searches X for the first reference to REGNO, returning the rtx of the
...@@ -841,7 +864,7 @@ condmove_p (insn) ...@@ -841,7 +864,7 @@ condmove_p (insn)
static rtx static rtx
regno_first_use_in (regno, x) regno_first_use_in (regno, x)
int regno; unsigned int regno;
rtx x; rtx x;
{ {
register const char *fmt; register const char *fmt;
...@@ -859,13 +882,14 @@ regno_first_use_in (regno, x) ...@@ -859,13 +882,14 @@ regno_first_use_in (regno, x)
if ((tem = regno_first_use_in (regno, XEXP (x, i)))) if ((tem = regno_first_use_in (regno, XEXP (x, i))))
return tem; return tem;
} }
else if (fmt[i] == 'E') else if (fmt[i] == 'E')
for (j = XVECLEN (x, i) - 1; j >= 0; j--) for (j = XVECLEN (x, i) - 1; j >= 0; j--)
if ((tem = regno_first_use_in (regno, XVECEXP (x, i, j)))) if ((tem = regno_first_use_in (regno, XVECEXP (x, i, j))))
return tem; return tem;
} }
return NULL_RTX; return 0;
} }
/* Dump def/use chain DU to RTL_DUMP_FILE, given insns in UID_RUID and /* Dump def/use chain DU to RTL_DUMP_FILE, given insns in UID_RUID and
...@@ -877,14 +901,14 @@ dump_def_use_chain (global_live_at_end, du, uid_ruid) ...@@ -877,14 +901,14 @@ dump_def_use_chain (global_live_at_end, du, uid_ruid)
def_uses *du; def_uses *du;
varray_type *uid_ruid; varray_type *uid_ruid;
{ {
int r, inum; unsigned int r;
int inum;
for (r = 0; r < FIRST_PSEUDO_REGISTER; r++) for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)
{ {
int set = 0; int set = 0;
for (inum = 0;
inum <= du->high_bound; for (inum = 0; inum <= du->high_bound; inum++)
inum++)
{ {
rtx insn = VARRAY_RTX (*uid_ruid, inum); rtx insn = VARRAY_RTX (*uid_ruid, inum);
#if 0 #if 0
...@@ -892,6 +916,7 @@ dump_def_use_chain (global_live_at_end, du, uid_ruid) ...@@ -892,6 +916,7 @@ dump_def_use_chain (global_live_at_end, du, uid_ruid)
|| GET_RTX_CLASS (GET_CODE || GET_RTX_CLASS (GET_CODE
(insn)) != 'i') (insn)) != 'i')
continue; continue;
reg_use = regno_first_use_in (r, PATTERN (insn)); reg_use = regno_first_use_in (r, PATTERN (insn));
if (!reg_use) if (!reg_use)
continue; continue;
...@@ -908,11 +933,13 @@ dump_def_use_chain (global_live_at_end, du, uid_ruid) ...@@ -908,11 +933,13 @@ dump_def_use_chain (global_live_at_end, du, uid_ruid)
fprintf (rtl_dump_file, "Live at Exit "); fprintf (rtl_dump_file, "Live at Exit ");
set = 1; set = 1;
} }
if (TEST_BIT (du->defs[r], inum)) if (TEST_BIT (du->defs[r], inum))
fprintf (rtl_dump_file, "=%d ", INSN_UID (insn)); fprintf (rtl_dump_file, "=%d ", INSN_UID (insn));
if (TEST_BIT (du->uses[r], inum)) if (TEST_BIT (du->uses[r], inum))
fprintf (rtl_dump_file, "%d ", INSN_UID (insn)); fprintf (rtl_dump_file, "%d ", INSN_UID (insn));
} }
if (set) if (set)
fprintf (rtl_dump_file, "\n"); fprintf (rtl_dump_file, "\n");
} }
...@@ -926,9 +953,8 @@ dump_ext_bb_info (eb, ebb) ...@@ -926,9 +953,8 @@ dump_ext_bb_info (eb, ebb)
ext_basic_blocks *ebb; ext_basic_blocks *ebb;
{ {
int b; int b;
{
int have_ebb = 0; int have_ebb = 0;
for (b = 0; b < n_basic_blocks; b++) for (b = 0; b < n_basic_blocks; b++)
{ {
if (TEST_BIT (ebb->basic_block[eb], b)) if (TEST_BIT (ebb->basic_block[eb], b))
...@@ -944,12 +970,13 @@ dump_ext_bb_info (eb, ebb) ...@@ -944,12 +970,13 @@ dump_ext_bb_info (eb, ebb)
} }
fprintf (rtl_dump_file, "%d ", b); fprintf (rtl_dump_file, "%d ", b);
} }
if (TEST_BIT (ebb->exit[eb], b)) if (TEST_BIT (ebb->exit[eb], b))
fprintf (rtl_dump_file, "(exit) "); fprintf (rtl_dump_file, "(exit) ");
} }
if (have_ebb) if (have_ebb)
fprintf (rtl_dump_file, "\n"); fprintf (rtl_dump_file, "\n");
}
} }
/* Initialize EBB with extended basic block info if RENAME_EXTENDED_BLOCKS is /* Initialize EBB with extended basic block info if RENAME_EXTENDED_BLOCKS is
...@@ -974,6 +1001,7 @@ find_ext_basic_blocks (ebb) ...@@ -974,6 +1001,7 @@ find_ext_basic_blocks (ebb)
#else #else
for (b = 0; b < n_basic_blocks; b++) for (b = 0; b < n_basic_blocks; b++)
{ {
basic_block bb = BASIC_BLOCK (b); basic_block bb = BASIC_BLOCK (b);
if (!TEST_BIT (bb_processed, b)) if (!TEST_BIT (bb_processed, b))
{ {
...@@ -1007,14 +1035,10 @@ find_one_ext_basic_block (entry, bb, bb_processed, ebb) ...@@ -1007,14 +1035,10 @@ find_one_ext_basic_block (entry, bb, bb_processed, ebb)
{ {
if (!e->dest->pred->pred_next if (!e->dest->pred->pred_next
&& (!TEST_BIT (*bb_processed, e->dest->index))) && (!TEST_BIT (*bb_processed, e->dest->index)))
{
find_one_ext_basic_block (entry, e->dest, bb_processed, ebb); find_one_ext_basic_block (entry, e->dest, bb_processed, ebb);
}
else else
{
SET_BIT (ebb->exit[entry], bb->index); SET_BIT (ebb->exit[entry], bb->index);
} }
}
} }
/* Find the register class for register REG_USE having TYPE (DESTINATION or /* Find the register class for register REG_USE having TYPE (DESTINATION or
...@@ -1036,17 +1060,16 @@ get_reg_class (insn, reg_use, type, default_class) ...@@ -1036,17 +1060,16 @@ get_reg_class (insn, reg_use, type, default_class)
preprocess_constraints (); preprocess_constraints ();
if (type == DESTINATION) if (type == DESTINATION)
for (id = 0; id < recog_data.n_operands; id++)
{ {
for (id = 0; id < recog_data.n_operands; id++)
if (rtx_equal_p (recog_data.operand[id], reg_use)) if (rtx_equal_p (recog_data.operand[id], reg_use))
break; break;
} }
else if (type == SOURCE) else if (type == SOURCE)
for (id = recog_data.n_operands - 1; id >= 0; id--) for (id = recog_data.n_operands - 1; id >= 0; id--)
{
if (rtx_equal_p (recog_data.operand[id], reg_use)) if (rtx_equal_p (recog_data.operand[id], reg_use))
break; break;
}
if (id == -1 || id == recog_data.n_operands) if (id == -1 || id == recog_data.n_operands)
return default_class; return default_class;
......
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