slp: Split out patterns away from using SLP_ONLY into their own flag
authorTamar Christina <tamar.christina@arm.com>
Wed, 3 Feb 2021 08:06:11 +0000 (08:06 +0000)
committerTamar Christina <tamar.christina@arm.com>
Wed, 3 Feb 2021 08:06:11 +0000 (08:06 +0000)
commit5e606ed90a1bed878071b6b5a3ef9b97b3d99838
tree2a6db1e9b76837733e48a50349a76c1e4bd014d1
parent548b75d82229cf30052db3ad13e34115335cd9d8
slp: Split out patterns away from using SLP_ONLY into their own flag

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.

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.
gcc/testsuite/gcc.target/i386/pr98928.c [new file with mode: 0644]
gcc/tree-vect-loop.c
gcc/tree-vect-slp-patterns.c
gcc/tree-vectorizer.h