microMIPS/GCC: Fix PIC call relaxation
authorMaciej W. Rozycki <macro@imgtec.com>
Wed, 16 Nov 2016 21:05:01 +0000 (21:05 +0000)
committerMaciej W. Rozycki <macro@gcc.gnu.org>
Wed, 16 Nov 2016 21:05:01 +0000 (21:05 +0000)
gcc/
* config/mips/mips.c (mips_output_jump): Output R_MICROMIPS_JALR
rather than R_MIPS_JALR relocation in microMIPS code.  Do not
cancel short delay slots in PIC call relaxation.

gcc/testsuite/
* gcc.target/mips/call-1.c (dg-options): Add `-mno-micromips'.
(dg-final): Remove microMIPS JALRS mnemonic matching.
* gcc.target/mips/call-2.c (dg-options): Add `-mno-micromips'.
(dg-final): Remove microMIPS JALRS mnemonic matching.
* gcc.target/mips/call-3.c (dg-options): Add `-mno-micromips'.
(dg-final): Remove microMIPS JALRS mnemonic matching.
* gcc.target/mips/call-4.c (dg-options): Add `-mno-micromips'.
* gcc.target/mips/call-5.c (dg-options): Add `-mno-micromips'.
* gcc.target/mips/call-6.c (dg-options): Add `-mno-micromips'.
* gcc.target/mips/call-1u.c: New test case.
* gcc.target/mips/call-2u.c: New test case.
* gcc.target/mips/call-3u.c: New test case.
* gcc.target/mips/call-4u.c: New test case.
* gcc.target/mips/call-5u.c: New test case.
* gcc.target/mips/call-6u.c: New test case.

From-SVN: r242512

15 files changed:
gcc/ChangeLog
gcc/config/mips/mips.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/mips/call-1.c
gcc/testsuite/gcc.target/mips/call-1u.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/call-2.c
gcc/testsuite/gcc.target/mips/call-2u.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/call-3.c
gcc/testsuite/gcc.target/mips/call-3u.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/call-4.c
gcc/testsuite/gcc.target/mips/call-4u.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/call-5.c
gcc/testsuite/gcc.target/mips/call-5u.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/call-6.c
gcc/testsuite/gcc.target/mips/call-6u.c [new file with mode: 0644]

index 02a309f735ff4b2e2d74c110f016940ea3613739..4e437f0bb670d6c590473460a97a5e8b04eb04a8 100644 (file)
@@ -1,3 +1,9 @@
+2016-11-16  Maciej W. Rozycki  <macro@imgtec.com>
+
+       * config/mips/mips.c (mips_output_jump): Output R_MICROMIPS_JALR
+       rather than R_MIPS_JALR relocation in microMIPS code.  Do not
+       cancel short delay slots in PIC call relaxation.
+
 2016-11-16  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        * config/arm/arm.md (arm_addsi3): Add alternative for addition of
index 10c20393ca4a7e292adc6ba8992ce38bf7165148..d6464c504302130589e61a4cf6a11629b30dfad6 100644 (file)
@@ -13618,12 +13618,9 @@ mips_output_jump (rtx *operands, int target_opno, int size_opno, bool link_p)
        s += sprintf (s, ".option\tpic0\n\t");
 
       if (reg_p && mips_get_pic_call_symbol (operands, size_opno))
-       {
-         s += sprintf (s, "%%*.reloc\t1f,R_MIPS_JALR,%%%d\n1:\t", size_opno);
-         /* Not sure why this shouldn't permit a short delay but it did not
-            allow it before so we still don't allow it.  */
-         short_delay = "";
-       }
+       s += sprintf (s, "%%*.reloc\t1f,%s,%%%d\n1:\t",
+                     TARGET_MICROMIPS ? "R_MICROMIPS_JALR" : "R_MIPS_JALR",
+                     size_opno);
       else
        s += sprintf (s, "%%*");
 
