mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 20:29:53 +00:00
Teach FunctionAttrs about the VAArg instruction.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118627 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6d44d64f61
commit
4cf0dcfb44
@ -195,6 +195,13 @@ bool FunctionAttrs::AddReadAttrs(const CallGraphSCC &SCC) {
|
||||
if (AA->pointsToConstantMemory(Loc, /*OrLocal=*/true))
|
||||
continue;
|
||||
}
|
||||
} else if (VAArgInst *VI = dyn_cast<VAArgInst>(I)) {
|
||||
// Ignore vaargs on local memory.
|
||||
AliasAnalysis::Location Loc(VI->getPointerOperand(),
|
||||
AliasAnalysis::UnknownSize,
|
||||
VI->getMetadata(LLVMContext::MD_tbaa));
|
||||
if (AA->pointsToConstantMemory(Loc, /*OrLocal=*/true))
|
||||
continue;
|
||||
}
|
||||
|
||||
// Any remaining instructions need to be taken seriously! Check if they
|
||||
|
@ -55,6 +55,20 @@ define void @test2_no(i8* %p, i8* %q, i64 %n) nounwind {
|
||||
ret void
|
||||
}
|
||||
|
||||
; Similar to the others, va_arg only accesses memory through its operand.
|
||||
|
||||
; CHECK: define i32 @test3_yes(i8* nocapture %p) nounwind readnone {
|
||||
define i32 @test3_yes(i8* %p) nounwind {
|
||||
%t = va_arg i8* %p, i32, !tbaa !1
|
||||
ret i32 %t
|
||||
}
|
||||
|
||||
; CHECK: define i32 @test3_no(i8* nocapture %p) nounwind {
|
||||
define i32 @test3_no(i8* %p) nounwind {
|
||||
%t = va_arg i8* %p, i32, !tbaa !2
|
||||
ret i32 %t
|
||||
}
|
||||
|
||||
declare void @callee(i32* %p) nounwind
|
||||
declare void @llvm.memcpy.p0i8.p0i8.i64(i8*, i8*, i64, i32, i1) nounwind
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user