This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[1/2] Fix bogus double reduction (PR 86725)
- From: Richard Sandiford <richard dot sandiford at arm dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Wed, 22 Aug 2018 10:31:12 +0100
- Subject: [1/2] Fix bogus double reduction (PR 86725)
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.
Tested on aarch64-linux-gnu (with and without SVE), aarch64_be-elf
and x86_64-linux-gnu. OK for trunk and GCC 8?
Richard
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.
Index: gcc/tree-vect-loop.c
===================================================================
--- gcc/tree-vect-loop.c 2018-08-21 14:47:07.047174151 +0100
+++ gcc/tree-vect-loop.c 2018-08-22 10:25:06.682099699 +0100
@@ -2992,6 +2992,7 @@ vect_is_simple_reduction (loop_vec_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 ())
Index: gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-1.c
===================================================================
--- /dev/null 2018-07-26 10:26:13.137955424 +0100
+++ gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-1.c 2018-08-22 10:25:06.682099699 +0100
@@ -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" } } */