[InstCombine] foldICmpWithLowBitMaskedVal(): handle ~(-1 << y) mask
Two folds are happening here:
- 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.
Reviewers: spatel, craig.topper, RKSimon
Reviewed By: spatel
Differential Revision: https://reviews.llvm.org/D52146