[llvm-commits] [llvm] r40711 - in /llvm/trunk: lib/Analysis/BasicAliasAnalysis.cpp test/Analysis/BasicAA/2007-08-01-NoAliasAndCalls.ll test/Analysis/BasicAA/2007-08-01-NoAliasAndGEP.ll

Christopher Lamb christopher.lamb at gmail.com
Wed Aug 1 18:18:17 PDT 2007


Author: clamb
Date: Wed Aug  1 20:18:14 2007
New Revision: 40711

URL: http://llvm.org/viewvc/llvm-project?rev=40711&view=rev
Log:
Teach BasicAA about noalias parameter attributes, but do it correctly this time.

Added:
    llvm/trunk/test/Analysis/BasicAA/2007-08-01-NoAliasAndCalls.ll
    llvm/trunk/test/Analysis/BasicAA/2007-08-01-NoAliasAndGEP.ll
Modified:
    llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp

Modified: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp?rev=40711&r1=40710&r2=40711&view=diff

==============================================================================
--- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original)
+++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Wed Aug  1 20:18:14 2007
@@ -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"
@@ -260,6 +261,21 @@
   return AliasAnalysis::getModRefInfo(CS, P, Size);
 }
 
+static bool isNoAliasArgument(const Argument *Arg) {
+  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 true;
+    }
+  }
+  return false;
+}
+
 // alias - Provide a bunch of ad-hoc rules to disambiguate in common cases, such
 // as array references.  Note that this function is heavily tail recursive.
 // Hopefully we have a smart C++ compiler.  :)
@@ -298,10 +314,24 @@
       if (isa<Argument>(O1)) {
         // Incoming argument cannot alias locally allocated object!
         if (isa<AllocationInst>(O2)) return NoAlias;
+        
+        // If they are two different objects, and one is a noalias argument
+        // then they do not alias.
+        if (O1 != O2 && isNoAliasArgument(cast<Argument>(O1)))
+          return NoAlias;
+          
         // Otherwise, nothing is known...
-      } else if (isa<Argument>(O2)) {
+      } 
+      
+      if (isa<Argument>(O2)) {
         // Incoming argument cannot alias locally allocated object!
         if (isa<AllocationInst>(O1)) return NoAlias;
+        
+        // If they are two different objects, and one is a noalias argument
+        // then they do not alias.
+        if (O1 != O2 && isNoAliasArgument(cast<Argument>(O2)))
+          return NoAlias;
+          
         // Otherwise, nothing is known...
       } else if (O1 != O2) {
         // If they are two different objects, we know that we have no alias...

Added: llvm/trunk/test/Analysis/BasicAA/2007-08-01-NoAliasAndCalls.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/BasicAA/2007-08-01-NoAliasAndCalls.ll?rev=40711&view=auto

==============================================================================
--- llvm/trunk/test/Analysis/BasicAA/2007-08-01-NoAliasAndCalls.ll (added)
+++ llvm/trunk/test/Analysis/BasicAA/2007-08-01-NoAliasAndCalls.ll Wed Aug  1 20:18:14 2007
@@ -0,0 +1,10 @@
+; RUN: llvm-as %s -o - | opt -basicaa -aa-eval -print-all-alias-modref-info -disable-output &| grep 'MayAlias:     i32* %y, i32* %x'
+
+declare i32* @unclear(i32* %a)
+
+define void @foo(i32* noalias %x) {
+  %y = call i32* @unclear(i32* %x)
+  store i32 0, i32* %x
+  store i32 0, i32* %y
+  ret void
+}

Added: llvm/trunk/test/Analysis/BasicAA/2007-08-01-NoAliasAndGEP.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/BasicAA/2007-08-01-NoAliasAndGEP.ll?rev=40711&view=auto

==============================================================================
--- llvm/trunk/test/Analysis/BasicAA/2007-08-01-NoAliasAndGEP.ll (added)
+++ llvm/trunk/test/Analysis/BasicAA/2007-08-01-NoAliasAndGEP.ll Wed Aug  1 20:18:14 2007
@@ -0,0 +1,17 @@
+; RUN: llvm-as %s -o - | opt -basicaa -aa-eval -print-all-alias-modref-info -disable-output &| grep '9 no alias'
+; RUN: llvm-as %s -o - | opt -basicaa -aa-eval -print-all-alias-modref-info -disable-output &| grep '6 may alias'
+; RUN: llvm-as %s -o - | opt -basicaa -aa-eval -print-all-alias-modref-info -disable-output &| grep 'MayAlias:     i32* %pj, i32* %pi'
+
+define void @foo(i32* noalias %p, i32* noalias %q, i32 %i, i32 %j) {
+  %pi = getelementptr i32* %p, i32 %i
+  %qi = getelementptr i32* %q, i32 %i
+  %pj = getelementptr i32* %p, i32 %j
+  %qj = getelementptr i32* %q, i32 %j
+  store i32 0, i32* %p
+  store i32 0, i32* %pi
+  store i32 0, i32* %pj
+  store i32 0, i32* %q
+  store i32 0, i32* %qi
+  store i32 0, i32* %qj
+  ret void
+}





More information about the llvm-commits mailing list