[PATCH] D66057: [InstCombine] Shift amount reassociation in bittest: trunc-of-shl (PR42399)

Roman Lebedev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 15 23:22:53 PDT 2019


lebedev.ri marked 2 inline comments as done.
lebedev.ri added a comment.

Thanks for taking a look!



================
Comment at: llvm/test/Transforms/InstCombine/shift-amount-reassociation-in-bittest-with-truncation-shl.ll:414
   %t1 = lshr i32 %x, %t0
-  %t2 = add i32 %len, 1 ; too much
+  %t2 = add i32 %len, 32 ; too much
   %t2_wide = zext i32 %t2 to i64
----------------
spatel wrote:
> Please explain and/or add a comment here.
> If we leave the add constant as 1, this gets simplified away completely with this patch? Why doesn't it happen with 32? 
> Do we already have a test that covers the case for the original test (with add of 1)?
With `%t2 = add i32 %len, 1` the total shift is `((32-len)+(len+1))`==`33`.
The widest type here is `i64`, and 33 is a valid shift amount there.
But since one of the values being shifted is i32, the result can be constant-folded to false
since you will effectively shift-out all the bits.
https://rise4fun.com/Alive/kk1

With 32 here, the total shift amount will be 64, which is not okay for i64.
But that would already imply UB, and we **should** be folding it into `undef`
https://rise4fun.com/Alive/Tzn

I'm trying to keep changes reviewable, so i did not get to that part yet.

The `@t9_oneuse5` gets constant-folded too, so there is some coverage.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D66057/new/

https://reviews.llvm.org/D66057





More information about the llvm-commits mailing list