[AArch64] PR84114: Avoid reassociating FMA
authorWilco Dijkstra <wdijkstr@arm.com>
Mon, 5 Mar 2018 14:40:55 +0000 (14:40 +0000)
committerWilco Dijkstra <wilco@gcc.gnu.org>
Mon, 5 Mar 2018 14:40:55 +0000 (14:40 +0000)
As discussed in the PR, the reassociation phase runs before FMAs are formed
and so can significantly reduce FMA opportunities.  Although reassociation
could be switched off, it helps in many cases, so a better alternative is to
only avoid reassociation of floating point additions.  This fixes the testcase
and gives 1% speedup on SPECFP2017, fixing the performance regression.

    gcc/
PR tree-optimization/84114
* config/aarch64/aarch64.c (aarch64_reassociation_width)
Avoid reassociation of FLOAT_MODE addition.

From-SVN: r258248

gcc/ChangeLog
gcc/config/aarch64/aarch64.c

index 28e31de036f440cca36e6cb2e0527d28e5bb5243..eeb36339911aaa1a4246d1b00b3d3481ae8331ce 100644 (file)
@@ -1,3 +1,9 @@
+2018-03-05  Wilco Dijkstra  <wdijkstr@arm.com>
+
+       PR tree-optimization/84114
+       * config/aarch64/aarch64.c (aarch64_reassociation_width)
+       Avoid reassociation of FLOAT_MODE addition.
+
 2018-03-05  Olga Makhotina  <olga.makhotina@intel.com>
 
        * common/config/i386/i386-common.c (OPTION_MASK_ISA_PCONFIG_SET,
index 2f98a21acf16297bdd7c4742cbcfc695cdc4e5f9..07c55b132a7a8c4ceeaf9f406ac8c3c9d7b6bb20 100644 (file)
@@ -1094,15 +1094,16 @@ aarch64_min_divisions_for_recip_mul (machine_mode mode)
   return aarch64_tune_params.min_div_recip_mul_df;
 }
 
+/* Return the reassociation width of treeop OPC with mode MODE.  */
 static int
-aarch64_reassociation_width (unsigned opc ATTRIBUTE_UNUSED,
-                            machine_mode mode)
+aarch64_reassociation_width (unsigned opc, machine_mode mode)
 {
   if (VECTOR_MODE_P (mode))
     return aarch64_tune_params.vec_reassoc_width;
   if (INTEGRAL_MODE_P (mode))
     return aarch64_tune_params.int_reassoc_width;
-  if (FLOAT_MODE_P (mode))
+  /* Avoid reassociating floating point addition so we emit more FMAs.  */
+  if (FLOAT_MODE_P (mode) && opc != PLUS_EXPR)
     return aarch64_tune_params.fp_reassoc_width;
   return 1;
 }