This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH, S390] Increase function alignment to 16 bytes
- From: Robin Dapp <rdapp at linux dot ibm dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: Andreas Krebbel <krebbel at linux dot ibm dot com>, mliska at suse dot cz
- Date: Wed, 11 Jul 2018 17:40:37 +0200
- Subject: [PATCH, S390] Increase function alignment to 16 bytes
Hi,
the following patch increases the default function alignment to 16
bytes. This helps get rid of some unwanted performance effects.
I'm unsure whether or when it's necessary to implement
OVERRIDE_OPTIONS_AFTER_CHANGE.
Apparently ia64 did it to set flags that are reset when using
__attribute__((optimize)). i386 calls i386_default_align () and sets
various alignments only when the alignment value is unset but when is
e.g. global_options.x_str_align_functions actually unset except for the
very first call?
Trying simple examples like
void foo () {};
__attribute__((optimize("Os")))
void bar () {};
I did not observe that the default alignment, once set, was reset anywhere.
Regards
Robin
--
gcc/ChangeLog:
2018-07-11 Robin Dapp <rdapp@linux.ibm.com>
* config/s390/s390.c (s390_default_align): Set default
function alignment.
(s390_override_options_after_change): New.
(s390_option_override_internal): Call s390_default_align.
(TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE): New.
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index 8df195ddd78..eaeba89b321 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -15322,6 +15322,23 @@ 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_optimize_size)
+ 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,
@@ -15559,6 +15576,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);
@@ -16751,6 +16771,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