diff --git a/llvm/lib/Analysis/StackSafetyAnalysis.cpp b/llvm/lib/Analysis/StackSafetyAnalysis.cpp index 9c937b0b1ddaa..a44732613c0fa 100644 --- a/llvm/lib/Analysis/StackSafetyAnalysis.cpp +++ b/llvm/lib/Analysis/StackSafetyAnalysis.cpp @@ -345,12 +345,18 @@ bool StackSafetyLocalAnalysis::analyzeAllUses(Value *Ptr, UseInfo &US) { assert(isa(Callee) || isa(Callee)); auto B = CB.arg_begin(), E = CB.arg_end(); + int Found = 0; for (auto A = B; A != E; ++A) { if (A->get() == V) { + ++Found; ConstantRange Offset = offsetFrom(UI, Ptr); US.Calls.emplace_back(Callee, A - B, Offset); } } + if (!Found) { + US.updateRange(UnknownRange); + return false; + } break; } diff --git a/llvm/test/Analysis/StackSafetyAnalysis/local.ll b/llvm/test/Analysis/StackSafetyAnalysis/local.ll index eeb7ccbe42d3e..5dee4b52a2e41 100644 --- a/llvm/test/Analysis/StackSafetyAnalysis/local.ll +++ b/llvm/test/Analysis/StackSafetyAnalysis/local.ll @@ -412,3 +412,15 @@ entry: %val = load %zerosize_type, %zerosize_type* %p, align 4 ret void } + +define void @OperandBundle() { +; CHECK-LABEL: @OperandBundle dso_preemptable{{$}} +; CHECK-NEXT: args uses: +; CHECK-NEXT: allocas uses: +; CHECK-NEXT: a[4]: full-set +; CHECK-NOT: ]: +entry: + %a = alloca i32, align 4 + call void @LeakAddress() ["unknown"(i32* %a)] + ret void +}