On Wed, Aug 22, 2018 at 11:31 AM Richard Sandiford <richard.sandif...@arm.com> wrote: > > 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?
OK. Thanks, Richard. > Richard > > > 2018-08-22 Richard Sandiford <richard.sandif...@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" } } */