From b2b32fd3fe22ca6b165d9c21d7ec0bcd2af105f5 Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Mon, 24 Nov 2008 05:00:44 +0000 Subject: [PATCH] Seriously strengthen the guarantee offered by noalias on a function's return value. It must now be as if the pointer were allocated and has not escaped to the caller. Thanks to Dan Gohman for pointing out the error in the original and helping devise this definition. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@59940 91177308-0d34-0410-b5e6-96231b3b80d8 --- docs/LangRef.html | 6 +++--- lib/Analysis/BasicAliasAnalysis.cpp | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/LangRef.html b/docs/LangRef.html index bc3b40b460e..b469022b762 100644 --- a/docs/LangRef.html +++ b/docs/LangRef.html @@ -892,9 +892,9 @@ declare signext i8 @returns_signed_char()
noalias
This indicates that the pointer does not alias any global or any other parameter. The caller is responsible for ensuring that this is the - case. Additionally, on a function return value noalias indicates - that the pointer does not alias the return value from other calls of - itself or other noalias functions.
+ case. On a function return value, noalias additionally indicates + that the pointer does not alias any other pointers visible to the + caller.
nest
This indicates that the pointer parameter can be excised using the diff --git a/lib/Analysis/BasicAliasAnalysis.cpp b/lib/Analysis/BasicAliasAnalysis.cpp index e9c6490ebb7..5b65fb1199c 100644 --- a/lib/Analysis/BasicAliasAnalysis.cpp +++ b/lib/Analysis/BasicAliasAnalysis.cpp @@ -383,9 +383,9 @@ BasicAliasAnalysis::alias(const Value *V1, unsigned V1Size, if (isIdentifiedObject(O1) && isIdentifiedObject(O2)) return NoAlias; - // Local allocations can't alias with arguments or noalias functions. - if ((isa(O1) && (isa(O2) || isNoAliasCall(O2))) || - (isa(O2) && (isa(O1) || isNoAliasCall(O1)))) + // Arguments can't alias with local allocations or noalias calls. + if ((isa(O1) && (isa(O2) || isNoAliasCall(O2))) || + (isa(O2) && (isa(O1) || isNoAliasCall(O1)))) return NoAlias; // Most objects can't alias null.