[llvm-commits] [llvm] r139204 - in /llvm/trunk: lib/Analysis/BasicAliasAnalysis.cpp test/Analysis/BasicAA/memset_pattern.ll

Eli Friedman eli.friedman at gmail.com
Tue Sep 6 16:39:51 PDT 2011


On Tue, Sep 6, 2011 at 4:33 PM, Owen Anderson <resistor at mac.com> wrote:
> Author: resistor
> Date: Tue Sep  6 18:33:25 2011
> New Revision: 139204
>
> URL: http://llvm.org/viewvc/llvm-project?rev=139204&view=rev
> Log:
> Teach BasicAA about the aliasing properties of memset_pattern16.
> Fixes PR10872 and <rdar://problem/10065079>.
>
> Added:
>    llvm/trunk/test/Analysis/BasicAA/memset_pattern.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=139204&r1=139203&r2=139204&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original)
> +++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Tue Sep  6 18:33:25 2011
> @@ -30,6 +30,7 @@
>  #include "llvm/Analysis/InstructionSimplify.h"
>  #include "llvm/Analysis/ValueTracking.h"
>  #include "llvm/Target/TargetData.h"
> +#include "llvm/Target/TargetLibraryInfo.h"
>  #include "llvm/ADT/SmallPtrSet.h"
>  #include "llvm/ADT/SmallVector.h"
>  #include "llvm/Support/ErrorHandling.h"
> @@ -468,6 +469,7 @@
>
>     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
>       AU.addRequired<AliasAnalysis>();
> +      AU.addRequired<TargetLibraryInfo>();
>     }
>
>     virtual AliasResult alias(const Location &LocA,
> @@ -550,10 +552,15 @@
>
>  // Register this pass...
>  char BasicAliasAnalysis::ID = 0;
> -INITIALIZE_AG_PASS(BasicAliasAnalysis, AliasAnalysis, "basicaa",
> +INITIALIZE_AG_PASS_BEGIN(BasicAliasAnalysis, AliasAnalysis, "basicaa",
> +                   "Basic Alias Analysis (stateless AA impl)",
> +                   false, true, false)
> +INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
> +INITIALIZE_AG_PASS_END(BasicAliasAnalysis, AliasAnalysis, "basicaa",
>                    "Basic Alias Analysis (stateless AA impl)",
>                    false, true, false)
>
> +
>  ImmutablePass *llvm::createBasicAliasAnalysisPass() {
>   return new BasicAliasAnalysis();
>  }
> @@ -717,6 +724,7 @@
>       return NoModRef;
>   }
>
> +  const TargetLibraryInfo &TLI = getAnalysis<TargetLibraryInfo>();
>   ModRefResult Min = ModRef;
>
>   // Finally, handle specific knowledge of intrinsics.
> @@ -819,6 +827,37 @@
>     }
>     }
>
> +  // We can bound the aliasing properties of memset_pattern16 just as we can
> +  // for memcpy/memset.  This is particularly important because the
> +  // LoopIdiomRecognizer likes to turn loops into calls to memset_pattern16
> +  // whenever possible.
> +  else if (TLI.has(LibFunc::memset_pattern16) &&
> +           CS.getCalledFunction() &&
> +           CS.getCalledFunction()->getName() == "memset_pattern16") {
> +    const Function *MS = CS.getCalledFunction();
> +    FunctionType *MemsetType = MS->getFunctionType();
> +    if (!MemsetType->isVarArg() && MemsetType->getNumParams() == 3 &&
> +        isa<PointerType>(MemsetType->getParamType(0)) &&
> +        isa<PointerType>(MemsetType->getParamType(1)) &&
> +        isa<IntegerType>(MemsetType->getParamType(2))) {
> +      uint64_t Len = UnknownSize;
> +      if (const ConstantInt *LenCI = dyn_cast<ConstantInt>(CS.getArgument(2)))
> +        Len = LenCI->getZExtValue();
> +      const Value *Dest = CS.getArgument(0);
> +      const Value *Src = CS.getArgument(1);
> +      // If it can't overlap the source dest, then it doesn't modref the loc.
> +      if (isNoAlias(Location(Dest, Len), Loc)) {
> +        if (isNoAlias(Location(Src, 2), Loc))
> +          return NoModRef;
> +        // If it can't overlap the dest, then worst case it reads the loc.
> +        Min = Ref;
> +      } else if (isNoAlias(Location(Src, 2), Loc)) {
> +        // If it can't overlap the source, then worst case it mutates the loc.
> +        Min = Mod;

Where does the magic constant 2 come from?

-Eli




More information about the llvm-commits mailing list