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 |