summaryrefslogtreecommitdiff
path: root/gcc/resource.c
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>1999-11-02 23:43:44 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>1999-11-02 23:43:44 +0000
commitf770745a86a9bf1aeee340370198c6a5ef93fee3 (patch)
treef3193f233d4e51a4135939703e853d08afda6299 /gcc/resource.c
parent203c756d7b95642ceb7a1001b4d28dde7d58c297 (diff)
downloadgcc-f770745a86a9bf1aeee340370198c6a5ef93fee3.tar.gz
* resource.c: Revert Oct 26 20:42 and Oct 27 00:56 changes.
* toplev.c: Revert Nov 1 13:22 change. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@30357 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/resource.c')
-rw-r--r--gcc/resource.c46
1 files changed, 39 insertions, 7 deletions
diff --git a/gcc/resource.c b/gcc/resource.c
index b857312d4d0..265c12f0768 100644
--- a/gcc/resource.c
+++ b/gcc/resource.c
@@ -74,6 +74,7 @@ static HARD_REG_SET current_live_regs;
static HARD_REG_SET pending_dead_regs;
static void update_live_status PROTO ((rtx, rtx, void *));
+static int find_basic_block PROTO ((rtx));
static rtx next_insn_no_annul PROTO ((rtx));
static rtx find_dead_or_set_registers PROTO ((rtx, struct resources*,
rtx*, int, struct resources,
@@ -112,6 +113,40 @@ update_live_status (dest, x, data)
CLEAR_HARD_REG_BIT (pending_dead_regs, i);
}
}
+/* Find the number of the basic block that starts closest to INSN. Return -1
+ if we couldn't find such a basic block. */
+
+static int
+find_basic_block (insn)
+ rtx insn;
+{
+ int i;
+
+ /* Scan backwards to the previous BARRIER. Then see if we can find a
+ label that starts a basic block. Return the basic block number. */
+
+ for (insn = prev_nonnote_insn (insn);
+ insn && GET_CODE (insn) != BARRIER;
+ insn = prev_nonnote_insn (insn))
+ ;
+
+ /* The start of the function is basic block zero. */
+ if (insn == 0)
+ return 0;
+
+ /* See if any of the upcoming CODE_LABELs start a basic block. If we reach
+ anything other than a CODE_LABEL or note, we can't find this code. */
+ for (insn = next_nonnote_insn (insn);
+ insn && GET_CODE (insn) == CODE_LABEL;
+ insn = next_nonnote_insn (insn))
+ {
+ for (i = 0; i < n_basic_blocks; i++)
+ if (insn == BLOCK_HEAD (i))
+ return i;
+ }
+
+ return -1;
+}
/* Similar to next_insn, but ignores insns in the delay slots of
an annulled branch. */
@@ -832,9 +867,8 @@ mark_target_live_regs (insns, target, res)
b = tinfo->block;
}
- if (b == -1
- && INSN_UID (target) < (int) VARRAY_SIZE (basic_block_for_insn))
- b = BLOCK_NUM (target);
+ if (b == -1)
+ b = find_basic_block (target);
if (target_hash_table != NULL)
{
@@ -1138,8 +1172,6 @@ init_resource_info (epilogue_insn)
target_hash_table = (struct target_info **)
xcalloc (TARGET_HASH_PRIME, sizeof (struct target_info *));
bb_ticks = (int *) xcalloc (n_basic_blocks, sizeof (int));
-
- compute_bb_for_insn (get_max_uid ());
}
/* Free up the resources allcated to mark_target_live_regs (). This
@@ -1187,7 +1219,7 @@ void
incr_ticks_for_insn (insn)
rtx insn;
{
- int b = BLOCK_NUM (insn);
+ int b = find_basic_block (insn);
if (b != -1)
bb_ticks[b]++;
@@ -1264,7 +1296,7 @@ find_free_register (current_insn, last_insn, class_str, mode, reg_set)
/* And we don't clobber traceback for noreturn functions. */
if ((regno == FRAME_POINTER_REGNUM || regno == HARD_FRAME_POINTER_REGNUM)
&& (! reload_completed || frame_pointer_needed))
- continue;
+ continue;
success = 1;
for (j = HARD_REGNO_NREGS (regno, mode) - 1; j >= 0; j--)