Commit 5dd56a93 by Jan Hubicka Committed by Jan Hubicka

* flow.c (recompute_reg_usage): Use basic block info to get loop_depth.

From-SVN: r30843
parent e73ccf83
Thu Dec 9 11:36:24 MET 1999 Jan Hubicka <hubicka@freesoft.cz> 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 * combine.c (try_combine, distribute_notes): Remove REG_N_REFS
updating code. updating code.
......
...@@ -5578,6 +5578,7 @@ recompute_reg_usage (f, loop_step) ...@@ -5578,6 +5578,7 @@ recompute_reg_usage (f, loop_step)
{ {
rtx insn; rtx insn;
int i, max_reg; int i, max_reg;
int index;
/* Clear out the old data. */ /* Clear out the old data. */
max_reg = max_reg_num (); max_reg = max_reg_num ();
...@@ -5590,58 +5591,51 @@ recompute_reg_usage (f, loop_step) ...@@ -5590,58 +5591,51 @@ recompute_reg_usage (f, loop_step)
/* Scan each insn in the chain and count how many times each register is /* Scan each insn in the chain and count how many times each register is
set/used. */ set/used. */
loop_depth = 1; loop_depth = 1;
for (insn = f; insn; insn = NEXT_INSN (insn)) for (index = 0; index < n_basic_blocks; index++)
{ {
/* Keep track of loop depth. */ basic_block bb = BASIC_BLOCK (index);
if (GET_CODE (insn) == NOTE) loop_depth = bb->loop_depth;
{ for (insn = bb->head; insn; insn = NEXT_INSN (insn))
/* Look for loop boundaries. */ {
if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END) if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
loop_depth -= loop_step; {
else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG) rtx links;
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;
/* This call will increment REG_N_SETS for each SET or CLOBBER /* This call will increment REG_N_SETS for each SET or CLOBBER
of a register in INSN. It will also increment REG_N_REFS of a register in INSN. It will also increment REG_N_REFS
by the loop depth for each set of a register in INSN. */ by the loop depth for each set of a register in INSN. */
count_reg_sets (PATTERN (insn)); count_reg_sets (PATTERN (insn));
/* count_reg_sets does not detect autoincrement address modes, so /* count_reg_sets does not detect autoincrement address modes, so
detect them here by looking at the notes attached to INSN. */ detect them here by looking at the notes attached to INSN. */
for (links = REG_NOTES (insn); links; links = XEXP (links, 1)) for (links = REG_NOTES (insn); links; links = XEXP (links, 1))
{ {
if (REG_NOTE_KIND (links) == REG_INC) if (REG_NOTE_KIND (links) == REG_INC)
/* Count (weighted) references, stores, etc. This counts a /* Count (weighted) references, stores, etc. This counts a
register twice if it is modified, but that is correct. */ register twice if it is modified, but that is correct. */
REG_N_SETS (REGNO (XEXP (links, 0)))++; REG_N_SETS (REGNO (XEXP (links, 0)))++;
} }
/* This call will increment REG_N_REFS by the current loop depth for /* This call will increment REG_N_REFS by the current loop depth for
each reference to a register in INSN. */ each reference to a register in INSN. */
count_reg_references (PATTERN (insn)); count_reg_references (PATTERN (insn));
/* count_reg_references will not include counts for arguments to /* count_reg_references will not include counts for arguments to
function calls, so detect them here by examining the function calls, so detect them here by examining the
CALL_INSN_FUNCTION_USAGE data. */ CALL_INSN_FUNCTION_USAGE data. */
if (GET_CODE (insn) == CALL_INSN) if (GET_CODE (insn) == CALL_INSN)
{ {
rtx note; rtx note;
for (note = CALL_INSN_FUNCTION_USAGE (insn); for (note = CALL_INSN_FUNCTION_USAGE (insn);
note; note;
note = XEXP (note, 1)) note = XEXP (note, 1))
if (GET_CODE (XEXP (note, 0)) == USE) if (GET_CODE (XEXP (note, 0)) == USE)
count_reg_references (XEXP (XEXP (note, 0), 0)); count_reg_references (XEXP (XEXP (note, 0), 0));
}
} }
if (insn == bb->end)
break;
} }
} }
} }
......
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