From: George Burgess IV Date: Fri, 28 Aug 2015 00:16:18 +0000 (+0000) Subject: Fix: CFLAA -- Mark no-args returns as unknown X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=dc5cb4d4ca0480ec004a120309e26dcfcd8f657b 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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@246240 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/CFLAliasAnalysis.cpp b/lib/Analysis/CFLAliasAnalysis.cpp index ea624aee4fb..729f7e412a8 100644 --- a/lib/Analysis/CFLAliasAnalysis.cpp +++ b/lib/Analysis/CFLAliasAnalysis.cpp @@ -398,6 +398,8 @@ public: } template void visitCallLikeInst(InstT &Inst) { + // TODO: Add support for noalias args/all the other fun function attributes + // that we can tack on. SmallVector 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); } diff --git a/test/Analysis/CFLAliasAnalysis/opaque-call-alias.ll b/test/Analysis/CFLAliasAnalysis/opaque-call-alias.ll new file mode 100644 index 00000000000..8d602ebb90a --- /dev/null +++ b/test/Analysis/CFLAliasAnalysis/opaque-call-alias.ll @@ -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()