]> git.ipfire.org Git - thirdparty/gcc.git/commit
tree-vect-patterns: Pattern recognize ctz or ffs using clz, popcount or ctz [PR109011]
authorJakub Jelinek <jakub@redhat.com>
Thu, 20 Apr 2023 09:55:16 +0000 (11:55 +0200)
committerJakub Jelinek <jakub@redhat.com>
Thu, 20 Apr 2023 09:55:16 +0000 (11:55 +0200)
commit705b0d2b62318b3935214f08a1cf023b1117acb8
tree141202f8be1eed027ec1d867d4502a51caae7a18
parent974326fd5199a8ae8482f2a521b1edd449a2fa9e
tree-vect-patterns: Pattern recognize ctz or ffs using clz, popcount or ctz [PR109011]

The following patch allows to vectorize __builtin_ffs*/.FFS even if
we just have vector .CTZ support, or __builtin_ffs*/.FFS/__builtin_ctz*/.CTZ
if we just have vector .CLZ or .POPCOUNT support.
It uses various expansions from Hacker's Delight book as well as GCC's
expansion, in particular:
.CTZ (X) = PREC - .CLZ ((X - 1) & ~X)
.CTZ (X) = .POPCOUNT ((X - 1) & ~X)
.CTZ (X) = (PREC - 1) - .CLZ (X & -X)
.FFS (X) = PREC - .CLZ (X & -X)
.CTZ (X) = PREC - .POPCOUNT (X | -X)
.FFS (X) = (PREC + 1) - .POPCOUNT (X | -X)
.FFS (X) = .CTZ (X) + 1
where the first one can be only used if both CTZ and CLZ have value
defined at zero (kind 2) and both have value of PREC there.
If the original has value defined at zero and the latter doesn't
for other forms or if it doesn't have matching value for that case,
a COND_EXPR is added for that afterwards.

The patch also modifies vect_recog_popcount_clz_ctz_ffs_pattern
such that the two can work together.

2023-04-20  Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/109011
* tree-vect-patterns.cc (vect_recog_ctz_ffs_pattern): New function.
(vect_recog_popcount_clz_ctz_ffs_pattern): Move vect_pattern_detected
call later.  Don't punt for IFN_CTZ or IFN_FFS if it doesn't have
direct optab support, but has instead IFN_CLZ, IFN_POPCOUNT or
for IFN_FFS IFN_CTZ support, use vect_recog_ctz_ffs_pattern for that
case.
(vect_vect_recog_func_ptrs): Add ctz_ffs entry.

* gcc.dg/vect/pr109011-1.c: Remove -mpower9-vector from
dg-additional-options.
(baz, qux): Remove functions and corresponding dg-final.
* gcc.dg/vect/pr109011-2.c: New test.
* gcc.dg/vect/pr109011-3.c: New test.
* gcc.dg/vect/pr109011-4.c: New test.
* gcc.dg/vect/pr109011-5.c: New test.
gcc/testsuite/gcc.dg/vect/pr109011-1.c
gcc/testsuite/gcc.dg/vect/pr109011-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/pr109011-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/pr109011-4.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/pr109011-5.c [new file with mode: 0644]
gcc/tree-vect-patterns.cc