X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=include%2Fllvm%2FCodeGen%2FMachineBasicBlock.h;h=8aac7b1fd13b2c31d748adb142b3ae99e9abfcd3;hp=118836ecbf6b610c7fd74f48a18cbe2fb6d2ca2b;hb=fbf4c2b2e1b9e9d78bab2a199ab5082205aed9ae;hpb=d9a08b08acd738f88fbe5aadbb43bc1c37912fbb diff --git a/include/llvm/CodeGen/MachineBasicBlock.h b/include/llvm/CodeGen/MachineBasicBlock.h index 118836ecbf6..8aac7b1fd13 100644 --- a/include/llvm/CodeGen/MachineBasicBlock.h +++ b/include/llvm/CodeGen/MachineBasicBlock.h @@ -16,6 +16,7 @@ #include "llvm/ADT/GraphTraits.h" #include "llvm/CodeGen/MachineInstr.h" +#include "llvm/MC/MCRegisterInfo.h" #include "llvm/Support/DataTypes.h" #include @@ -25,6 +26,7 @@ class Pass; class BasicBlock; class MachineFunction; class MCSymbol; +class MIPrinter; class SlotIndexes; class StringRef; class raw_ostream; @@ -66,33 +68,30 @@ class MachineBasicBlock : public ilist_node { int Number; MachineFunction *xParent; - /// Predecessors/Successors - Keep track of the predecessor / successor - /// basicblocks. + /// Keep track of the predecessor / successor basic blocks. std::vector Predecessors; std::vector Successors; - /// Weights - Keep track of the weights to the successors. This vector - /// has the same order as Successors, or it is empty if we don't use it - /// (disable optimization). + /// Keep track of the weights to the successors. This vector has the same + /// order as Successors, or it is empty if we don't use it (disable + /// optimization). std::vector Weights; typedef std::vector::iterator weight_iterator; typedef std::vector::const_iterator const_weight_iterator; - /// LiveIns - Keep track of the physical registers that are livein of - /// the basicblock. - std::vector LiveIns; + /// Keep track of the physical registers that are livein of the basicblock. + typedef std::vector LiveInVector; + LiveInVector LiveIns; - /// Alignment - Alignment of the basic block. Zero if the basic block does - /// not need to be aligned. - /// The alignment is specified as log2(bytes). + /// Alignment of the basic block. Zero if the basic block does not need to be + /// aligned. The alignment is specified as log2(bytes). unsigned Alignment; - /// IsLandingPad - Indicate that this basic block is entered via an - /// exception handler. + /// Indicate that this basic block is entered via an exception handler. bool IsLandingPad; - /// AddressTaken - Indicate that this basic block is potentially the - /// target of an indirect branch. + /// Indicate that this basic block is potentially the target of an indirect + /// branch. bool AddressTaken; /// \brief since getSymbol is a relatively heavy-weight operation, the symbol @@ -110,36 +109,30 @@ class MachineBasicBlock : public ilist_node { friend class MachineFunction; public: - /// getBasicBlock - Return the LLVM basic block that this instance - /// corresponded to originally. Note that this may be NULL if this instance - /// does not correspond directly to an LLVM basic block. - /// + /// Return the LLVM basic block that this instance corresponded to originally. + /// Note that this may be NULL if this instance does not correspond directly + /// to an LLVM basic block. const BasicBlock *getBasicBlock() const { return BB; } - /// getName - Return the name of the corresponding LLVM basic block, or - /// "(null)". + /// Return the name of the corresponding LLVM basic block, or "(null)". StringRef getName() const; - /// getFullName - Return a formatted string to identify this block and its - /// parent function. + /// Return a formatted string to identify this block and its parent function. std::string getFullName() const; - /// hasAddressTaken - Test whether this block is potentially the target - /// of an indirect branch. + /// Test whether this block is potentially the target of an indirect branch. bool hasAddressTaken() const { return AddressTaken; } - /// setHasAddressTaken - Set this block to reflect that it potentially - /// is the target of an indirect branch. + /// Set this block to reflect that it potentially is the target of an indirect + /// branch. void setHasAddressTaken() { AddressTaken = true; } - /// getParent - Return the MachineFunction containing this basic block. - /// + /// Return the MachineFunction containing this basic block. const MachineFunction *getParent() const { return xParent; } MachineFunction *getParent() { return xParent; } - - /// bundle_iterator - MachineBasicBlock iterator that automatically skips over - /// MIs that are inside bundles (i.e. walk top level MIs only). + /// MachineBasicBlock iterator that automatically skips over MIs that are + /// inside bundles (i.e. walk top level MIs only). template class bundle_iterator : public std::iterator { @@ -318,7 +311,7 @@ public: /// Adds the specified register as a live in. Note that it is an error to add /// the same register to the same set more than once unless the intention is /// to call sortUniqueLiveIns after all registers are added. - void addLiveIn(unsigned Reg) { LiveIns.push_back(Reg); } + void addLiveIn(MCPhysReg PhysReg) { LiveIns.push_back(PhysReg); } /// Sorts and uniques the LiveIns vector. It can be significantly faster to do /// this than repeatedly calling isLiveIn before calling addLiveIn for every @@ -331,118 +324,112 @@ public: /// Add PhysReg as live in to this block, and ensure that there is a copy of /// PhysReg to a virtual register of class RC. Return the virtual register /// that is a copy of the live in PhysReg. - unsigned addLiveIn(unsigned PhysReg, const TargetRegisterClass *RC); + unsigned addLiveIn(MCPhysReg PhysReg, const TargetRegisterClass *RC); - /// removeLiveIn - Remove the specified register from the live in set. - /// - void removeLiveIn(unsigned Reg); + /// Remove the specified register from the live in set. + void removeLiveIn(MCPhysReg Reg); - /// isLiveIn - Return true if the specified register is in the live in set. - /// - bool isLiveIn(unsigned Reg) const; + /// Return true if the specified register is in the live in set. + bool isLiveIn(MCPhysReg Reg) const; // Iteration support for live in sets. These sets are kept in sorted // order by their register number. - typedef std::vector::const_iterator livein_iterator; + typedef LiveInVector::const_iterator livein_iterator; livein_iterator livein_begin() const { return LiveIns.begin(); } livein_iterator livein_end() const { return LiveIns.end(); } bool livein_empty() const { return LiveIns.empty(); } + iterator_range liveins() const { + return make_range(livein_begin(), livein_end()); + } - /// getAlignment - Return alignment of the basic block. - /// The alignment is specified as log2(bytes). - /// + /// Return alignment of the basic block. The alignment is specified as + /// log2(bytes). unsigned getAlignment() const { return Alignment; } - /// setAlignment - Set alignment of the basic block. - /// The alignment is specified as log2(bytes). - /// + /// Set alignment of the basic block. The alignment is specified as + /// log2(bytes). void setAlignment(unsigned Align) { Alignment = Align; } - /// isLandingPad - Returns true if the block is a landing pad. That is - /// this basic block is entered via an exception handler. + /// Returns true if the block is a landing pad. That is this basic block is + /// entered via an exception handler. bool isLandingPad() const { return IsLandingPad; } - /// setIsLandingPad - Indicates the block is a landing pad. That is - /// this basic block is entered via an exception handler. + /// Indicates the block is a landing pad. That is this basic block is entered + /// via an exception handler. void setIsLandingPad(bool V = true) { IsLandingPad = V; } - /// getLandingPadSuccessor - If this block has a successor that is a landing - /// pad, return it. Otherwise return NULL. + /// If this block has a successor that is a landing pad, return it. Otherwise + /// return NULL. const MachineBasicBlock *getLandingPadSuccessor() const; // Code Layout methods. - /// moveBefore/moveAfter - move 'this' block before or after the specified - /// block. This only moves the block, it does not modify the CFG or adjust - /// potential fall-throughs at the end of the block. + /// Move 'this' block before or after the specified block. This only moves + /// the block, it does not modify the CFG or adjust potential fall-throughs at + /// the end of the block. void moveBefore(MachineBasicBlock *NewAfter); void moveAfter(MachineBasicBlock *NewBefore); - /// updateTerminator - Update the terminator instructions in block to account - /// for changes to the layout. If the block previously used a fallthrough, - /// it may now need a branch, and if it previously used branching it may now - /// be able to use a fallthrough. + /// Update the terminator instructions in block to account for changes to the + /// layout. If the block previously used a fallthrough, it may now need a + /// branch, and if it previously used branching it may now be able to use a + /// fallthrough. void updateTerminator(); // Machine-CFG mutators - /// addSuccessor - Add succ as a successor of this MachineBasicBlock. - /// The Predecessors list of succ is automatically updated. WEIGHT - /// parameter is stored in Weights list and it may be used by - /// MachineBranchProbabilityInfo analysis to calculate branch probability. + /// Add succ as a successor of this MachineBasicBlock. The Predecessors list + /// of succ is automatically updated. WEIGHT parameter is stored in Weights + /// list and it may be used by MachineBranchProbabilityInfo analysis to + /// calculate branch probability. /// /// Note that duplicate Machine CFG edges are not allowed. - /// void addSuccessor(MachineBasicBlock *succ, uint32_t weight = 0); /// Set successor weight of a given iterator. void setSuccWeight(succ_iterator I, uint32_t weight); - /// removeSuccessor - Remove successor from the successors list of this - /// MachineBasicBlock. The Predecessors list of succ is automatically updated. - /// + /// Remove successor from the successors list of this MachineBasicBlock. The + /// Predecessors list of succ is automatically updated. void removeSuccessor(MachineBasicBlock *succ); - /// removeSuccessor - Remove specified successor from the successors list of - /// this MachineBasicBlock. The Predecessors list of succ is automatically - /// updated. Return the iterator to the element after the one removed. - /// + /// Remove specified successor from the successors list of this + /// MachineBasicBlock. The Predecessors list of succ is automatically updated. + /// Return the iterator to the element after the one removed. succ_iterator removeSuccessor(succ_iterator I); - /// replaceSuccessor - Replace successor OLD with NEW and update weight info. - /// + /// Replace successor OLD with NEW and update weight info. void replaceSuccessor(MachineBasicBlock *Old, MachineBasicBlock *New); - - /// transferSuccessors - Transfers all the successors from MBB to this - /// machine basic block (i.e., copies all the successors fromMBB and - /// remove all the successors from fromMBB). + /// Transfers all the successors from MBB to this machine basic block (i.e., + /// copies all the successors fromMBB and remove all the successors from + /// fromMBB). void transferSuccessors(MachineBasicBlock *fromMBB); - /// transferSuccessorsAndUpdatePHIs - Transfers all the successors, as - /// in transferSuccessors, and update PHI operands in the successor blocks - /// which refer to fromMBB to refer to this. + /// Transfers all the successors, as in transferSuccessors, and update PHI + /// operands in the successor blocks which refer to fromMBB to refer to this. void transferSuccessorsAndUpdatePHIs(MachineBasicBlock *fromMBB); - /// isPredecessor - Return true if the specified MBB is a predecessor of this - /// block. + /// Return true if any of the successors have weights attached to them. + bool hasSuccessorWeights() const { return !Weights.empty(); } + + /// Return true if the specified MBB is a predecessor of this block. bool isPredecessor(const MachineBasicBlock *MBB) const; - /// isSuccessor - Return true if the specified MBB is a successor of this - /// block. + /// Return true if the specified MBB is a successor of this block. bool isSuccessor(const MachineBasicBlock *MBB) const; - /// isLayoutSuccessor - Return true if the specified MBB will be emitted - /// immediately after this block, such that if this block exits by - /// falling through, control will transfer to the specified MBB. Note - /// that MBB need not be a successor at all, for example if this block - /// ends with an unconditional branch to some other block. + /// Return true if the specified MBB will be emitted immediately after this + /// block, such that if this block exits by falling through, control will + /// transfer to the specified MBB. Note that MBB need not be a successor at + /// all, for example if this block ends with an unconditional branch to some + /// other block. bool isLayoutSuccessor(const MachineBasicBlock *MBB) const; - /// canFallThrough - Return true if the block can implicitly transfer - /// control to the block after it by falling off the end of it. This should - /// return false if it can reach the block after it, but it uses an explicit - /// branch to do so (e.g., a table jump). True is a conservative answer. + /// Return true if the block can implicitly transfer control to the block + /// after it by falling off the end of it. This should return false if it can + /// reach the block after it, but it uses an explicit branch to do so (e.g., a + /// table jump). True is a conservative answer. bool canFallThrough(); /// Returns a pointer to the first instruction in this block that is not a @@ -452,29 +439,38 @@ public: /// Returns end() is there's no non-PHI instruction. iterator getFirstNonPHI(); - /// SkipPHIsAndLabels - Return the first instruction in MBB after I that is - /// not a PHI or a label. This is the correct point to insert copies at the - /// beginning of a basic block. + /// Return the first instruction in MBB after I that is not a PHI or a label. + /// This is the correct point to insert copies at the beginning of a basic + /// block. iterator SkipPHIsAndLabels(iterator I); - /// getFirstTerminator - returns an iterator to the first terminator - /// instruction of this basic block. If a terminator does not exist, - /// it returns end() + /// Returns an iterator to the first terminator instruction of this basic + /// block. If a terminator does not exist, it returns end(). iterator getFirstTerminator(); - const_iterator getFirstTerminator() const; + const_iterator getFirstTerminator() const { + return const_cast(this)->getFirstTerminator(); + } - /// getFirstInstrTerminator - Same getFirstTerminator but it ignores bundles - /// and return an instr_iterator instead. + /// Same getFirstTerminator but it ignores bundles and return an + /// instr_iterator instead. instr_iterator getFirstInstrTerminator(); - /// getLastNonDebugInstr - returns an iterator to the last non-debug - /// instruction in the basic block, or end() + /// Returns an iterator to the first non-debug instruction in the basic block, + /// or end(). + iterator getFirstNonDebugInstr(); + const_iterator getFirstNonDebugInstr() const { + return const_cast(this)->getFirstNonDebugInstr(); + } + + /// Returns an iterator to the last non-debug instruction in the basic block, + /// or end(). iterator getLastNonDebugInstr(); - const_iterator getLastNonDebugInstr() const; + const_iterator getLastNonDebugInstr() const { + return const_cast(this)->getLastNonDebugInstr(); + } - /// SplitCriticalEdge - Split the critical edge from this block to the - /// given successor block, and return the newly created block, or null - /// if splitting is not possible. + /// Split the critical edge from this block to the given successor block, and + /// return the newly created block, or null if splitting is not possible. /// /// This function updates LiveVariables, MachineDominatorTree, and /// MachineLoopInfo, as applicable. @@ -594,30 +590,29 @@ public: From.getInstrIterator(), To.getInstrIterator()); } - /// removeFromParent - This method unlinks 'this' from the containing - /// function, and returns it, but does not delete it. + /// This method unlinks 'this' from the containing function, and returns it, + /// but does not delete it. MachineBasicBlock *removeFromParent(); - /// eraseFromParent - This method unlinks 'this' from the containing - /// function and deletes it. + /// This method unlinks 'this' from the containing function and deletes it. void eraseFromParent(); - /// ReplaceUsesOfBlockWith - Given a machine basic block that branched to - /// 'Old', change the code and CFG so that it branches to 'New' instead. + /// Given a machine basic block that branched to 'Old', change the code and + /// CFG so that it branches to 'New' instead. void ReplaceUsesOfBlockWith(MachineBasicBlock *Old, MachineBasicBlock *New); - /// CorrectExtraCFGEdges - Various pieces of code can cause excess edges in - /// the CFG to be inserted. If we have proven that MBB can only branch to - /// DestA and DestB, remove any other MBB successors from the CFG. DestA and - /// DestB can be null. Besides DestA and DestB, retain other edges leading - /// to LandingPads (currently there can be only one; we don't check or require - /// that here). Note it is possible that DestA and/or DestB are LandingPads. + /// Various pieces of code can cause excess edges in the CFG to be inserted. + /// If we have proven that MBB can only branch to DestA and DestB, remove any + /// other MBB successors from the CFG. DestA and DestB can be null. Besides + /// DestA and DestB, retain other edges leading to LandingPads (currently + /// there can be only one; we don't check or require that here). Note it is + /// possible that DestA and/or DestB are LandingPads. bool CorrectExtraCFGEdges(MachineBasicBlock *DestA, MachineBasicBlock *DestB, bool isCond); - /// findDebugLoc - find the next valid DebugLoc starting at MBBI, skipping - /// any DBG_VALUE instructions. Return UnknownLoc if there is none. + /// Find the next valid DebugLoc starting at MBBI, skipping any DBG_VALUE + /// instructions. Return UnknownLoc if there is none. DebugLoc findDebugLoc(instr_iterator MBBI); DebugLoc findDebugLoc(iterator MBBI) { return findDebugLoc(MBBI.getInstrIterator()); @@ -633,48 +628,48 @@ public: ///< neighborhood. }; - /// computeRegisterLiveness - Return whether (physical) register \c Reg - /// has been ined and not ed as of just before \c MI. + /// Return whether (physical) register \p Reg has been ined and not + /// ed as of just before \p Before. /// - /// Search is localised to a neighborhood of - /// \c Neighborhood instructions before (searching for defs or kills) and - /// Neighborhood instructions after (searching just for defs) MI. + /// Search is localised to a neighborhood of \p Neighborhood instructions + /// before (searching for defs or kills) and \p Neighborhood instructions + /// after (searching just for defs) \p Before. /// - /// \c Reg must be a physical register. + /// \p Reg must be a physical register. LivenessQueryResult computeRegisterLiveness(const TargetRegisterInfo *TRI, - unsigned Reg, MachineInstr *MI, - unsigned Neighborhood=10); + unsigned Reg, + const_iterator Before, + unsigned Neighborhood=10) const; // Debugging methods. void dump() const; void print(raw_ostream &OS, SlotIndexes* = nullptr) const; + void print(raw_ostream &OS, ModuleSlotTracker &MST, + SlotIndexes * = nullptr) const; // Printing method used by LoopInfo. void printAsOperand(raw_ostream &OS, bool PrintType = true) const; - /// getNumber - MachineBasicBlocks are uniquely numbered at the function - /// level, unless they're not in a MachineFunction yet, in which case this - /// will return -1. - /// + /// MachineBasicBlocks are uniquely numbered at the function level, unless + /// they're not in a MachineFunction yet, in which case this will return -1. int getNumber() const { return Number; } void setNumber(int N) { Number = N; } - /// getSymbol - Return the MCSymbol for this basic block. - /// + /// Return the MCSymbol for this basic block. MCSymbol *getSymbol() const; private: - /// getWeightIterator - Return weight iterator corresponding to the I - /// successor iterator. + /// Return weight iterator corresponding to the I successor iterator. weight_iterator getWeightIterator(succ_iterator I); const_weight_iterator getWeightIterator(const_succ_iterator I) const; friend class MachineBranchProbabilityInfo; + friend class MIPrinter; - /// getSuccWeight - Return weight of the edge from this block to MBB. This - /// method should NOT be called directly, but by using getEdgeWeight method - /// from MachineBranchProbabilityInfo class. + /// Return weight of the edge from this block to MBB. This method should NOT + /// be called directly, but by using getEdgeWeight method from + /// MachineBranchProbabilityInfo class. uint32_t getSuccWeight(const_succ_iterator Succ) const; @@ -683,17 +678,14 @@ private: // Machine-CFG mutators - /// addPredecessor - Remove pred as a predecessor of this MachineBasicBlock. - /// Don't do this unless you know what you're doing, because it doesn't - /// update pred's successors list. Use pred->addSuccessor instead. - /// + /// Remove pred as a predecessor of this MachineBasicBlock. Don't do this + /// unless you know what you're doing, because it doesn't update pred's + /// successors list. Use pred->addSuccessor instead. void addPredecessor(MachineBasicBlock *pred); - /// removePredecessor - Remove pred as a predecessor of this - /// MachineBasicBlock. Don't do this unless you know what you're - /// doing, because it doesn't update pred's successors list. Use - /// pred->removeSuccessor instead. - /// + /// Remove pred as a predecessor of this MachineBasicBlock. Don't do this + /// unless you know what you're doing, because it doesn't update pred's + /// successors list. Use pred->removeSuccessor instead. void removePredecessor(MachineBasicBlock *pred); }; @@ -712,7 +704,7 @@ struct MBB2NumberFunctor : //===--------------------------------------------------------------------===// // Provide specializations of GraphTraits to be able to treat a -// MachineFunction as a graph of MachineBasicBlocks... +// MachineFunction as a graph of MachineBasicBlocks. // template <> struct GraphTraits { @@ -742,7 +734,7 @@ template <> struct GraphTraits { }; // Provide specializations of GraphTraits to be able to treat a -// MachineFunction as a graph of MachineBasicBlocks... and to walk it +// MachineFunction as a graph of MachineBasicBlocks and to walk it // in inverse order. Inverse order for a function is considered // to be when traversing the predecessor edges of a MBB // instead of the successor edges.