Two issues: first, it was ignoring the parameters to a memcpy when determining if the memcpy mod/ref'ed a value, and the tail call based check is invalid for sret arguments.

--Owen

On Feb 18, 2008, at 12:27 AM, Bill Wendling wrote:

What are the bugs?

-bw

On Feb 17, 2008, at 6:31 PM, Owen Anderson wrote:

Author: resistor
Date: Sun Feb 17 20:31:23 2008
New Revision: 47252

URL: http://llvm.org/viewvc/llvm-project?rev=47252&view=rev
Log:
Fix bugs that Chris noticed in my last patch.

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=47252&r1=47251&r2=47252&view=diff

= =====================================================================
========
--- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original)
+++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Sun Feb 17
20:31:23 2008
@@ -250,22 +250,30 @@
    const Value *Object = getUnderlyingObject(P);
    // Allocations and byval arguments are "new" objects.
    if (Object &&
-        (isa<AllocationInst>(Object) ||
-         (isa<Argument>(Object) &&
-                                 (cast<Argument>(Object)-
hasByValAttr() ||
-                                  cast<Argument>(Object)-
hasNoAliasAttr())))) {
+        (isa<AllocationInst>(Object) || isa<Argument>(Object))) {
      // Okay, the pointer is to a stack allocated (or effectively
so, for
      // for noalias parameters) object.  If we can prove that
      // the pointer never "escapes", then we know the call cannot
clobber it,
      // because it simply can't get its address.
-      if (!AddressMightEscape(Object))
-        return NoModRef;
+      if (isa<AllocationInst>(Object) ||
+          cast<Argument>(Object)->hasByValAttr() ||
+          cast<Argument>(Object)->hasNoAliasAttr())
+        if (!AddressMightEscape(Object)) {
+          for (CallSite::arg_iterator CI = CS.arg_begin(), CE =
CS.arg_end();
+              CI != CE; ++CI)
+            if (getUnderlyingObject(CI->get()) == P)
+              return AliasAnalysis::getModRefInfo(CS, P, Size);
+
+          return NoModRef;
+        }

      // If this is a tail call and P points to a stack location,
we know that
      // the tail call cannot access or modify the local stack.
-      if (CallInst *CI = dyn_cast<CallInst>(CS.getInstruction()))
-        if (CI->isTailCall() && !isa<MallocInst>(Object))
-          return NoModRef;
+      if (isa<AllocationInst>(Object) ||
+          cast<Argument>(Object)->hasByValAttr())
+        if (CallInst *CI = dyn_cast<CallInst>(CS.getInstruction()))
+          if (CI->isTailCall() && !isa<MallocInst>(Object))
+            return NoModRef;
    }
  }



_______________________________________________
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

_______________________________________________
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

Attachment: smime.p7s
Description: S/MIME cryptographic signature

_______________________________________________
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

Reply via email to