[gcc(refs/users/marxin/heads/marxin-gcc-benchmark-branch)] widening_mul: restrict ops to be defined in the same basic-block when convert plusminus to widen

Martin Liska marxin@gcc.gnu.org
Mon Mar 30 11:07:44 GMT 2020


https://gcc.gnu.org/g:d21dff5b4fee51ae432143065bededfc763dc344

commit d21dff5b4fee51ae432143065bededfc763dc344
Author: Richard Biener <rguenther@suse.de>
Date:   Thu Mar 26 08:33:57 2020 +0100

    widening_mul: restrict ops to be defined in the same basic-block when convert plusminus to widen
    
    In the testcase for PR94269, widening_mul moves two multiply
    instructions from outside the loop to inside
    the loop, merging with two add instructions separately.  This
    increases the cost of the loop.  Like FMA detection
    in the same pass, simply restrict ops to be defined in the same
    basic-block to avoid possibly moving multiply
    to a different block with a higher execution frequency.
    
    2020-03-26  Felix Yang  <felix.yang@huawei.com>
    
            PR tree-optimization/94269
            * tree-ssa-math-opts.c (convert_plusminus_to_widen): Restrict
            this
            operation to single basic block.
    
            * gcc.dg/pr94269.c: New test.

Diff:
---
 gcc/ChangeLog                  |  7 +++++++
 gcc/testsuite/ChangeLog        |  5 +++++
 gcc/testsuite/gcc.dg/pr94269.c | 26 ++++++++++++++++++++++++++
 gcc/tree-ssa-math-opts.c       |  6 +++++-
 4 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3ad7a7aae0d..9f7927d748f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2020-03-26  Felix Yang  <felix.yang@huawei.com>
+
+	PR tree-optimization/94269
+	* tree-ssa-math-opts.c (convert_plusminus_to_widen): Restrict
+	this
+	operation to single basic block.
+
 2020-03-25  Jeff Law  <law@redhat.com>
 
 	PR rtl-optimization/90275
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e750dcbc790..f8512d3fb32 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-03-26  Felix Yang  <felix.yang@huawei.com>
+
+	PR tree-optimization/94269
+	* gcc.dg/pr94269.c: New test.
+
 2020-03-25  Andrew Stubbs  <ams@codesourcery.com>
 
 	* gcc.dg/vect/bb-slp-pr69907.c: Disable the dump scan for amdgcn.
diff --git a/gcc/testsuite/gcc.dg/pr94269.c b/gcc/testsuite/gcc.dg/pr94269.c
new file mode 100644
index 00000000000..49d57044f78
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr94269.c
@@ -0,0 +1,26 @@
+/* { dg-do compile { target aarch64*-*-* } } */
+/* { dg-options "-O2 -ftree-loop-vectorize -funsafe-math-optimizations -march=armv8.2-a+sve -msve-vector-bits=256" } */
+
+float
+foo(long n, float *x, int inc_x,
+            float *y, int inc_y)
+{
+  float dot = 0.0;
+  int ix = 0, iy = 0;
+
+  if (n < 0) {
+    return dot;
+  }
+
+  int i = 0;
+  while (i < n) {
+    dot += y[iy] * x[ix];
+    ix  += inc_x;
+    iy  += inc_y;
+    i++;
+  }
+
+  return dot;
+}
+
+/* { dg-final { scan-assembler-not "smaddl" { target aarch64*-*-* } } } */
diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c
index 54ba035f5ee..969c1a6b6c6 100644
--- a/gcc/tree-ssa-math-opts.c
+++ b/gcc/tree-ssa-math-opts.c
@@ -2715,11 +2715,14 @@ convert_plusminus_to_widen (gimple_stmt_iterator *gsi, gimple *stmt,
      multiply-and-accumulate instructions.
 
      If the widened-multiplication result has more than one uses, it is
-     probably wiser not to do the conversion.  */
+     probably wiser not to do the conversion.  Also restrict this operation
+     to single basic block to avoid moving the multiply to a different block
+     with a higher execution frequency.  */
   if (code == PLUS_EXPR
       && (rhs1_code == MULT_EXPR || rhs1_code == WIDEN_MULT_EXPR))
     {
       if (!has_single_use (rhs1)
+	  || gimple_bb (rhs1_stmt) != gimple_bb (stmt)
 	  || !is_widening_mult_p (rhs1_stmt, &type1, &mult_rhs1,
 				  &type2, &mult_rhs2))
 	return false;
@@ -2729,6 +2732,7 @@ convert_plusminus_to_widen (gimple_stmt_iterator *gsi, gimple *stmt,
   else if (rhs2_code == MULT_EXPR || rhs2_code == WIDEN_MULT_EXPR)
     {
       if (!has_single_use (rhs2)
+	  || gimple_bb (rhs2_stmt) != gimple_bb (stmt)
 	  || !is_widening_mult_p (rhs2_stmt, &type1, &mult_rhs1,
 				  &type2, &mult_rhs2))
 	return false;


More information about the Gcc-cvs mailing list