aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@freesoft.cz>1999-12-09 11:51:44 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>1999-12-09 10:51:44 +0000
commit5dd56a932b3e62d8302a7a57f526bebe7c66eb85 (patch)
tree6c6130018fdd982a23677a34b38a91d6e26c8d44
parente73ccf83b659d36880b3e6bd0ab9d935d4d8eacb (diff)
downloadgcc-5dd56a932b3e62d8302a7a57f526bebe7c66eb85.zip
gcc-5dd56a932b3e62d8302a7a57f526bebe7c66eb85.tar.gz
gcc-5dd56a932b3e62d8302a7a57f526bebe7c66eb85.tar.bz2
* flow.c (recompute_reg_usage): Use basic block info to get loop_depth.
From-SVN: r30843
-rw-r--r--gcc/ChangeLog2
-rw-r--r--gcc/flow.c84
2 files changed, 41 insertions, 45 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index aa3dd01..4834010 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,7 @@
Thu Dec 9 11:36:24 MET 1999 Jan Hubicka <hubicka@freesoft.cz>
+ * flow.c (recompute_reg_usage): Use basic block info to get loop_depth.
+
* combine.c (try_combine, distribute_notes): Remove REG_N_REFS
updating code.
diff --git a/gcc/flow.c b/gcc/flow.c
index 18c9b44..eb50c94 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -5578,6 +5578,7 @@ recompute_reg_usage (f, loop_step)
{
rtx insn;
int i, max_reg;
+ int index;
/* Clear out the old data. */
max_reg = max_reg_num ();
@@ -5590,58 +5591,51 @@ recompute_reg_usage (f, loop_step)
/* Scan each insn in the chain and count how many times each register is
set/used. */
loop_depth = 1;
- for (insn = f; insn; insn = NEXT_INSN (insn))
+ for (index = 0; index < n_basic_blocks; index++)
{
- /* Keep track of loop depth. */
- if (GET_CODE (insn) == NOTE)
- {
- /* Look for loop boundaries. */
- if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
- loop_depth -= loop_step;
- else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
- loop_depth += loop_step;
-
- /* If we have LOOP_DEPTH == 0, there has been a bookkeeping error.
- Abort now rather than setting register status incorrectly. */
- if (loop_depth == 0)
- abort ();
- }
- else if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
- {
- rtx links;
+ basic_block bb = BASIC_BLOCK (index);
+ loop_depth = bb->loop_depth;
+ for (insn = bb->head; insn; insn = NEXT_INSN (insn))
+ {
+ if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
+ {
+ rtx links;
- /* This call will increment REG_N_SETS for each SET or CLOBBER
- of a register in INSN. It will also increment REG_N_REFS
- by the loop depth for each set of a register in INSN. */
- count_reg_sets (PATTERN (insn));
+ /* This call will increment REG_N_SETS for each SET or CLOBBER
+ of a register in INSN. It will also increment REG_N_REFS
+ by the loop depth for each set of a register in INSN. */
+ count_reg_sets (PATTERN (insn));
- /* count_reg_sets does not detect autoincrement address modes, so
- detect them here by looking at the notes attached to INSN. */
- for (links = REG_NOTES (insn); links; links = XEXP (links, 1))
- {
- if (REG_NOTE_KIND (links) == REG_INC)
- /* Count (weighted) references, stores, etc. This counts a
- register twice if it is modified, but that is correct. */
- REG_N_SETS (REGNO (XEXP (links, 0)))++;
- }
+ /* count_reg_sets does not detect autoincrement address modes, so
+ detect them here by looking at the notes attached to INSN. */
+ for (links = REG_NOTES (insn); links; links = XEXP (links, 1))
+ {
+ if (REG_NOTE_KIND (links) == REG_INC)
+ /* Count (weighted) references, stores, etc. This counts a
+ register twice if it is modified, but that is correct. */
+ REG_N_SETS (REGNO (XEXP (links, 0)))++;
+ }
- /* This call will increment REG_N_REFS by the current loop depth for
- each reference to a register in INSN. */
- count_reg_references (PATTERN (insn));
+ /* This call will increment REG_N_REFS by the current loop depth for
+ each reference to a register in INSN. */
+ count_reg_references (PATTERN (insn));
- /* count_reg_references will not include counts for arguments to
- function calls, so detect them here by examining the
- CALL_INSN_FUNCTION_USAGE data. */
- if (GET_CODE (insn) == CALL_INSN)
- {
- rtx note;
+ /* count_reg_references will not include counts for arguments to
+ function calls, so detect them here by examining the
+ CALL_INSN_FUNCTION_USAGE data. */
+ if (GET_CODE (insn) == CALL_INSN)
+ {
+ rtx note;
- for (note = CALL_INSN_FUNCTION_USAGE (insn);
- note;
- note = XEXP (note, 1))
- if (GET_CODE (XEXP (note, 0)) == USE)
- count_reg_references (XEXP (XEXP (note, 0), 0));
+ for (note = CALL_INSN_FUNCTION_USAGE (insn);
+ note;
+ note = XEXP (note, 1))
+ if (GET_CODE (XEXP (note, 0)) == USE)
+ count_reg_references (XEXP (XEXP (note, 0), 0));
+ }
}
+ if (insn == bb->end)
+ break;
}
}
}