S/390: Set default function alignment to 16.

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
This commit is contained in:
Robin Dapp 2018-07-17 12:05:07 +00:00 committed by Robin Dapp
parent a3bccfa17c
commit 22800d6629
6 changed files with 95 additions and 0 deletions

View 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

View 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

View 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.

View file

@ -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);
}

View file

@ -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 } } */
}

View file

@ -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);
}