index 4c274d731488b15f686083be40050caf68704b26..0677079fb2b8f29c7c6bdd74a3e40391a1623b28 100644 (file)
@@ -1,3 +1,21 @@
+2016-11-16  Maciej W. Rozycki  <macro@imgtec.com>
+
+       * gcc.target/mips/call-1.c (dg-options): Add `-mno-micromips'.
+       (dg-final): Remove microMIPS JALRS mnemonic matching.
+       * gcc.target/mips/call-2.c (dg-options): Add `-mno-micromips'.
+       (dg-final): Remove microMIPS JALRS mnemonic matching.
+       * gcc.target/mips/call-3.c (dg-options): Add `-mno-micromips'.
+       (dg-final): Remove microMIPS JALRS mnemonic matching.
+       * gcc.target/mips/call-4.c (dg-options): Add `-mno-micromips'.
+       * gcc.target/mips/call-5.c (dg-options): Add `-mno-micromips'.
+       * gcc.target/mips/call-6.c (dg-options): Add `-mno-micromips'.
+       * gcc.target/mips/call-1u.c: New test case.
+       * gcc.target/mips/call-2u.c: New test case.
+       * gcc.target/mips/call-3u.c: New test case.
+       * gcc.target/mips/call-4u.c: New test case.
+       * gcc.target/mips/call-5u.c: New test case.
+       * gcc.target/mips/call-6u.c: New test case.
+
 2016-11-16  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        * gcc.target/arm/empty_fiq_handler.c: New test.
index 46a2536754b7b705a5446a7d63338d13a4242c53..9516e7ea89b0590906cab523b01fdee0e55f9c7f 100644 (file)
@@ -1,8 +1,8 @@
-/* { dg-options "-mrelax-pic-calls -mshared -foptimize-sibling-calls -mabi=32" } */
+/* { dg-options "-mno-micromips -mrelax-pic-calls -mshared -foptimize-sibling-calls -mabi=32" } */
 /* { dg-skip-if "requires -foptimize-sibling-calls" { *-*-* } { "-O0" } { "" } } */
-/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,normal\n1:\tjalrc?s?\t" } } */
-/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,normal2\n1:\tjalrc?s?\t" } } */
-/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,staticfunc\n1:\tjalrc?s?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,normal\n1:\tjalrc?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,normal2\n1:\tjalrc?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,staticfunc\n1:\tjalrc?\t" } } */
 /* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,tail\n1:\tjrc?\t" } } */
 /* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,tail2\n1:\tjrc?\t" } } */
 /* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,tail3\n1:\tjrc?\t" } } */
diff --git a/gcc/testsuite/gcc.target/mips/call-1u.c b/gcc/testsuite/gcc.target/mips/call-1u.c
new file mode 100644 (file)
index 0000000..d9700e2
--- /dev/null
@@ -0,0 +1,51 @@
+/* { dg-options "-mmicromips -mrelax-pic-calls -mshared -foptimize-sibling-calls -mabi=32" } */
+/* { dg-skip-if "requires -foptimize-sibling-calls" { *-*-* } { "-O0" } { "" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,normal\n1:\tjalrs?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,normal2\n1:\tjalrs?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,staticfunc\n1:\tjalrs?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,tail\n1:\tjrc?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,tail2\n1:\tjrc?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,tail3\n1:\tjrc?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,tail4\n1:\tjrc?\t" } } */
+
+__attribute__ ((noinline)) static void staticfunc () { asm (""); }
+int normal ();
+void normal2 ();
+
+int
+NOMIPS16 f (int *p)
+{
+  *p = normal ();
+  normal2 ();
+  staticfunc ();
+  return 1;
+}
+
+int tail ();
+
+int
+NOMIPS16 h ()
+{
+  return tail ();
+}
+
+void tail2 ();
+
+NOMIPS16 void g ()
+{
+  tail2 ();
+}
+
+__attribute__ ((visibility ("hidden"))) void tail3 ();
+
+NOMIPS16 void j ()
+{
+  tail3 ();
+}
+
+__attribute__ ((noinline)) static void tail4 () { asm (""); }
+
+NOMIPS16 void k ()
+{
+  tail4 ();
+}
index 175933cbe77b9e083e5c0f4350463d14f0168bc0..916cc7b46503b2632baf56faf952df03b211be10 100644 (file)
@@ -1,6 +1,6 @@
 /* See through some simple data-flow.  */
