This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
regrename.c cleanup
- To: gcc-patches at gcc dot gnu dot org
- Subject: regrename.c cleanup
- From: kenner at vlsi1 dot ultra dot nyu dot edu (Richard Kenner)
- Date: Mon, 10 Apr 00 07:35:56 EDT
This mostly fixes whitespace issues, but also does some other cleanups
and makes some variables unsigned.
Mon Apr 10 07:21:13 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* regrename.c: Minor cleanups, including changing some variables
to unsigned int.
*** regrename.c 2000/04/06 13:52:59 1.4
--- regrename.c 2000/04/10 11:07:57
*************** ext_basic_blocks;
*** 76,97 ****
#define SOURCE 2
! static void build_def_use PARAMS ((int, ext_basic_blocks *, HARD_REG_SET *,
! def_uses *, sbitmap *));
! static int replace_reg_in_block
! PARAMS ((def_uses *, varray_type *, int, rtx, 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 rtx rr_replace_reg PARAMS ((rtx, rtx, rtx, int, rtx, int *));
! static int consider_use PARAMS ((rtx, int, int, int));
! static int condmove_p PARAMS ((rtx));
! static void dump_def_use_chain PARAMS ((HARD_REG_SET *, def_uses *,
! varray_type *));
! static void dump_ext_bb_info PARAMS ((int, 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 *,
! ext_basic_blocks *));
! static enum reg_class get_reg_class PARAMS ((rtx, rtx, int, enum reg_class));
! static rtx regno_first_use_in PARAMS ((int, rtx));
!
void
regrename_optimize ()
--- 76,101 ----
#define SOURCE 2
! static void build_def_use PARAMS ((int, ext_basic_blocks *,
! HARD_REG_SET *, def_uses *,
! sbitmap *));
! 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_available PARAMS ((rtx, int, HARD_REG_SET *,
! 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 condmove_p PARAMS ((rtx));
! static void dump_def_use_chain PARAMS ((HARD_REG_SET *, def_uses *,
! varray_type *));
! static void dump_ext_bb_info PARAMS ((int, 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 *,
! ext_basic_blocks *));
! static enum reg_class get_reg_class PARAMS ((rtx, rtx, int,
! enum reg_class));
! static rtx regno_first_use_in PARAMS ((unsigned int, rtx));
!
void
regrename_optimize ()
*************** regrename_optimize ()
*** 102,106 ****
ext_basic_blocks ebb;
-
/* Registers used in a given class */
HARD_REG_SET class_regs;
--- 106,109 ----
*************** regrename_optimize ()
*** 134,142 ****
VARRAY_LONG_INIT (uid_rbid, UID_RUID_HIGH_BOUND + 1, "uid_rbid");
! ebb.basic_block =
! sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
sbitmap_vector_zero (ebb.basic_block, n_basic_blocks);
! ebb.exit =
! sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
sbitmap_vector_zero (ebb.exit, n_basic_blocks);
--- 137,145 ----
VARRAY_LONG_INIT (uid_rbid, UID_RUID_HIGH_BOUND + 1, "uid_rbid");
! ebb.basic_block
! = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
sbitmap_vector_zero (ebb.basic_block, n_basic_blocks);
! ebb.exit
! = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
sbitmap_vector_zero (ebb.exit, n_basic_blocks);
*************** regrename_optimize ()
*** 150,174 ****
{
for (eb = du.high_bound = 0; eb < n_basic_blocks; eb++)
! {
! if (TEST_BIT (ebb.basic_block[b], eb))
! {
! basic_block bb = BASIC_BLOCK (eb);
! /* Calculate high bound for uid_ruid and allocate if necessary */
! for (insn = bb->head;
! insn != NEXT_INSN (bb->end);
! du.high_bound++, insn = NEXT_INSN (insn))
! {
! int uid_ruid_high_bound = VARRAY_SIZE (uid_ruid);
! if (du.high_bound + 4 >= uid_ruid_high_bound)
! {
! VARRAY_GROW (uid_ruid, uid_ruid_high_bound * 2);
! VARRAY_GROW (uid_rbid, uid_ruid_high_bound * 2);
! }
! VARRAY_RTX (uid_ruid, du.high_bound) = insn;
! VARRAY_LONG (uid_rbid, du.high_bound) = eb;
! }
! }
! }
CLEAR_HARD_REG_SET (null_bitmap);
CLEAR_HARD_REG_SET (class_regs);
--- 153,178 ----
{
for (eb = du.high_bound = 0; eb < n_basic_blocks; eb++)
! if (TEST_BIT (ebb.basic_block[b], eb))
! {
! basic_block bb = BASIC_BLOCK (eb);
!
! /* Calculate high bound for uid_ruid and allocate if necessary */
! for (insn = bb->head;
! insn != NEXT_INSN (bb->end);
! du.high_bound++, insn = NEXT_INSN (insn))
! {
! int uid_ruid_high_bound = VARRAY_SIZE (uid_ruid);
+ if (du.high_bound + 4 >= uid_ruid_high_bound)
+ {
+ VARRAY_GROW (uid_ruid, uid_ruid_high_bound * 2);
+ VARRAY_GROW (uid_rbid, uid_ruid_high_bound * 2);
+ }
+
+ VARRAY_RTX (uid_ruid, du.high_bound) = insn;
+ VARRAY_LONG (uid_rbid, du.high_bound) = eb;
+ }
+ }
+
CLEAR_HARD_REG_SET (null_bitmap);
CLEAR_HARD_REG_SET (class_regs);
*************** regrename_optimize ()
*** 178,186 ****
CLEAR_HARD_REG_SET (renamed_regs);
! du.defs =
! sbitmap_vector_alloc (FIRST_PSEUDO_REGISTER, du.high_bound + 1);
sbitmap_vector_zero (du.defs, FIRST_PSEUDO_REGISTER);
! du.uses =
! sbitmap_vector_alloc (FIRST_PSEUDO_REGISTER, du.high_bound + 1);
sbitmap_vector_zero (du.uses, FIRST_PSEUDO_REGISTER);
du.require_call_save_reg = sbitmap_alloc (du.high_bound + 1);
--- 182,190 ----
CLEAR_HARD_REG_SET (renamed_regs);
! du.defs
! = sbitmap_vector_alloc (FIRST_PSEUDO_REGISTER, du.high_bound + 1);
sbitmap_vector_zero (du.defs, FIRST_PSEUDO_REGISTER);
! du.uses
! = sbitmap_vector_alloc (FIRST_PSEUDO_REGISTER, du.high_bound + 1);
sbitmap_vector_zero (du.uses, FIRST_PSEUDO_REGISTER);
du.require_call_save_reg = sbitmap_alloc (du.high_bound + 1);
*************** regrename_optimize ()
*** 189,202 ****
sbitmap_zero (defs_live_exit);
! du.def_class = xrealloc
! (du.def_class,
! sizeof (enum reg_class) * FIRST_PSEUDO_REGISTER * du.high_bound);
!
! du.use_class = xrealloc
! (du.use_class,
! sizeof (enum reg_class) * FIRST_PSEUDO_REGISTER * du.high_bound);
! build_def_use (b, &ebb, ®s_used, &du,
! &defs_live_exit);
if (rtl_dump_file)
--- 193,207 ----
sbitmap_zero (defs_live_exit);
! du.def_class
! = xrealloc (du.def_class,
! (sizeof (enum reg_class) * FIRST_PSEUDO_REGISTER
! * du.high_bound));
!
! du.use_class
! = xrealloc (du.use_class,
! (sizeof (enum reg_class) * FIRST_PSEUDO_REGISTER
! * du.high_bound));
! build_def_use (b, &ebb, ®s_used, &du, &defs_live_exit);
if (rtl_dump_file)
*************** regrename_optimize ()
*** 212,226 ****
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);
IOR_HARD_REG_SET (tmp_bitmap, global_live_at_start);
for (eb = 0; eb < n_basic_blocks; eb++)
! {
! if (TEST_BIT (ebb.basic_block[b], eb))
! {
! basic_block bb = BASIC_BLOCK (eb);
! 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);
! }
! }
def_idx = xcalloc (du.high_bound, sizeof (int));
--- 217,232 ----
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);
IOR_HARD_REG_SET (tmp_bitmap, global_live_at_start);
for (eb = 0; eb < n_basic_blocks; eb++)
! if (TEST_BIT (ebb.basic_block[b], eb))
! {
! basic_block bb = BASIC_BLOCK (eb);
!
! 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);
! }
def_idx = xcalloc (du.high_bound, sizeof (int));
*************** regrename_optimize ()
*** 240,293 ****
definitions of this register in this block. and def_idx
is the ordinal position of this insn in the block. */
! for (i = 0, def_idx[def_cnt] = 0;
! i < du.high_bound;
! i++)
! {
! if (TEST_BIT (du.defs[r], i)
! && consider_def (VARRAY_RTX (uid_ruid, i), r,
! &du, i))
! {
! int first_use = 1;
! def_idx[def_cnt] = i;
! /* Only consider definitions that have a use. */
! for (use_idx = i + 1; use_idx < du.high_bound;
! use_idx++)
! {
! if (TEST_BIT (du.uses[r], use_idx))
! {
! if (consider_use (VARRAY_RTX (uid_ruid, use_idx), r,
! VARRAY_LONG (uid_rbid, i),
! VARRAY_LONG (uid_rbid, use_idx)))
! {
! if (first_use)
! {
! first_use = 0;
! def_cnt++;
! }
! }
! else
! {
! /* Don't consider def if we don't want this use */
! if (!first_use)
! def_cnt--;
! break;
! }
! }
! if (TEST_BIT (du.defs[r], use_idx))
! break;
! }
! /* Scan until the next def to avoid renaming
! parameter registers. */
! /* ??? consider using CALL_INSN_FUNCTION_USAGE */
! for (call_idx = i; call_idx <= use_idx; call_idx++)
! if (VARRAY_RTX (uid_ruid, call_idx)
! && GET_CODE (VARRAY_RTX (uid_ruid, call_idx))
! == CALL_INSN)
{
! SET_BIT (du.require_call_save_reg, i);
}
! }
! }
if (def_cnt < 2)
continue;
--- 246,296 ----
definitions of this register in this block. and def_idx
is the ordinal position of this insn in the block. */
! for (i = 0, def_idx[def_cnt] = 0; i < du.high_bound; i++)
! if (TEST_BIT (du.defs[r], i)
! && consider_def (VARRAY_RTX (uid_ruid, i), r, &du, i))
! {
! int first_use = 1;
! def_idx[def_cnt] = i;
! /* Only consider definitions that have a use. */
! for (use_idx = i + 1; use_idx < du.high_bound; use_idx++)
! {
! if (TEST_BIT (du.uses[r], use_idx))
{
! if (consider_use (VARRAY_RTX (uid_ruid, use_idx), r,
! VARRAY_LONG (uid_rbid, i),
! VARRAY_LONG (uid_rbid, use_idx)))
! {
! if (first_use)
! {
! first_use = 0;
! def_cnt++;
! }
! }
! else
! {
! /* Don't consider def if we don't want this
! use. */
! if (!first_use)
! def_cnt--;
!
! break;
! }
}
!
! if (TEST_BIT (du.defs[r], use_idx))
! break;
! }
!
! /* Scan until the next def to avoid renaming
! parameter registers. */
! /* ??? consider using CALL_INSN_FUNCTION_USAGE */
! for (call_idx = i; call_idx <= use_idx; call_idx++)
! if (VARRAY_RTX (uid_ruid, call_idx)
! && (GET_CODE (VARRAY_RTX (uid_ruid, call_idx))
! == CALL_INSN))
! SET_BIT (du.require_call_save_reg, i);
! }
!
if (def_cnt < 2)
continue;
*************** regrename_optimize ()
*** 304,309 ****
def_idx[def]))) == 'i'))
{
! rtx reg_use = regno_first_use_in
! (r, PATTERN (VARRAY_RTX (uid_ruid, def_idx[def])));
if (!reg_use)
--- 307,313 ----
def_idx[def]))) == 'i'))
{
! rtx reg_use
! = regno_first_use_in
! (r, PATTERN (VARRAY_RTX (uid_ruid, def_idx[def])));
if (!reg_use)
*************** regrename_optimize ()
*** 315,319 ****
#endif
rc = (int) DU_REG_CLASS (du.def_class,
! r, du.high_bound, def_idx[def]);
COPY_HARD_REG_SET (avail_regs,
reg_class_contents[(enum reg_class) rc]);
--- 319,323 ----
#endif
rc = (int) DU_REG_CLASS (du.def_class,
! r, du.high_bound, def_idx[def]);
COPY_HARD_REG_SET (avail_regs,
reg_class_contents[(enum reg_class) rc]);
*************** regrename_optimize ()
*** 324,330 ****
--- 328,336 ----
GO_IF_HARD_REG_EQUAL (avail_regs, null_bitmap,
no_available_regs);
+
for (ar_idx = 0; ar_idx < FIRST_PSEUDO_REGISTER
&& TEST_HARD_REG_BIT (avail_regs, ar_idx); ar_idx++)
;
+
if (ar_idx == FIRST_PSEUDO_REGISTER)
goto no_available_regs;
*************** regrename_optimize ()
*** 332,338 ****
/* Only try register renaming if there is an available
register in this class. */
! for (ar_idx = 0;
! ar_idx < FIRST_PSEUDO_REGISTER;
! ar_idx++)
{
#ifdef REG_ALLOC_ORDER
--- 338,342 ----
/* Only try register renaming if there is an available
register in this class. */
! for (ar_idx = 0; ar_idx < FIRST_PSEUDO_REGISTER; ar_idx++)
{
#ifdef REG_ALLOC_ORDER
*************** regrename_optimize ()
*** 341,346 ****
avail_reg = ar_idx;
#endif
! if (consider_available (reg_use, avail_reg, &avail_regs,
! rc, &du, def_idx[def]))
break;
}
--- 345,351 ----
avail_reg = ar_idx;
#endif
! if (consider_available (reg_use, avail_reg,
! &avail_regs, rc, &du,
! def_idx[def]))
break;
}
*************** regrename_optimize ()
*** 361,366 ****
def_idx[def]))
fprintf (rtl_dump_file, " crosses a call");
! fprintf (rtl_dump_file, ". No available registers\n");
}
goto try_next_def;
}
--- 366,374 ----
def_idx[def]))
fprintf (rtl_dump_file, " crosses a call");
!
! fprintf (rtl_dump_file,
! ". No available registers\n");
}
+
goto try_next_def;
}
*************** regrename_optimize ()
*** 372,404 ****
remainder of block until new register is defined
again */
! replace_ok = replace_reg_in_block
! (&du, &uid_ruid, def_idx[def], reg_use, avail_reg);
/* Replace failed, so restore previous register */
if (!replace_ok)
{
replace_reg_in_block (&du, &uid_ruid, def_idx[def],
! gen_rtx_REG (GET_MODE (reg_use),
! avail_reg),
REGNO (reg_use));
if (rtl_dump_file)
! fprintf (rtl_dump_file,
! "Register %s in class %s Renaming as %s would not satisfy constraints\n",
! reg_names[r], reg_class_names[rc],
! reg_names[avail_reg]);
}
else if (rtl_dump_file)
! fprintf (rtl_dump_file,
! "Register %s in class %s Renamed as %s at insn %d\n",
! reg_names[r], reg_class_names[rc],
! reg_names[avail_reg],
! INSN_UID (VARRAY_RTX (uid_ruid, def_idx[def])));
}
try_next_def:
continue;
}
sbitmap_zero (du.defs[r]);
no_available_regs:
continue;
}
free (def_idx);
sbitmap_vector_free (du.defs);
--- 380,428 ----
remainder of block until new register is defined
again */
! replace_ok
! = replace_reg_in_block (&du, &uid_ruid, def_idx[def],
! reg_use, avail_reg);
!
/* Replace failed, so restore previous register */
if (!replace_ok)
{
replace_reg_in_block (&du, &uid_ruid, def_idx[def],
! gen_rtx_REG (GET_MODE (reg_use),
! avail_reg),
REGNO (reg_use));
+
if (rtl_dump_file)
! {
! fprintf (rtl_dump_file,
! "Register %s in class %s Renaming as %s ",
! reg_names[r], reg_class_names[rc],
! reg_names[avail_reg]);
! fprintf (rtl_dump_file,
! "would not satisfy constraints\n");
! }
}
+
else if (rtl_dump_file)
! {
! fprintf (rtl_dump_file,
! "Register %s in class %s Renamed as %s ",
! reg_names[r], reg_class_names[rc],
! reg_names[avail_reg]);
! fprintf (rtl_dump_file, "at insn %d\n",
! INSN_UID (VARRAY_RTX (uid_ruid,
! def_idx[def])));
! }
}
+
try_next_def:
continue;
}
+
sbitmap_zero (du.defs[r]);
+
no_available_regs:
continue;
}
+
free (def_idx);
sbitmap_vector_free (du.defs);
*************** build_def_use (b, ebb, regs_used, du, de
*** 430,434 ****
{
rtx insn;
! int eb, inum, r;
inum = 0;
--- 454,459 ----
{
rtx insn;
! int eb, inum;
! unsigned int r;
inum = 0;
*************** build_def_use (b, ebb, regs_used, du, de
*** 453,459 ****
mark_set_resources (insn, &insn_sets, 0, MARK_DEST);
! for (r = 0;
! r < FIRST_PSEUDO_REGISTER;
! r++)
{
if (!TEST_HARD_REG_BIT (insn_sets.regs, r))
--- 478,482 ----
mark_set_resources (insn, &insn_sets, 0, MARK_DEST);
! for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)
{
if (!TEST_HARD_REG_BIT (insn_sets.regs, r))
*************** build_def_use (b, ebb, regs_used, du, de
*** 463,471 ****
if (REGNO_REG_SET_P (bb->global_live_at_end, r))
SET_BIT (*defs_live_exit, inum);
if (!insn_sets.memory)
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)),
! DESTINATION, NO_REGS);
}
--- 486,496 ----
if (REGNO_REG_SET_P (bb->global_live_at_end, r))
SET_BIT (*defs_live_exit, inum);
+
if (!insn_sets.memory)
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)),
! DESTINATION, NO_REGS);
}
*************** build_def_use (b, ebb, regs_used, du, de
*** 473,479 ****
mark_referenced_resources (insn, &insn_res, 0);
! for (r = 0;
! r < FIRST_PSEUDO_REGISTER;
! r++)
{
if (!TEST_HARD_REG_BIT (insn_res.regs, r))
--- 498,502 ----
mark_referenced_resources (insn, &insn_res, 0);
! for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)
{
if (!TEST_HARD_REG_BIT (insn_res.regs, r))
*************** build_def_use (b, ebb, regs_used, du, de
*** 482,491 ****
SET_HARD_REG_BIT (*regs_used, r);
SET_BIT (du->uses[r], inum);
! DU_REG_CLASS (du->use_class, r, du->high_bound, inum) = get_reg_class
! (insn, regno_use_in (r, PATTERN (insn)),
! SOURCE, NO_REGS);
}
}
}
free_resource_info ();
}
--- 505,515 ----
SET_HARD_REG_BIT (*regs_used, r);
SET_BIT (du->uses[r], inum);
! DU_REG_CLASS (du->use_class, r, du->high_bound, inum)
! = get_reg_class (insn, regno_use_in (r, PATTERN (insn)),
! SOURCE, NO_REGS);
}
}
}
+
free_resource_info ();
}
*************** replace_reg_in_block (du, uid_ruid, def,
*** 500,514 ****
int def;
rtx reg_def;
! int avail_reg;
{
int du_idx, status = 1;
! int r = REGNO (reg_def);
rtx death_note;
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);
if (!status)
return status;
--- 524,537 ----
int def;
rtx reg_def;
! unsigned int avail_reg;
{
int du_idx, status = 1;
! unsigned int r = REGNO (reg_def);
rtx death_note;
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);
if (!status)
return status;
*************** replace_reg_in_block (du, uid_ruid, def,
*** 516,520 ****
death_note = find_reg_note (VARRAY_RTX (*uid_ruid, def), REG_DEAD, reg_def);
if (!death_note)
! death_note = find_reg_note (VARRAY_RTX (*uid_ruid, def), REG_UNUSED, reg_def);
if (death_note)
rr_replace_reg (death_note, reg_def, new_reg, 0,
--- 539,545 ----
death_note = find_reg_note (VARRAY_RTX (*uid_ruid, def), REG_DEAD, reg_def);
if (!death_note)
! death_note = find_reg_note (VARRAY_RTX (*uid_ruid, def), REG_UNUSED,
! reg_def);
!
if (death_note)
rr_replace_reg (death_note, reg_def, new_reg, 0,
*************** replace_reg_in_block (du, uid_ruid, def,
*** 525,532 ****
rtx reg_use;
rtx new_reg;
if (GET_RTX_CLASS (GET_CODE (VARRAY_RTX (*uid_ruid, du_idx))) != 'i')
continue;
- reg_use = regno_use_in (r, PATTERN (VARRAY_RTX (*uid_ruid, du_idx)));
if (reg_use && TEST_BIT (du->uses[r], du_idx))
{
--- 550,558 ----
rtx reg_use;
rtx new_reg;
+
if (GET_RTX_CLASS (GET_CODE (VARRAY_RTX (*uid_ruid, du_idx))) != 'i')
continue;
+ reg_use = regno_use_in (r, PATTERN (VARRAY_RTX (*uid_ruid, du_idx)));
if (reg_use && TEST_BIT (du->uses[r], du_idx))
{
*************** replace_reg_in_block (du, uid_ruid, def,
*** 543,546 ****
--- 569,573 ----
rr_replace_reg (death_note, reg_use, new_reg, 0,
VARRAY_RTX (*uid_ruid, def), &status);
+
SET_BIT (du->uses[avail_reg], du_idx);
RESET_BIT (du->uses[r], du_idx);
*************** replace_reg_in_block (du, uid_ruid, def,
*** 548,554 ****
--- 575,583 ----
return status;
}
+
if (TEST_BIT (du->defs[r], du_idx))
break;
}
+
return status;
}
*************** rr_replace_reg (x, reg_use, reg_sub, rep
*** 585,588 ****
--- 614,618 ----
return gen_rtx_REG (GET_MODE (x), REGNO (reg_use));
}
+
return x;
*************** rr_replace_reg (x, reg_use, reg_sub, rep
*** 593,605 ****
else if (replace_type == SOURCE)
{
! int dest_subregno;
! if (GET_CODE (SET_DEST (x)) == SUBREG)
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,
replace_type, insn, status);
/* If the replacement register is not part of the source
then it may be part of a source mem operand. */
--- 623,635 ----
else if (replace_type == SOURCE)
{
! unsigned int dest_subregno;
! int had_subreg = GET_CODE (SET_DEST (x)) == SUBREG;
! if (had_subreg)
dest_subregno = REGNO (XEXP (SET_DEST (x), 0));
SET_SRC (x) = rr_replace_reg (SET_SRC (x), reg_use, reg_sub,
replace_type, insn, status);
+
/* If the replacement register is not part of the source
then it may be part of a source mem operand. */
*************** rr_replace_reg (x, reg_use, reg_sub, rep
*** 610,616 ****
SET_DEST (x) = rr_replace_reg (SET_DEST (x), reg_use, reg_sub,
replace_type, insn, status);
! /* shared rtl sanity check */
! if (dest_subregno
! && dest_subregno != REGNO (XEXP (SET_DEST (x), 0)))
{
*status = 0;
--- 640,645 ----
SET_DEST (x) = rr_replace_reg (SET_DEST (x), reg_use, reg_sub,
replace_type, insn, status);
! /* Shared rtl sanity check. */
! if (had_subreg && dest_subregno != REGNO (XEXP (SET_DEST (x), 0)))
{
*status = 0;
*************** rr_replace_reg (x, reg_use, reg_sub, rep
*** 623,626 ****
--- 652,656 ----
{
int id;
+
extract_insn (insn);
*************** rr_replace_reg (x, reg_use, reg_sub, rep
*** 629,636 ****
{
int opno = recog_data.dup_num[id];
if (GET_CODE (*recog_data.dup_loc[id]) == REG
&& GET_CODE (*recog_data.operand_loc[opno]) == REG
! && (REGNO (*recog_data.dup_loc[id]) !=
! REGNO (*recog_data.operand_loc[opno])))
*status = 0;
}
--- 659,667 ----
{
int opno = recog_data.dup_num[id];
+
if (GET_CODE (*recog_data.dup_loc[id]) == REG
&& GET_CODE (*recog_data.operand_loc[opno]) == REG
! && (REGNO (*recog_data.dup_loc[id])
! != REGNO (*recog_data.operand_loc[opno])))
*status = 0;
}
*************** rr_replace_reg (x, reg_use, reg_sub, rep
*** 660,663 ****
--- 691,695 ----
{
register int xv;
+
for (xv = 0; xv < XVECLEN (x, i); xv++)
{
*************** rr_replace_reg (x, reg_use, reg_sub, rep
*** 680,683 ****
--- 712,716 ----
}
}
+
return x;
}
*************** consider_def (insn, regno, du, inum)
*** 690,695 ****
rtx insn;
int regno;
! def_uses *du;
! int inum;
{
/* Don't rename windowed registers across a call */
--- 723,728 ----
rtx insn;
int regno;
! def_uses *du ATTRIBUTE_UNUSED;
! int inum ATTRIBUTE_UNUSED;
{
/* Don't rename windowed registers across a call */
*************** consider_use (insn, regno, def_block, us
*** 734,743 ****
if (def_block != use_block)
for (e = ub->pred; e; e = e->pred_next)
! {
! if (e->src->index != def_block
! && e->src->index != -1
! && REGNO_REG_SET_P (BASIC_BLOCK (e->src->index)->global_live_at_end, regno))
! return 0;
! }
/* Don't consider conditional moves. Predicate architectures may
--- 767,775 ----
if (def_block != use_block)
for (e = ub->pred; e; e = e->pred_next)
! if (e->src->index != def_block
! && e->src->index != -1
! && REGNO_REG_SET_P (BASIC_BLOCK (e->src->index)->global_live_at_end,
! regno))
! return 0;
/* Don't consider conditional moves. Predicate architectures may
*************** consider_use (insn, regno, def_block, us
*** 756,764 ****
/* Don't consider register if the only use is in a USE */
! if (reg_mentioned_p (gen_rtx_USE (VOIDmode, reg_use),
! PATTERN (insn)))
! return 0;
! else
! return 1;
}
else
--- 788,793 ----
/* Don't consider register if the only use is in a USE */
! return ! reg_mentioned_p (gen_rtx_USE (VOIDmode, reg_use),
! PATTERN (insn));
}
else
*************** consider_available (reg_use, avail_reg,
*** 811,816 ****
)
|| (TEST_BIT (du->require_call_save_reg, inum)
! && (call_used_regs[avail_reg] || call_used_regs[REGNO (reg_use)]
! )))
return 0;
--- 840,844 ----
)
|| (TEST_BIT (du->require_call_save_reg, inum)
! && (call_used_regs[avail_reg] || call_used_regs[REGNO (reg_use)])))
return 0;
*************** consider_available (reg_use, avail_reg,
*** 818,825 ****
call saved registers can not be added to regs_ever_live after reload,
as it would invalidate most elimination offsets */
! if (regs_ever_live[avail_reg] || call_used_regs[avail_reg])
! return 1;
!
! return 0;
}
--- 846,850 ----
call saved registers can not be added to regs_ever_live after reload,
as it would invalidate most elimination offsets */
! return regs_ever_live[avail_reg] || call_used_regs[avail_reg];
}
*************** condmove_p (insn)
*** 830,838 ****
rtx insn;
{
! if (GET_CODE (insn) == INSN
! && GET_CODE (PATTERN (insn)) == SET
! && GET_CODE (SET_SRC (PATTERN (insn))) == IF_THEN_ELSE)
! return 1;
! return 0;
}
--- 855,861 ----
rtx insn;
{
! return (GET_CODE (insn) == INSN
! && GET_CODE (PATTERN (insn)) == SET
! && GET_CODE (SET_SRC (PATTERN (insn))) == IF_THEN_ELSE);
}
*************** condmove_p (insn)
*** 842,846 ****
static rtx
regno_first_use_in (regno, x)
! int regno;
rtx x;
{
--- 865,869 ----
static rtx
regno_first_use_in (regno, x)
! unsigned int regno;
rtx x;
{
*************** regno_first_use_in (regno, x)
*** 860,863 ****
--- 883,887 ----
return tem;
}
+
else if (fmt[i] == 'E')
for (j = XVECLEN (x, i) - 1; j >= 0; j--)
*************** regno_first_use_in (regno, x)
*** 866,870 ****
}
! return NULL_RTX;
}
--- 890,894 ----
}
! return 0;
}
*************** dump_def_use_chain (global_live_at_end,
*** 878,889 ****
varray_type *uid_ruid;
{
! int r, inum;
!
for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)
{
int set = 0;
! for (inum = 0;
! inum <= du->high_bound;
! inum++)
{
rtx insn = VARRAY_RTX (*uid_ruid, inum);
--- 902,913 ----
varray_type *uid_ruid;
{
! unsigned int r;
! int inum;
!
for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)
{
int set = 0;
!
! for (inum = 0; inum <= du->high_bound; inum++)
{
rtx insn = VARRAY_RTX (*uid_ruid, inum);
*************** dump_def_use_chain (global_live_at_end,
*** 893,896 ****
--- 917,921 ----
(insn)) != 'i')
continue;
+
reg_use = regno_first_use_in (r, PATTERN (insn));
if (!reg_use)
*************** dump_def_use_chain (global_live_at_end,
*** 909,912 ****
--- 934,938 ----
set = 1;
}
+
if (TEST_BIT (du->defs[r], inum))
fprintf (rtl_dump_file, "=%d ", INSN_UID (insn));
*************** dump_def_use_chain (global_live_at_end,
*** 914,917 ****
--- 940,944 ----
fprintf (rtl_dump_file, "%d ", INSN_UID (insn));
}
+
if (set)
fprintf (rtl_dump_file, "\n");
*************** dump_ext_bb_info (eb, ebb)
*** 927,954 ****
{
int b;
! {
! int have_ebb = 0;
! for (b = 0; b < n_basic_blocks; b++)
! {
! if (TEST_BIT (ebb->basic_block[eb], b))
! {
! if (!have_ebb)
! {
#ifndef RENAME_EXTENDED_BLOCKS
! fprintf (rtl_dump_file, "\nBasic block %d: ", b);
#else
! fprintf (rtl_dump_file, "\nExtended basic block %d: ", b);
#endif
! have_ebb = 1;
! }
! fprintf (rtl_dump_file, "%d ", b);
! }
! if (TEST_BIT (ebb->exit[eb], b))
! fprintf (rtl_dump_file, "(exit) ");
! }
! if (have_ebb)
! fprintf (rtl_dump_file, "\n");
! }
}
--- 954,981 ----
{
int b;
+ int have_ebb = 0;
! for (b = 0; b < n_basic_blocks; b++)
! {
! if (TEST_BIT (ebb->basic_block[eb], b))
! {
! if (!have_ebb)
! {
#ifndef RENAME_EXTENDED_BLOCKS
! fprintf (rtl_dump_file, "\nBasic block %d: ", b);
#else
! fprintf (rtl_dump_file, "\nExtended basic block %d: ", b);
#endif
! have_ebb = 1;
! }
! fprintf (rtl_dump_file, "%d ", b);
! }
!
! if (TEST_BIT (ebb->exit[eb], b))
! fprintf (rtl_dump_file, "(exit) ");
! }
!
! if (have_ebb)
! fprintf (rtl_dump_file, "\n");
}
*************** find_ext_basic_blocks (ebb)
*** 975,978 ****
--- 1002,1006 ----
for (b = 0; b < n_basic_blocks; b++)
{
+
basic_block bb = BASIC_BLOCK (b);
if (!TEST_BIT (bb_processed, b))
*************** find_one_ext_basic_block (entry, bb, bb_
*** 1008,1018 ****
if (!e->dest->pred->pred_next
&& (!TEST_BIT (*bb_processed, e->dest->index)))
! {
! find_one_ext_basic_block (entry, e->dest, bb_processed, ebb);
! }
else
! {
! SET_BIT (ebb->exit[entry], bb->index);
! }
}
}
--- 1036,1042 ----
if (!e->dest->pred->pred_next
&& (!TEST_BIT (*bb_processed, e->dest->index)))
! find_one_ext_basic_block (entry, e->dest, bb_processed, ebb);
else
! SET_BIT (ebb->exit[entry], bb->index);
}
}
*************** get_reg_class (insn, reg_use, type, defa
*** 1037,1051 ****
if (type == DESTINATION)
! for (id = 0; id < recog_data.n_operands; id++)
! {
if (rtx_equal_p (recog_data.operand[id], reg_use))
break;
! }
else if (type == SOURCE)
for (id = recog_data.n_operands - 1; id >= 0; id--)
! {
! if (rtx_equal_p (recog_data.operand[id], reg_use))
! break;
! }
if (id == -1 || id == recog_data.n_operands)
--- 1061,1074 ----
if (type == DESTINATION)
! {
! for (id = 0; id < recog_data.n_operands; id++)
if (rtx_equal_p (recog_data.operand[id], reg_use))
break;
! }
!
else if (type == SOURCE)
for (id = recog_data.n_operands - 1; id >= 0; id--)
! if (rtx_equal_p (recog_data.operand[id], reg_use))
! break;
if (id == -1 || id == recog_data.n_operands)