diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp | 9 | ||||
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp | 4 |
2 files changed, 5 insertions, 8 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp index dc3f32d..c672456 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -987,9 +987,7 @@ Instruction *InstCombinerImpl::transformZExtICmp(ICmpInst *Cmp, ZExtInst &Zext) if (match(Cmp->getOperand(1), m_APInt(Op1CV))) { // zext (x <s 0) to i32 --> x>>u31 true if signbit set. - // zext (x >s -1) to i32 --> (x>>u31)^1 true if signbit clear. - if ((Cmp->getPredicate() == ICmpInst::ICMP_SLT && Op1CV->isZero()) || - (Cmp->getPredicate() == ICmpInst::ICMP_SGT && Op1CV->isAllOnes())) { + if (Cmp->getPredicate() == ICmpInst::ICMP_SLT && Op1CV->isZero()) { Value *In = Cmp->getOperand(0); Value *Sh = ConstantInt::get(In->getType(), In->getType()->getScalarSizeInBits() - 1); @@ -997,11 +995,6 @@ Instruction *InstCombinerImpl::transformZExtICmp(ICmpInst *Cmp, ZExtInst &Zext) if (In->getType() != Zext.getType()) In = Builder.CreateIntCast(In, Zext.getType(), false /*ZExt*/); - if (Cmp->getPredicate() == ICmpInst::ICMP_SGT) { - Constant *One = ConstantInt::get(In->getType(), 1); - In = Builder.CreateXor(In, One, In->getName() + ".not"); - } - return replaceInstUsesWith(Zext, In); } diff --git a/llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp index e5b0e32..8453c9f 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp @@ -1158,6 +1158,10 @@ Instruction *InstCombinerImpl::visitLShr(BinaryOperator &I) { } if (ShAmtC == BitWidth - 1) { + // lshr i32 (~X), 31 --> zext (X > -1) + if (match(Op0, m_OneUse(m_Not(m_Value(X))))) + return new ZExtInst(Builder.CreateIsNotNeg(X), Ty); + // lshr i32 or(X,-X), 31 --> zext (X != 0) if (match(Op0, m_OneUse(m_c_Or(m_Neg(m_Value(X)), m_Deferred(X))))) return new ZExtInst(Builder.CreateIsNotNull(X), Ty); |