[1/2] Fix bogus double reduction (PR 86725)
authorRichard Sandiford <richard.sandiford@arm.com>
Wed, 22 Aug 2018 13:02:39 +0000 (13:02 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Wed, 22 Aug 2018 13:02:39 +0000 (13:02 +0000)
This patch is the first part of the fix for PR 86725.  We would
treat x_1 in:

    outer1:
      x_1 = PHI <x_4(outer2), ...>;
      ...

    inner:
      x_2 = ...x_1...;
      ...
      x_3 = ...;
      ...

    outer2:
      x_4 = PHI <x_3(inner)>;
      ...

as a double reduction without checking what kind of statement x_2 is.
In practice it has to be a phi, since for other x_2, x_1 would simply
be a loop invariant that gets used for every inner loop iteration.

The idea with doing this patch first is that, by checking x_2 really
is a phi, we can hand off the validation of the rest of the reduction
to the phi analysis in the inner loop.

The test case is a variant of the one in the PR.

2018-08-22  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
PR tree-optimization/86725
* tree-vect-loop.c (vect_is_simple_reduction): When treating
an outer loop phi as a double reduction, make sure that the
single user of the phi result is an inner loop phi.

gcc/testsuite/
PR tree-optimization/86725
* gcc.dg/vect/no-scevccp-pr86725-1.c: New test.

From-SVN: r263773

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-1.c [new file with mode: 0644]
gcc/tree-vect-loop.c

index 6fdb1b62d2d099f3e97ad347dd20fb3c1e486e8a..63779d362c2ec3f2de921d94c12bdf58dbebe193 100644 (file)
@@ -1,3 +1,10 @@
+2018-08-22  Richard Sandiford  <richard.sandiford@arm.com>
+
+       PR tree-optimization/86725
+       * tree-vect-loop.c (vect_is_simple_reduction): When treating
+       an outer loop phi as a double reduction, make sure that the
+       single user of the phi result is an inner loop phi.
+
 2018-08-22  Richard Sandiford  <richard.sandiford@arm.com>
 
        * tree-vect-data-refs.c (vect_analyze_group_access_1): Convert
index 9c624ff0739fd705b9af829ee38cc52b554c1ec0..3117afaa82d693466cb251a70c1ac76fb3adda6a 100644 (file)
@@ -1,3 +1,8 @@
+2018-08-22  Richard Sandiford  <richard.sandiford@arm.com>
+
+       PR tree-optimization/86725
+       * gcc.dg/vect/no-scevccp-pr86725-1.c: New test.
+
 2018-08-22  Richard Sandiford  <richard.sandiford@arm.com>
 
        * gcc.dg/vect/vect-avg-16.c: New test.
diff --git a/gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-1.c b/gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-1.c
new file mode 100644 (file)
index 0000000..3bc63a6
--- /dev/null
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-O -w" } */
+
+int foo;
+int
+nr (int xe, int z)
+{
+  int oo, wo = 0;
+
+  for (oo = 0; oo < 4; ++oo)
+    {
+      int qq;
+
+      int old_wo = wo;
+      for (qq = 0; qq < 2; ++qq)
+        {
+          wo = z + qq + old_wo;
+          xe += wo;
+        }
+    }
+  foo = wo;
+  return xe;
+}
+
+/* { dg-final { scan-tree-dump-not "double reduction: wo" "vect" } } */
+/* { dg-final { scan-tree-dump-not "OUTER LOOP VECTORIZED" "vect" } } */
index db92f76c74fdf5f39cbe0ed22304f8cb15c2f47e..f21d995fdb9c0b2d6551c7c120bb0385ed274f95 100644 (file)
@@ -2992,6 +2992,7 @@ vect_is_simple_reduction (loop_vec_info loop_info, stmt_vec_info phi_info,
           && loop->inner
           && flow_bb_inside_loop_p (loop->inner, gimple_bb (def1))
           && is_gimple_assign (def1)
+         && is_a <gphi *> (phi_use_stmt)
          && flow_bb_inside_loop_p (loop->inner, gimple_bb (phi_use_stmt)))
         {
           if (dump_enabled_p ())