153ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner//===- AliasAnalysis.cpp - Generic Alias Analysis Interface Implementation -==//
22b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman//
3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//                     The LLVM Compiler Infrastructure
4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
72b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman//
8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===//
953ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner//
1053ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner// This file implements the generic AliasAnalysis interface which is used as the
1153ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner// common interface used by all clients and implementations of alias analysis.
1253ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner//
1353ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner// This file also implements the default version of the AliasAnalysis interface
1453ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner// that is to be used when no other implementation is specified.  This does some
1553ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner// simple tests that detect obvious cases: two different global pointers cannot
1653ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner// alias, a global cannot alias a malloc, two different mallocs cannot alias,
1753ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner// etc.
1853ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner//
1953ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner// This alias analysis implementation really isn't very good for anything, but
2053ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner// it is very fast, and makes a nice clean default implementation.  Because it
2153ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner// handles lots of little corner cases, other, more complex, alias analysis
2253ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner// implementations may choose to rely on this pass to resolve these simple and
2353ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner// easy cases.
2453ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner//
2553ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner//===----------------------------------------------------------------------===//
2653ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner
27d501c13b7d6ce418b0144886dde16525d13f835aChris Lattner#include "llvm/Analysis/AliasAnalysis.h"
28f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/Analysis/BasicAliasAnalysis.h"
2981e480463d8bb57776d03cebfd083762909023f1Nick Lewycky#include "llvm/Analysis/CFG.h"
30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Analysis/CFLAndersAliasAnalysis.h"
31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Analysis/CFLSteensAliasAnalysis.h"
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Analysis/CaptureTracking.h"
33f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/Analysis/GlobalsModRef.h"
34f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/Analysis/ObjCARCAliasAnalysis.h"
35f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
36f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/Analysis/ScopedNoAliasAA.h"
37ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Analysis/TargetLibraryInfo.h"
38f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/Analysis/TypeBasedAliasAnalysis.h"
393a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier#include "llvm/Analysis/ValueTracking.h"
400b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/BasicBlock.h"
410b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h"
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Dominators.h"
430b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h"
440b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h"
450b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/IntrinsicInst.h"
460b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/LLVMContext.h"
470b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Type.h"
48d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Pass.h"
49992860c44ed8d8b82c6b7fde6645123772965c65Chris Lattnerusing namespace llvm;
50d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
51f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// Allow disabling BasicAA from the AA results. This is particularly useful
52f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// when testing to isolate a single AA implementation.
53f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarstatic cl::opt<bool> DisableBasicAA("disable-basicaa", cl::Hidden,
54f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                    cl::init(false));
55f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarAAResults::AAResults(AAResults &&Arg) : TLI(Arg.TLI), AAs(std::move(Arg.AAs)) {
57f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (auto &AA : AAs)
58f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    AA->setAAResults(this);
59f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
60f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
61f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarAAResults::~AAResults() {
62f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// FIXME; It would be nice to at least clear out the pointers back to this
63f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// aggregation here, but we end up with non-nesting lifetimes in the legacy
64f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// pass manager that prevent this from working. In the legacy pass manager
65f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// we'll end up with dangling references here in some cases.
66f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#if 0
67f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (auto &AA : AAs)
68f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    AA->setAAResults(nullptr);
69f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#endif
70f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
7153ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner
725a24d70d99cc76be190ed6ebe37d09585046ddc3Chris Lattner//===----------------------------------------------------------------------===//
735a24d70d99cc76be190ed6ebe37d09585046ddc3Chris Lattner// Default chaining methods
745a24d70d99cc76be190ed6ebe37d09585046ddc3Chris Lattner//===----------------------------------------------------------------------===//
755a24d70d99cc76be190ed6ebe37d09585046ddc3Chris Lattner
76f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarAliasResult AAResults::alias(const MemoryLocation &LocA,
77f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                             const MemoryLocation &LocB) {
78f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (const auto &AA : AAs) {
79f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    auto Result = AA->alias(LocA, LocB);
80f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (Result != MayAlias)
81f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return Result;
82f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
83f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return MayAlias;
845a24d70d99cc76be190ed6ebe37d09585046ddc3Chris Lattner}
855a24d70d99cc76be190ed6ebe37d09585046ddc3Chris Lattner
86f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool AAResults::pointsToConstantMemory(const MemoryLocation &Loc,
87f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                       bool OrLocal) {
88f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (const auto &AA : AAs)
89f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (AA->pointsToConstantMemory(Loc, OrLocal))
90f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return true;
915a24d70d99cc76be190ed6ebe37d09585046ddc3Chris Lattner
92f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return false;
93c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}
94c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
95f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarModRefInfo AAResults::getArgModRefInfo(ImmutableCallSite CS, unsigned ArgIdx) {
96f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ModRefInfo Result = MRI_ModRef;
975a24d70d99cc76be190ed6ebe37d09585046ddc3Chris Lattner
98f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (const auto &AA : AAs) {
99f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    Result = ModRefInfo(Result & AA->getArgModRefInfo(CS, ArgIdx));
1005a24d70d99cc76be190ed6ebe37d09585046ddc3Chris Lattner
101f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // Early-exit the moment we reach the bottom of the lattice.
102f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (Result == MRI_NoModRef)
103f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return Result;
104f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
105f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
106f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return Result;
107ab6acc6ecdc4585a55059e36d81481d1c26d3ff9Owen Anderson}
108ab6acc6ecdc4585a55059e36d81481d1c26d3ff9Owen Anderson
109f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarModRefInfo AAResults::getModRefInfo(Instruction *I, ImmutableCallSite Call) {
1100c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  // We may have two calls
1110c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (auto CS = ImmutableCallSite(I)) {
1120c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // Check if the two calls modify the same memory
113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return getModRefInfo(CS, Call);
1140c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  } else {
1150c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // Otherwise, check if the call modifies or references the
1160c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // location this memory access defines.  The best we can say
1170c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // is that if the call references what this instruction
1180c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // defines, it must be clobbered by this location.
119f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const MemoryLocation DefLoc = MemoryLocation::get(I);
120f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (getModRefInfo(Call, DefLoc) != MRI_NoModRef)
121f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return MRI_ModRef;
1220c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
123f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return MRI_NoModRef;
1240c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
125ab6acc6ecdc4585a55059e36d81481d1c26d3ff9Owen Anderson
126f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarModRefInfo AAResults::getModRefInfo(ImmutableCallSite CS,
127f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                    const MemoryLocation &Loc) {
128f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ModRefInfo Result = MRI_ModRef;
1296ce9d8b0edaf7c59f5a7c52d506c2801004698f0Dan Gohman
130f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (const auto &AA : AAs) {
131f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    Result = ModRefInfo(Result & AA->getModRefInfo(CS, Loc));
1326ce9d8b0edaf7c59f5a7c52d506c2801004698f0Dan Gohman
133f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // Early-exit the moment we reach the bottom of the lattice.
134f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (Result == MRI_NoModRef)
135f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return Result;
136f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
1376ce9d8b0edaf7c59f5a7c52d506c2801004698f0Dan Gohman
138de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Try to refine the mod-ref info further using other API entry points to the
139de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // aggregate set of AA results.
140de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto MRB = getModRefBehavior(CS);
141de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (MRB == FMRB_DoesNotAccessMemory)
142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return MRI_NoModRef;
143de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
144de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (onlyReadsMemory(MRB))
145de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Result = ModRefInfo(Result & MRI_Ref);
146de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  else if (doesNotReadMemory(MRB))
147de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Result = ModRefInfo(Result & MRI_Mod);
148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
149de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (onlyAccessesArgPointees(MRB)) {
150de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    bool DoesAlias = false;
151de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ModRefInfo AllArgsMask = MRI_NoModRef;
152de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (doesAccessArgPointees(MRB)) {
153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      for (auto AI = CS.arg_begin(), AE = CS.arg_end(); AI != AE; ++AI) {
154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        const Value *Arg = *AI;
155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        if (!Arg->getType()->isPointerTy())
156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          continue;
157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        unsigned ArgIdx = std::distance(CS.arg_begin(), AI);
158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        MemoryLocation ArgLoc = MemoryLocation::getForArgument(CS, ArgIdx, TLI);
159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        AliasResult ArgAlias = alias(ArgLoc, Loc);
160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        if (ArgAlias != NoAlias) {
161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          ModRefInfo ArgMask = getArgModRefInfo(CS, ArgIdx);
162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          DoesAlias = true;
163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          AllArgsMask = ModRefInfo(AllArgsMask | ArgMask);
164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        }
165de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      }
166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!DoesAlias)
168de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return MRI_NoModRef;
169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Result = ModRefInfo(Result & AllArgsMask);
170de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
172de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // If Loc is a constant memory location, the call definitely could not
173de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // modify the memory location.
174de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if ((Result & MRI_Mod) &&
175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      pointsToConstantMemory(Loc, /*OrLocal*/ false))
176de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Result = ModRefInfo(Result & ~MRI_Mod);
177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
178f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return Result;
1796ce9d8b0edaf7c59f5a7c52d506c2801004698f0Dan Gohman}
1806ce9d8b0edaf7c59f5a7c52d506c2801004698f0Dan Gohman
181f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarModRefInfo AAResults::getModRefInfo(ImmutableCallSite CS1,
182f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                    ImmutableCallSite CS2) {
183f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ModRefInfo Result = MRI_ModRef;
1846ce9d8b0edaf7c59f5a7c52d506c2801004698f0Dan Gohman
185f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (const auto &AA : AAs) {
186f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    Result = ModRefInfo(Result & AA->getModRefInfo(CS1, CS2));
1876ce9d8b0edaf7c59f5a7c52d506c2801004698f0Dan Gohman
188f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // Early-exit the moment we reach the bottom of the lattice.
189f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (Result == MRI_NoModRef)
190f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return Result;
191f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
1926ce9d8b0edaf7c59f5a7c52d506c2801004698f0Dan Gohman
193de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Try to refine the mod-ref info further using other API entry points to the
194de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // aggregate set of AA results.
195de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
196de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // If CS1 or CS2 are readnone, they don't interact.
197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto CS1B = getModRefBehavior(CS1);
198de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (CS1B == FMRB_DoesNotAccessMemory)
199de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return MRI_NoModRef;
200de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
201de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto CS2B = getModRefBehavior(CS2);
202de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (CS2B == FMRB_DoesNotAccessMemory)
203de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return MRI_NoModRef;
204de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
205de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // If they both only read from memory, there is no dependence.
206de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (onlyReadsMemory(CS1B) && onlyReadsMemory(CS2B))
207de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return MRI_NoModRef;
208de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
209de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // If CS1 only reads memory, the only dependence on CS2 can be
210de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // from CS1 reading memory written by CS2.
211de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (onlyReadsMemory(CS1B))
212de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Result = ModRefInfo(Result & MRI_Ref);
213de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  else if (doesNotReadMemory(CS1B))
214de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Result = ModRefInfo(Result & MRI_Mod);
215de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
216de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // If CS2 only access memory through arguments, accumulate the mod/ref
217de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // information from CS1's references to the memory referenced by
218de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // CS2's arguments.
219de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (onlyAccessesArgPointees(CS2B)) {
220de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ModRefInfo R = MRI_NoModRef;
221de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (doesAccessArgPointees(CS2B)) {
222de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      for (auto I = CS2.arg_begin(), E = CS2.arg_end(); I != E; ++I) {
223de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        const Value *Arg = *I;
224de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        if (!Arg->getType()->isPointerTy())
225de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          continue;
226de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        unsigned CS2ArgIdx = std::distance(CS2.arg_begin(), I);
227de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        auto CS2ArgLoc = MemoryLocation::getForArgument(CS2, CS2ArgIdx, TLI);
228de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
229de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        // ArgMask indicates what CS2 might do to CS2ArgLoc, and the dependence
230de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        // of CS1 on that location is the inverse.
231de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        ModRefInfo ArgMask = getArgModRefInfo(CS2, CS2ArgIdx);
232de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        if (ArgMask == MRI_Mod)
233de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          ArgMask = MRI_ModRef;
234de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        else if (ArgMask == MRI_Ref)
235de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          ArgMask = MRI_Mod;
236de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
237de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        ArgMask = ModRefInfo(ArgMask & getModRefInfo(CS1, CS2ArgLoc));
238de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
239de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        R = ModRefInfo((R | ArgMask) & Result);
240de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        if (R == Result)
241de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          break;
242de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      }
243de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
244de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return R;
245de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
246de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
247de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // If CS1 only accesses memory through arguments, check if CS2 references
248de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // any of the memory referenced by CS1's arguments. If not, return NoModRef.
249de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (onlyAccessesArgPointees(CS1B)) {
250de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ModRefInfo R = MRI_NoModRef;
251de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (doesAccessArgPointees(CS1B)) {
252de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      for (auto I = CS1.arg_begin(), E = CS1.arg_end(); I != E; ++I) {
253de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        const Value *Arg = *I;
254de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        if (!Arg->getType()->isPointerTy())
255de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          continue;
256de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        unsigned CS1ArgIdx = std::distance(CS1.arg_begin(), I);
257de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        auto CS1ArgLoc = MemoryLocation::getForArgument(CS1, CS1ArgIdx, TLI);
258de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
259de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        // ArgMask indicates what CS1 might do to CS1ArgLoc; if CS1 might Mod
260de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        // CS1ArgLoc, then we care about either a Mod or a Ref by CS2. If CS1
261de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        // might Ref, then we care only about a Mod by CS2.
262de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        ModRefInfo ArgMask = getArgModRefInfo(CS1, CS1ArgIdx);
263de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        ModRefInfo ArgR = getModRefInfo(CS2, CS1ArgLoc);
264de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        if (((ArgMask & MRI_Mod) != MRI_NoModRef &&
265de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar             (ArgR & MRI_ModRef) != MRI_NoModRef) ||
266de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar            ((ArgMask & MRI_Ref) != MRI_NoModRef &&
267de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar             (ArgR & MRI_Mod) != MRI_NoModRef))
268de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          R = ModRefInfo((R | ArgMask) & Result);
269de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
270de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        if (R == Result)
271de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          break;
272de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      }
273de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
274de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return R;
275de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
276de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
277f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return Result;
2786ce9d8b0edaf7c59f5a7c52d506c2801004698f0Dan Gohman}
2796ce9d8b0edaf7c59f5a7c52d506c2801004698f0Dan Gohman
280f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarFunctionModRefBehavior AAResults::getModRefBehavior(ImmutableCallSite CS) {
281f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  FunctionModRefBehavior Result = FMRB_UnknownModRefBehavior;
2826ce9d8b0edaf7c59f5a7c52d506c2801004698f0Dan Gohman
283f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (const auto &AA : AAs) {
284f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    Result = FunctionModRefBehavior(Result & AA->getModRefBehavior(CS));
2856ce9d8b0edaf7c59f5a7c52d506c2801004698f0Dan Gohman
286f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // Early-exit the moment we reach the bottom of the lattice.
287f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (Result == FMRB_DoesNotAccessMemory)
288f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return Result;
289f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
2906ce9d8b0edaf7c59f5a7c52d506c2801004698f0Dan Gohman
291f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return Result;
2926ce9d8b0edaf7c59f5a7c52d506c2801004698f0Dan Gohman}
2936ce9d8b0edaf7c59f5a7c52d506c2801004698f0Dan Gohman
294f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarFunctionModRefBehavior AAResults::getModRefBehavior(const Function *F) {
295f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  FunctionModRefBehavior Result = FMRB_UnknownModRefBehavior;
296f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
297f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (const auto &AA : AAs) {
298f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    Result = FunctionModRefBehavior(Result & AA->getModRefBehavior(F));
299f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
300f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // Early-exit the moment we reach the bottom of the lattice.
301f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (Result == FMRB_DoesNotAccessMemory)
302f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return Result;
303f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
304f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
305f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return Result;
3065a24d70d99cc76be190ed6ebe37d09585046ddc3Chris Lattner}
3075a24d70d99cc76be190ed6ebe37d09585046ddc3Chris Lattner
3085a24d70d99cc76be190ed6ebe37d09585046ddc3Chris Lattner//===----------------------------------------------------------------------===//
309f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// Helper method implementation
3105a24d70d99cc76be190ed6ebe37d09585046ddc3Chris Lattner//===----------------------------------------------------------------------===//
3115a24d70d99cc76be190ed6ebe37d09585046ddc3Chris Lattner
312f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarModRefInfo AAResults::getModRefInfo(const LoadInst *L,
313f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                    const MemoryLocation &Loc) {
314667ccf231b57857ea9e36f1d93bd895242d58284Eli Friedman  // Be conservative in the face of volatile/atomic.
315667ccf231b57857ea9e36f1d93bd895242d58284Eli Friedman  if (!L->isUnordered())
316f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return MRI_ModRef;
317b9db52dcbcf4279270eab972f3d560b4e5654260Dan Gohman
31814a498a48677eb1eaddd8329330df073224f9575Dan Gohman  // If the load address doesn't alias the given address, it doesn't read
31914a498a48677eb1eaddd8329330df073224f9575Dan Gohman  // or write the specified memory.
3206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (Loc.Ptr && !alias(MemoryLocation::get(L), Loc))
321f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return MRI_NoModRef;
32214a498a48677eb1eaddd8329330df073224f9575Dan Gohman
32314a498a48677eb1eaddd8329330df073224f9575Dan Gohman  // Otherwise, a load just reads.
324f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return MRI_Ref;
32514ac877e0a898ab46eeba1b0b72b8e5a9918179fChris Lattner}
32653ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner
327f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarModRefInfo AAResults::getModRefInfo(const StoreInst *S,
328f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                    const MemoryLocation &Loc) {
329667ccf231b57857ea9e36f1d93bd895242d58284Eli Friedman  // Be conservative in the face of volatile/atomic.
330667ccf231b57857ea9e36f1d93bd895242d58284Eli Friedman  if (!S->isUnordered())
331f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return MRI_ModRef;
332b9db52dcbcf4279270eab972f3d560b4e5654260Dan Gohman
3330c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (Loc.Ptr) {
3340c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // If the store address cannot alias the pointer in question, then the
3350c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // specified memory cannot be modified by the store.
3366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (!alias(MemoryLocation::get(S), Loc))
337f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return MRI_NoModRef;
338f4d904d7e326c9cbed497ca681b6270170fd2020Chris Lattner
3390c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // If the pointer is a pointer to constant memory, then it could not have
3400c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // been modified by this store.
3410c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (pointsToConstantMemory(Loc))
342f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return MRI_NoModRef;
3430c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
34414a498a48677eb1eaddd8329330df073224f9575Dan Gohman
34514a498a48677eb1eaddd8329330df073224f9575Dan Gohman  // Otherwise, a store just writes.
346f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return MRI_Mod;
34753ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner}
34853ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner
349f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarModRefInfo AAResults::getModRefInfo(const VAArgInst *V,
350f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                    const MemoryLocation &Loc) {
351e26a7b5e21a49543a727b1b2524a934e73c89772Dan Gohman
3526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (Loc.Ptr) {
3536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // If the va_arg address cannot alias the pointer in question, then the
3546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // specified memory cannot be accessed by the va_arg.
3556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (!alias(MemoryLocation::get(V), Loc))
356f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return MRI_NoModRef;
3576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // If the pointer is a pointer to constant memory, then it could not have
3596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // been modified by this va_arg.
3606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (pointsToConstantMemory(Loc))
361f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return MRI_NoModRef;
3626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
363e26a7b5e21a49543a727b1b2524a934e73c89772Dan Gohman
364e26a7b5e21a49543a727b1b2524a934e73c89772Dan Gohman  // Otherwise, a va_arg reads and writes.
365f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return MRI_ModRef;
366f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
367f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
368f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarModRefInfo AAResults::getModRefInfo(const CatchPadInst *CatchPad,
369f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                    const MemoryLocation &Loc) {
370f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (Loc.Ptr) {
371f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // If the pointer is a pointer to constant memory,
372f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // then it could not have been modified by this catchpad.
373f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (pointsToConstantMemory(Loc))
374f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return MRI_NoModRef;
375f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
376f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
377f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Otherwise, a catchpad reads and writes.
378f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return MRI_ModRef;
379f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
380f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
381f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarModRefInfo AAResults::getModRefInfo(const CatchReturnInst *CatchRet,
382f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                    const MemoryLocation &Loc) {
383f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (Loc.Ptr) {
384f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // If the pointer is a pointer to constant memory,
385f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // then it could not have been modified by this catchpad.
386f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (pointsToConstantMemory(Loc))
387f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return MRI_NoModRef;
388f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
389f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
390f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Otherwise, a catchret reads and writes.
391f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return MRI_ModRef;
392e26a7b5e21a49543a727b1b2524a934e73c89772Dan Gohman}
393e26a7b5e21a49543a727b1b2524a934e73c89772Dan Gohman
394f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarModRefInfo AAResults::getModRefInfo(const AtomicCmpXchgInst *CX,
395f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                    const MemoryLocation &Loc) {
39646cb5afdcd031c371c78201fb34291d9d48b2ee4Eli Friedman  // Acquire/Release cmpxchg has properties that matter for arbitrary addresses.
397de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (isStrongerThanMonotonic(CX->getSuccessOrdering()))
398f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return MRI_ModRef;
39946cb5afdcd031c371c78201fb34291d9d48b2ee4Eli Friedman
40046cb5afdcd031c371c78201fb34291d9d48b2ee4Eli Friedman  // If the cmpxchg address does not alias the location, it does not access it.
4016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (Loc.Ptr && !alias(MemoryLocation::get(CX), Loc))
402f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return MRI_NoModRef;
40346cb5afdcd031c371c78201fb34291d9d48b2ee4Eli Friedman
404f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return MRI_ModRef;
40546cb5afdcd031c371c78201fb34291d9d48b2ee4Eli Friedman}
40646cb5afdcd031c371c78201fb34291d9d48b2ee4Eli Friedman
407f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarModRefInfo AAResults::getModRefInfo(const AtomicRMWInst *RMW,
408f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                    const MemoryLocation &Loc) {
40946cb5afdcd031c371c78201fb34291d9d48b2ee4Eli Friedman  // Acquire/Release atomicrmw has properties that matter for arbitrary addresses.
410de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (isStrongerThanMonotonic(RMW->getOrdering()))
411f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return MRI_ModRef;
41246cb5afdcd031c371c78201fb34291d9d48b2ee4Eli Friedman
41346cb5afdcd031c371c78201fb34291d9d48b2ee4Eli Friedman  // If the atomicrmw address does not alias the location, it does not access it.
4146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (Loc.Ptr && !alias(MemoryLocation::get(RMW), Loc))
415f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return MRI_NoModRef;
41646cb5afdcd031c371c78201fb34291d9d48b2ee4Eli Friedman
417f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return MRI_ModRef;
41846cb5afdcd031c371c78201fb34291d9d48b2ee4Eli Friedman}
41946cb5afdcd031c371c78201fb34291d9d48b2ee4Eli Friedman
420f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// \brief Return information about whether a particular call site modifies
421f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// or reads the specified memory location \p MemLoc before instruction \p I
422f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// in a BasicBlock. A ordered basic block \p OBB can be used to speed up
423f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// instruction-ordering queries inside the BasicBlock containing \p I.
424f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// FIXME: this is really just shoring-up a deficiency in alias analysis.
425f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// BasicAA isn't willing to spend linear time determining whether an alloca
426f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// was captured before or after this particular call, while we are. However,
427f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// with a smarter AA in place, this test is just wasting compile time.
428f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarModRefInfo AAResults::callCapturesBefore(const Instruction *I,
429f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                         const MemoryLocation &MemLoc,
430f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                         DominatorTree *DT,
431f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                         OrderedBasicBlock *OBB) {
4324c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (!DT)
433f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return MRI_ModRef;
4343a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier
435f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const Value *Object =
436f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      GetUnderlyingObject(MemLoc.Ptr, I->getModule()->getDataLayout());
4373a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier  if (!isIdentifiedObject(Object) || isa<GlobalValue>(Object) ||
4383a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier      isa<Constant>(Object))
439f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return MRI_ModRef;
4403a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier
4413a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier  ImmutableCallSite CS(I);
4423a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier  if (!CS.getInstruction() || CS.getInstruction() == Object)
443f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return MRI_ModRef;
4443a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier
44537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (llvm::PointerMayBeCapturedBefore(Object, /* ReturnCaptures */ true,
44637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                       /* StoreCaptures */ true, I, DT,
447f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                       /* include Object */ true,
448f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                       /* OrderedBasicBlock */ OBB))
449f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return MRI_ModRef;
4503a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier
4513a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier  unsigned ArgNo = 0;
452f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ModRefInfo R = MRI_NoModRef;
453de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (auto CI = CS.data_operands_begin(), CE = CS.data_operands_end();
4543a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier       CI != CE; ++CI, ++ArgNo) {
4553a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier    // Only look at the no-capture or byval pointer arguments.  If this
4563a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier    // pointer were passed to arguments that were neither of these, then it
4573a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier    // couldn't be no-capture.
4583a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier    if (!(*CI)->getType()->isPointerTy() ||
4593a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier        (!CS.doesNotCapture(ArgNo) && !CS.isByValArgument(ArgNo)))
4603a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier      continue;
4613a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier
4623a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier    // If this is a no-capture pointer argument, see if we can tell that it
4633a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier    // is impossible to alias the pointer we're checking.  If not, we have to
4643a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier    // assume that the call could touch the pointer, even though it doesn't
4653a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier    // escape.
466f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (isNoAlias(MemoryLocation(*CI), MemoryLocation(Object)))
46737ade2b8015d86e73c62ab48a2ce5f0ce10de708Nick Lewycky      continue;
46837ade2b8015d86e73c62ab48a2ce5f0ce10de708Nick Lewycky    if (CS.doesNotAccessMemory(ArgNo))
46937ade2b8015d86e73c62ab48a2ce5f0ce10de708Nick Lewycky      continue;
47037ade2b8015d86e73c62ab48a2ce5f0ce10de708Nick Lewycky    if (CS.onlyReadsMemory(ArgNo)) {
471f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      R = MRI_Ref;
47237ade2b8015d86e73c62ab48a2ce5f0ce10de708Nick Lewycky      continue;
4733a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier    }
474f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return MRI_ModRef;
4753a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier  }
47637ade2b8015d86e73c62ab48a2ce5f0ce10de708Nick Lewycky  return R;
4773a884f5c17ac32e34e7e62b4602a0d73eeda1ce8Chad Rosier}
47846cb5afdcd031c371c78201fb34291d9d48b2ee4Eli Friedman
47914ac877e0a898ab46eeba1b0b72b8e5a9918179fChris Lattner/// canBasicBlockModify - Return true if it is possible for execution of the
480ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// specified basic block to modify the location Loc.
48114ac877e0a898ab46eeba1b0b72b8e5a9918179fChris Lattner///
482f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool AAResults::canBasicBlockModify(const BasicBlock &BB,
483f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                    const MemoryLocation &Loc) {
484f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return canInstructionRangeModRef(BB.front(), BB.back(), Loc, MRI_Mod);
48553ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner}
48653ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner
487ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// canInstructionRangeModRef - Return true if it is possible for the
488ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// execution of the specified instructions to mod\ref (according to the
489ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// mode) the location Loc. The instructions to consider are all
490ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// of the instructions in the range of [I1,I2] INCLUSIVE.
4916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// I1 and I2 must be in the same basic block.
492f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool AAResults::canInstructionRangeModRef(const Instruction &I1,
493f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                          const Instruction &I2,
494f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                          const MemoryLocation &Loc,
495f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                          const ModRefInfo Mode) {
49653ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner  assert(I1.getParent() == I2.getParent() &&
49753ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner         "Instructions not in same basic block!");
498f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  BasicBlock::const_iterator I = I1.getIterator();
499f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  BasicBlock::const_iterator E = I2.getIterator();
50053ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner  ++E;  // Convert from inclusive to exclusive range.
50153ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner
50214ac877e0a898ab46eeba1b0b72b8e5a9918179fChris Lattner  for (; I != E; ++I) // Check every instruction in range
503f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (getModRefInfo(&*I, Loc) & Mode)
50453ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner      return true;
50553ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner  return false;
50653ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner}
50753ad0edd361c724df623c082a8a37eaf762d1703Chris Lattner
508f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// Provide a definition for the root virtual destructor.
509f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarAAResults::Concept::~Concept() {}
510f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
511de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Provide a definition for the static object used to identify passes.
512de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarchar AAManager::PassID;
513de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
514f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarnamespace {
515f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// A wrapper pass for external alias analyses. This just squirrels away the
516f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// callback used to run any analyses and register their results.
517f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarstruct ExternalAAWrapperPass : ImmutablePass {
518f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef std::function<void(Pass &, Function &, AAResults &)> CallbackT;
519f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
520f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  CallbackT CB;
521f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
522f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  static char ID;
523f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
524f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ExternalAAWrapperPass() : ImmutablePass(ID) {
525f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    initializeExternalAAWrapperPassPass(*PassRegistry::getPassRegistry());
526f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
527f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  explicit ExternalAAWrapperPass(CallbackT CB)
528f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      : ImmutablePass(ID), CB(std::move(CB)) {
529f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    initializeExternalAAWrapperPassPass(*PassRegistry::getPassRegistry());
530f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
531f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
532f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void getAnalysisUsage(AnalysisUsage &AU) const override {
533f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    AU.setPreservesAll();
534f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
535f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar};
536f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
537f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
538f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarchar ExternalAAWrapperPass::ID = 0;
539f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarINITIALIZE_PASS(ExternalAAWrapperPass, "external-aa", "External Alias Analysis",
540f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                false, true)
541f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
542f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarImmutablePass *
543f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarllvm::createExternalAAWrapperPass(ExternalAAWrapperPass::CallbackT Callback) {
544f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return new ExternalAAWrapperPass(std::move(Callback));
545f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
546f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
547f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarAAResultsWrapperPass::AAResultsWrapperPass() : FunctionPass(ID) {
548f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  initializeAAResultsWrapperPassPass(*PassRegistry::getPassRegistry());
549f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
550f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
551f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarchar AAResultsWrapperPass::ID = 0;
552f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
553f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarINITIALIZE_PASS_BEGIN(AAResultsWrapperPass, "aa",
554f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                      "Function Alias Analysis Results", false, true)
555f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarINITIALIZE_PASS_DEPENDENCY(BasicAAWrapperPass)
556de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarINITIALIZE_PASS_DEPENDENCY(CFLAndersAAWrapperPass)
557de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarINITIALIZE_PASS_DEPENDENCY(CFLSteensAAWrapperPass)
558f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarINITIALIZE_PASS_DEPENDENCY(ExternalAAWrapperPass)
559f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarINITIALIZE_PASS_DEPENDENCY(GlobalsAAWrapperPass)
560f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarINITIALIZE_PASS_DEPENDENCY(ObjCARCAAWrapperPass)
561f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarINITIALIZE_PASS_DEPENDENCY(SCEVAAWrapperPass)
562f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarINITIALIZE_PASS_DEPENDENCY(ScopedNoAliasAAWrapperPass)
563f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarINITIALIZE_PASS_DEPENDENCY(TypeBasedAAWrapperPass)
564f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarINITIALIZE_PASS_END(AAResultsWrapperPass, "aa",
565f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                    "Function Alias Analysis Results", false, true)
566f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
567f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarFunctionPass *llvm::createAAResultsWrapperPass() {
568f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return new AAResultsWrapperPass();
569f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
570f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
571f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// Run the wrapper pass to rebuild an aggregation over known AA passes.
572f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar///
573f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// This is the legacy pass manager's interface to the new-style AA results
574f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// aggregation object. Because this is somewhat shoe-horned into the legacy
575f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// pass manager, we hard code all the specific alias analyses available into
576f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// it. While the particular set enabled is configured via commandline flags,
577f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// adding a new alias analysis to LLVM will require adding support for it to
578f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// this list.
579f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool AAResultsWrapperPass::runOnFunction(Function &F) {
580f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // NB! This *must* be reset before adding new AA results to the new
581f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // AAResults object because in the legacy pass manager, each instance
582f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // of these will refer to the *same* immutable analyses, registering and
583f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // unregistering themselves with them. We need to carefully tear down the
584f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // previous object first, in this case replacing it with an empty one, before
585f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // registering new results.
586de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  AAR.reset(
587de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      new AAResults(getAnalysis<TargetLibraryInfoWrapperPass>().getTLI()));
588f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
589f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // BasicAA is always available for function analyses. Also, we add it first
590f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // so that it can trump TBAA results when it proves MustAlias.
591f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // FIXME: TBAA should have an explicit mode to support this and then we
592f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // should reconsider the ordering here.
593f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!DisableBasicAA)
594f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    AAR->addAAResult(getAnalysis<BasicAAWrapperPass>().getResult());
595f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
596f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Populate the results with the currently available AAs.
597f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (auto *WrapperPass = getAnalysisIfAvailable<ScopedNoAliasAAWrapperPass>())
598f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    AAR->addAAResult(WrapperPass->getResult());
599f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (auto *WrapperPass = getAnalysisIfAvailable<TypeBasedAAWrapperPass>())
600f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    AAR->addAAResult(WrapperPass->getResult());
601f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (auto *WrapperPass =
602f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          getAnalysisIfAvailable<objcarc::ObjCARCAAWrapperPass>())
603f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    AAR->addAAResult(WrapperPass->getResult());
604f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (auto *WrapperPass = getAnalysisIfAvailable<GlobalsAAWrapperPass>())
605f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    AAR->addAAResult(WrapperPass->getResult());
606f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (auto *WrapperPass = getAnalysisIfAvailable<SCEVAAWrapperPass>())
607f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    AAR->addAAResult(WrapperPass->getResult());
608de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (auto *WrapperPass = getAnalysisIfAvailable<CFLAndersAAWrapperPass>())
609de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    AAR->addAAResult(WrapperPass->getResult());
610de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (auto *WrapperPass = getAnalysisIfAvailable<CFLSteensAAWrapperPass>())
611f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    AAR->addAAResult(WrapperPass->getResult());
612f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
613f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // If available, run an external AA providing callback over the results as
614f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // well.
615f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (auto *WrapperPass = getAnalysisIfAvailable<ExternalAAWrapperPass>())
616f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (WrapperPass->CB)
617f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      WrapperPass->CB(*this, F, *AAR);
618f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
619f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Analyses don't mutate the IR, so return false.
620f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return false;
621f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
622f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
623f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid AAResultsWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
624f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  AU.setPreservesAll();
625f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  AU.addRequired<BasicAAWrapperPass>();
626de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  AU.addRequired<TargetLibraryInfoWrapperPass>();
627f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
628f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // We also need to mark all the alias analysis passes we will potentially
629f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // probe in runOnFunction as used here to ensure the legacy pass manager
630f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // preserves them. This hard coding of lists of alias analyses is specific to
631f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // the legacy pass manager.
632f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  AU.addUsedIfAvailable<ScopedNoAliasAAWrapperPass>();
633f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  AU.addUsedIfAvailable<TypeBasedAAWrapperPass>();
634f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  AU.addUsedIfAvailable<objcarc::ObjCARCAAWrapperPass>();
635f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  AU.addUsedIfAvailable<GlobalsAAWrapperPass>();
636f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  AU.addUsedIfAvailable<SCEVAAWrapperPass>();
637de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  AU.addUsedIfAvailable<CFLAndersAAWrapperPass>();
638de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  AU.addUsedIfAvailable<CFLSteensAAWrapperPass>();
639f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
640f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
641f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarAAResults llvm::createLegacyPMAAResults(Pass &P, Function &F,
642f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                        BasicAAResult &BAR) {
643de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  AAResults AAR(P.getAnalysis<TargetLibraryInfoWrapperPass>().getTLI());
644f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
645f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Add in our explicitly constructed BasicAA results.
646f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!DisableBasicAA)
647f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    AAR.addAAResult(BAR);
648f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
649f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Populate the results with the other currently available AAs.
650f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (auto *WrapperPass =
651f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          P.getAnalysisIfAvailable<ScopedNoAliasAAWrapperPass>())
652f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    AAR.addAAResult(WrapperPass->getResult());
653f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (auto *WrapperPass = P.getAnalysisIfAvailable<TypeBasedAAWrapperPass>())
654f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    AAR.addAAResult(WrapperPass->getResult());
655f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (auto *WrapperPass =
656f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          P.getAnalysisIfAvailable<objcarc::ObjCARCAAWrapperPass>())
657f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    AAR.addAAResult(WrapperPass->getResult());
658f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (auto *WrapperPass = P.getAnalysisIfAvailable<GlobalsAAWrapperPass>())
659f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    AAR.addAAResult(WrapperPass->getResult());
660de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (auto *WrapperPass = P.getAnalysisIfAvailable<CFLAndersAAWrapperPass>())
661f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    AAR.addAAResult(WrapperPass->getResult());
662de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (auto *WrapperPass = P.getAnalysisIfAvailable<CFLSteensAAWrapperPass>())
663f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    AAR.addAAResult(WrapperPass->getResult());
664f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
665f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return AAR;
666f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
667f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
668a5f81bba4ab18d6129774d4d67495f14b6f64375Dan Gohmanbool llvm::isNoAliasCall(const Value *V) {
669f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (auto CS = ImmutableCallSite(V))
670f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return CS.paramHasAttr(0, Attribute::NoAlias);
671a5f81bba4ab18d6129774d4d67495f14b6f64375Dan Gohman  return false;
672a5f81bba4ab18d6129774d4d67495f14b6f64375Dan Gohman}
673a5f81bba4ab18d6129774d4d67495f14b6f64375Dan Gohman
674de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool llvm::isNoAliasArgument(const Value *V) {
6759f5de6dadcdb9922ad8c8135a29e4abccec11671Michael Kuperstein  if (const Argument *A = dyn_cast<Argument>(V))
6769f5de6dadcdb9922ad8c8135a29e4abccec11671Michael Kuperstein    return A->hasNoAliasAttr();
6779f5de6dadcdb9922ad8c8135a29e4abccec11671Michael Kuperstein  return false;
6789f5de6dadcdb9922ad8c8135a29e4abccec11671Michael Kuperstein}
6799f5de6dadcdb9922ad8c8135a29e4abccec11671Michael Kuperstein
6809e86f4364b912ae743490ba01d6989acfd12c046Dan Gohmanbool llvm::isIdentifiedObject(const Value *V) {
6816be2bd516a3022721480f8fee6986617baf0944fDan Gohman  if (isa<AllocaInst>(V))
6825753a4a0033da4add45f2e9930a4e1159d92a869Dan Gohman    return true;
6835753a4a0033da4add45f2e9930a4e1159d92a869Dan Gohman  if (isa<GlobalValue>(V) && !isa<GlobalAlias>(V))
684a5f81bba4ab18d6129774d4d67495f14b6f64375Dan Gohman    return true;
6859e86f4364b912ae743490ba01d6989acfd12c046Dan Gohman  if (isNoAliasCall(V))
6869e86f4364b912ae743490ba01d6989acfd12c046Dan Gohman    return true;
6879e86f4364b912ae743490ba01d6989acfd12c046Dan Gohman  if (const Argument *A = dyn_cast<Argument>(V))
6889e86f4364b912ae743490ba01d6989acfd12c046Dan Gohman    return A->hasNoAliasAttr() || A->hasByValAttr();
689a5f81bba4ab18d6129774d4d67495f14b6f64375Dan Gohman  return false;
690a5f81bba4ab18d6129774d4d67495f14b6f64375Dan Gohman}
69137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
692de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool llvm::isIdentifiedFunctionLocal(const Value *V) {
69337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return isa<AllocaInst>(V) || isNoAliasCall(V) || isNoAliasArgument(V);
69437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
695de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
696de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid llvm::getAAResultsAnalysisUsage(AnalysisUsage &AU) {
697de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // This function needs to be in sync with llvm::createLegacyPMAAResults -- if
698de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // more alias analyses are added to llvm::createLegacyPMAAResults, they need
699de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // to be added here also.
700de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  AU.addRequired<TargetLibraryInfoWrapperPass>();
701de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  AU.addUsedIfAvailable<ScopedNoAliasAAWrapperPass>();
702de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  AU.addUsedIfAvailable<TypeBasedAAWrapperPass>();
703de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  AU.addUsedIfAvailable<objcarc::ObjCARCAAWrapperPass>();
704de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  AU.addUsedIfAvailable<GlobalsAAWrapperPass>();
705de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  AU.addUsedIfAvailable<CFLAndersAAWrapperPass>();
706de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  AU.addUsedIfAvailable<CFLSteensAAWrapperPass>();
707de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
708