mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-25 23:00:15 +00:00
Fix: CFLAA -- Mark no-args returns as unknown
Prior to this patch, we hadn't been marking StratifiedSets with the appropriate StratifiedAttrs when handling the result of no-args call instructions. This caused us to report NoAlias when handed, for example, an escaped alloca and a result from an opaque function. Now we properly mark the return value of said functions. Thanks again to Chandler, Richard, and Nick for pinging me about this. Differential review: http://reviews.llvm.org/D12408 llvm-svn: 246240
This commit is contained in:
parent
fa4ecb4b9a
commit
68b36e01da
@ -398,6 +398,8 @@ public:
|
||||
}
|
||||
|
||||
template <typename InstT> void visitCallLikeInst(InstT &Inst) {
|
||||
// TODO: Add support for noalias args/all the other fun function attributes
|
||||
// that we can tack on.
|
||||
SmallVector<Function *, 4> Targets;
|
||||
if (getPossibleTargets(&Inst, Targets)) {
|
||||
if (tryInterproceduralAnalysis(Targets, &Inst, Inst.arg_operands()))
|
||||
@ -406,8 +408,16 @@ public:
|
||||
Output.clear();
|
||||
}
|
||||
|
||||
// Because the function is opaque, we need to note that anything
|
||||
// could have happened to the arguments, and that the result could alias
|
||||
// just about anything, too.
|
||||
// The goal of the loop is in part to unify many Values into one set, so we
|
||||
// don't care if the function is void there.
|
||||
for (Value *V : Inst.arg_operands())
|
||||
Output.push_back(Edge(&Inst, V, EdgeType::Assign, AttrAll));
|
||||
if (Inst.getNumArgOperands() == 0 &&
|
||||
Inst.getType() != Type::getVoidTy(Inst.getContext()))
|
||||
Output.push_back(Edge(&Inst, &Inst, EdgeType::Assign, AttrAll));
|
||||
}
|
||||
|
||||
void visitCallInst(CallInst &Inst) { visitCallLikeInst(Inst); }
|
||||
|
20
llvm/test/Analysis/CFLAliasAnalysis/opaque-call-alias.ll
Normal file
20
llvm/test/Analysis/CFLAliasAnalysis/opaque-call-alias.ll
Normal file
@ -0,0 +1,20 @@
|
||||
; We previously had a case where we would put results from a no-args call in
|
||||
; its own stratified set. This would make cases like the one in @test say that
|
||||
; nothing (except %Escapes and %Arg) can alias
|
||||
|
||||
; RUN: opt < %s -cfl-aa -aa-eval -print-may-aliases -disable-output 2>&1 | FileCheck %s
|
||||
|
||||
; CHECK: Function: test
|
||||
; CHECK: MayAlias: i8* %Arg, i8* %Escapes
|
||||
; CHECK: MayAlias: i8* %Arg, i8* %Retrieved
|
||||
; CHECK: MayAlias: i8* %Escapes, i8* %Retrieved
|
||||
define void @test(i8* %Arg) {
|
||||
%Noalias = alloca i8
|
||||
%Escapes = alloca i8
|
||||
call void @set_thepointer(i8* %Escapes)
|
||||
%Retrieved = call i8* @get_thepointer()
|
||||
ret void
|
||||
}
|
||||
|
||||
declare void @set_thepointer(i8* %P)
|
||||
declare i8* @get_thepointer()
|
Loading…
Reference in New Issue
Block a user