match.pd: Optimize ffs of known non-zero arg into ctz + 1 [PR94956]
authorJakub Jelinek <jakub@redhat.com>
Fri, 8 May 2020 07:33:55 +0000 (09:33 +0200)
committerJakub Jelinek <jakub@redhat.com>
Fri, 8 May 2020 07:33:55 +0000 (09:33 +0200)
commitdf569f7da567af4996821dc0a1871eec79957d04
treecc4ced8f3fc3149413fca20171fb9bedf899abed
parentff33680165346cb291667f38dd2e9f25a74cc3c3
match.pd: Optimize ffs of known non-zero arg into ctz + 1 [PR94956]

The ffs expanders on several targets (x86, ia64, aarch64 at least)
emit a conditional move or similar code to handle the case when the
argument is 0, which makes the code longer.
If we know from VRP that the argument will not be zero, we can (if the
target has also an ctz expander) just use ctz which is undefined at zero
and thus the expander doesn't need to deal with that.

2020-05-08  Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/94956
* match.pd (FFS): Optimize __builtin_ffs* of non-zero argument into
__builtin_ctz* + 1 if direct IFN_CTZ is supported.

* gcc.target/i386/pr94956.c: New test.
gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr94956.c [new file with mode: 0644]