From ae7aa60b2dfa7bba9bb6852b0f8fad0134b18018 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Sat, 25 Oct 2014 07:13:13 +0000 Subject: [PATCH] InstCombine: Remove overzealous asserts These asserts can trigger if the worklist iteration order is sufficiently unlucky. Instead of adding special case logic to handle these edge conditions, just bail out on trying to transform them: InstSimplify will get them when it reaches them on the worklist. This fixes PR21378. N.B. No test case is included because any test would rely on the fragile worklist iteration order. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220612 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../InstCombine/InstCombineCompares.cpp | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/lib/Transforms/InstCombine/InstCombineCompares.cpp b/lib/Transforms/InstCombine/InstCombineCompares.cpp index 2be03bd7f04..0288dfd1c5a 100644 --- a/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -1052,8 +1052,18 @@ Instruction *InstCombiner::FoldICmpCstShrCst(ICmpInst &I, Value *Op, Value *A, APInt AP1 = CI1->getValue(); APInt AP2 = CI2->getValue(); - assert(AP2 != 0 && "Handled in InstSimplify"); - assert(!AP2.isAllOnesValue() && "Handled in InstSimplify"); + // Don't bother doing any work for cases which InstSimplify handles. + if (AP2 == 0) + return nullptr; + bool IsAShr = isa(Op); + if (IsAShr) { + if (AP2.isAllOnesValue()) + return nullptr; + if (AP2.isNegative() != AP1.isNegative()) + return nullptr; + if (AP2.sgt(AP1)) + return nullptr; + } if (!AP1) // 'A' must be large enough to shift out the highest set bit. @@ -1063,13 +1073,6 @@ Instruction *InstCombiner::FoldICmpCstShrCst(ICmpInst &I, Value *Op, Value *A, if (AP1 == AP2) return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType())); - bool IsAShr = isa(Op); - // If we are dealing with an arithmetic shift, both constants should agree in - // sign. InstSimplify's SimplifyICmpInst range analysis is supposed to catch - // the cases when they disagree. - assert((!IsAShr || (AP1.isNegative() == AP2.isNegative() && AP1.sgt(AP2))) && - "Handled in InstSimplify"); - // Get the distance between the highest bit that's set. int Shift; // Both the constants are negative, take their positive to calculate log. @@ -1109,7 +1112,9 @@ Instruction *InstCombiner::FoldICmpCstShlCst(ICmpInst &I, Value *Op, Value *A, APInt AP1 = CI1->getValue(); APInt AP2 = CI2->getValue(); - assert(AP2 != 0 && "Handled in InstSimplify"); + // Don't bother doing any work for cases which InstSimplify handles. + if (AP2 == 0) + return nullptr; unsigned AP2TrailingZeros = AP2.countTrailingZeros(); @@ -2591,11 +2596,13 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) { if (match(Op0, m_AShr(m_ConstantInt(CI2), m_Value(A))) || match(Op0, m_LShr(m_ConstantInt(CI2), m_Value(A)))) { // (icmp eq/ne (ashr/lshr const2, A), const1) - return FoldICmpCstShrCst(I, Op0, A, CI, CI2); + if (Instruction *Inst = FoldICmpCstShrCst(I, Op0, A, CI, CI2)) + return Inst; } if (match(Op0, m_Shl(m_ConstantInt(CI2), m_Value(A)))) { // (icmp eq/ne (shl const2, A), const1) - return FoldICmpCstShlCst(I, Op0, A, CI, CI2); + if (Instruction *Inst = FoldICmpCstShlCst(I, Op0, A, CI, CI2)) + return Inst; } }