]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
s390: Add -munroll-only-small-loops.
authorRobin Dapp <rdapp@linux.ibm.com>
Thu, 3 Mar 2022 14:06:21 +0000 (15:06 +0100)
committerRobin Dapp <rdapp@linux.ibm.com>
Mon, 29 Aug 2022 09:15:09 +0000 (11:15 +0200)
Inspired by Power we also introduce -munroll-only-small-loops.  This
implies activating -funroll-loops and -munroll-only-small-loops at -O2 and
above.

gcc/ChangeLog:

* common/config/s390/s390-common.cc: Enable -funroll-loops and
-munroll-only-small-loops for OPT_LEVELS_2_PLUS_SPEED_ONLY.
* config/s390/s390.cc (s390_loop_unroll_adjust): Do not unroll
loops larger than 12 instructions.
(s390_override_options_after_change): Set unroll options.
(s390_option_override_internal): Likewise.
* config/s390/s390.opt: Document munroll-only-small-loops.

gcc/testsuite/ChangeLog:

* gcc.target/s390/vector/vec-copysign.c: Do not unroll.
* gcc.target/s390/zvector/autovec-double-quiet-uneq.c: Dito.
* gcc.target/s390/zvector/autovec-double-signaling-ltgt.c: Dito.
* gcc.target/s390/zvector/autovec-float-quiet-uneq.c: Dito.
* gcc.target/s390/zvector/autovec-float-signaling-ltgt.c: Dito.

gcc/common/config/s390/s390-common.cc
gcc/config/s390/s390.cc
gcc/config/s390/s390.opt
gcc/testsuite/gcc.target/s390/vector/vec-copysign.c
gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-uneq.c
gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ltgt.c
gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-uneq.c
gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-ltgt.c

index 72a5ef47eaac4c25833705abdf1e627a9935f7b5..be3e6f201429029721eae75367e5ce80b29c662f 100644 (file)
@@ -64,6 +64,11 @@ static const struct default_options s390_option_optimization_table[] =
     /* Enable -fsched-pressure by default when optimizing.  */
     { OPT_LEVELS_1_PLUS, OPT_fsched_pressure, NULL, 1 },
 
+    /* Enable -munroll-only-small-loops with -funroll-loops to unroll small
+       loops at -O2 and above by default.  */
+    { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_funroll_loops, NULL, 1 },
+    { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_munroll_only_small_loops, NULL, 1 },
+
     /* ??? There are apparently still problems with -fcaller-saves.  */
     { OPT_LEVELS_ALL, OPT_fcaller_saves, NULL, 0 },
 
index 5e06bf9350c90f9b043be22fb0fbda743c4df6c4..942ed267b8797698c1fe6446d113862b1103a962 100644 (file)
@@ -15420,6 +15420,21 @@ s390_loop_unroll_adjust (unsigned nunroll, struct loop *loop)
   if (s390_tune < PROCESSOR_2097_Z10)
     return nunroll;
 
+  if (unroll_only_small_loops)
+    {
+      /* Only unroll loops smaller than or equal to 12 insns.  */
+      const unsigned int small_threshold = 12;
+
+      if (loop->ninsns > small_threshold)
+       return 0;
+
+      /* ???: Make this dependent on the type of registers in
+        the loop.  Increase the limit for vector registers.  */
+      const unsigned int max_insns = optimize >= 3 ? 36 : 24;
+
+      nunroll = MIN (nunroll, max_insns / loop->ninsns);
+    }
+
   /* Count the number of memory references within the loop body.  */
   bbs = get_loop_body (loop);
   subrtx_iterator::array_type array;
@@ -15494,6 +15509,19 @@ static void
 s390_override_options_after_change (void)
 {
   s390_default_align (&global_options);
+
+  /* Explicit -funroll-loops turns -munroll-only-small-loops off.  */
+  if ((OPTION_SET_P (flag_unroll_loops) && flag_unroll_loops)
+       || (OPTION_SET_P (flag_unroll_all_loops)
+          && flag_unroll_all_loops))
+    {
+      if (!OPTION_SET_P (unroll_only_small_loops))
+       unroll_only_small_loops = 0;
+      if (!OPTION_SET_P (flag_cunroll_grow_size))
+       flag_cunroll_grow_size = 1;
+    }
+  else if (!OPTION_SET_P (flag_cunroll_grow_size))
+    flag_cunroll_grow_size = flag_peel_loops || optimize >= 3;
 }
 
 static void
@@ -15703,6 +15731,9 @@ s390_option_override_internal (struct gcc_options *opts,
   /* Set the default alignment.  */
   s390_default_align (opts);
 
+  /* Set unroll options.  */
+  s390_override_options_after_change ();
+
   /* 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, opts_set, NULL);
index 9e8d3bfd404cd877196b4e31adc2ada5621c908f..c375b9c5f72907b6fc1e10b2228f9843a5079222 100644 (file)
@@ -321,3 +321,7 @@ and the default behavior is to emit separate multiplication and addition
 instructions for long doubles in vector registers, because measurements show
 that this improves performance.  This option allows overriding it for testing
 purposes.
+
+munroll-only-small-loops
+Target Undocumented Var(unroll_only_small_loops) Init(0) Save
+; Use conservative small loop unrolling.
index 64c6970c23e2930c003a8901fa597c8661240e2a..b723ceb13be9b4872b350cf169a79601294c4f44 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile { target { s390*-*-* } } } */
-/* { dg-options "-O2 -ftree-vectorize -mzarch" } */
+/* { dg-options "-O2 -ftree-vectorize -mzarch -fno-unroll-loops" } */
 /* { dg-final { scan-assembler-times "vgmg" 1 } } */
 /* { dg-final { scan-assembler-times "vgmf" 1 } } */
 /* { dg-final { scan-assembler-times "vsel" 2 } } */
index 7c9b20fd2e0f20615f4f08858417a7f96b62b485..8948be28ed5d6ba6070ba2bce881730955b18b65 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O3 -march=z13 -mzvector -mzarch" } */
+/* { dg-options "-O3 -march=z13 -mzvector -mzarch -fno-unroll-loops" } */
 
 #include "autovec.h"
 
index 9dfae8f2f7e7a8c193d249e50fd63f256519197b..9417b0c4838ff83dd21af324d74f2096d17b3d5e 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O3 -march=z14 -mzvector -mzarch" } */
+/* { dg-options "-O3 -march=z14 -mzvector -mzarch -fno-unroll-loops" } */
 
 #include "autovec.h"
 
index 5ab9337880d006e8c6023c4022e227a8124123ae..0a2aca0d5dd37e4ac30f824fbf42c9b5f33fe795 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O3 -march=z14 -mzvector -mzarch" } */
+/* { dg-options "-O3 -march=z14 -mzvector -mzarch -fno-unroll-loops" } */
 
 #include "autovec.h"
 
index c34cf09160873a6fce01bb181fc842b7465a7209..15e61b70b0bdbd9e625f7d9d40c7dae546ac6e8b 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O3 -march=z14 -mzvector -mzarch" } */
+/* { dg-options "-O3 -march=z14 -mzvector -mzarch -fno-unroll-loops" } */
 
 #include "autovec.h"