[PATCH] middle-end: Simplify popcount/parity of bswap/rotate.
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 <email@example.com>
> * 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.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
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
More information about the Gcc-patches