diff options
author | J"orn Rennecke <amylaar@cygnus.co.uk> | 1998-03-04 07:54:28 +0000 |
---|---|---|
committer | Joern Rennecke <amylaar@gcc.gnu.org> | 1998-03-04 07:54:28 +0000 |
commit | e2faec75889fb1f824b6013a73e90a6783dd1dff (patch) | |
tree | 90cccac0ed9e8e7903367b83748fd45301214253 /gcc/final.c | |
parent | 26024475522b4a9ca6ba751c0cc5657b564d1cbf (diff) | |
download | gcc-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.c | 17 |
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); |