Models that have hardware prefetchers prefer sorted store instructions.
The autoprefetcher model is based on that of AArch64.  We start with
only AUTOPREFETCHER_OFF and AUTOPREFETCHER_WEAK, leaving the strong
model for further work.  The support of a strong model is only useful
after max_issue is supported.  It is little work to implement one like
Arm's, but some research may need to be done of its benefits.

gcc/ChangeLog:

        * config/riscv/riscv.cc (struct riscv_tune_param): New member.
        (xt_c9501_tune_info): Set autoprefetcher model to weak.
        (riscv_override_options_internal): Set
        param_sched_autopref_queue_depth based on autoprefetcher model.

gcc/testsuite/ChangeLog:

        * gcc.target/riscv/autopref-xt-c9501fdvt.c: New test.
---
 gcc/config/riscv/riscv.cc                     | 22 +++++++++++++++++++
 .../gcc.target/riscv/autopref-xt-c9501fdvt.c  | 13 +++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/riscv/autopref-xt-c9501fdvt.c

diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index a2a51c019ec..7c061614aa5 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -305,6 +305,11 @@ struct riscv_tune_param
   unsigned short vec_reassoc_width = 1;
   unsigned int small_loop_unroll_ninsns = 4;
   unsigned int small_loop_unroll_factor = 2;
+  enum riscv_autoprefetch_model
+  {
+    AUTOPREFETCHER_OFF,
+    AUTOPREFETCHER_WEAK
+  } autoprefetcher_model = AUTOPREFETCHER_OFF;
 };
 
 
@@ -747,6 +752,7 @@ static const struct riscv_tune_param xt_c9501_tune_info = {
   1,                                           /* vec_reassoc_width.  */
   4,   /* small_loop_unroll_ninsns.  */
   8,   /* small_loop_unroll_factor.  */
+  riscv_tune_param::AUTOPREFETCHER_WEAK,       /* autoprefetcher_model */
 };
 
 /* Costs to use when optimizing for Tenstorrent Ascalon 8 wide.  */
@@ -12195,6 +12201,22 @@ riscv_override_options_internal (struct gcc_options 
*opts)
       opts->x_flag_cf_protection
       = (cf_protection_level) (opts->x_flag_cf_protection | CF_SET);
     }
+
+  int queue_depth = 0;
+  switch (cpu->tune_param->autoprefetcher_model)
+    {
+      case riscv_tune_param::AUTOPREFETCHER_OFF:
+       queue_depth = -1;
+       break;
+      case riscv_tune_param::AUTOPREFETCHER_WEAK:
+       queue_depth = 0;
+       break;
+      default:
+       gcc_unreachable ();
+    }
+
+  SET_OPTION_IF_UNSET (&global_options, &global_options_set,
+                      param_sched_autopref_queue_depth, queue_depth);
 }
 
 /* Implement TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE.  */
diff --git a/gcc/testsuite/gcc.target/riscv/autopref-xt-c9501fdvt.c 
b/gcc/testsuite/gcc.target/riscv/autopref-xt-c9501fdvt.c
new file mode 100644
index 00000000000..c506b0d6fbb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/autopref-xt-c9501fdvt.c
@@ -0,0 +1,13 @@
+/* { dg-do compile { target { rv64 } } } */
+/* { dg-skip-if "" { *-*-* } { "-O0" "-O1" "-O3" "-Og" "-Os" "-Oz" } } */
+/* { dg-options "-march=rv64gc -mabi=lp64d -mtune=xt-c9501fdvt" } */
+
+void
+foo(long *a)
+{ 
+  a[2] = 1;
+  a[1] = 1;
+  a[0] = 1;
+}
+
+/* { dg-final { scan-assembler 
"sd.*0\\(a0\\)\n\\s*sd.*8\\(a0\\)\n\\s*sd.*16\\(a0\\)" } } */
-- 
2.46.0

Reply via email to