On Thu, 22 Jun 2017, Richard Biener wrote: > On Wed, 21 Jun 2017, Richard Biener wrote: > > > > > During my attempt to refactor reduction vectorization I ran across > > the special casing of inital values for INTEGER_INDUC_COND_REDUCTION > > and tried to see what it is about. So I ended up implementing > > cond reduction support for targets w/o REDUC_MAX_EXPR by simply > > doing the reduction in scalar code -- while that results in an > > expensive epilogue the vector loop should be reasonably fast. > > > > I still didn't run into any exec FAILs in vect.exp with removing > > the INTEGER_INDUC_COND_REDUCTION special case thus the following > > patch. > > > > Alan -- is there a testcase (maybe full bootstrap & regtest will > > unconver one) that shows how this is necessary? > > Testing has some fallout and I discovered what this special-case is > about. I'll commit the below testcase to exercise the case.
After fixing the typo (sorry) the testcase also shows a latent wrong-code bug. We use an induction vector starting at index 1 for COND_REDUCTION to allow for a special value of zero but it seems the INTEGER_INDUC_COND_REDUCTION special-casing of the default value relies on the value of zero being special but in the testcase it is meaningful... In fact, given that for INTEGER_INDUC_COND_REDUCTION the values, while based on an induction variable, do not have to match 1:1, we can modify the testcase to use last = 2*i; or last = i - 1; Which means we have to add a second vector to specify whether a lane was set or not, basically use the COND_REDUCTION code? Richard. > Richard. > > 2017-06-22 Richard Biener <rguent...@suse.de> > > * gcc.dg/vect/pr65947-14.c: New testcase. > > Index: gcc/testsuite/gcc.dg/vect/pr65947-14.c > =================================================================== > --- gcc/testsuite/gcc.dg/vect/pr65947-14.c (nonexistent) > +++ gcc/testsuite/gcc.dg/vect/pr65947-14.c (working copy) > @@ -0,0 +1,44 @@ > +/* { dg-require-effective-target vect_condition } */ > + > +#include "tree-vect.h" > + > +extern void abort (void) __attribute__ ((noreturn)); > + > +#define N 27 > + > +/* Condition reduction with matches only in even lanes at runtime. */ > + > +int > +condition_reduction (int *a, int min_v) > +{ > + int last = N + 96; > + > + for (int i = 0; i < N; i++) > + if (a[i] > min_v) > + last = i; > + > + return last; > +} > + > +int > +main (void) > +{ > + int a[N] = { > + 47, 12, 13, 14, 15, 16, 17, 18, 19, 20, > + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, > + 21, 22, 23, 24, 25, 26, 27 > + }; > + > + check_vect (); > + > + int ret = condition_reduction (a, 46); > + > + /* loop should have found a value of 0, not default N + 96. */ > + if (ret != 0) > + abort (); > + > + return 0; > +} > + > +/* { dg-final { scan-tree-dump-times "LOOP VECTORIZED" 2 "vect" { xfail { ! > vect_max_reduc } } } */ > +/* { dg-final { scan-tree-dump-times "condition expression based on integer > induction." 4 "vect" } } */ > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)