Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===- MustExecute.h - Is an instruction known to execute--------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
/// \file
9
/// Contains a collection of routines for determining if a given instruction is
10
/// guaranteed to execute if a given point in control flow is reached. The most
11
/// common example is an instruction within a loop being provably executed if we
12
/// branch to the header of it's containing loop.
13
///
14
/// There are two interfaces available to determine if an instruction is
15
/// executed once a given point in the control flow is reached:
16
/// 1) A loop-centric one derived from LoopSafetyInfo.
17
/// 2) A "must be executed context"-based one implemented in the
18
///    MustBeExecutedContextExplorer.
19
/// Please refer to the class comments for more information.
20
///
21
//===----------------------------------------------------------------------===//
22
 
23
#ifndef LLVM_ANALYSIS_MUSTEXECUTE_H
24
#define LLVM_ANALYSIS_MUSTEXECUTE_H
25
 
26
#include "llvm/ADT/DenseMap.h"
27
#include "llvm/ADT/DenseSet.h"
28
#include "llvm/Analysis/EHPersonalities.h"
29
#include "llvm/Analysis/InstructionPrecedenceTracking.h"
30
#include "llvm/IR/PassManager.h"
31
 
32
namespace llvm {
33
 
34
namespace {
35
template <typename T> using GetterTy = std::function<T *(const Function &F)>;
36
}
37
 
38
class BasicBlock;
39
class DominatorTree;
40
class Instruction;
41
class Loop;
42
class LoopInfo;
43
class PostDominatorTree;
44
class raw_ostream;
45
 
46
/// Captures loop safety information.
47
/// It keep information for loop blocks may throw exception or otherwise
48
/// exit abnormally on any iteration of the loop which might actually execute
49
/// at runtime.  The primary way to consume this information is via
50
/// isGuaranteedToExecute below, but some callers bailout or fallback to
51
/// alternate reasoning if a loop contains any implicit control flow.
52
/// NOTE: LoopSafetyInfo contains cached information regarding loops and their
53
/// particular blocks. This information is only dropped on invocation of
54
/// computeLoopSafetyInfo. If the loop or any of its block is deleted, or if
55
/// any thrower instructions have been added or removed from them, or if the
56
/// control flow has changed, or in case of other meaningful modifications, the
57
/// LoopSafetyInfo needs to be recomputed. If a meaningful modifications to the
58
/// loop were made and the info wasn't recomputed properly, the behavior of all
59
/// methods except for computeLoopSafetyInfo is undefined.
60
class LoopSafetyInfo {
61
  // Used to update funclet bundle operands.
62
  DenseMap<BasicBlock *, ColorVector> BlockColors;
63
 
64
protected:
65
  /// Computes block colors.
66
  void computeBlockColors(const Loop *CurLoop);
67
 
68
public:
69
  /// Returns block colors map that is used to update funclet operand bundles.
70
  const DenseMap<BasicBlock *, ColorVector> &getBlockColors() const;
71
 
72
  /// Copy colors of block \p Old into the block \p New.
73
  void copyColors(BasicBlock *New, BasicBlock *Old);
74
 
75
  /// Returns true iff the block \p BB potentially may throw exception. It can
76
  /// be false-positive in cases when we want to avoid complex analysis.
77
  virtual bool blockMayThrow(const BasicBlock *BB) const = 0;
78
 
79
  /// Returns true iff any block of the loop for which this info is contains an
80
  /// instruction that may throw or otherwise exit abnormally.
81
  virtual bool anyBlockMayThrow() const = 0;
82
 
83
  /// Return true if we must reach the block \p BB under assumption that the
84
  /// loop \p CurLoop is entered.
85
  bool allLoopPathsLeadToBlock(const Loop *CurLoop, const BasicBlock *BB,
86
                               const DominatorTree *DT) const;
87
 
88
  /// Computes safety information for a loop checks loop body & header for
89
  /// the possibility of may throw exception, it takes LoopSafetyInfo and loop
90
  /// as argument. Updates safety information in LoopSafetyInfo argument.
91
  /// Note: This is defined to clear and reinitialize an already initialized
92
  /// LoopSafetyInfo.  Some callers rely on this fact.
93
  virtual void computeLoopSafetyInfo(const Loop *CurLoop) = 0;
94
 
95
  /// Returns true if the instruction in a loop is guaranteed to execute at
96
  /// least once (under the assumption that the loop is entered).
97
  virtual bool isGuaranteedToExecute(const Instruction &Inst,
98
                                     const DominatorTree *DT,
99
                                     const Loop *CurLoop) const = 0;
100
 
101
  LoopSafetyInfo() = default;
102
 
103
  virtual ~LoopSafetyInfo() = default;
104
};
105
 
106
 
107
/// Simple and conservative implementation of LoopSafetyInfo that can give
108
/// false-positive answers to its queries in order to avoid complicated
109
/// analysis.
110
class SimpleLoopSafetyInfo: public LoopSafetyInfo {
111
  bool MayThrow = false;       // The current loop contains an instruction which
112
                               // may throw.
113
  bool HeaderMayThrow = false; // Same as previous, but specific to loop header
114
 
115
public:
116
  bool blockMayThrow(const BasicBlock *BB) const override;
117
 
118
  bool anyBlockMayThrow() const override;
119
 
120
  void computeLoopSafetyInfo(const Loop *CurLoop) override;
121
 
122
  bool isGuaranteedToExecute(const Instruction &Inst,
123
                             const DominatorTree *DT,
124
                             const Loop *CurLoop) const override;
125
};
126
 
127
/// This implementation of LoopSafetyInfo use ImplicitControlFlowTracking to
128
/// give precise answers on "may throw" queries. This implementation uses cache
129
/// that should be invalidated by calling the methods insertInstructionTo and
130
/// removeInstruction whenever we modify a basic block's contents by adding or
131
/// removing instructions.
132
class ICFLoopSafetyInfo: public LoopSafetyInfo {
133
  bool MayThrow = false;       // The current loop contains an instruction which
134
                               // may throw.
135
  // Contains information about implicit control flow in this loop's blocks.
136
  mutable ImplicitControlFlowTracking ICF;
137
  // Contains information about instruction that may possibly write memory.
138
  mutable MemoryWriteTracking MW;
139
 
140
public:
141
  bool blockMayThrow(const BasicBlock *BB) const override;
142
 
143
  bool anyBlockMayThrow() const override;
144
 
145
  void computeLoopSafetyInfo(const Loop *CurLoop) override;
146
 
147
  bool isGuaranteedToExecute(const Instruction &Inst,
148
                             const DominatorTree *DT,
149
                             const Loop *CurLoop) const override;
150
 
151
  /// Returns true if we could not execute a memory-modifying instruction before
152
  /// we enter \p BB under assumption that \p CurLoop is entered.
153
  bool doesNotWriteMemoryBefore(const BasicBlock *BB, const Loop *CurLoop)
154
      const;
155
 
156
  /// Returns true if we could not execute a memory-modifying instruction before
157
  /// we execute \p I under assumption that \p CurLoop is entered.
158
  bool doesNotWriteMemoryBefore(const Instruction &I, const Loop *CurLoop)
159
      const;
160
 
161
  /// Inform the safety info that we are planning to insert a new instruction
162
  /// \p Inst into the basic block \p BB. It will make all cache updates to keep
163
  /// it correct after this insertion.
164
  void insertInstructionTo(const Instruction *Inst, const BasicBlock *BB);
165
 
166
  /// Inform safety info that we are planning to remove the instruction \p Inst
167
  /// from its block. It will make all cache updates to keep it correct after
168
  /// this removal.
169
  void removeInstruction(const Instruction *Inst);
170
};
171
 
172
bool mayContainIrreducibleControl(const Function &F, const LoopInfo *LI);
173
 
174
struct MustBeExecutedContextExplorer;
175
 
176
/// Enum that allows us to spell out the direction.
177
enum class ExplorationDirection {
178
  BACKWARD = 0,
179
  FORWARD = 1,
180
};
181
 
182
/// Must be executed iterators visit stretches of instructions that are
183
/// guaranteed to be executed together, potentially with other instruction
184
/// executed in-between.
185
///
186
/// Given the following code, and assuming all statements are single
187
/// instructions which transfer execution to the successor (see
188
/// isGuaranteedToTransferExecutionToSuccessor), there are two possible
189
/// outcomes. If we start the iterator at A, B, or E, we will visit only A, B,
190
/// and E. If we start at C or D, we will visit all instructions A-E.
191
///
192
/// \code
193
///   A;
194
///   B;
195
///   if (...) {
196
///     C;
197
///     D;
198
///   }
199
///   E;
200
/// \endcode
201
///
202
///
203
/// Below is the example extneded with instructions F and G. Now we assume F
204
/// might not transfer execution to it's successor G. As a result we get the
205
/// following visit sets:
206
///
207
/// Start Instruction   | Visit Set
208
/// A                   | A, B,       E, F
209
///    B                | A, B,       E, F
210
///       C             | A, B, C, D, E, F
211
///          D          | A, B, C, D, E, F
212
///             E       | A, B,       E, F
213
///                F    | A, B,       E, F
214
///                   G | A, B,       E, F, G
215
///
216
///
217
/// \code
218
///   A;
219
///   B;
220
///   if (...) {
221
///     C;
222
///     D;
223
///   }
224
///   E;
225
///   F;  // Might not transfer execution to its successor G.
226
///   G;
227
/// \endcode
228
///
229
///
230
/// A more complex example involving conditionals, loops, break, and continue
231
/// is shown below. We again assume all instructions will transmit control to
232
/// the successor and we assume we can prove the inner loop to be finite. We
233
/// omit non-trivial branch conditions as the exploration is oblivious to them.
234
/// Constant branches are assumed to be unconditional in the CFG. The resulting
235
/// visist sets are shown in the table below.
236
///
237
/// \code
238
///   A;
239
///   while (true) {
240
///     B;
241
///     if (...)
242
///       C;
243
///     if (...)
244
///       continue;
245
///     D;
246
///     if (...)
247
///       break;
248
///     do {
249
///       if (...)
250
///         continue;
251
///       E;
252
///     } while (...);
253
///     F;
254
///   }
255
///   G;
256
/// \endcode
257
///
258
/// Start Instruction    | Visit Set
259
/// A                    | A, B
260
///    B                 | A, B
261
///       C              | A, B, C
262
///          D           | A, B,    D
263
///             E        | A, B,    D, E, F
264
///                F     | A, B,    D,    F
265
///                   G  | A, B,    D,       G
266
///
267
///
268
/// Note that the examples show optimal visist sets but not necessarily the ones
269
/// derived by the explorer depending on the available CFG analyses (see
270
/// MustBeExecutedContextExplorer). Also note that we, depending on the options,
271
/// the visit set can contain instructions from other functions.
272
struct MustBeExecutedIterator {
273
  /// Type declarations that make his class an input iterator.
274
  ///{
275
  typedef const Instruction *value_type;
276
  typedef std::ptrdiff_t difference_type;
277
  typedef const Instruction **pointer;
278
  typedef const Instruction *&reference;
279
  typedef std::input_iterator_tag iterator_category;
280
  ///}
281
 
282
  using ExplorerTy = MustBeExecutedContextExplorer;
283
 
284
  MustBeExecutedIterator(const MustBeExecutedIterator &Other) = default;
285
 
286
  MustBeExecutedIterator(MustBeExecutedIterator &&Other)
287
      : Visited(std::move(Other.Visited)), Explorer(Other.Explorer),
288
        CurInst(Other.CurInst), Head(Other.Head), Tail(Other.Tail) {}
289
 
290
  MustBeExecutedIterator &operator=(MustBeExecutedIterator &&Other) {
291
    if (this != &Other) {
292
      std::swap(Visited, Other.Visited);
293
      std::swap(CurInst, Other.CurInst);
294
      std::swap(Head, Other.Head);
295
      std::swap(Tail, Other.Tail);
296
    }
297
    return *this;
298
  }
299
 
300
  ~MustBeExecutedIterator() = default;
301
 
302
  /// Pre- and post-increment operators.
303
  ///{
304
  MustBeExecutedIterator &operator++() {
305
    CurInst = advance();
306
    return *this;
307
  }
308
 
309
  MustBeExecutedIterator operator++(int) {
310
    MustBeExecutedIterator tmp(*this);
311
    operator++();
312
    return tmp;
313
  }
314
  ///}
315
 
316
  /// Equality and inequality operators. Note that we ignore the history here.
317
  ///{
318
  bool operator==(const MustBeExecutedIterator &Other) const {
319
    return CurInst == Other.CurInst && Head == Other.Head && Tail == Other.Tail;
320
  }
321
 
322
  bool operator!=(const MustBeExecutedIterator &Other) const {
323
    return !(*this == Other);
324
  }
325
  ///}
326
 
327
  /// Return the underlying instruction.
328
  const Instruction *&operator*() { return CurInst; }
329
  const Instruction *getCurrentInst() const { return CurInst; }
330
 
331
  /// Return true if \p I was encountered by this iterator already.
332
  bool count(const Instruction *I) const {
333
    return Visited.count({I, ExplorationDirection::FORWARD}) ||
334
           Visited.count({I, ExplorationDirection::BACKWARD});
335
  }
336
 
337
private:
338
  using VisitedSetTy =
339
      DenseSet<PointerIntPair<const Instruction *, 1, ExplorationDirection>>;
340
 
341
  /// Private constructors.
342
  MustBeExecutedIterator(ExplorerTy &Explorer, const Instruction *I);
343
 
344
  /// Reset the iterator to its initial state pointing at \p I.
345
  void reset(const Instruction *I);
346
 
347
  /// Reset the iterator to point at \p I, keep cached state.
348
  void resetInstruction(const Instruction *I);
349
 
350
  /// Try to advance one of the underlying positions (Head or Tail).
351
  ///
352
  /// \return The next instruction in the must be executed context, or nullptr
353
  ///         if none was found.
354
  const Instruction *advance();
355
 
356
  /// A set to track the visited instructions in order to deal with endless
357
  /// loops and recursion.
358
  VisitedSetTy Visited;
359
 
360
  /// A reference to the explorer that created this iterator.
361
  ExplorerTy &Explorer;
362
 
363
  /// The instruction we are currently exposing to the user. There is always an
364
  /// instruction that we know is executed with the given program point,
365
  /// initially the program point itself.
366
  const Instruction *CurInst;
367
 
368
  /// Two positions that mark the program points where this iterator will look
369
  /// for the next instruction. Note that the current instruction is either the
370
  /// one pointed to by Head, Tail, or both.
371
  const Instruction *Head, *Tail;
372
 
373
  friend struct MustBeExecutedContextExplorer;
374
};
375
 
376
/// A "must be executed context" for a given program point PP is the set of
377
/// instructions, potentially before and after PP, that are executed always when
378
/// PP is reached. The MustBeExecutedContextExplorer an interface to explore
379
/// "must be executed contexts" in a module through the use of
380
/// MustBeExecutedIterator.
381
///
382
/// The explorer exposes "must be executed iterators" that traverse the must be
383
/// executed context. There is little information sharing between iterators as
384
/// the expected use case involves few iterators for "far apart" instructions.
385
/// If that changes, we should consider caching more intermediate results.
386
struct MustBeExecutedContextExplorer {
387
 
388
  /// In the description of the parameters we use PP to denote a program point
389
  /// for which the must be executed context is explored, or put differently,
390
  /// for which the MustBeExecutedIterator is created.
391
  ///
392
  /// \param ExploreInterBlock    Flag to indicate if instructions in blocks
393
  ///                             other than the parent of PP should be
394
  ///                             explored.
395
  /// \param ExploreCFGForward    Flag to indicate if instructions located after
396
  ///                             PP in the CFG, e.g., post-dominating PP,
397
  ///                             should be explored.
398
  /// \param ExploreCFGBackward   Flag to indicate if instructions located
399
  ///                             before PP in the CFG, e.g., dominating PP,
400
  ///                             should be explored.
401
  MustBeExecutedContextExplorer(
402
      bool ExploreInterBlock, bool ExploreCFGForward, bool ExploreCFGBackward,
403
      GetterTy<const LoopInfo> LIGetter =
404
          [](const Function &) { return nullptr; },
405
      GetterTy<const DominatorTree> DTGetter =
406
          [](const Function &) { return nullptr; },
407
      GetterTy<const PostDominatorTree> PDTGetter =
408
          [](const Function &) { return nullptr; })
409
      : ExploreInterBlock(ExploreInterBlock),
410
        ExploreCFGForward(ExploreCFGForward),
411
        ExploreCFGBackward(ExploreCFGBackward), LIGetter(LIGetter),
412
        DTGetter(DTGetter), PDTGetter(PDTGetter), EndIterator(*this, nullptr) {}
413
 
414
  /// Iterator-based interface. \see MustBeExecutedIterator.
415
  ///{
416
  using iterator = MustBeExecutedIterator;
417
  using const_iterator = const MustBeExecutedIterator;
418
 
419
  /// Return an iterator to explore the context around \p PP.
420
  iterator &begin(const Instruction *PP) {
421
    auto &It = InstructionIteratorMap[PP];
422
    if (!It)
423
      It.reset(new iterator(*this, PP));
424
    return *It;
425
  }
426
 
427
  /// Return an iterator to explore the cached context around \p PP.
428
  const_iterator &begin(const Instruction *PP) const {
429
    return *InstructionIteratorMap.find(PP)->second;
430
  }
431
 
432
  /// Return an universal end iterator.
433
  ///{
434
  iterator &end() { return EndIterator; }
435
  iterator &end(const Instruction *) { return EndIterator; }
436
 
437
  const_iterator &end() const { return EndIterator; }
438
  const_iterator &end(const Instruction *) const { return EndIterator; }
439
  ///}
440
 
441
  /// Return an iterator range to explore the context around \p PP.
442
  llvm::iterator_range<iterator> range(const Instruction *PP) {
443
    return llvm::make_range(begin(PP), end(PP));
444
  }
445
 
446
  /// Return an iterator range to explore the cached context around \p PP.
447
  llvm::iterator_range<const_iterator> range(const Instruction *PP) const {
448
    return llvm::make_range(begin(PP), end(PP));
449
  }
450
  ///}
451
 
452
  /// Check \p Pred on all instructions in the context.
453
  ///
454
  /// This method will evaluate \p Pred and return
455
  /// true if \p Pred holds in every instruction.
456
  bool checkForAllContext(const Instruction *PP,
457
                          function_ref<bool(const Instruction *)> Pred) {
458
    for (auto EIt = begin(PP), EEnd = end(PP); EIt != EEnd; ++EIt)
459
      if (!Pred(*EIt))
460
        return false;
461
    return true;
462
  }
463
 
464
  /// Helper to look for \p I in the context of \p PP.
465
  ///
466
  /// The context is expanded until \p I was found or no more expansion is
467
  /// possible.
468
  ///
469
  /// \returns True, iff \p I was found.
470
  bool findInContextOf(const Instruction *I, const Instruction *PP) {
471
    auto EIt = begin(PP), EEnd = end(PP);
472
    return findInContextOf(I, EIt, EEnd);
473
  }
474
 
475
  /// Helper to look for \p I in the context defined by \p EIt and \p EEnd.
476
  ///
477
  /// The context is expanded until \p I was found or no more expansion is
478
  /// possible.
479
  ///
480
  /// \returns True, iff \p I was found.
481
  bool findInContextOf(const Instruction *I, iterator &EIt, iterator &EEnd) {
482
    bool Found = EIt.count(I);
483
    while (!Found && EIt != EEnd)
484
      Found = (++EIt).getCurrentInst() == I;
485
    return Found;
486
  }
487
 
488
  /// Return the next instruction that is guaranteed to be executed after \p PP.
489
  ///
490
  /// \param It              The iterator that is used to traverse the must be
491
  ///                        executed context.
492
  /// \param PP              The program point for which the next instruction
493
  ///                        that is guaranteed to execute is determined.
494
  const Instruction *
495
  getMustBeExecutedNextInstruction(MustBeExecutedIterator &It,
496
                                   const Instruction *PP);
497
  /// Return the previous instr. that is guaranteed to be executed before \p PP.
498
  ///
499
  /// \param It              The iterator that is used to traverse the must be
500
  ///                        executed context.
501
  /// \param PP              The program point for which the previous instr.
502
  ///                        that is guaranteed to execute is determined.
503
  const Instruction *
504
  getMustBeExecutedPrevInstruction(MustBeExecutedIterator &It,
505
                                   const Instruction *PP);
506
 
507
  /// Find the next join point from \p InitBB in forward direction.
508
  const BasicBlock *findForwardJoinPoint(const BasicBlock *InitBB);
509
 
510
  /// Find the next join point from \p InitBB in backward direction.
511
  const BasicBlock *findBackwardJoinPoint(const BasicBlock *InitBB);
512
 
513
  /// Parameter that limit the performed exploration. See the constructor for
514
  /// their meaning.
515
  ///{
516
  const bool ExploreInterBlock;
517
  const bool ExploreCFGForward;
518
  const bool ExploreCFGBackward;
519
  ///}
520
 
521
private:
522
  /// Getters for common CFG analyses: LoopInfo, DominatorTree, and
523
  /// PostDominatorTree.
524
  ///{
525
  GetterTy<const LoopInfo> LIGetter;
526
  GetterTy<const DominatorTree> DTGetter;
527
  GetterTy<const PostDominatorTree> PDTGetter;
528
  ///}
529
 
530
  /// Map to cache isGuaranteedToTransferExecutionToSuccessor results.
531
  DenseMap<const BasicBlock *, std::optional<bool>> BlockTransferMap;
532
 
533
  /// Map to cache containsIrreducibleCFG results.
534
  DenseMap<const Function *, std::optional<bool>> IrreducibleControlMap;
535
 
536
  /// Map from instructions to associated must be executed iterators.
537
  DenseMap<const Instruction *, std::unique_ptr<MustBeExecutedIterator>>
538
      InstructionIteratorMap;
539
 
540
  /// A unique end iterator.
541
  MustBeExecutedIterator EndIterator;
542
};
543
 
544
class MustExecutePrinterPass : public PassInfoMixin<MustExecutePrinterPass> {
545
  raw_ostream &OS;
546
 
547
public:
548
  MustExecutePrinterPass(raw_ostream &OS) : OS(OS) {}
549
  PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
550
};
551
 
552
class MustBeExecutedContextPrinterPass
553
    : public PassInfoMixin<MustBeExecutedContextPrinterPass> {
554
  raw_ostream &OS;
555
 
556
public:
557
  MustBeExecutedContextPrinterPass(raw_ostream &OS) : OS(OS) {}
558
  PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
559
};
560
 
561
} // namespace llvm
562
 
563
#endif