diff options
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp index 1ba017d479e..a3c1b2777e3 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -863,15 +863,19 @@ Instruction *InstCombiner::transformZExtICmp(ICmpInst *Cmp, ZExtInst &Zext, (Pred == ICmpInst::ICMP_SGT && Op1C->isAllOnesValue())) { if (!DoTransform) return Cmp; + Value *In = Op0; Value *ShAmt = ConstantInt::get(CmpOpType, CmpOpType->getScalarSizeInBits() - 1); - Value *Sh = Builder.CreateLShr(Op0, ShAmt, Op0->getName() + ".lobit"); - Value *Cast = Builder.CreateIntCast(Sh, ZType, false /*ZExt*/); - // Invert low bit if testing for positive. - if (Pred == ICmpInst::ICMP_SGT) - Cast = Builder.CreateXor(Cast, ConstantInt::get(CmpOpType, 1)); + In = Builder.CreateLShr(In, ShAmt, In->getName() + ".lobit"); + if (CmpOpType != ZType) + In = Builder.CreateIntCast(In, ZType, false /*ZExt*/); - return replaceInstUsesWith(Zext, Cast); + if (Pred == ICmpInst::ICMP_SGT) { + Constant *One = ConstantInt::get(CmpOpType, 1); + In = Builder.CreateXor(In, One, In->getName() + ".not"); + } + + return replaceInstUsesWith(Zext, In); } // zext (X == 0) to i32 --> X^1 iff X has only the low bit set. |