diff --git a/llvm/lib/Transforms/Scalar/LoopDeletion.cpp b/llvm/lib/Transforms/Scalar/LoopDeletion.cpp --- a/llvm/lib/Transforms/Scalar/LoopDeletion.cpp +++ b/llvm/lib/Transforms/Scalar/LoopDeletion.cpp @@ -191,6 +191,12 @@ Value *RHS = getValueOnFirstIteration(BO->getOperand(1), FirstIterValue, SQ); FirstIterV = SimplifyBinOp(BO->getOpcode(), LHS, RHS, SQ); + } else if (auto *Cmp = dyn_cast(V)) { + Value *LHS = + getValueOnFirstIteration(Cmp->getOperand(0), FirstIterValue, SQ); + Value *RHS = + getValueOnFirstIteration(Cmp->getOperand(1), FirstIterValue, SQ); + FirstIterV = SimplifyICmpInst(Cmp->getPredicate(), LHS, RHS, SQ); } if (!FirstIterV) FirstIterV = V; @@ -314,22 +320,20 @@ } using namespace PatternMatch; - ICmpInst::Predicate Pred; - Value *LHS, *RHS; + Value *Cond; BasicBlock *IfTrue, *IfFalse; auto *Term = BB->getTerminator(); - if (match(Term, m_Br(m_ICmp(Pred, m_Value(LHS), m_Value(RHS)), + if (match(Term, m_Br(m_Value(Cond), m_BasicBlock(IfTrue), m_BasicBlock(IfFalse)))) { - if (!LHS->getType()->isIntegerTy()) { + auto *ICmp = dyn_cast(Cond); + if (!ICmp || !ICmp->getType()->isIntegerTy()) { MarkAllSuccessorsLive(BB); continue; } // Can we prove constant true or false for this condition? - LHS = getValueOnFirstIteration(LHS, FirstIterValue, SQ); - RHS = getValueOnFirstIteration(RHS, FirstIterValue, SQ); - auto *KnownCondition = SimplifyICmpInst(Pred, LHS, RHS, SQ); - if (!KnownCondition) { + auto *KnownCondition = getValueOnFirstIteration(ICmp, FirstIterValue, SQ); + if (KnownCondition == ICmp) { // Failed to simplify. MarkAllSuccessorsLive(BB); continue;