diff options
author | Christopher Lamb <christopher.lamb@gmail.com> | 2007-07-31 07:04:51 +0000 |
---|---|---|
committer | Christopher Lamb <christopher.lamb@gmail.com> | 2007-07-31 07:04:51 +0000 |
commit | 50192c215252cf20e0b205ee2012272aa9b9b1a2 (patch) | |
tree | b0a2c68cbb16d5671f312f39d53cfac0818a122e /lib/Analysis/BasicAliasAnalysis.cpp | |
parent | 66ca0bc73add3b2edba7cd88db00f85d08103015 (diff) |
Teach BasicAA about noalias function parameters. Passes all of DejaGNU and test-suite.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40624 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/BasicAliasAnalysis.cpp')
-rw-r--r-- | lib/Analysis/BasicAliasAnalysis.cpp | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/lib/Analysis/BasicAliasAnalysis.cpp b/lib/Analysis/BasicAliasAnalysis.cpp index 580f7e5d9e..ffe7411b77 100644 --- a/lib/Analysis/BasicAliasAnalysis.cpp +++ b/lib/Analysis/BasicAliasAnalysis.cpp @@ -18,6 +18,7 @@ #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" #include "llvm/Function.h" +#include "llvm/ParameterAttributes.h" #include "llvm/GlobalVariable.h" #include "llvm/Instructions.h" #include "llvm/Pass.h" @@ -294,6 +295,21 @@ BasicAliasAnalysis::alias(const Value *V1, unsigned V1Size, // Pointing at a discernible object? if (O1) { + // Check for noalias attribute + if (isa<Argument>(O1)) { + const Argument *Arg = cast<Argument>(O1); + const Function *Func = Arg->getParent(); + const ParamAttrsList *Attr = Func->getFunctionType()->getParamAttrs(); + if (Attr) { + unsigned Idx = 1; + for (Function::const_arg_iterator I = Func->arg_begin(), + E = Func->arg_end(); I != E; ++I, ++Idx) { + if (&(*I) == Arg && + Attr->paramHasAttr(Idx, ParamAttr::NoAlias)) + return NoAlias; + } + } + } if (O2) { if (isa<Argument>(O1)) { // Incoming argument cannot alias locally allocated object! @@ -307,7 +323,22 @@ BasicAliasAnalysis::alias(const Value *V1, unsigned V1Size, // If they are two different objects, we know that we have no alias... return NoAlias; } - + + // Check for noalias atrribute independently from above logic + if (isa<Argument>(O2)) { + const Argument *Arg = cast<Argument>(O2); + const Function *Func = Arg->getParent(); + const ParamAttrsList *Attr = Func->getFunctionType()->getParamAttrs(); + if (Attr) { + unsigned Idx = 1; + for (Function::const_arg_iterator I = Func->arg_begin(), + E = Func->arg_end(); I != E; ++I, ++Idx) { + if (&(*I) == Arg && + Attr->paramHasAttr(Idx, ParamAttr::NoAlias)) + return NoAlias; + } + } + } // If they are the same object, they we can look at the indexes. If they // index off of the object is the same for both pointers, they must alias. // If they are provably different, they must not alias. Otherwise, we |