diff --git a/lib/Analysis/AliasAnalysisEvaluator.cpp b/lib/Analysis/AliasAnalysisEvaluator.cpp index c2a95cc31ea..12917b650e5 100644 --- a/lib/Analysis/AliasAnalysisEvaluator.cpp +++ b/lib/Analysis/AliasAnalysisEvaluator.cpp @@ -167,10 +167,9 @@ bool AAEval::runOnFunction(Function &F) { if (!isa(Callee) && isInterestingPointer(Callee)) Pointers.insert(Callee); // Consider formals. - for (CallSite::arg_iterator AI = CS.arg_begin(), AE = CS.arg_end(); - AI != AE; ++AI) - if (isInterestingPointer(*AI)) - Pointers.insert(*AI); + for (Use &DataOp : CS.data_ops()) + if (isInterestingPointer(DataOp)) + Pointers.insert(DataOp); CallSites.insert(CS); } else { // Consider all operands. diff --git a/lib/Analysis/GlobalsModRef.cpp b/lib/Analysis/GlobalsModRef.cpp index 51a83d53277..ab2263ae374 100644 --- a/lib/Analysis/GlobalsModRef.cpp +++ b/lib/Analysis/GlobalsModRef.cpp @@ -353,12 +353,12 @@ bool GlobalsAAResult::AnalyzeUsesOfPointer(Value *V, } else if (auto CS = CallSite(I)) { // Make sure that this is just the function being called, not that it is // passing into the function. - if (!CS.isCallee(&U)) { + if (CS.isDataOperand(&U)) { // Detect calls to free. - if (isFreeCall(I, &TLI)) { + if (CS.isArgOperand(&U) && isFreeCall(I, &TLI)) { if (Writers) Writers->insert(CS->getParent()->getParent()); - } else if (CS.doesNotCapture(CS.getArgumentNo(&U))) { + } else if (CS.doesNotCapture(CS.getDataOperandNo(&U))) { Function *ParentF = CS->getParent()->getParent(); // A nocapture argument may be read from or written to, but does not // escape unless the call can somehow recurse. diff --git a/test/Analysis/GlobalsModRef/nocapture.ll b/test/Analysis/GlobalsModRef/nocapture.ll index 5b9c5e34cc7..0cb80a10f8d 100644 --- a/test/Analysis/GlobalsModRef/nocapture.ll +++ b/test/Analysis/GlobalsModRef/nocapture.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -globals-aa -aa-eval -print-all-alias-modref-info -S 2>&1 | FileCheck %s +; RUN: opt < %s -globals-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.10.0" @@ -45,3 +45,13 @@ entry: store i32 %add, i32* %q, align 4 ret i32 4 } + +declare void @g3() + +; CHECK-LABEL: Function: f3 +; CHECK: NoAlias: i32* %p, i32* @b +define void @f3(i32* nocapture readonly %p) { +entry: + tail call void @g3() [ "deopt"(i32* @b, i32 *%p) ] + unreachable +}