diff --git a/llvm/lib/Analysis/StackSafetyAnalysis.cpp b/llvm/lib/Analysis/StackSafetyAnalysis.cpp index e3bd26374abca..f2c2bfd3b1a9c 100644 --- a/llvm/lib/Analysis/StackSafetyAnalysis.cpp +++ b/llvm/lib/Analysis/StackSafetyAnalysis.cpp @@ -327,8 +327,6 @@ bool StackSafetyLocalAnalysis::analyzeAllUses(Value *Ptr, case Instruction::Call: case Instruction::Invoke: { - const auto &CB = cast(*I); - if (I->isLifetimeStartOrEnd()) break; @@ -337,6 +335,12 @@ bool StackSafetyLocalAnalysis::analyzeAllUses(Value *Ptr, break; } + const auto &CB = cast(*I); + if (!CB.isArgOperand(&UI)) { + US.updateRange(UnknownRange); + return false; + } + // FIXME: consult devirt? // Do not follow aliases, otherwise we could inadvertently follow // dso_preemptable aliases or aliases with interposable linkage. @@ -348,19 +352,8 @@ bool StackSafetyLocalAnalysis::analyzeAllUses(Value *Ptr, } assert(isa(Callee) || isa(Callee)); - - int Found = 0; - for (size_t ArgNo = 0; ArgNo < CB.getNumArgOperands(); ++ArgNo) { - if (CB.getArgOperand(ArgNo) == V) { - ++Found; - US.Calls.emplace_back(Callee, ArgNo, offsetFrom(UI, Ptr)); - } - } - if (!Found) { - US.updateRange(UnknownRange); - return false; - } - + US.Calls.emplace_back(Callee, CB.getArgOperandNo(&UI), + offsetFrom(UI, Ptr)); break; }