LLVM  8.0.1
CaptureTracking.cpp
Go to the documentation of this file.
1 //===--- CaptureTracking.cpp - Determine whether a pointer is captured ----===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains routines that help determine which pointers are captured.
11 // A pointer value is captured if the function makes a copy of any part of the
12 // pointer that outlives the call. Not being captured means, more or less, that
13 // the pointer is only dereferenced and not stored in a global. Returning part
14 // of the pointer as the function return value may or may not count as capturing
15 // the pointer, depending on the context.
16 //
17 //===----------------------------------------------------------------------===//
18 
20 #include "llvm/ADT/SmallSet.h"
21 #include "llvm/ADT/SmallVector.h"
23 #include "llvm/Analysis/CFG.h"
26 #include "llvm/IR/Constants.h"
27 #include "llvm/IR/Dominators.h"
28 #include "llvm/IR/Instructions.h"
29 #include "llvm/IR/IntrinsicInst.h"
30 
31 using namespace llvm;
32 
34 
35 bool CaptureTracker::shouldExplore(const Use *U) { return true; }
36 
37 namespace {
38  struct SimpleCaptureTracker : public CaptureTracker {
39  explicit SimpleCaptureTracker(bool ReturnCaptures)
40  : ReturnCaptures(ReturnCaptures), Captured(false) {}
41 
42  void tooManyUses() override { Captured = true; }
43 
44  bool captured(const Use *U) override {
45  if (isa<ReturnInst>(U->getUser()) && !ReturnCaptures)
46  return false;
47 
48  Captured = true;
49  return true;
50  }
51 
52  bool ReturnCaptures;
53 
54  bool Captured;
55  };
56 
57  /// Only find pointer captures which happen before the given instruction. Uses
58  /// the dominator tree to determine whether one instruction is before another.
59  /// Only support the case where the Value is defined in the same basic block
60  /// as the given instruction and the use.
61  struct CapturesBefore : public CaptureTracker {
62 
63  CapturesBefore(bool ReturnCaptures, const Instruction *I, const DominatorTree *DT,
64  bool IncludeI, OrderedBasicBlock *IC)
65  : OrderedBB(IC), BeforeHere(I), DT(DT),
66  ReturnCaptures(ReturnCaptures), IncludeI(IncludeI), Captured(false) {}
67 
68  void tooManyUses() override { Captured = true; }
69 
70  bool isSafeToPrune(Instruction *I) {
71  BasicBlock *BB = I->getParent();
72  // We explore this usage only if the usage can reach "BeforeHere".
73  // If use is not reachable from entry, there is no need to explore.
74  if (BeforeHere != I && !DT->isReachableFromEntry(BB))
75  return true;
76 
77  // Compute the case where both instructions are inside the same basic
78  // block. Since instructions in the same BB as BeforeHere are numbered in
79  // 'OrderedBB', avoid using 'dominates' and 'isPotentiallyReachable'
80  // which are very expensive for large basic blocks.
81  if (BB == BeforeHere->getParent()) {
82  // 'I' dominates 'BeforeHere' => not safe to prune.
83  //
84  // The value defined by an invoke dominates an instruction only
85  // if it dominates every instruction in UseBB. A PHI is dominated only
86  // if the instruction dominates every possible use in the UseBB. Since
87  // UseBB == BB, avoid pruning.
88  if (isa<InvokeInst>(BeforeHere) || isa<PHINode>(I) || I == BeforeHere)
89  return false;
90  if (!OrderedBB->dominates(BeforeHere, I))
91  return false;
92 
93  // 'BeforeHere' comes before 'I', it's safe to prune if we also
94  // guarantee that 'I' never reaches 'BeforeHere' through a back-edge or
95  // by its successors, i.e, prune if:
96  //
97  // (1) BB is an entry block or have no successors.
98  // (2) There's no path coming back through BB successors.
99  if (BB == &BB->getParent()->getEntryBlock() ||
101  return true;
102 
104  Worklist.append(succ_begin(BB), succ_end(BB));
105  return !isPotentiallyReachableFromMany(Worklist, BB, DT);
106  }
107 
108  // If the value is defined in the same basic block as use and BeforeHere,
109  // there is no need to explore the use if BeforeHere dominates use.
110  // Check whether there is a path from I to BeforeHere.
111  if (BeforeHere != I && DT->dominates(BeforeHere, I) &&
112  !isPotentiallyReachable(I, BeforeHere, DT))
113  return true;
114 
115  return false;
116  }
117 
118  bool shouldExplore(const Use *U) override {
119  Instruction *I = cast<Instruction>(U->getUser());
120 
121  if (BeforeHere == I && !IncludeI)
122  return false;
123 
124  if (isSafeToPrune(I))
125  return false;
126 
127  return true;
128  }
129 
130  bool captured(const Use *U) override {
131  if (isa<ReturnInst>(U->getUser()) && !ReturnCaptures)
132  return false;
133 
134  if (!shouldExplore(U))
135  return false;
136 
137  Captured = true;
138  return true;
139  }
140 
141  OrderedBasicBlock *OrderedBB;
142  const Instruction *BeforeHere;
143  const DominatorTree *DT;
144 
145  bool ReturnCaptures;
146  bool IncludeI;
147 
148  bool Captured;
149  };
150 }
151 
152 /// PointerMayBeCaptured - Return true if this pointer value may be captured
153 /// by the enclosing function (which is required to exist). This routine can
154 /// be expensive, so consider caching the results. The boolean ReturnCaptures
155 /// specifies whether returning the value (or part of it) from the function
156 /// counts as capturing it or not. The boolean StoreCaptures specified whether
157 /// storing the value (or part of it) into memory anywhere automatically
158 /// counts as capturing it or not.
160  bool ReturnCaptures, bool StoreCaptures,
161  unsigned MaxUsesToExplore) {
162  assert(!isa<GlobalValue>(V) &&
163  "It doesn't make sense to ask whether a global is captured.");
164 
165  // TODO: If StoreCaptures is not true, we could do Fancy analysis
166  // to determine whether this store is not actually an escape point.
167  // In that case, BasicAliasAnalysis should be updated as well to
168  // take advantage of this.
169  (void)StoreCaptures;
170 
171  SimpleCaptureTracker SCT(ReturnCaptures);
172  PointerMayBeCaptured(V, &SCT, MaxUsesToExplore);
173  return SCT.Captured;
174 }
175 
176 /// PointerMayBeCapturedBefore - Return true if this pointer value may be
177 /// captured by the enclosing function (which is required to exist). If a
178 /// DominatorTree is provided, only captures which happen before the given
179 /// instruction are considered. This routine can be expensive, so consider
180 /// caching the results. The boolean ReturnCaptures specifies whether
181 /// returning the value (or part of it) from the function counts as capturing
182 /// it or not. The boolean StoreCaptures specified whether storing the value
183 /// (or part of it) into memory anywhere automatically counts as capturing it
184 /// or not. A ordered basic block \p OBB can be used in order to speed up
185 /// queries about relative order among instructions in the same basic block.
186 bool llvm::PointerMayBeCapturedBefore(const Value *V, bool ReturnCaptures,
187  bool StoreCaptures, const Instruction *I,
188  const DominatorTree *DT, bool IncludeI,
189  OrderedBasicBlock *OBB,
190  unsigned MaxUsesToExplore) {
191  assert(!isa<GlobalValue>(V) &&
192  "It doesn't make sense to ask whether a global is captured.");
193  bool UseNewOBB = OBB == nullptr;
194 
195  if (!DT)
196  return PointerMayBeCaptured(V, ReturnCaptures, StoreCaptures,
197  MaxUsesToExplore);
198  if (UseNewOBB)
199  OBB = new OrderedBasicBlock(I->getParent());
200 
201  // TODO: See comment in PointerMayBeCaptured regarding what could be done
202  // with StoreCaptures.
203 
204  CapturesBefore CB(ReturnCaptures, I, DT, IncludeI, OBB);
205  PointerMayBeCaptured(V, &CB, MaxUsesToExplore);
206 
207  if (UseNewOBB)
208  delete OBB;
209  return CB.Captured;
210 }
211 
213  unsigned MaxUsesToExplore) {
214  assert(V->getType()->isPointerTy() && "Capture is for pointers only!");
217 
218  auto AddUses = [&](const Value *V) {
219  unsigned Count = 0;
220  for (const Use &U : V->uses()) {
221  // If there are lots of uses, conservatively say that the value
222  // is captured to avoid taking too much compile time.
223  if (Count++ >= MaxUsesToExplore)
224  return Tracker->tooManyUses();
225  if (!Visited.insert(&U).second)
226  continue;
227  if (!Tracker->shouldExplore(&U))
228  continue;
229  Worklist.push_back(&U);
230  }
231  };
232  AddUses(V);
233 
234  while (!Worklist.empty()) {
235  const Use *U = Worklist.pop_back_val();
236  Instruction *I = cast<Instruction>(U->getUser());
237  V = U->get();
238 
239  switch (I->getOpcode()) {
240  case Instruction::Call:
241  case Instruction::Invoke: {
242  auto *Call = cast<CallBase>(I);
243  // Not captured if the callee is readonly, doesn't return a copy through
244  // its return value and doesn't unwind (a readonly function can leak bits
245  // by throwing an exception or not depending on the input value).
246  if (Call->onlyReadsMemory() && Call->doesNotThrow() &&
247  Call->getType()->isVoidTy())
248  break;
249 
250  // The pointer is not captured if returned pointer is not captured.
251  // NOTE: CaptureTracking users should not assume that only functions
252  // marked with nocapture do not capture. This means that places like
253  // GetUnderlyingObject in ValueTracking or DecomposeGEPExpression
254  // in BasicAA also need to know about this property.
256  AddUses(Call);
257  break;
258  }
259 
260  // Volatile operations effectively capture the memory location that they
261  // load and store to.
262  if (auto *MI = dyn_cast<MemIntrinsic>(Call))
263  if (MI->isVolatile())
264  if (Tracker->captured(U))
265  return;
266 
267  // Not captured if only passed via 'nocapture' arguments. Note that
268  // calling a function pointer does not in itself cause the pointer to
269  // be captured. This is a subtle point considering that (for example)
270  // the callee might return its own address. It is analogous to saying
271  // that loading a value from a pointer does not cause the pointer to be
272  // captured, even though the loaded value might be the pointer itself
273  // (think of self-referential objects).
274  for (auto IdxOpPair : enumerate(Call->data_ops())) {
275  int Idx = IdxOpPair.index();
276  Value *A = IdxOpPair.value();
277  if (A == V && !Call->doesNotCapture(Idx))
278  // The parameter is not marked 'nocapture' - captured.
279  if (Tracker->captured(U))
280  return;
281  }
282  break;
283  }
284  case Instruction::Load:
285  // Volatile loads make the address observable.
286  if (cast<LoadInst>(I)->isVolatile())
287  if (Tracker->captured(U))
288  return;
289  break;
290  case Instruction::VAArg:
291  // "va-arg" from a pointer does not cause it to be captured.
292  break;
293  case Instruction::Store:
294  // Stored the pointer - conservatively assume it may be captured.
295  // Volatile stores make the address observable.
296  if (V == I->getOperand(0) || cast<StoreInst>(I)->isVolatile())
297  if (Tracker->captured(U))
298  return;
299  break;
300  case Instruction::AtomicRMW: {
301  // atomicrmw conceptually includes both a load and store from
302  // the same location.
303  // As with a store, the location being accessed is not captured,
304  // but the value being stored is.
305  // Volatile stores make the address observable.
306  auto *ARMWI = cast<AtomicRMWInst>(I);
307  if (ARMWI->getValOperand() == V || ARMWI->isVolatile())
308  if (Tracker->captured(U))
309  return;
310  break;
311  }
312  case Instruction::AtomicCmpXchg: {
313  // cmpxchg conceptually includes both a load and store from
314  // the same location.
315  // As with a store, the location being accessed is not captured,
316  // but the value being stored is.
317  // Volatile stores make the address observable.
318  auto *ACXI = cast<AtomicCmpXchgInst>(I);
319  if (ACXI->getCompareOperand() == V || ACXI->getNewValOperand() == V ||
320  ACXI->isVolatile())
321  if (Tracker->captured(U))
322  return;
323  break;
324  }
325  case Instruction::BitCast:
326  case Instruction::GetElementPtr:
327  case Instruction::PHI:
328  case Instruction::Select:
329  case Instruction::AddrSpaceCast:
330  // The original value is not captured via this if the new value isn't.
331  AddUses(I);
332  break;
333  case Instruction::ICmp: {
334  // Don't count comparisons of a no-alias return value against null as
335  // captures. This allows us to ignore comparisons of malloc results
336  // with null, for example.
337  if (ConstantPointerNull *CPN =
338  dyn_cast<ConstantPointerNull>(I->getOperand(1)))
339  if (CPN->getType()->getAddressSpace() == 0)
340  if (isNoAliasCall(V->stripPointerCasts()))
341  break;
342  // Comparison against value stored in global variable. Given the pointer
343  // does not escape, its value cannot be guessed and stored separately in a
344  // global variable.
345  unsigned OtherIndex = (I->getOperand(0) == V) ? 1 : 0;
346  auto *LI = dyn_cast<LoadInst>(I->getOperand(OtherIndex));
347  if (LI && isa<GlobalVariable>(LI->getPointerOperand()))
348  break;
349  // Otherwise, be conservative. There are crazy ways to capture pointers
350  // using comparisons.
351  if (Tracker->captured(U))
352  return;
353  break;
354  }
355  default:
356  // Something else - be conservative and say it is captured.
357  if (Tracker->captured(U))
358  return;
359  break;
360  }
361  }
362 
363  // All uses examined.
364 }
iterator_range< use_iterator > uses()
Definition: Value.h:355
virtual void tooManyUses()=0
tooManyUses - The depth of traversal has breached a limit.
This callback is used in conjunction with PointerMayBeCaptured.
This class represents lattice values for constants.
Definition: AllocatorList.h:24
bool isIntrinsicReturningPointerAliasingArgumentWithoutCapturing(const CallBase *Call)
virtual bool shouldExplore(const Use *U)
shouldExplore - This is the use of a value derived from the pointer.
bool isNoAliasCall(const Value *V)
Return true if this pointer is returned by a noalias function.
An instruction for reading from memory.
Definition: Instructions.h:168
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Definition: BasicBlock.cpp:138
bool isReachableFromEntry(const Use &U) const
Provide an overload for a Use.
Definition: Dominators.cpp:300
A Use represents the edge between a Value definition and its users.
Definition: Use.h:56
virtual bool captured(const Use *U)=0
captured - Information about the pointer was captured by the user of use U.
Interval::succ_iterator succ_begin(Interval *I)
succ_begin/succ_end - define methods so that Intervals may be used just like BasicBlocks can with the...
Definition: Interval.h:103
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:245
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
Definition: Instruction.h:126
bool PointerMayBeCapturedBefore(const Value *V, bool ReturnCaptures, bool StoreCaptures, const Instruction *I, const DominatorTree *DT, bool IncludeI=false, OrderedBasicBlock *OBB=nullptr, unsigned MaxUsesToExplore=DefaultMaxUsesToExplore)
PointerMayBeCapturedBefore - Return true if this pointer value may be captured by the enclosing funct...
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree...
Definition: Dominators.h:145
unsigned getNumSuccessors() const
Return the number of successors that this instruction has.
Value * getOperand(unsigned i) const
Definition: User.h:170
Interval::succ_iterator succ_end(Interval *I)
Definition: Interval.h:106
const BasicBlock & getEntryBlock() const
Definition: Function.h:640
LLVM Basic Block Representation.
Definition: BasicBlock.h:58
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
Definition: SmallSet.h:135
This file contains the declarations for the subclasses of Constant, which represent the different fla...
bool isPointerTy() const
True if this is an instance of PointerType.
Definition: Type.h:224
bool isPotentiallyReachable(const Instruction *From, const Instruction *To, const DominatorTree *DT=nullptr, const LoopInfo *LI=nullptr)
Determine whether instruction &#39;To&#39; is reachable from &#39;From&#39;, returning true if uncertain.
Definition: CFG.cpp:187
std::pair< NoneType, bool > insert(const T &V)
insert - Insert an element into the set if it isn&#39;t already there.
Definition: SmallSet.h:181
This is a &#39;vector&#39; (really, a variable-sized array), optimized for the case when the array is small...
Definition: SmallVector.h:847
bool dominates(const Instruction *Def, const Use &U) const
Return true if Def dominates a use in User.
Definition: Dominators.cpp:249
A constant pointer value that points to null.
Definition: Constants.h:539
void append(in_iter in_start, in_iter in_end)
Add the specified range to the end of the SmallVector.
Definition: SmallVector.h:394
const Function * getParent() const
Return the enclosing method, or null if none.
Definition: BasicBlock.h:107
#define I(x, y, z)
Definition: MD5.cpp:58
LLVM_NODISCARD std::enable_if<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
Definition: Casting.h:323
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
LLVM Value Representation.
Definition: Value.h:73
IRTranslator LLVM IR MI
static bool isVolatile(Instruction *Inst)
bool isPotentiallyReachableFromMany(SmallVectorImpl< BasicBlock *> &Worklist, BasicBlock *StopBB, const DominatorTree *DT=nullptr, const LoopInfo *LI=nullptr)
Determine whether there is at least one path from a block in &#39;Worklist&#39; to &#39;StopBB&#39;, returning true if uncertain.
Definition: CFG.cpp:131
detail::enumerator< R > enumerate(R &&TheRange)
Given an input range, returns a new range whose values are are pair (A,B) such that A is the 0-based ...
Definition: STLExtras.h:1517
const BasicBlock * getParent() const
Definition: Instruction.h:67
bool PointerMayBeCaptured(const Value *V, bool ReturnCaptures, bool StoreCaptures, unsigned MaxUsesToExplore=DefaultMaxUsesToExplore)
PointerMayBeCaptured - Return true if this pointer value may be captured by the enclosing function (w...