1 //===- llvm/Transforms/Utils/OrderedInstructions.h -------------*- C++ -*-===// 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 defines an efficient way to check for dominance relation between 2 11 // instructions. 12 // 13 // This interface dispatches to appropriate dominance check given 2 14 // instructions, i.e. in case the instructions are in the same basic block, 15 // OrderedBasicBlock (with instruction numbering and caching) are used. 16 // Otherwise, dominator tree is used. 17 // 18 //===----------------------------------------------------------------------===// 19 20 #ifndef LLVM_TRANSFORMS_UTILS_ORDEREDINSTRUCTIONS_H 21 #define LLVM_TRANSFORMS_UTILS_ORDEREDINSTRUCTIONS_H 22 23 #include "llvm/ADT/DenseMap.h" 24 #include "llvm/Analysis/OrderedBasicBlock.h" 25 #include "llvm/IR/Dominators.h" 26 #include "llvm/IR/Operator.h" 27 28 namespace llvm { 29 30 class OrderedInstructions { 31 /// Used to check dominance for instructions in same basic block. 32 mutable DenseMap<const BasicBlock *, std::unique_ptr<OrderedBasicBlock>> 33 OBBMap; 34 35 /// The dominator tree of the parent function. 36 DominatorTree *DT; 37 38 public: 39 /// Constructor. 40 OrderedInstructions(DominatorTree *DT) : DT(DT) {} 41 42 /// Return true if first instruction dominates the second. 43 bool dominates(const Instruction *, const Instruction *) const; 44 45 /// Invalidate the OrderedBasicBlock cache when its basic block changes. 46 void invalidateBlock(BasicBlock *BB) { OBBMap.erase(BB); } 47 }; 48 49 } // end namespace llvm 50 51 #endif // LLVM_TRANSFORMS_UTILS_ORDEREDINSTRUCTIONS_H 52