S/390: Add support for section anchors
authorIlya Leoshkevich <iii@linux.ibm.com>
Mon, 3 Dec 2018 15:07:36 +0000 (15:07 +0000)
committerIlya Leoshkevich <iii@gcc.gnu.org>
Mon, 3 Dec 2018 15:07:36 +0000 (15:07 +0000)
gcc/ChangeLog:

2018-12-03  Ilya Leoshkevich  <iii@linux.ibm.com>

* common/config/s390/s390-common.c (s390_option_init_struct):
Use section anchors by default.
* config/s390/s390.c (s390_check_symref_alignment): Handle
anchors.
(TARGET_MAX_ANCHOR_OFFSET): Use short displacement.
* output.h (assemble_align): Pass `align' as unsigned int, so
that the value 0x80000000, which corresponds to `aligned(1 <<
28)', would pass the `align > BITS_PER_UNIT' check.
* varasm.c (assemble_align): Likewise.

gcc/testsuite/ChangeLog:

2018-12-03  Ilya Leoshkevich  <iii@linux.ibm.com>

* gcc.target/s390/nodatarel-1.c: Expect .LANCHOR0@GOTENT instead
of a@GOTENT.
* gcc.target/s390/section-anchors.c: New test.
* gcc.target/s390/section-anchors2.c: New test.
* gcc.target/s390/section-anchors3.c: New test.

From-SVN: r266741

gcc/ChangeLog
gcc/common/config/s390/s390-common.c
gcc/config/s390/s390.c
gcc/output.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/nodatarel-1.c
gcc/testsuite/gcc.target/s390/section-anchors.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/section-anchors2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/section-anchors3.c [new file with mode: 0644]
gcc/varasm.c

index 2f4e96f18a979d70b42782b8dfd22e613fde0a08..2ac32608a45721f067799b87b2834df5dd416a34 100644 (file)
@@ -1,3 +1,15 @@
+2018-12-03  Ilya Leoshkevich  <iii@linux.ibm.com>
+
+       * common/config/s390/s390-common.c (s390_option_init_struct):
+       Use section anchors by default.
+       * config/s390/s390.c (s390_check_symref_alignment): Handle
+       anchors.
+       (TARGET_MAX_ANCHOR_OFFSET): Use short displacement.
+       * output.h (assemble_align): Pass `align' as unsigned int, so
+       that the value 0x80000000, which corresponds to `aligned(1 <<
+       28)', would pass the `align > BITS_PER_UNIT' check.
+       * varasm.c (assemble_align): Likewise.
+
 2018-12-03  Julian Brown  <julian@codesourcery.com>
 
        * tree-pretty-print.c (dump_omp_clause): Make default case
index 2f728957e2541672b3ae630f3e9e63e1ef0e7f2c..59b24654c82b9e0cbda76a3078c699685e0a483d 100644 (file)
@@ -74,6 +74,9 @@ s390_option_init_struct (struct gcc_options *opts)
   /* By default, always emit DWARF-2 unwind info.  This allows debugging
      without maintaining a stack frame back-chain.  */
   opts->x_flag_asynchronous_unwind_tables = 1;
+
+  /* Enable section anchors by default.  */
+  opts->x_flag_section_anchors = 1;
 }
 
 /* Implement TARGET_HANDLE_OPTION.  */