-/* { dg-options "-mrelax-pic-calls" } */
-/* { dg-final { scan-assembler-times "\\.reloc\t1f,R_MIPS_JALR,g\n1:\tjalrc?s?\t" 2 } } */
+/* { dg-options "-mno-micromips -mrelax-pic-calls" } */
+/* { dg-final { scan-assembler-times "\\.reloc\t1f,R_MIPS_JALR,g\n1:\tjalrc?\t" 2 } } */
 
 extern void g (void);
 
diff --git a/gcc/testsuite/gcc.target/mips/call-2u.c b/gcc/testsuite/gcc.target/mips/call-2u.c
new file mode 100644 (file)
index 0000000..4f59030
--- /dev/null
@@ -0,0 +1,13 @@
+/* See through some simple data-flow.  */
+/* { dg-options "-mmicromips -mrelax-pic-calls" } */
+/* { dg-final { scan-assembler-times "\\.reloc\t1f,R_MICROMIPS_JALR,g\n1:\tjalrs?\t" 2 } } */
+
+extern void g (void);
+
+int
+NOMIPS16 f ()
+{
+  g ();
+  g ();
+  return 1;
+}
index 08cf336a4240c9365782199fa9d29246cda3d02b..c52bc74d12bc78f73e76a48bef209a31730f42b2 100644 (file)
@@ -1,5 +1,5 @@
-/* { dg-options "-mrelax-pic-calls -mno-shared" } */
-/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,g\n1:\tjalrc?s?\t" } } */
+/* { dg-options "-mno-micromips -mrelax-pic-calls -mno-shared" } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,g\n1:\tjalrc?\t" } } */
 /* { dg-require-visibility "" } */
 
 __attribute__ ((visibility ("hidden"))) void g ();
diff --git a/gcc/testsuite/gcc.target/mips/call-3u.c b/gcc/testsuite/gcc.target/mips/call-3u.c
new file mode 100644 (file)
index 0000000..f8d557d
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-options "-mmicromips -mrelax-pic-calls -mno-shared" } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,g\n1:\tjalrs?\t" } } */
+/* { dg-require-visibility "" } */
+
+__attribute__ ((visibility ("hidden"))) void g ();
+
+int
+NOMIPS16 f ()
+{
+  g ();
+  return 1;
+}
index bf357c7a5b07baa235f9f1d353bd160b79a7991d..eb79d0d2a2519ab169cd87da578795941da5fae5 100644 (file)
@@ -1,5 +1,5 @@
 /* See through some simple data-flow.  */
-/* { dg-options "-mrelax-pic-calls" } */
+/* { dg-options "-mno-micromips -mrelax-pic-calls" } */
 /* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,g\n1:\tjalrc?\t" } } */
 
 extern void g (void);
diff --git a/gcc/testsuite/gcc.target/mips/call-4u.c b/gcc/testsuite/gcc.target/mips/call-4u.c
new file mode 100644 (file)
index 0000000..70bc399
--- /dev/null
@@ -0,0 +1,12 @@
+/* See through some simple data-flow.  */
+/* { dg-options "-mmicromips -mrelax-pic-calls" } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,g\n1:\tjalrs?\t" } } */
+
+extern void g (void);
+
+int
+NOMIPS16 f (int i)
+{
+  while (i--)
+    g ();
+}
index f6ebae9db79eda212ecdb85911a78fa0458e5aaf..822dc77bc9166ae6a7fbf3e4c9e9915bae9991ef 100644 (file)
@@ -1,6 +1,6 @@
 /* Like call-1.c, but for n32.  We cannot use sibling calls for tail and tail2
    in this case (PR target/57260).  */
-/* { dg-options "-mrelax-pic-calls -mshared -foptimize-sibling-calls -mabi=n32" } */
+/* { dg-options "-mno-micromips -mrelax-pic-calls -mshared -foptimize-sibling-calls -mabi=n32" } */
 /* { dg-skip-if "requires -foptimize-sibling-calls" { *-*-* } { "-O0" } { "" } } */
 /* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,normal\n1:\tjalrc?\t" } } */
 /* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,normal2\n1:\tjalrc?\t" } } */
