| //===- llvm/Analysis/Trace.h - Represent one trace of LLVM code -*- C++ -*-===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This class represents a single trace of LLVM basic blocks. A trace is a | |
| // single entry, multiple exit, region of code that is often hot. Trace-based | |
| // optimizations treat traces almost like they are a large, strange, basic | |
| // block: because the trace path is assumed to be hot, optimizations for the | |
| // fall-through path are made at the expense of the non-fall-through paths. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_ANALYSIS_TRACE_H | |
| #define LLVM_ANALYSIS_TRACE_H | |
| #include <vector> | |
| #include <cassert> | |
| namespace llvm { | |
| class BasicBlock; | |
| class Function; | |
| class Module; | |
| class raw_ostream; | |
| class Trace { | |
| typedef std::vector<BasicBlock *> BasicBlockListType; | |
| BasicBlockListType BasicBlocks; | |
| public: | |
| /// Trace ctor - Make a new trace from a vector of basic blocks, | |
| /// residing in the function which is the parent of the first | |
| /// basic block in the vector. | |
| /// | |
| Trace(const std::vector<BasicBlock *> &vBB) : BasicBlocks (vBB) {} | |
| /// getEntryBasicBlock - Return the entry basic block (first block) | |
| /// of the trace. | |
| /// | |
| BasicBlock *getEntryBasicBlock () const { return BasicBlocks[0]; } | |
| /// operator[]/getBlock - Return basic block N in the trace. | |
| /// | |
| BasicBlock *operator[](unsigned i) const { return BasicBlocks[i]; } | |
| BasicBlock *getBlock(unsigned i) const { return BasicBlocks[i]; } | |
| /// getFunction - Return this trace's parent function. | |
| /// | |
| Function *getFunction () const; | |
| /// getModule - Return this Module that contains this trace's parent | |
| /// function. | |
| /// | |
| Module *getModule () const; | |
| /// getBlockIndex - Return the index of the specified basic block in the | |
| /// trace, or -1 if it is not in the trace. | |
| int getBlockIndex(const BasicBlock *X) const { | |
| for (unsigned i = 0, e = BasicBlocks.size(); i != e; ++i) | |
| if (BasicBlocks[i] == X) | |
| return i; | |
| return -1; | |
| } | |
| /// contains - Returns true if this trace contains the given basic | |
| /// block. | |
| /// | |
| bool contains(const BasicBlock *X) const { | |
| return getBlockIndex(X) != -1; | |
| } | |
| /// Returns true if B1 occurs before B2 in the trace, or if it is the same | |
| /// block as B2.. Both blocks must be in the trace. | |
| /// | |
| bool dominates(const BasicBlock *B1, const BasicBlock *B2) const { | |
| int B1Idx = getBlockIndex(B1), B2Idx = getBlockIndex(B2); | |
| assert(B1Idx != -1 && B2Idx != -1 && "Block is not in the trace!"); | |
| return B1Idx <= B2Idx; | |
| } | |
| // BasicBlock iterators... | |
| typedef BasicBlockListType::iterator iterator; | |
| typedef BasicBlockListType::const_iterator const_iterator; | |
| typedef std::reverse_iterator<const_iterator> const_reverse_iterator; | |
| typedef std::reverse_iterator<iterator> reverse_iterator; | |
| iterator begin() { return BasicBlocks.begin(); } | |
| const_iterator begin() const { return BasicBlocks.begin(); } | |
| iterator end () { return BasicBlocks.end(); } | |
| const_iterator end () const { return BasicBlocks.end(); } | |
| reverse_iterator rbegin() { return BasicBlocks.rbegin(); } | |
| const_reverse_iterator rbegin() const { return BasicBlocks.rbegin(); } | |
| reverse_iterator rend () { return BasicBlocks.rend(); } | |
| const_reverse_iterator rend () const { return BasicBlocks.rend(); } | |
| unsigned size() const { return BasicBlocks.size(); } | |
| bool empty() const { return BasicBlocks.empty(); } | |
| iterator erase(iterator q) { return BasicBlocks.erase (q); } | |
| iterator erase(iterator q1, iterator q2) { return BasicBlocks.erase (q1, q2); } | |
| /// print - Write trace to output stream. | |
| /// | |
| void print(raw_ostream &O) const; | |
| /// dump - Debugger convenience method; writes trace to standard error | |
| /// output stream. | |
| /// | |
| void dump() const; | |
| }; | |
| } // end namespace llvm | |
| #endif // TRACE_H |