From 22800d6629dd7a9dde96276a3d93dabe236e2ea6 Mon Sep 17 00:00:00 2001 From: Robin Dapp Date: Tue, 17 Jul 2018 12:05:07 +0000 Subject: [PATCH] S/390: Set default function alignment to 16. gcc/ChangeLog: 2018-07-17 Robin Dapp * 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 * 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 | 8 +++++++ gcc/config/s390/s390.c | 22 +++++++++++++++++ gcc/testsuite/ChangeLog | 6 +++++ .../gcc.target/s390/function-align1.c | 24 +++++++++++++++++++ .../gcc.target/s390/function-align2.c | 13 ++++++++++ .../gcc.target/s390/function-align3.c | 22 +++++++++++++++++ 6 files changed, 95 insertions(+) create mode 100644 gcc/testsuite/gcc.target/s390/function-align1.c create mode 100644 gcc/testsuite/gcc.target/s390/function-align2.c create mode 100644 gcc/testsuite/gcc.target/s390/function-align3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8ec7da04154..2e04a56a342 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2018-07-17 Robin Dapp + + * 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 PR middle-end/86542 diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index cb896944797..81f1fbaf894 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d0001f0a84e..addeb046696 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-07-17 Robin Dapp + + * 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 * 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 index 00000000000..78fa563098e --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/function-align1.c @@ -0,0 +1,24 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -march=z13" } */ + +#include +#include + +__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 index 00000000000..0d8e1ff2251 --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/function-align2.c @@ -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 index 00000000000..adb79763d4a --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/function-align3.c @@ -0,0 +1,22 @@ +/* { dg-do run } */ +/* { dg-options "-Os -march=z13" } */ + +#include +#include + +__attribute__((noinline)) +void bar () {} + +__attribute__((noinline)) +__attribute__((optimize("O2"))) +void baf () {} + +int main () +{ + bar (); + baf (); + + void *g = &baf; + + assert ( ((uintptr_t)g % 16) == 0); +} -- 2.30.2