From: Sanjoy Das Date: Sat, 7 May 2016 02:08:24 +0000 (+0000) Subject: [ValueTracking] Hoist some computation out of a loop; NFC X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0bcecaafe780c739d79c230fbe56581f1a25b62d;p=llvm [ValueTracking] Hoist some computation out of a loop; NFC There is no need to match the comparison instruction repeatedly. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@268836 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/ValueTracking.cpp b/lib/Analysis/ValueTracking.cpp index 2f31ec26c8b..52b1e444731 100644 --- a/lib/Analysis/ValueTracking.cpp +++ b/lib/Analysis/ValueTracking.cpp @@ -3199,39 +3199,30 @@ static bool isKnownNonNullFromDominatingCondition(const Value *V, assert(V->getType()->isPointerTy() && "V must be pointer type"); unsigned NumUsesExplored = 0; - for (auto U : V->users()) { + for (auto *U : V->users()) { // Avoid massive lists if (NumUsesExplored >= DomConditionsMaxUses) break; NumUsesExplored++; // Consider only compare instructions uniquely controlling a branch - const ICmpInst *Cmp = dyn_cast(U); - if (!Cmp) + CmpInst::Predicate Pred; + if (!match(const_cast(U), + m_c_ICmp(Pred, m_Specific(V), m_Zero())) || + (Pred != ICmpInst::ICMP_EQ && Pred != ICmpInst::ICMP_NE)) continue; - for (auto *CmpU : Cmp->users()) { + for (auto *CmpU : U->users()) { const BranchInst *BI = dyn_cast(CmpU); if (!BI) continue; assert(BI->isConditional() && "uses a comparison!"); - BasicBlock *NonNullSuccessor = nullptr; - CmpInst::Predicate Pred; - - if (match(const_cast(Cmp), - m_c_ICmp(Pred, m_Specific(V), m_Zero()))) { - if (Pred == ICmpInst::ICMP_EQ) - NonNullSuccessor = BI->getSuccessor(1); - else if (Pred == ICmpInst::ICMP_NE) - NonNullSuccessor = BI->getSuccessor(0); - } - - if (NonNullSuccessor) { - BasicBlockEdge Edge(BI->getParent(), NonNullSuccessor); - if (Edge.isSingleEdge() && DT->dominates(Edge, CtxI->getParent())) - return true; - } + BasicBlock *NonNullSuccessor = + BI->getSuccessor(Pred == ICmpInst::ICMP_EQ ? 1 : 0); + BasicBlockEdge Edge(BI->getParent(), NonNullSuccessor); + if (Edge.isSingleEdge() && DT->dominates(Edge, CtxI->getParent())) + return true; } }