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@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