Hello All:

This patch improves loop_unroll_adjust by adding mem count to calculate
unroll factor.

Bootstrapped and regtested on powerpc64-linux-gnu.

Thanks & Regards
Ajit

rs6000: Improve loop_unroll_adjust

Improves loop_unroll_adjust by adding mem count to calculate
unroll factor.

2024-07-24  Ajit Kumar Agarwal  <aagar...@linux.ibm.com>

gcc/ChangeLog:

        * config/rs6000/rs6000.cc: Improve loop_unroll_adjust
        by adding mem count to calculate unroll factor.
---
 gcc/config/rs6000/rs6000.cc | 29 ++++++++++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)

diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index 0bcc6a2d0ab..3dd3857a74e 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -81,6 +81,7 @@
 #include "ppc-auxv.h"
 #include "rs6000-internal.h"
 #include "opts.h"
+#include "rtl-iter.h"
 
 /* This file should be included last.  */
 #include "target-def.h"
@@ -5570,7 +5571,11 @@ rs6000_cost_data::finish_cost (const vector_costs 
*scalar_costs)
 static unsigned
 rs6000_loop_unroll_adjust (unsigned nunroll, struct loop *loop)
 {
-   if (unroll_only_small_loops)
+  basic_block *bbs;
+  rtx_insn *insn;
+  unsigned i;
+  unsigned mem_count = 0;
+  if (unroll_only_small_loops)
     {
       /* TODO: These are hardcoded values right now.  We probably should use
         a PARAM here.  */
@@ -5582,6 +5587,28 @@ rs6000_loop_unroll_adjust (unsigned nunroll, struct loop 
*loop)
       return 0;
     }
 
+   /* Count the number of memory references within the loop body. */
+  subrtx_iterator::array_type array;
+  bbs = get_loop_body (loop);
+  for (i = 0; i < loop->num_nodes; i++)
+    FOR_BB_INSNS (bbs[i], insn)
+      if (NONDEBUG_INSN_P (insn))
+       FOR_EACH_SUBRTX (iter, array, PATTERN (insn), NONCONST)
+         if (const_rtx x = *iter)
+           if (MEM_P (x))
+             {
+               machine_mode mode = GET_MODE (x);
+               unsigned int n_words = GET_MODE_SIZE (mode) / UNITS_PER_WORD;
+               if (n_words > 4)
+                 mem_count += 2;
+               else
+                 mem_count += 1;
+             }
+  free (bbs);
+
+  if (mem_count && mem_count <=32)
+    return MIN (nunroll, 32 / mem_count);
+
   return nunroll;
 }
 
-- 
2.43.5

Reply via email to