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