S/390: Set default function alignment to 16.
authorRobin Dapp <rdapp@linux.ibm.com>
Tue, 17 Jul 2018 12:05:07 +0000 (12:05 +0000)
committerRobin Dapp <rdapp@gcc.gnu.org>
Tue, 17 Jul 2018 12:05:07 +0000 (12:05 +0000)
gcc/ChangeLog:

2018-07-17  Robin Dapp  <rdapp@linux.ibm.com>

* config/s390/s390.c (s390_default_align): Set default function
alignment to 16.
(s390_override_options_after_change): Call s390_default align.
(s390_option_override_internal): Call s390_default_align.
(TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE): Define.

gcc/testsuite/ChangeLog:

2018-07-17  Robin Dapp  <rdapp@linux.ibm.com>

* gcc.target/s390/function-align1.c: New test.
* gcc.target/s390/function-align2.c: New test.
* gcc.target/s390/function-align3.c: New test.

From-SVN: r262817

gcc/ChangeLog
gcc/config/s390/s390.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/function-align1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/function-align2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/function-align3.c [new file with mode: 0644]

index 8ec7da041541991d5117c2f8e6a19f80521ce095..2e04a56a342a0e35292633efb2789a4bd6d28e5b 100644 (file)
@@ -1,3 +1,11 @@
+2018-07-17  Robin Dapp  <rdapp@linux.ibm.com>
+
+       * config/s390/s390.c (s390_default_align): Set default function
+       alignment to 16.
+       (s390_override_options_after_change): Call s390_default align.
+       (s390_option_override_internal): Call s390_default_align.
+       (TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE): Define.
+
 2018-07-17  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/86542
index cb89694479758165b081d7f99c4ade005fea2a4f..81f1fbaf894f4b427341dc62e142bbb41f257749 100644 (file)
@@ -15396,6 +15396,22 @@ s390_function_specific_restore (struct gcc_options *opts,
   opts->x_s390_cost_pointer = (long)processor_table[opts->x_s390_tune].cost;
 }
 
+static void
+s390_default_align (struct gcc_options *opts)
+{
+  /* Set the default function alignment to 16 in order to get rid of
+     some unwanted performance effects. */
+  if (opts->x_flag_align_functions && !opts->x_str_align_functions
+      && opts->x_s390_tune >= PROCESSOR_2964_Z13)
+    opts->x_str_align_functions = "16";
+}
+
+static void
+s390_override_options_after_change (void)
+{
+  s390_default_align (&global_options);
+}
+
 static void
 s390_option_override_internal (bool main_args_p,
                               struct gcc_options *opts,
@@ -15633,6 +15649,9 @@ s390_option_override_internal (bool main_args_p,
                         opts->x_param_values,
                         opts_set->x_param_values);
 
+  /* Set the default alignment.  */
+  s390_default_align (opts);
+
   /* Call target specific restore function to do post-init work.  At the moment,
      this just sets opts->x_s390_cost_pointer.  */
   s390_function_specific_restore (opts, NULL);
@@ -16831,6 +16850,9 @@ s390_case_values_threshold (void)
 #undef TARGET_PASS_BY_REFERENCE
 #define TARGET_PASS_BY_REFERENCE s390_pass_by_reference
 
+#undef  TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE
+#define TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE s390_override_options_after_change
+
 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
 #define TARGET_FUNCTION_OK_FOR_SIBCALL s390_function_ok_for_sibcall
 #undef TARGET_FUNCTION_ARG
index d0001f0a84e83464a8233e7e4d2a83a79fb1c482..addeb046696405345c44d28edd8bd3bf512025be 100644 (file)
@@ -1,3 +1,9 @@
+2018-07-17  Robin Dapp  <rdapp@linux.ibm.com>
+
+       * gcc.target/s390/function-align1.c: New test.
+       * gcc.target/s390/function-align2.c: New test.
+       * gcc.target/s390/function-align3.c: New test.
+
 2018-07-17  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/discr55.adb: New test.
diff --git a/gcc/testsuite/gcc.target/s390/function-align1.c b/gcc/testsuite/gcc.target/s390/function-align1.c
new file mode 100644 (file)
index 0000000..78fa563
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -march=z13"  } */
+
+#include <assert.h>
+#include <stdint.h>
+
+__attribute__((noinline))
+void foo1 () {}
+
+__attribute__((noinline))
+__attribute__((optimize("align-functions=32")))
+void foo2 () {}
+
+int main ()
+{
+  foo1 ();
+  foo2 ();
+
+  void *f = &foo1;
+  void *g = &foo2;
+
+  assert (((uintptr_t)f % 16) == 0);
+  assert (((uintptr_t)g % 32) == 0);
+}
diff --git a/gcc/testsuite/gcc.target/s390/function-align2.c b/gcc/testsuite/gcc.target/s390/function-align2.c
new file mode 100644 (file)
index 0000000..0d8e1ff
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-Os -march=z13"  } */
+
+void bar ()
+{
+  /* { dg-final { scan-assembler-times ".align\t8" 2 } } */
+}
+
+__attribute__((optimize("O2")))
+void baz ()
+{
+  /* { dg-final { scan-assembler-times ".align\t16" 1 } } */
+}
diff --git a/gcc/testsuite/gcc.target/s390/function-align3.c b/gcc/testsuite/gcc.target/s390/function-align3.c
new file mode 100644 (file)
index 0000000..adb7976
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do run } */
+/* { dg-options "-Os -march=z13"  } */
+
+#include <assert.h>
+#include <stdint.h>
+
+__attribute__((noinline))
+void bar () {}
+
+__attribute__((noinline))
+__attribute__((optimize("O2")))
+void baf () {}
+
+int main ()
+{
+  bar ();
+  baf ();
+
+  void *g = &baf;
+
+  assert ( ((uintptr_t)g % 16) == 0);
+}