forked from OSchip/llvm-project
[OperandBundles] Have GlobalsModRef play nice with operand bundles
A call site's use of a Value might not correspond to an argument operand but to a bundle operand. llvm-svn: 256329
This commit is contained in:
parent
63ad9e0543
commit
2bc2538470
|
@ -167,10 +167,9 @@ bool AAEval::runOnFunction(Function &F) {
|
||||||
if (!isa<Function>(Callee) && isInterestingPointer(Callee))
|
if (!isa<Function>(Callee) && isInterestingPointer(Callee))
|
||||||
Pointers.insert(Callee);
|
Pointers.insert(Callee);
|
||||||
// Consider formals.
|
// Consider formals.
|
||||||
for (CallSite::arg_iterator AI = CS.arg_begin(), AE = CS.arg_end();
|
for (Use &DataOp : CS.data_ops())
|
||||||
AI != AE; ++AI)
|
if (isInterestingPointer(DataOp))
|
||||||
if (isInterestingPointer(*AI))
|
Pointers.insert(DataOp);
|
||||||
Pointers.insert(*AI);
|
|
||||||
CallSites.insert(CS);
|
CallSites.insert(CS);
|
||||||
} else {
|
} else {
|
||||||
// Consider all operands.
|
// Consider all operands.
|
||||||
|
|
|
@ -353,12 +353,12 @@ bool GlobalsAAResult::AnalyzeUsesOfPointer(Value *V,
|
||||||
} else if (auto CS = CallSite(I)) {
|
} else if (auto CS = CallSite(I)) {
|
||||||
// Make sure that this is just the function being called, not that it is
|
// Make sure that this is just the function being called, not that it is
|
||||||
// passing into the function.
|
// passing into the function.
|
||||||
if (!CS.isCallee(&U)) {
|
if (CS.isDataOperand(&U)) {
|
||||||
// Detect calls to free.
|
// Detect calls to free.
|
||||||
if (isFreeCall(I, &TLI)) {
|
if (CS.isArgOperand(&U) && isFreeCall(I, &TLI)) {
|
||||||
if (Writers)
|
if (Writers)
|
||||||
Writers->insert(CS->getParent()->getParent());
|
Writers->insert(CS->getParent()->getParent());
|
||||||
} else if (CS.doesNotCapture(CS.getArgumentNo(&U))) {
|
} else if (CS.doesNotCapture(CS.getDataOperandNo(&U))) {
|
||||||
Function *ParentF = CS->getParent()->getParent();
|
Function *ParentF = CS->getParent()->getParent();
|
||||||
// A nocapture argument may be read from or written to, but does not
|
// A nocapture argument may be read from or written to, but does not
|
||||||
// escape unless the call can somehow recurse.
|
// escape unless the call can somehow recurse.
|
||||||
|
|
|
@ -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 datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
target triple = "x86_64-apple-macosx10.10.0"
|
target triple = "x86_64-apple-macosx10.10.0"
|
||||||
|
@ -45,3 +45,13 @@ entry:
|
||||||
store i32 %add, i32* %q, align 4
|
store i32 %add, i32* %q, align 4
|
||||||
ret i32 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
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue