diff mbox series

[v1] LoongArch: Set default alignment for functions jumps and loops [PR112919].

Message ID 20240402070319.25666-1-chenglulu@loongson.cn
State New
Headers show
Series [v1] LoongArch: Set default alignment for functions jumps and loops [PR112919]. | expand

Commit Message

Lulu Cheng April 2, 2024, 7:03 a.m. UTC
Xi Ruoyao set the alignment rules under LA464 in commit r14-1839,
but the macro ASM_OUTPUT_ALIGN_WITH_NOP was removed in R14-4674,
which affected the alignment rules.

So I set different aligns on LA464 and LA664 again to test the
performance of spec2006, and modify the alignment based on the test
results.

gcc/ChangeLog:

	PR target/112919
	* config/loongarch/loongarch-def.cc (la664_align): Newly defined
	function that sets alignment rules under the LA664 microarchitecture.
	* config/loongarch/loongarch-opts.cc
	(loongarch_target_option_override): If not optimizing for size, set
	the default alignment to what the target wants.
	* config/loongarch/loongarch-tune.h (struct loongarch_align): Add
	new member variables jump and loop.
---
 gcc/config/loongarch/loongarch-def.cc  | 11 ++++++++---
 gcc/config/loongarch/loongarch-opts.cc | 19 +++++++++++++------
 gcc/config/loongarch/loongarch-tune.h  | 22 +++++++++++++++-------
 3 files changed, 36 insertions(+), 16 deletions(-)

Comments

Xi Ruoyao April 6, 2024, 9:53 a.m. UTC | #1
On Tue, 2024-04-02 at 15:03 +0800, Lulu Cheng wrote:
> +/* Alignment for functions loops and jumps for best performance.  For new
> +   uarchs the value should be measured via benchmarking.  See the documentation
> +   for -falign-functions -falign-loops and -falign-jumps in invoke.texi for the
                           ^             ^

Better have two commas here.

Otherwise it should be OK.

> +   format.  */
Lulu Cheng April 8, 2024, 1:04 a.m. UTC | #2
在 2024/4/6 下午5:53, Xi Ruoyao 写道:
> On Tue, 2024-04-02 at 15:03 +0800, Lulu Cheng wrote:
>> +/* Alignment for functions loops and jumps for best performance.  For new
>> +   uarchs the value should be measured via benchmarking.  See the documentation
>> +   for -falign-functions -falign-loops and -falign-jumps in invoke.texi for the
>                             ^             ^
>
> Better have two commas here.
>
> Otherwise it should be OK.
>
>> +   format.  */
Modify the annotation information and pushed to r14-9824.
diff mbox series

Patch

diff --git a/gcc/config/loongarch/loongarch-def.cc b/gcc/config/loongarch/loongarch-def.cc
index e8c129ce643..63a8f108f4e 100644
--- a/gcc/config/loongarch/loongarch-def.cc
+++ b/gcc/config/loongarch/loongarch-def.cc
@@ -81,14 +81,19 @@  array_tune<loongarch_cache> loongarch_cpu_cache =
 
 static inline loongarch_align la464_align ()
 {
-  return loongarch_align ().function_ ("32").label_ ("16");
+  return loongarch_align ().function_ ("32").loop_ ("16").jump_ ("16");
+}
+
+static inline loongarch_align la664_align ()
+{
+  return loongarch_align ().function_ ("8").loop_ ("8").jump_ ("32");
 }
 
 array_tune<loongarch_align> loongarch_cpu_align =
   array_tune<loongarch_align> ()
-    .set (CPU_LOONGARCH64, la464_align ())
+    .set (CPU_LOONGARCH64, la664_align ())
     .set (CPU_LA464, la464_align ())
-    .set (CPU_LA664, la464_align ());
+    .set (CPU_LA664, la664_align ());
 
 /* Default RTX cost initializer.  */
 loongarch_rtx_cost_data::loongarch_rtx_cost_data ()
diff --git a/gcc/config/loongarch/loongarch-opts.cc b/gcc/config/loongarch/loongarch-opts.cc
index 2a6fc41b247..7b21cc311a8 100644
--- a/gcc/config/loongarch/loongarch-opts.cc
+++ b/gcc/config/loongarch/loongarch-opts.cc
@@ -922,13 +922,20 @@  loongarch_target_option_override (struct loongarch_target *target,
 {
   loongarch_update_gcc_opt_status (target, opts, opts_set);
 
-  /* alignments */
-  if (opts->x_flag_align_functions && !opts->x_str_align_functions)
-    opts->x_str_align_functions
-      = loongarch_cpu_align[target->cpu_tune].function;
+  /* If not optimizing for size, set the default
+     alignment to what the target wants.  */
+  if (!opts->x_optimize_size)
+    {
+      if (opts->x_flag_align_functions && !opts->x_str_align_functions)
+	opts->x_str_align_functions
+	  = loongarch_cpu_align[target->cpu_tune].function;
+
+      if (opts->x_flag_align_loops && !opts->x_str_align_loops)
+	opts->x_str_align_loops = loongarch_cpu_align[target->cpu_tune].loop;
 
-  if (opts->x_flag_align_labels && !opts->x_str_align_labels)
-    opts->x_str_align_labels = loongarch_cpu_align[target->cpu_tune].label;
+      if (opts->x_flag_align_jumps && !opts->x_str_align_jumps)
+	opts->x_str_align_jumps = loongarch_cpu_align[target->cpu_tune].jump;
+    }
 
   /* Set up parameters to be used in prefetching algorithm.  */
   int simultaneous_prefetches
diff --git a/gcc/config/loongarch/loongarch-tune.h b/gcc/config/loongarch/loongarch-tune.h
index 72b75f6de3f..3974edf9a90 100644
--- a/gcc/config/loongarch/loongarch-tune.h
+++ b/gcc/config/loongarch/loongarch-tune.h
@@ -162,14 +162,16 @@  struct loongarch_cache {
   }
 };
 
-/* Alignment for functions and labels for best performance.  For new uarchs
-   the value should be measured via benchmarking.  See the documentation for
-   -falign-functions and -falign-labels in invoke.texi for the format.  */
+/* Alignment for functions loops and jumps for best performance.  For new
+   uarchs the value should be measured via benchmarking.  See the documentation
+   for -falign-functions -falign-loops and -falign-jumps in invoke.texi for the
+   format.  */
 struct loongarch_align {
   const char *function;	/* default value for -falign-functions */
-  const char *label;	/* default value for -falign-labels */
+  const char *loop;	/* default value for -falign-loops */
+  const char *jump;	/* default value for -falign-jumps */
 
-  loongarch_align () : function (nullptr), label (nullptr) {}
+  loongarch_align () : function (nullptr), loop (nullptr), jump (nullptr) {}
 
   loongarch_align function_ (const char *_function)
   {
@@ -177,9 +179,15 @@  struct loongarch_align {
     return *this;
   }
 
-  loongarch_align label_ (const char *_label)
+  loongarch_align loop_ (const char *_loop)
   {
-    label = _label;
+    loop = _loop;
+    return *this;
+  }
+
+  loongarch_align jump_ (const char *_jump)
+  {
+    jump = _jump;
     return *this;
   }
 };