[PATCH]middle-end slp: Split out patterns away from using SLP_ONLY into their own flag
Hi All, Previously the SLP pattern matcher was using STMT_VINFO_SLP_VECT_ONLY as a way to dissolve the SLP only patterns during SLP cancellation. However it seems like the semantics for STMT_VINFO_SLP_VECT_ONLY are slightly different than what I expected. Namely that the non-SLP path can still use a statement marked STMT_VINFO_SLP_VECT_ONLY. One such example is masked loads which are used both in the SLP and non-SLP path. To fix this I now introduce a new flag STMT_VINFO_SLP_VECT_ONLY_PATTERN which is used only by the pattern matcher. Bootstrapped Regtested on aarch64-none-linux-gnu, x86_64-pc-linux-gnu and no issues. Ok for master? Thanks, Tamar gcc/ChangeLog: PR tree-optimization/98928 * tree-vect-loop.c (vect_analyze_loop_2): Change STMT_VINFO_SLP_VECT_ONLY to STMT_VINFO_SLP_VECT_ONLY_PATTERN. * tree-vect-slp-patterns.c (complex_pattern::build): Likewise. * tree-vectorizer.h (STMT_VINFO_SLP_VECT_ONLY_PATTERN): New. (class _stmt_vec_info): Add slp_vect_pattern_only_p. gcc/testsuite/ChangeLog: PR tree-optimization/98928 * gcc.target/i386/pr98928.c: New test. --- inline copy of patch -- diff --git a/gcc/testsuite/gcc.target/i386/pr98928.c b/gcc/testsuite/gcc.target/i386/pr98928.c new file mode 100644 index ..9503b579a88d95c427d3e3e5a71565b0c048c125 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr98928.c @@ -0,0 +1,59 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-Ofast -march=skylake-avx512 -fwhole-program -w" } */ + +typedef float MagickRealType; +typedef short Quantum; +float InterpolateMagickPixelPacket_alpha[1]; +int InterpolateMagickPixelPacket_i; + +void InterpolateMagickPixelPacket(); + +void main() { InterpolateMagickPixelPacket(); } + +typedef struct { + MagickRealType red, green, blue, opacity, index; +} MagickPixelPacket; +typedef struct { + Quantum blue, green, red, opacity; +} PixelPacket; +struct _Image { + int colorspace; + int matte; +} GetMagickPixelPacket(MagickPixelPacket *pixel) { + pixel->red = pixel->green = pixel->blue = 0.0; +} +int AlphaBlendMagickPixelPacket(struct _Image *image, PixelPacket *color, +Quantum *indexes, MagickPixelPacket *pixel, +MagickRealType *alpha) { + if (image->matte) { +*alpha = pixel->red = pixel->green = pixel->blue = pixel->opacity = +color->opacity; +pixel->index = 0.0; +if (image->colorspace) + pixel->index = *indexes; +return 0; + } + *alpha = 1.0 / 0.2; + pixel->red = *alpha * color->red; + pixel->green = *alpha * color->green; + pixel->blue = *alpha * color->blue; + pixel->opacity = pixel->index = 0.0; + if (image->colorspace && indexes) +pixel->index = *indexes; +} +MagickPixelPacket InterpolateMagickPixelPacket_pixels[1]; +PixelPacket InterpolateMagickPixelPacket_p; + +void +InterpolateMagickPixelPacket(struct _Image *image) { + Quantum *indexes; + for (; InterpolateMagickPixelPacket_i; InterpolateMagickPixelPacket_i++) { +GetMagickPixelPacket(InterpolateMagickPixelPacket_pixels + + InterpolateMagickPixelPacket_i); +AlphaBlendMagickPixelPacket( +image, &InterpolateMagickPixelPacket_p + InterpolateMagickPixelPacket_i, +indexes + InterpolateMagickPixelPacket_i, +InterpolateMagickPixelPacket_pixels + InterpolateMagickPixelPacket_i, +InterpolateMagickPixelPacket_alpha + InterpolateMagickPixelPacket_i); + } +} diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index acfd1952e3b803ea79cf51433101466743c9793e..200ed27b32ef4aa54c6783afa1864924b6f55582 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -2700,7 +2700,7 @@ again: { stmt_vec_info pattern_stmt_info = STMT_VINFO_RELATED_STMT (stmt_info); - if (STMT_VINFO_SLP_VECT_ONLY (pattern_stmt_info)) + if (STMT_VINFO_SLP_VECT_ONLY_PATTERN (pattern_stmt_info)) STMT_VINFO_IN_PATTERN_P (stmt_info) = false; gimple *pattern_def_seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info); diff --git a/gcc/tree-vect-slp-patterns.c b/gcc/tree-vect-slp-patterns.c index d25560fab97bb852e949884850d51c6148b14a68..f0817da9f622d22e3df2e30410d1cf610b4ffa1d 100644 --- a/gcc/tree-vect-slp-patterns.c +++ b/gcc/tree-vect-slp-patterns.c @@ -599,7 +599,7 @@ complex_pattern::build (vec_info *vinfo) the call there. */ vect_mark_pattern_stmts (vinfo, stmt_info, call_stmt, SLP_TREE_VECTYPE (node)); - STMT_VINFO_SLP_VECT_ONLY (call_stmt_info) = true; + STMT_VINFO_SLP_VECT_ONLY_PATTERN (call_stmt_info) = true; /* Since we are replacing all the statements in the group with the same thing it doesn't really matter. So just set it every time a new stmt diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h index f8bf4488d0ea32e7909f6be2bf4e7cdaee4f55fe..e
Re: [PATCH]middle-end slp: Split out patterns away from using SLP_ONLY into their own flag
On Tue, 2 Feb 2021, Tamar Christina wrote: > Hi All, > > Previously the SLP pattern matcher was using STMT_VINFO_SLP_VECT_ONLY as a way > to dissolve the SLP only patterns during SLP cancellation. However it seems > like the semantics for STMT_VINFO_SLP_VECT_ONLY are slightly different than > what > I expected. > > Namely that the non-SLP path can still use a statement marked > STMT_VINFO_SLP_VECT_ONLY. One such example is masked loads which are used > both > in the SLP and non-SLP path. > > To fix this I now introduce a new flag STMT_VINFO_SLP_VECT_ONLY_PATTERN which > is > used only by the pattern matcher. > > Bootstrapped Regtested on aarch64-none-linux-gnu, x86_64-pc-linux-gnu > and no issues. > > Ok for master? OK. Thanks, Richard. > Thanks, > Tamar > > gcc/ChangeLog: > > PR tree-optimization/98928 > * tree-vect-loop.c (vect_analyze_loop_2): Change > STMT_VINFO_SLP_VECT_ONLY to STMT_VINFO_SLP_VECT_ONLY_PATTERN. > * tree-vect-slp-patterns.c (complex_pattern::build): Likewise. > * tree-vectorizer.h (STMT_VINFO_SLP_VECT_ONLY_PATTERN): New. > (class _stmt_vec_info): Add slp_vect_pattern_only_p. > > gcc/testsuite/ChangeLog: > > PR tree-optimization/98928 > * gcc.target/i386/pr98928.c: New test. > > --- inline copy of patch -- > diff --git a/gcc/testsuite/gcc.target/i386/pr98928.c > b/gcc/testsuite/gcc.target/i386/pr98928.c > new file mode 100644 > index > ..9503b579a88d95c427d3e3e5a71565b0c048c125 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/pr98928.c > @@ -0,0 +1,59 @@ > +/* { dg-do compile } */ > +/* { dg-additional-options "-Ofast -march=skylake-avx512 -fwhole-program -w" > } */ > + > +typedef float MagickRealType; > +typedef short Quantum; > +float InterpolateMagickPixelPacket_alpha[1]; > +int InterpolateMagickPixelPacket_i; > + > +void InterpolateMagickPixelPacket(); > + > +void main() { InterpolateMagickPixelPacket(); } > + > +typedef struct { > + MagickRealType red, green, blue, opacity, index; > +} MagickPixelPacket; > +typedef struct { > + Quantum blue, green, red, opacity; > +} PixelPacket; > +struct _Image { > + int colorspace; > + int matte; > +} GetMagickPixelPacket(MagickPixelPacket *pixel) { > + pixel->red = pixel->green = pixel->blue = 0.0; > +} > +int AlphaBlendMagickPixelPacket(struct _Image *image, PixelPacket *color, > +Quantum *indexes, MagickPixelPacket *pixel, > +MagickRealType *alpha) { > + if (image->matte) { > +*alpha = pixel->red = pixel->green = pixel->blue = pixel->opacity = > +color->opacity; > +pixel->index = 0.0; > +if (image->colorspace) > + pixel->index = *indexes; > +return 0; > + } > + *alpha = 1.0 / 0.2; > + pixel->red = *alpha * color->red; > + pixel->green = *alpha * color->green; > + pixel->blue = *alpha * color->blue; > + pixel->opacity = pixel->index = 0.0; > + if (image->colorspace && indexes) > +pixel->index = *indexes; > +} > +MagickPixelPacket InterpolateMagickPixelPacket_pixels[1]; > +PixelPacket InterpolateMagickPixelPacket_p; > + > +void > +InterpolateMagickPixelPacket(struct _Image *image) { > + Quantum *indexes; > + for (; InterpolateMagickPixelPacket_i; InterpolateMagickPixelPacket_i++) { > +GetMagickPixelPacket(InterpolateMagickPixelPacket_pixels + > + InterpolateMagickPixelPacket_i); > +AlphaBlendMagickPixelPacket( > +image, &InterpolateMagickPixelPacket_p + > InterpolateMagickPixelPacket_i, > +indexes + InterpolateMagickPixelPacket_i, > +InterpolateMagickPixelPacket_pixels + InterpolateMagickPixelPacket_i, > +InterpolateMagickPixelPacket_alpha + InterpolateMagickPixelPacket_i); > + } > +} > diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c > index > acfd1952e3b803ea79cf51433101466743c9793e..200ed27b32ef4aa54c6783afa1864924b6f55582 > 100644 > --- a/gcc/tree-vect-loop.c > +++ b/gcc/tree-vect-loop.c > @@ -2700,7 +2700,7 @@ again: > { > stmt_vec_info pattern_stmt_info > = STMT_VINFO_RELATED_STMT (stmt_info); > - if (STMT_VINFO_SLP_VECT_ONLY (pattern_stmt_info)) > + if (STMT_VINFO_SLP_VECT_ONLY_PATTERN (pattern_stmt_info)) > STMT_VINFO_IN_PATTERN_P (stmt_info) = false; > > gimple *pattern_def_seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info); > diff --git a/gcc/tree-vect-slp-patterns.c b/gcc/tree-vect-slp-patterns.c > index > d25560fab97bb852e949884850d51c6148b14a68..f0817da9f622d22e3df2e30410d1cf610b4ffa1d > 100644 > --- a/gcc/tree-vect-slp-patterns.c > +++ b/gcc/tree-vect-slp-patterns.c > @@ -599,7 +599,7 @@ complex_pattern::build (vec_info *vinfo) >the call there. */ >vect_mark_pattern_stmts (vinfo, stmt_info, call_stmt, > SLP_TREE_VECTYPE (node)); > - STMT_VINFO_SLP_VECT_ONLY (call_stmt_info) = true; > + STMT_VINFO_SLP_VECT_O