This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix PR81038
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Bill Schmidt <wschmidt at linux dot vnet dot ibm dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Thu, 8 Feb 2018 11:52:01 +0100
- Subject: Re: [PATCH] Fix PR81038
- Authentication-results: sourceware.org; auth=none
- References: <a8bf4899-aed9-f675-69f0-051ca986b73a@linux.vnet.ibm.com>
On Sat, Feb 3, 2018 at 12:30 AM, Bill Schmidt
<wschmidt@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 ;)
Richard.
2018-02-08 Richard Biener <rguenther@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 <wschmidt@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. */
>