On Sat, 26 Nov 2016, Paolo Bonzini wrote:
--- match.pd (revision 242742) +++ match.pd (working copy) @@ -2554,6 +2554,19 @@ (cmp (bit_and@2 @0 integer_pow2p@1) @1) (icmp @2 { build_zero_cst (TREE_TYPE (@0)); })))+/* If we have (A & C) != 0 ? D : 0 where C and D are powers of 2, + convert this into a shift of (A & C). */ +(simplify + (cond + (ne (bit_and@2 @0 integer_pow2p@1) integer_zerop) + integer_pow2p@3 integer_zerop) + (with { + int shift = wi::exact_log2 (@3) - wi::exact_log2 (@1); + } + (if (shift > 0) + (lshift (convert @2) { build_int_cst (integer_type_node, shift); }) + (convert (rshift @2 { build_int_cst (integer_type_node, -shift); })))))
What happens if @1 is the sign bit, in a signed type? Do we get an arithmetic shift right?
-- Marc Glisse
