S/390: Disable vectorization for loops with few iterations
authorRobin Dapp <rdapp@linux.vnet.ibm.com>
Mon, 6 Mar 2017 12:43:33 +0000 (12:43 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Mon, 6 Mar 2017 12:43:33 +0000 (12:43 +0000)
The following patch defines the PARAM_MIN_VECT_LOOP_BOUND parameter in
the s390 backend.  It helps with the vectorization epilogue problem
described here [1].
I see an overall performance increase of > 1% in SPECfp2006, yet some
cases like cactusADM regress.  This seems to be caused by the vectorizer
creating an epilogue guard for one more iteration than before, which, in
turn, causes e.g. predcom to run on the epilogue that it used to ignore
before ("Loop iterates only 1 time, nothing to do.").  Subsequent,
minor, effects cause an eventual slowdown.

Until the reason for the bad epilogue code is understood, this patch
mitigates the problem.  When investigating the issue, I stumbled across
an attempt to vectorize the epilogue itself as well as combine it with
the vectorized loop in addition to vector masking [2].  A similar
approach might also help here.  My original observation of high register
pressure within the epilogue still stands.  In this specific case, it
would most likely suffice to save all registers once, run the epilogue
and restore the registers.  I'm pretty sure this would be faster than
the "spill fest" that's currently happening.

Regards
 Robin

[1] https://gcc.gnu.org/ml/gcc/2017-01/msg00234.html
[2] https://gcc.gnu.org/ml/gcc-patches/2016-05/msg01562.html

gcc/ChangeLog:

2017-03-06  Robin Dapp  <rdapp@linux.vnet.ibm.com>

* config/s390/s390.c (s390_option_override_internal): Set
PARAM_MIN_VECT_LOOP_BOUND

From-SVN: r245918

gcc/ChangeLog
gcc/config/s390/s390.c

index 8393f03aec4918c6e012882682a77837be4a749e..1176ec3e4653e5cc6474b53c1bf73ddad2f17281 100644 (file)
@@ -1,3 +1,8 @@
+2017-03-06  Robin Dapp  <rdapp@linux.vnet.ibm.com>
+
+       * config/s390/s390.c (s390_option_override_internal): Set
+       PARAM_MIN_VECT_LOOP_BOUND
+
 2017-03-06  Robin Dapp  <rdapp@linux.vnet.ibm.com>
 
        * config/s390/s390.c (s390_asm_output_function_label): Use nopr %r0.
index e8265c6add55083a1884e17fd5d97e85820c10eb..e7ab128252bb0d9cb2800da02ec464c13023f6a8 100644 (file)
@@ -14679,6 +14679,10 @@ s390_option_override_internal (bool main_args_p,
                          opts->x_param_values,
                          opts_set->x_param_values);
 
+  maybe_set_param_value (PARAM_MIN_VECT_LOOP_BOUND, 2,
+                        opts->x_param_values,
+                        opts_set->x_param_values);
+
   /* 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, NULL);