[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