mips.c (mips_emit_loadgp): Return early if there is nothing do to...
authorRichard Sandiford <rdsandiford@googlemail.com>
Mon, 2 Jun 2008 21:13:20 +0000 (21:13 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 2 Jun 2008 21:13:20 +0000 (21:13 +0000)
gcc/
* config/mips/mips.c (mips_emit_loadgp): Return early if
there is nothing do to, otherwise emit a blockage if
!TARGET_EXPLICIT_RELOCS || crtl->profile.
* config/mips/mips.md (loadgp_blockage): Use SI rather than DI.

From-SVN: r136294

gcc/ChangeLog
gcc/config/mips/mips.c
gcc/config/mips/mips.md

index 7edcf2ef94a48528af6b746d67edaea2e1b4f16b..8db8a5552534300e33b1bda77ecc97bbe64a993a 100644 (file)
@@ -1,3 +1,10 @@
+2008-06-02  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * config/mips/mips.c (mips_emit_loadgp): Return early if
+       there is nothing do to, otherwise emit a blockage if
+       !TARGET_EXPLICIT_RELOCS || crtl->profile.
+       * config/mips/mips.md (loadgp_blockage): Use SI rather than DI.
+
 2008-06-02  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
 
        * configure.ac: Drop unneeded backslash ending up in config.in.
index 551159c9e94c78ef1ad93eda3080295f16340190..41fc6d030090f6ac6582d3a36f07276edcd52b81 100644 (file)
@@ -8516,8 +8516,6 @@ mips_emit_loadgp (void)
       emit_insn (Pmode == SImode
                 ? gen_loadgp_newabi_si (pic_reg, offset, incoming_address)
                 : gen_loadgp_newabi_di (pic_reg, offset, incoming_address));
-      if (!TARGET_EXPLICIT_RELOCS)
-       emit_insn (gen_loadgp_blockage ());
       break;
 
     case LOADGP_RTP:
@@ -8526,13 +8524,16 @@ mips_emit_loadgp (void)
       emit_insn (Pmode == SImode
                 ? gen_loadgp_rtp_si (pic_reg, base, index)
                 : gen_loadgp_rtp_di (pic_reg, base, index));
-      if (!TARGET_EXPLICIT_RELOCS)
-       emit_insn (gen_loadgp_blockage ());
       break;
 
     default:
-      break;
+      return;
     }
+  /* Emit a blockage if there are implicit uses of the GP register.
+     This includes profiled functions, because FUNCTION_PROFILE uses
+     a jal macro.  */
+  if (!TARGET_EXPLICIT_RELOCS || crtl->profile)
+    emit_insn (gen_loadgp_blockage ());
 }
 
 /* Expand the "prologue" pattern.  */
index 3370d9958c8925253b7a0f54741d266d96897e05..29b8e70389077e83e90bc7195b46407ff07164c2 100644 (file)
 }
   [(set_attr "length" "8")])
 
-;; The use of gp is hidden when not using explicit relocations.
 ;; This blockage instruction prevents the gp load from being
 ;; scheduled after an implicit use of gp.  It also prevents
 ;; the load from being deleted as dead.
 (define_insn "loadgp_blockage"
-  [(unspec_volatile [(reg:DI 28)] UNSPEC_BLOCKAGE)]
+  [(unspec_volatile [(reg:SI 28)] UNSPEC_BLOCKAGE)]
   ""
   ""
   [(set_attr "type" "ghost")