aboutsummaryrefslogtreecommitdiff
path: root/gcc/final.c
diff options
context:
space:
mode:
authorJ"orn Rennecke <amylaar@cygnus.co.uk>1998-03-04 07:54:28 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>1998-03-04 07:54:28 +0000
commite2faec75889fb1f824b6013a73e90a6783dd1dff (patch)
tree90cccac0ed9e8e7903367b83748fd45301214253 /gcc/final.c
parent26024475522b4a9ca6ba751c0cc5657b564d1cbf (diff)
downloadgcc-e2faec75889fb1f824b6013a73e90a6783dd1dff.zip
gcc-e2faec75889fb1f824b6013a73e90a6783dd1dff.tar.gz
gcc-e2faec75889fb1f824b6013a73e90a6783dd1dff.tar.bz2
final.c (shorten_branches): Tag the loop alignment onto the first label after NOTE_INSN_LOOP_BEG even if...
* final.c (shorten_branches): Tag the loop alignment onto the first label after NOTE_INSN_LOOP_BEG even if there is an intervening insn. From-SVN: r18396
Diffstat (limited to 'gcc/final.c')
-rw-r--r--gcc/final.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/gcc/final.c b/gcc/final.c
index 35628f6..9fb40ac 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -982,13 +982,23 @@ shorten_branches (first)
/* Initialize label_align and set up uid_shuid to be strictly
monotonically rising with insn order. */
+ /* We use max_log here to keep track of the maximum alignment we want to
+ impose on the next CODE_LABEL (or the current one if we are processing
+ the CODE_LABEL itself). */
+
for (max_log = 0, insn = get_insns (), i = 1; insn; insn = NEXT_INSN (insn))
{
int log;
INSN_SHUID (insn) = i++;
if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
- max_log = 0;
+ {
+ /* reorg might make the first insn of a loop being run once only,
+ and delete the label in front of it. Then we want to apply
+ the loop alignment to the new label created by reorg, which
+ is separated by the former loop start insn from the
+ NOTE_INSN_LOOP_BEG. */
+ }
else if (GET_CODE (insn) == CODE_LABEL)
{
rtx next;
@@ -1028,13 +1038,14 @@ shorten_branches (first)
break;
}
}
+ /* Again, we allow NOTE_INSN_LOOP_BEG - INSN - CODE_LABEL
+ sequences in order to handle reorg output efficiently. */
else if (GET_CODE (insn) == NOTE
&& NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
{
rtx label;
- for (label = insn; label && GET_RTX_CLASS (GET_CODE (label)) != 'i';
- label = NEXT_INSN (label))
+ for (label = insn; label; label = NEXT_INSN (label))
if (GET_CODE (label) == CODE_LABEL)
{
log = LOOP_ALIGN (insn);