aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRobin Dapp <rdapp@linux.ibm.com>2022-03-03 15:06:21 +0100
committerRobin Dapp <rdapp@linux.ibm.com>2022-08-29 11:15:09 +0200
commitaf8955112f4d3294d9cc50a2a125718b202321f0 (patch)
treeaf1b4ea676c7a53a69e062c57837de56d153c6da /gcc
parent9b3cd1755be55fbed5f86fd55bb1a6c3279f1fc4 (diff)
downloadgcc-af8955112f4d3294d9cc50a2a125718b202321f0.zip
gcc-af8955112f4d3294d9cc50a2a125718b202321f0.tar.gz
gcc-af8955112f4d3294d9cc50a2a125718b202321f0.tar.bz2
s390: Add -munroll-only-small-loops.
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/common/config/s390/s390-common.cc5
-rw-r--r--gcc/config/s390/s390.cc31
-rw-r--r--gcc/config/s390/s390.opt4
-rw-r--r--gcc/testsuite/gcc.target/s390/vector/vec-copysign.c2
-rw-r--r--gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-uneq.c2
-rw-r--r--gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ltgt.c2
-rw-r--r--gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-uneq.c2
-rw-r--r--gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-ltgt.c2
8 files changed, 45 insertions, 5 deletions
diff --git a/gcc/common/config/s390/s390-common.cc b/gcc/common/config/s390/s390-common.cc
index 72a5ef4..be3e6f2 100644
--- a/gcc/common/config/s390/s390-common.cc
+++ b/gcc/common/config/s390/s390-common.cc
@@ -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 },
diff --git a/gcc/config/s390/s390.cc b/gcc/config/s390/s390.cc
index 5e06bf9..942ed26 100644
--- a/gcc/config/s390/s390.cc
+++ b/gcc/config/s390/s390.cc
@@ -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);
diff --git a/gcc/config/s390/s390.opt b/gcc/config/s390/s390.opt
index 9e8d3bf..c375b9c 100644
--- a/gcc/config/s390/s390.opt
+++ b/gcc/config/s390/s390.opt
@@ -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.
diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-copysign.c b/gcc/testsuite/gcc.target/s390/vector/vec-copysign.c
index 64c6970..b723ceb 100644
--- a/gcc/testsuite/gcc.target/s390/vector/vec-copysign.c
+++ b/gcc/testsuite/gcc.target/s390/vector/vec-copysign.c
@@ -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 } } */
diff --git a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-uneq.c b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-uneq.c
index 7c9b20f..8948be2 100644
--- a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-uneq.c
+++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-uneq.c
@@ -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"
diff --git a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ltgt.c b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ltgt.c
index 9dfae8f..9417b0c 100644
--- a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ltgt.c
+++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ltgt.c
@@ -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"
diff --git a/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-uneq.c b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-uneq.c
index 5ab9337..0a2aca0 100644
--- a/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-uneq.c
+++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-uneq.c
@@ -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"
diff --git a/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-ltgt.c b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-ltgt.c
index c34cf09..15e61b7 100644
--- a/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-ltgt.c
+++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-ltgt.c
@@ -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"