[PATCH] middle-end: Simplify popcount/parity of bswap/rotate.
Jeff Law
law@redhat.com
Mon Aug 24 23:16:54 GMT 2020
On Fri, 2020-08-21 at 17:52 +0100, Roger Sayle wrote:
> This simple patch to match.pd optimizes away bit permutation
> operations, specifically bswap and rotate, in calls to popcount and
> parity. Although this patch has been developed and tested on LP64,
> it relies on there being no truncations or extensions to "marry up"
> the appropriate PARITY, PARITYL and PARITYLL forms with either BSWAP32
> or BSWAP64, assuming this transformation won't fire if the integral
> types have different sizes.
>
> The following patch has been tested on x86_64-pc-linux-gnu with
> "make bootstrap" and "make -k check" with no new failures.
> Ok for mainline?
>
> 2020-08-21 Roger Sayle <roger@nextmovesoftware.com>
>
> gcc/ChangeLog
> * gcc/match.pd (popcount(bswapN(x)) -> popcount(x),
> popcount(rotate(x)) -> popcount(x), parity(bswapN(x)) -> parity(x),
> parity(rotate(x)) -> parity(x)): New simplifications.
>
> gcc/testsuite/ChangeLog
> * gcc.dg/fold-popcount-6.c: New test.
> * gcc.dg/fold-popcount-7.c: New test.
> * gcc.dg/fold-parity-6.c: New test.
> * gcc.dg/fold-parity-7.c: New test.
My worry here would be GCC's habit of not type checking arguments to builtins all
that well. It's come up several times recently and while I think some of those
holes have been closed, I don't have much confidence we're doing a good job
there.
So with that in mind, this is fine if you verify that the type of the argument is
the same as the resultant type. I think you've got access to both within the
match.pd framework.
jeff
>
More information about the Gcc-patches
mailing list