[InstCombine] foldICmpWithLowBitMaskedVal(): handle ~(-1 << y) mask
authorRoman Lebedev <lebedev.ri@gmail.com>
Wed, 19 Sep 2018 13:35:27 +0000 (13:35 +0000)
committerRoman Lebedev <lebedev.ri@gmail.com>
Wed, 19 Sep 2018 13:35:27 +0000 (13:35 +0000)
commit183a465dc60b9ca87841bd0b7c34bc74deef74b4
tree3deae2eceb3d7273e6d5e303cea098e1363c76b3
parent0b835be7bb3e84dbb3efe7bab32a33166d94db8e
[InstCombine] foldICmpWithLowBitMaskedVal(): handle  ~(-1 << y)  mask

Summary:
Two folds are happening here:
1. https://rise4fun.com/Alive/oaFX
2. And then `foldICmpWithHighBitMask()` (D52001): https://rise4fun.com/Alive/wsP4

This change doesn't just add the handling for eq/ne predicates,
it actually builds upon the previous `foldICmpWithLowBitMaskedVal()` work,
so **all** the 16 fold variants* are immediately supported.

I'm indeed only testing these two predicates.
I do not feel like re-proving all 16 folds*, because they were already proven
for the general case of constant with all-ones in low bits. So as long as
the mask produces all-ones in low bits, i'm pretty sure the fold is valid.

But required, i can re-prove, let me know.

* eq/ne are commutative - 4 folds; ult/ule/ugt/uge - are not commutative (the commuted variant is InstSimplified), 4 folds; slt/sle/sgt/sge are not commutative - 4 folds. 12 folds in total.

https://bugs.llvm.org/show_bug.cgi?id=38123
https://bugs.llvm.org/show_bug.cgi?id=38708

Reviewers: spatel, craig.topper, RKSimon

Reviewed By: spatel

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D52146

llvm-svn: 342546
llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
llvm/test/Transforms/InstCombine/canonicalize-low-bit-mask-v2-and-icmp-eq-to-icmp-ule.ll
llvm/test/Transforms/InstCombine/canonicalize-low-bit-mask-v2-and-icmp-ne-to-icmp-ugt.ll