final.c (shorten_branches): Don't add an alignment for loops that have no label inside.
authorJ"orn Rennecke <amylaar@cygnus.co.uk>
Wed, 4 Aug 1999 22:13:14 +0000 (22:13 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Wed, 4 Aug 1999 22:13:14 +0000 (23:13 +0100)
* final.c (shorten_branches): Don't add an alignment for loops
that have no label inside.

From-SVN: r28517

gcc/ChangeLog
gcc/final.c

index 0ae4eacebb38d42d0a4b56eff1369810a79b7412..d414f6af217761e651ffe33b021acfba00caac14 100644 (file)
@@ -1,3 +1,8 @@
+Wed Aug  4 20:45:04 1999  J"orn Rennecke <amylaar@cygnus.co.uk>
+
+       * final.c (shorten_branches): Don't add an alignment for loops
+       that have no label inside.
+
 Wed Aug  4 16:39:24 1999  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * builtins.c (expand_builtin_memcmp, expand_builtin_strcmp): Wrap
index 79a973e89a1606fdbff67da519214d563c3cc398..a6080418ac57a4404ad1b45388c0b88d87adfee6 100644 (file)
@@ -1113,18 +1113,32 @@ shorten_branches (first)
               && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
        {
          rtx label;
+         int nest = 0;
 
+         /* Search for the label that starts the loop.
+            Don't skip past the end of the loop, since that could
+            lead to putting an alignment where it does not belong.
+            However, a label after a nested (non-)loop would be OK.  */
          for (label = insn; label; label = NEXT_INSN (label))
-           if (GET_CODE (label) == CODE_LABEL)
-             {
-               log = LOOP_ALIGN (insn);
-               if (max_log < log)
-                 {
-                   max_log = log;
-                   max_skip = LOOP_ALIGN_MAX_SKIP;
-                 }
+           {
+             if (GET_CODE (label) == NOTE
+                 && NOTE_LINE_NUMBER (label) == NOTE_INSN_LOOP_BEG)
+               nest++;
+             else if (GET_CODE (label) == NOTE
+                      && NOTE_LINE_NUMBER (label) == NOTE_INSN_LOOP_END
+                      && --nest == 0)
                break;
-             }
+             else if (GET_CODE (label) == CODE_LABEL)
+               {
+                 log = LOOP_ALIGN (insn);
+                 if (max_log < log)
+                   {
+                     max_log = log;
+                     max_skip = LOOP_ALIGN_MAX_SKIP;
+                   }
+                 break;
+               }
+           }
        }
       else
        continue;