diff options
| author | Roman Lebedev <lebedev.ri@gmail.com> | 2018-09-19 13:35:40 +0000 |
|---|---|---|
| committer | Roman Lebedev <lebedev.ri@gmail.com> | 2018-09-19 13:35:40 +0000 |
| commit | ca2bdb03d6cfeef068dcae8ae3bf78ead219612a (patch) | |
| tree | 8d46e53c9455809efed0403ea68459948d2aef07 /llvm/lib/Transforms | |
| parent | 183a465dc60b9ca87841bd0b7c34bc74deef74b4 (diff) | |
| download | bcm5719-llvm-ca2bdb03d6cfeef068dcae8ae3bf78ead219612a.tar.gz bcm5719-llvm-ca2bdb03d6cfeef068dcae8ae3bf78ead219612a.zip | |
[InstCombine] foldICmpWithLowBitMaskedVal(): handle uncanonical ((1 << y)+(-1)) mask
Summary:
Same as to D52146.
`((1 << y)+(-1))` is simply non-canoniacal version of `~(-1 << y)`: https://rise4fun.com/Alive/0vl
We can not canonicalize it due to the extra uses. But we can handle it here.
Reviewers: spatel, craig.topper, RKSimon
Reviewed By: spatel
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D52147
llvm-svn: 342547
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index f06a0e83c9b..c6294d173d9 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -2887,6 +2887,7 @@ Instruction *InstCombiner::foldICmpInstWithConstantNotInt(ICmpInst &I) { /// Where Mask is some pattern that produces all-ones in low bits: /// (-1 >> y) /// ~(-1 << y) +/// ((1 << y) + (-1)) <- non-canonical, has extra uses /// The Mask can be a constant, too. /// For some predicates, the operands are commutative. /// For others, x can only be on a specific side. @@ -2894,8 +2895,10 @@ static Value *foldICmpWithLowBitMaskedVal(ICmpInst &I, InstCombiner::BuilderTy &Builder) { ICmpInst::Predicate SrcPred; Value *X, *M; - auto m_VariableMask = m_CombineOr(m_Not(m_Shl(m_AllOnes(), m_Value())), - m_LShr(m_AllOnes(), m_Value())); + auto m_VariableMask = + m_CombineOr(m_CombineOr(m_Not(m_Shl(m_AllOnes(), m_Value())), + m_Add(m_Shl(m_One(), m_Value()), m_AllOnes())), + m_LShr(m_AllOnes(), m_Value())); auto m_Mask = m_CombineOr(m_VariableMask, m_LowBitMask()); if (!match(&I, m_c_ICmp(SrcPred, m_c_And(m_CombineAnd(m_Mask, m_Value(M)), m_Value(X)), |

