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 <[email protected]>
* 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