> On Feb 8, 2018, at 4:52 AM, Richard Biener <richard.guent...@gmail.com> wrote:
> 
> On Sat, Feb 3, 2018 at 12:30 AM, Bill Schmidt
> <wschm...@linux.vnet.ibm.com> wrote:
>> Hi,
>> 
>> The test g++.dg/vect/slp-pr56812.cc is somewhat fragile and is currently 
>> failing
>> on several targets.  PR81038 notes that this began with r248678, which 
>> stopped
>> some inferior peeling solutions from preventing vectorization that could be 
>> done
>> without peeling.  I observed that for powerpc64le, r248677 vectorizes the 
>> code
>> during SLP, but r248678 vectorizes it during the loop vectorization pass.  
>> Which
>> pass does the vectorization is quite dependent on cost model, which for us 
>> is a
>> quite close decision.  In any case, the important thing is that the code is
>> vectorized, not which pass does it.
>> 
>> This patch prevents the test from flipping in and out of failure status 
>> depending
>> on which pass does the vectorization, by testing the final "optimized" dump 
>> for
>> the expected vectorized output instead of relying on a specific vectorization
>> pass dump.
>> 
>> By the way, the test case somehow had gotten DOS/Windows newlines into it, so
>> I removed those.  The ^M characters disappeared when I pasted into this 
>> mailer,
>> unfortunately.  Anyway, that's the reason for the full replacement of the 
>> file.
>> The only real changes are the dg-final directives and the documentation of 
>> the
>> expected output.
>> 
>> Verified on powerpc64le-unknown-linux-gnu.  Is this okay for trunk?
> 
> Hmm.  That removes the existing XFAIL.  Also wouldn't it be more elegant to do
> the following?  This makes the testcase pass on x86_64, thus committed ;)

Terrific, thanks!

Bill
> 
> Richard.
> 
> 2018-02-08  Richard Biener  <rguent...@suse.de>
> 
>        * g++.dg/vect/slp-pr56812.cc: Allow either basic-block or
>        loop vectorization to happen.
> 
> Index: gcc/testsuite/g++.dg/vect/slp-pr56812.cc
> ===================================================================
> --- gcc/testsuite/g++.dg/vect/slp-pr56812.cc    (revision 257477)
> +++ gcc/testsuite/g++.dg/vect/slp-pr56812.cc    (working copy)
> @@ -1,7 +1,7 @@
> /* { dg-do compile } */
> /* { dg-require-effective-target vect_float } */
> /* { dg-require-effective-target vect_hw_misalign } */
> -/* { dg-additional-options "-O3 -funroll-loops -fvect-cost-model=dynamic" } 
> */
> +/* { dg-additional-options "-O3 -funroll-loops
> -fvect-cost-model=dynamic -fopt-info-vec" } */
> 
> class mydata {
> public:
> @@ -13,10 +13,7 @@ public:
> 
> void mydata::Set (float x)
> {
> -  for (int i=0; i<upper(); i++)
> +  /* We want to vectorize this either as loop or basic-block.  */
> +  for (int i=0; i<upper(); i++) /* { dg-message "note: \[^\n\]*
> vectorized" } */
>     data[i] = x;
> }
> -
> -/* For targets without vector loop peeling the loop becomes cheap
> -   enough to be vectorized.  */
> -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1
> "slp1" { xfail { ! vect_peeling_profitable } } } } */
> 
>> Thanks,
>> Bill
>> 
>> 
>> 2018-02-02  Bill Schmidt  <wschm...@linux.vnet.ibm.com>
>> 
>>        * g++.dg/vect/slp-pr56812.cc: Convert from DOS newline characters
>>        to utf-8-unix.  Change to scan "optimized" dump for indications
>>        that the code was vectorized.
>> 
>> 
>> Index: gcc/testsuite/g++.dg/vect/slp-pr56812.cc
>> ===================================================================
>> --- gcc/testsuite/g++.dg/vect/slp-pr56812.cc    (revision 257352)
>> +++ gcc/testsuite/g++.dg/vect/slp-pr56812.cc    (working copy)
>> @@ -1,22 +1,31 @@
>> -/* { dg-do compile } */
>> -/* { dg-require-effective-target vect_float } */
>> -/* { dg-require-effective-target vect_hw_misalign } */
>> -/* { dg-additional-options "-O3 -funroll-loops -fvect-cost-model=dynamic" } 
>> */
>> -
>> -class mydata {
>> -public:
>> -    mydata() {Set(-1.0);}
>> -    void Set (float);
>> -    static int upper() {return 8;}
>> -    float data[8];
>> -};
>> -
>> -void mydata::Set (float x)
>> -{
>> -  for (int i=0; i<upper(); i++)
>> -    data[i] = x;
>> -}
>> -
>> -/* For targets without vector loop peeling the loop becomes cheap
>> -   enough to be vectorized.  */
>> -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp1" { 
>> xfail { ! vect_peeling_profitable } } } } */
>> +/* { dg-do compile } */
>> +/* { dg-require-effective-target vect_float } */
>> +/* { dg-require-effective-target vect_hw_misalign } */
>> +/* { dg-additional-options "-O3 -funroll-loops -fvect-cost-model=dynamic 
>> -fdump-tree-optimized" } */
>> +
>> +class mydata {
>> +public:
>> +    mydata() {Set(-1.0);}
>> +    void Set (float);
>> +    static int upper() {return 8;}
>> +    float data[8];
>> +};
>> +
>> +void mydata::Set (float x)
>> +{
>> +  for (int i=0; i<upper(); i++)
>> +    data[i] = x;
>> +}
>> +
>> +/* { dg-final { scan-tree-dump "vect_cst__\[0-9\]* = " "optimized" } } */
>> +/* { dg-final { scan-tree-dump-times "= vect_cst__\[0-9\]*;" 2 "optimized" 
>> } } */
>> +
>> +/* Expected vectorized output is something like:
>> +
>> +  <bb 2> [11.11%]:
>> +  vect_cst__10 = {x_5(D), x_5(D), x_5(D), x_5(D)};
>> +  MEM[(float *)this_4(D)] = vect_cst__10;
>> +  MEM[(float *)this_4(D) + 16B] = vect_cst__10;
>> +  return;
>> +
>> +  Could be vectorized either by the "vect" or the "slp" pass.  */

Reply via email to