[llvm-commits] [llvm] r40624 - in /llvm/trunk: lib/Analysis/BasicAliasAnalysis.cpp test/Analysis/BasicAA/2007-07-31-NoAliasTest.ll

Christopher Lamb christopher.lamb at gmail.com
Tue Jul 31 00:04:51 PDT 2007


Author: clamb
Date: Tue Jul 31 02:04:51 2007
New Revision: 40624

URL: http://llvm.org/viewvc/llvm-project?rev=40624&view=rev
Log:
Teach BasicAA about noalias function parameters. Passes all of DejaGNU and test-suite.

Added:
    llvm/trunk/test/Analysis/BasicAA/2007-07-31-NoAliasTest.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=40624&r1=40623&r2=40624&view=diff

==============================================================================
--- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original)
+++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Tue Jul 31 02:04:51 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"
@@ -294,6 +295,21 @@
 
   // 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 @@
         // 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

Added: llvm/trunk/test/Analysis/BasicAA/2007-07-31-NoAliasTest.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/BasicAA/2007-07-31-NoAliasTest.ll?rev=40624&view=auto

==============================================================================
--- llvm/trunk/test/Analysis/BasicAA/2007-07-31-NoAliasTest.ll (added)
+++ llvm/trunk/test/Analysis/BasicAA/2007-07-31-NoAliasTest.ll Tue Jul 31 02:04:51 2007
@@ -0,0 +1,12 @@
+; RUN:   llvm-as %s -o - | opt -aa-eval -print-may-aliases -disable-output |& grep '1 may alias'
+; RUN:   llvm-as %s -o - | opt -aa-eval -print-may-aliases -disable-output |& grep '5 no alias'
+; RUN:   llvm-as %s -o - | opt -aa-eval -print-may-aliases -disable-output |& grep 'MayAlias:     i32* %ptr4, i32* %ptr2'
+
+define void @_Z3fooPiS_RiS_(i32* noalias  %ptr1, i32* %ptr2, i32* noalias  %ptr3, i32* %ptr4) {
+entry:
+        store i32 0, i32* %ptr1
+        store i32 0, i32* %ptr2
+        store i32 0, i32* %ptr3
+        store i32 0, i32* %ptr4
+        ret void
+}
\ No newline at end of file





More information about the llvm-commits mailing list