diff options
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp index 73876d0..658bbbc 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp @@ -1775,6 +1775,15 @@ Instruction *InstCombinerImpl::visitAdd(BinaryOperator &I) { } } + // (add (add A, 1), (sext (icmp ne A, 0))) => call umax(A, 1) + if (match(LHS, m_Add(m_Value(A), m_One())) && + match(RHS, m_OneUse(m_SExt(m_OneUse(m_SpecificICmp( + ICmpInst::ICMP_NE, m_Specific(A), m_ZeroInt())))))) { + Value *OneConst = ConstantInt::get(A->getType(), 1); + Value *UMax = Builder.CreateBinaryIntrinsic(Intrinsic::umax, A, OneConst); + return replaceInstUsesWith(I, UMax); + } + if (Instruction *Ashr = foldAddToAshr(I)) return Ashr; |