Bug was because we recognized patterns like (shl 4, Z) as a power of
2 we could take Log2 of (2 + Z), but doing (shl X, (2 + Z)) can
cause a poison shift.
https://alive2.llvm.org/ce/z/yuJm_k
The fix is to verify that Log2(Y) will be a non-poisonous shift
amount. We can do this with:
`nsw` flag:
- https://alive2.llvm.org/ce/z/yyyJBr
- https://alive2.llvm.org/ce/z/YgubD_
`nuw` flag:
- https://alive2.llvm.org/ce/z/-4mpyV
- https://alive2.llvm.org/ce/z/a6ik6r
Prove `Y != 0`:
- https://alive2.llvm.org/ce/z/ced4su
- https://alive2.llvm.org/ce/z/X-JJHb
Replace RequireNoOverflow with an AssumeNonZero flag. This is what justifies it for division.