diff --git a/gcc/testsuite/gcc.target/mips/call-5u.c b/gcc/testsuite/gcc.target/mips/call-5u.c
new file mode 100644 (file)
index 0000000..e98c059
--- /dev/null
@@ -0,0 +1,53 @@
+/* Like call-1.c, but for n32.  We cannot use sibling calls for tail and tail2
+   in this case (PR target/57260).  */
+/* { dg-options "-mmicromips -mrelax-pic-calls -mshared -foptimize-sibling-calls -mabi=n32" } */
+/* { dg-skip-if "requires -foptimize-sibling-calls" { *-*-* } { "-O0" } { "" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,normal\n1:\tjalrs?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,normal2\n1:\tjalrs?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,staticfunc\n1:\tjalrs?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,tail\n1:\tjalrs?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,tail2\n1:\tjalrs?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,tail3\n1:\tjrc?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,tail4\n1:\tjrc?\t" } } */
+
+__attribute__ ((noinline)) static void staticfunc () { asm (""); }
+int normal ();
+void normal2 ();
+
+int
+NOMIPS16 f (int *p)
+{
+  *p = normal ();
+  normal2 ();
+  staticfunc ();
+  return 1;
+}
+
+int tail ();
+
+int
+NOMIPS16 h ()
+{
+  return tail ();
+}
+
+void tail2 ();
+
+NOMIPS16 void g ()
+{
+  tail2 ();
+}
+
+__attribute__ ((visibility ("hidden"))) void tail3 ();
+
+NOMIPS16 void j ()
+{
+  tail3 ();
+}
+
+__attribute__ ((noinline)) static void tail4 () { asm (""); }
+
+NOMIPS16 void k ()
+{
+  tail4 ();
+}
index 00f4a1ef3532ef24a71ec1ddc7e281209b035d71..0267751773feed5f98baf9b8bc8c96abe6ebfbf3 100644 (file)
@@ -1,5 +1,5 @@
 /* Like call-5.c, but for n64.  */
-/* { dg-options "-mrelax-pic-calls -mshared -foptimize-sibling-calls -mabi=64" } */
+/* { dg-options "-mno-micromips -mrelax-pic-calls -mshared -foptimize-sibling-calls -mabi=64" } */
 /* { dg-skip-if "requires -foptimize-sibling-calls" { *-*-* } { "-O0" } { "" } } */
 /* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,normal\n1:\tjalrc?\t" } } */
 /* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,normal2\n1:\tjalrc?\t" } } */
diff --git a/gcc/testsuite/gcc.target/mips/call-6u.c b/gcc/testsuite/gcc.target/mips/call-6u.c
new file mode 100644 (file)
index 0000000..5d3b15e
--- /dev/null
@@ -0,0 +1,52 @@
+/* Like call-5.c, but for n64.  */
+/* { dg-options "-mmicromips -mrelax-pic-calls -mshared -foptimize-sibling-calls -mabi=64" } */
+/* { dg-skip-if "requires -foptimize-sibling-calls" { *-*-* } { "-O0" } { "" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,normal\n1:\tjalrs?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,normal2\n1:\tjalrs?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,staticfunc\n1:\tjalrs?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,tail\n1:\tjalrs?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,tail2\n1:\tjalrs?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,tail3\n1:\tjrc?\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MICROMIPS_JALR,tail4\n1:\tjrc?\t" } } */
+
+__attribute__ ((noinline)) static void staticfunc () { asm (""); }
+int normal ();
+void normal2 ();
+
+int
+NOMIPS16 f (int *p)
+{
+  *p = normal ();
+  normal2 ();
+  staticfunc ();
+  return 1;
+}
+
+int tail ();
+
+int
+NOMIPS16 h ()
+{
+  return tail ();
+}
+
+void tail2 ();
+
+NOMIPS16 void g ()
+{
+  tail2 ();
+}
+
+__attribute__ ((visibility ("hidden"))) void tail3 ();
+
+NOMIPS16 void j ()
+{
+  tail3 ();
+}
+
+__attribute__ ((noinline)) static void tail4 () { asm (""); }
+
+NOMIPS16 void k ()
+{
+  tail4 ();
+}