On Fri, 21 Aug 2020, Roger Sayle wrote:

This simple patch to match.pd optimizes away bit permutation
operations, specifically bswap and rotate, in calls to popcount and
parity.

Good idea.

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.

There would be a convert_expr or similar if the sizes were different, so you are safe.

I wish we had only generic builtins/ifn instead of
__builtin_parity{,l,ll,imax}, and inconsistently __builtin_bswap{16,32,64,128},
that's very inconvenient to deal with... And genmatch generates a lot of
useless code because of that.

I didn't try but couldn't the transformations be merged to reduce repetition?

(for bitcnt (POPCOUNT PARITY)
 (for swap (BUILT_IN_BSWAP32 BUILT_IN_BSWAP64)
  (simplify
   (bitcnt (swap @0))
   (bitcnt @0)))
 (for rot (lrotate rrotate)
  (simplify
   (bitcnt (rot @0 @1))
   (bitcnt @0))))

I assume you skipped BUILT_IN_BSWAP16 because on 32+ bit targets, there
is an intermediate extension, and 16 bit targets are "rare"? And
BUILT_IN_BSWAP128 because on most platforms intmax_t is only 64 bits and
we don't have a 128-bit version of parity/popcount? (we have an IFN, but
it seldom appears by magic)

--
Marc Glisse

Reply via email to