https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61559
--- Comment #14 from rguenther at suse dot de <rguenther at suse dot de> --- On Thu, 4 Sep 2014, ubizjak at gmail dot com wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61559 > > --- Comment #12 from Uroš Bizjak <ubizjak at gmail dot com> --- > (In reply to Uroš Bizjak from comment #11) > > > This one should be: > > > > (simplify > > (bswap (bitop (bswap @0) (bswap @1))) > > (bitop @0 @1)) > > Oh, we already have this. Please disregard this message. Not sure - we don't exactly have it. OTOH I think that (simplify (bitop (bswap @0) (bswap @1)) (bswap (bitop @0 @1))) is profitable in most cases (not only when wrapped inside another bswap). Jakubs concern applies though. OTOH (simplify (bswap (bitop (bswap @0) INTEGER_CST@1)) (bitop @0 (bswap @1))))) may generally apply (not only to INTEGER_CST 2nd operand to bitop). The argument would be that one bswap goes away. But again if @0 was a memory and @1 is not then this isn't always profitable(?) (well, the outer bswap goes away). So merge the restricted first one and this to (simplify (bswap (bitop:c (bswap @0) @1)) (bitop @0 (bswap @1))) ? Thus only one operand of the bitop needs to be a bswap if there is an outer bswap. For constant @1 the inner bswap will be folded away as well as if @1 is a bswap itself. /* PR61559. Transforms for gcc.dg/builtin-bswap-8.c */ (for bswap in BUILT_IN_BSWAP16 BUILT_IN_BSWAP32 BUILT_IN_BSWAP64 (simplify (bswap (bswap @0)) @0) (simplify (bswap (bit_not (bswap @0))) (bit_not @0)) (for bitop in bit_xor bit_ior bit_and /* This might not be profitable if the inner bswaps are free because @0 and @1 are memory operands and the target has an instruction for load+bswap. */ (simplify (bitop (bswap @0) (bswap @1)) (bswap (bitop @0 @1))) (simplify (bswap (bitop:c (bswap @0) @1)) (bitop @0 (bswap @1)))))