[InstCombine] fold lshr(mul X, SplatC), C2
authorSanjay Patel <spatel@rotateright.com>
Wed, 10 Feb 2021 19:57:31 +0000 (14:57 -0500)
committerSanjay Patel <spatel@rotateright.com>
Wed, 10 Feb 2021 20:02:31 +0000 (15:02 -0500)
commit6e2053983e0d3f69b0d9219923d7ba1eae592e12
tree5642066da22cc196d558f212aa0089e79a3d4036
parent6bcc1fd461eeeb7946184cbfe886eead9291919c
[InstCombine] fold lshr(mul X, SplatC), C2

This is a special-case multiply that replicates bits of
the source operand. We need this fold to avoid regression
if we make canonicalization to `mul` more aggressive for
shl+or patterns.

I did not see a way to make Alive generalize the bit width
condition for even-number-of-bits only, but an example of
the proof is:
  Name: i32
  Pre: isPowerOf2(C1 - 1) && log2(C1) == C2 && (C2 * 2 == width(C2))
  %m = mul nuw i32 %x, C1
  %t = lshr i32 %m, C2
  =>
  %t = and i32 %x, C1 - 2

  Name: i14
  %m = mul nuw i14 %x, 129
  %t = lshr i14 %m, 7
  =>
  %t = and i14 %x, 127

https://rise4fun.com/Alive/e52
llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp
llvm/test/Transforms/InstCombine/lshr.ll