alpha.c (alpha_align_insns): Suppress realignment immediately after a call; insert...
authorRichard Henderson <rth@redhat.com>
Sun, 9 Dec 2001 21:54:23 +0000 (13:54 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Sun, 9 Dec 2001 21:54:23 +0000 (13:54 -0800)
        * config/alpha/alpha.c (alpha_align_insns): Suppress realignment
        immediately after a call; insert nops before a call.

From-SVN: r47820

gcc/ChangeLog
gcc/config/alpha/alpha.c

index 7381bd05f39eb7f968921ce73544dde878acdc0a..c3b2dee926079a3d586d4410888ad9591111b654 100644 (file)
@@ -1,3 +1,8 @@
+2001-12-09  Richard Henderson  <rth@redhat.com>
+
+       * config/alpha/alpha.c (alpha_align_insns): Suppress realignment
+       immediately after a call; insert nops before a call.
+
 2001-12-09  Richard Henderson  <rth@redhat.com>
 
        * config/alpha/alpha.c (alpha_align_insns): Use align_functions,
index a4ca0df7c6c0f70d99f7c3e26d9bc41a6be4b929..66ed07947f7b665ffe3ca3ae71eeed7f02829c33 100644 (file)
@@ -7622,15 +7622,20 @@ alpha_align_insns (insns, max_align, next_group, next_nop)
       else if ((int) align < len)
        {
          unsigned int new_log_align = len > 8 ? 4 : 3;
-         rtx where;
+         rtx prev, where;
 
-         where = prev_nonnote_insn (i);
+         where = prev = prev_nonnote_insn (i);
          if (!where || GET_CODE (where) != CODE_LABEL)
            where = i;
 
-         emit_insn_before (gen_realign (GEN_INT (new_log_align)), where);
-         align = 1 << new_log_align;
-         ofs = 0;
+         /* Can't realign between a call and its gp reload.  */
+         if (! (TARGET_EXPLICIT_RELOCS
+                && prev && GET_CODE (prev) == CALL_INSN))
+           {
+             emit_insn_before (gen_realign (GEN_INT (new_log_align)), where);
+             align = 1 << new_log_align;
+             ofs = 0;
+           }
        }
 
       /* If the group won't fit in the same INT16 as the previous,
@@ -7644,8 +7649,8 @@ alpha_align_insns (insns, max_align, next_group, next_nop)
          int nop_count = (align - ofs) / 4;
          rtx where;
 
-         /* Insert nops before labels and branches to truely merge the
-            execution of the nops with the previous instruction group.  */
+         /* Insert nops before labels, branches, and calls to truely merge
+            the execution of the nops with the previous instruction group.  */
          where = prev_nonnote_insn (i);
          if (where)
            {
@@ -7655,7 +7660,7 @@ alpha_align_insns (insns, max_align, next_group, next_nop)
                  if (where2 && GET_CODE (where2) == JUMP_INSN)
                    where = where2;
                }
-             else if (GET_CODE (where) != JUMP_INSN)
+             else if (GET_CODE (where) == INSN)
                where = i;
            }
          else