index 277d555440b971b9716d0efe78e0fef4b61bb09d..62868995ca6ee4d53f3073d2958d16255002aee8 100644 (file)
@@ -4187,6 +4187,20 @@ s390_check_symref_alignment (rtx addr, HOST_WIDE_INT alignment)
 
   if (GET_CODE (symref) == SYMBOL_REF)
     {
+      /* s390_encode_section_info is not called for anchors, since they don't
+        have corresponding VAR_DECLs.  Therefore, we cannot rely on
+        SYMBOL_FLAG_NOTALIGN{2,4,8}_P returning useful information.  */
+      if (SYMBOL_REF_ANCHOR_P (symref))
+       {
+         HOST_WIDE_INT block_offset = SYMBOL_REF_BLOCK_OFFSET (symref);
+         unsigned int block_alignment = (SYMBOL_REF_BLOCK (symref)->alignment
+                                         / BITS_PER_UNIT);
+
+         gcc_assert (block_offset >= 0);
+         return ((block_offset & (alignment - 1)) == 0
+                 && block_alignment >= alignment);
+       }
+
       /* We have load-relative instructions for 2-byte, 4-byte, and
         8-byte alignment so allow only these.  */
       switch (alignment)
@@ -16338,6 +16352,11 @@ s390_case_values_threshold (void)
 #undef TARGET_CASE_VALUES_THRESHOLD
 #define TARGET_CASE_VALUES_THRESHOLD s390_case_values_threshold
 
+/* Use only short displacement, since long displacement is not available for
+   the floating point instructions.  */
+#undef TARGET_MAX_ANCHOR_OFFSET
+#define TARGET_MAX_ANCHOR_OFFSET 0xfff
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 #include "gt-s390.h"
index 333389e484ce18f5484ab87693d9e98567858970..b2f0cc168ebfb36fca5b21a1e72961384d23dadf 100644 (file)
@@ -219,7 +219,7 @@ extern void assemble_external (tree);
 extern void assemble_zeros (unsigned HOST_WIDE_INT);
 
 /* Assemble an alignment pseudo op for an ALIGN-bit boundary.  */
-extern void assemble_align (int);
+extern void assemble_align (unsigned int);
 
 /* Assemble a string constant with the specified C string as contents.  */
 extern void assemble_string (const char *, int);
index f38b209ff075893fb22f0f3f3de58f7d62ba1acd..27300fcc0e02627dfaf8524f181733cf3f28699a 100644 (file)
@@ -1,3 +1,11 @@
+2018-12-03  Ilya Leoshkevich  <iii@linux.ibm.com>
+
+       * gcc.target/s390/nodatarel-1.c: Expect .LANCHOR0@GOTENT instead
+       of a@GOTENT.
+       * gcc.target/s390/section-anchors.c: New test.
+       * gcc.target/s390/section-anchors2.c: New test.
+       * gcc.target/s390/section-anchors3.c: New test.
+
 2018-12-03  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/88301
index 1d589a109472292e57525d2da31720faebb743d2..f53332f901dbc4c6ec65f32735e09440967595b1 100644 (file)
@@ -29,7 +29,7 @@ bar (int b)
   a = b;
 }
 
-/* { dg-final { scan-assembler-times "a@GOTENT" 3 } } */
+/* { dg-final { scan-assembler-times "\\.LANCHOR\\d+@GOTENT" 3 } } */
 
 /* The exrl target is a label_ref which should not be affected at
    all.  */
diff --git a/gcc/testsuite/gcc.target/s390/section-anchors.c b/gcc/testsuite/gcc.target/s390/section-anchors.c
new file mode 100644 (file)
index 0000000..68a6a39
--- /dev/null
@@ -0,0 +1,14 @@
+/* Test basic section anchor functionality.  */
+
+/* { dg-do compile { target { lp64 } } } */
+/* { dg-options "-O3 -march=z13" } */
+
+int a = 1, b = 2;
+
+void
+f ()
+{
+  a = 1234;
+  b = 5678;
+  /* { dg-final { scan-assembler {(?n)\n\tlarl\t(%r\d+),\.LANCHOR\d+\n\tmvhi\t\d+\(\1\),1234\n\tmvhi\t\d+\(\1\),5678} } } */
+}
diff --git a/gcc/testsuite/gcc.target/s390/section-anchors2.c b/gcc/testsuite/gcc.target/s390/section-anchors2.c
new file mode 100644 (file)
index 0000000..a3c3143
--- /dev/null
@@ -0,0 +1,26 @@
+/* Test corner case when LG from literal pool could be preferred to LARL.  */
+
+/* { dg-do compile { target { lp64 } } } */
+/* { dg-options "-O3 -march=z13" } */
+
+int e = 42;
+int *c = &e;
+
+void
+h (int *i)
+{
+  c = i;
+}
+
+void
+j ()
+{
+  h (&e);
+  /* { dg-final { scan-assembler {(?n)\n\tlarl\t.+\n\tstgrl\t.+\n\tbr\t%r14\n} } } */
+}
+
+void
+f ()
+{
+  h (c);
+}
diff --git a/gcc/testsuite/gcc.target/s390/section-anchors3.c b/gcc/testsuite/gcc.target/s390/section-anchors3.c
new file mode 100644 (file)
index 0000000..d9cac9d
--- /dev/null
@@ -0,0 +1,11 @@
+/* Test corner case when LG from literal pool could be preferred to LARL.  */
+
+/* { dg-do compile { target { lp64 } } } */
+/* { dg-options "-O3 -march=z13" } */
+
+int
+a (int b)
+{
+  return b / 100;
+  /* { dg-final { scan-assembler-not {\n\t\.quad\t\.LC} } } */
+}
index 243d205c1f5e9d95c221f807be6c23f96261b16f..dcce541d6432dd57657b3cbba6beedf13df871c2 100644 (file)
@@ -1974,7 +1974,7 @@ assemble_zeros (unsigned HOST_WIDE_INT size)
 /* Assemble an alignment pseudo op for an ALIGN-bit boundary.  */
 
 void
-assemble_align (int align)
+assemble_align (unsigned int align)
 {
   if (align > BITS_PER_UNIT)
     {