[llvm-commits] [llvm] r47247 - /llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp

Evan Cheng evan.cheng at apple.com
Mon Feb 18 11:43:30 PST 2008


Hi Resistor,

This breaks MultiSource/Benchmarks/Prolangs-C++/city under x86-64.  
Please take a look.

Thanks,

Evan

On Feb 17, 2008, at 1:29 PM, Owen Anderson wrote:

> Author: resistor
> Date: Sun Feb 17 15:29:08 2008
> New Revision: 47247
>
> URL: http://llvm.org/viewvc/llvm-project?rev=47247&view=rev
> Log:
> Teach getModRefInfo that memcpy, memmove, and memset don't "capture"  
> memory addresses.
> Also, noalias arguments are be considered "like" stack allocated  
> ones for this purpose, because
> the only way they can be modref'ed is if they escape somewhere in  
> the current function.
>
> 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=47247&r1=47246&r2=47247&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original)
> +++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Sun Feb 17  
> 15:29:08 2008
> @@ -21,7 +21,7 @@
> #include "llvm/ParameterAttributes.h"
> #include "llvm/GlobalVariable.h"
> #include "llvm/Instructions.h"
> -#include "llvm/Intrinsics.h"
> +#include "llvm/IntrinsicInst.h"
> #include "llvm/Pass.h"
> #include "llvm/Target/TargetData.h"
> #include "llvm/ADT/SmallVector.h"
> @@ -228,6 +228,13 @@
>       // If returned, the address will escape to calling functions,  
> but no
>       // callees could modify it.
>       break; // next use
> +    case Instruction::Call:
> +      // If the call is to a few known safe intrinsics, we know  
> that it does
> +      // not escape
> +      if (isa<MemIntrinsic>(I))
> +        return false;
> +      else
> +        return true;
>     default:
>       return true;
>     }
> @@ -247,8 +254,11 @@
>     // Allocations and byval arguments are "new" objects.
>     if (Object &&
>         (isa<AllocationInst>(Object) ||
> -         (isa<Argument>(Object) && cast<Argument>(Object)- 
> >hasByValAttr()))) {
> -      // Okay, the pointer is to a stack allocated object.  If we  
> can prove that
> +         (isa<Argument>(Object) &&
> +                                 (cast<Argument>(Object)- 
> >hasByValAttr() ||
> +                                  cast<Argument>(Object)- 
> >hasNoAliasAttr())))) {
> +      // 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))
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list