Trace.h revision 6ba8972919b79996e7b9d646ca005d81dbebd04a
16ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner//===- llvm/Analysis/Trace.h - Represent one trace of LLVM code -*- C++ -*-===// 26ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner// 36ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner// The LLVM Compiler Infrastructure 46ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner// 56ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner// This file was developed by the LLVM research group and is distributed under 66ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner// the University of Illinois Open Source License. See LICENSE.TXT for details. 76ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner// 86ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner//===----------------------------------------------------------------------===// 96ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner// 106ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner// This class represents a single trace of LLVM basic blocks. A trace is a 116ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner// single entry, multiple exit, region of code that is often hot. Trace-based 126ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner// optimizations treat traces almost like they are a large, strange, basic 136ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner// block: because the trace path is assumed to be hot, optimizations for the 146ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner// fall-through path are made at the expense of the non-fall-through paths. 156ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner// 166ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner//===----------------------------------------------------------------------===// 176ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner 186ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner#ifndef LLVM_ANALYSIS_TRACE_H 196ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner#define LLVM_ANALYSIS_TRACE_H 206ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner 216ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner#include <iosfwd> 226ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner#include <vector> 236ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner 246ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattnernamespace llvm { 256ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner class BasicBlock; 266ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner class Function; 276ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner class Module; 286ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner 296ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattnerclass Trace { 306ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner typedef std::vector<BasicBlock *> BasicBlockListType; 316ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner BasicBlockListType BasicBlocks; 326ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner 336ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattnerpublic: 346ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// contains - Returns true if this trace contains the given basic 356ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// block. 366ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// 376ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner inline bool contains (const BasicBlock *X) { 386ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner for (unsigned i = 0, e = BasicBlocks.size(); i != e; ++i) 396ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner if (BasicBlocks[i] == X) 406ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner return true; 416ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner return false; 426ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner } 436ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner 446ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// Trace ctor - Make a new trace from a vector of basic blocks, 456ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// residing in the function which is the parent of the first 466ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// basic block in the vector. 476ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// 486ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner Trace (const std::vector<BasicBlock *> &vBB) : BasicBlocks (vBB) { 496ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner } 506ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner 516ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// getEntryBasicBlock - Return the entry basic block (first block) 526ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// of the trace. 536ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// 546ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner BasicBlock *getEntryBasicBlock () const { return BasicBlocks[0]; } 556ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner 566ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// getFunction - Return this trace's parent function. 576ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// 586ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner Function *getFunction () const; 596ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner 606ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// getModule - Return this Module that contains this trace's parent 616ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// function. 626ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// 636ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner Module *getModule () const; 646ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner 656ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// print - Write trace to output stream. 666ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// 676ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner void print (std::ostream &O) const; 686ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner 696ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// dump - Debugger convenience method; writes trace to standard error 706ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// output stream. 716ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// 726ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner void dump () const; 736ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner 746ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner // BasicBlock iterators... 756ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner typedef BasicBlockListType::iterator iterator; 766ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner typedef BasicBlockListType::const_iterator const_iterator; 776ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 786ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner typedef std::reverse_iterator<iterator> reverse_iterator; 796ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner 806ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner iterator begin() { return BasicBlocks.begin(); } 816ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner const_iterator begin() const { return BasicBlocks.begin(); } 826ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner iterator end () { return BasicBlocks.end(); } 836ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner const_iterator end () const { return BasicBlocks.end(); } 846ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner 856ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner reverse_iterator rbegin() { return BasicBlocks.rbegin(); } 866ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner const_reverse_iterator rbegin() const { return BasicBlocks.rbegin(); } 876ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner reverse_iterator rend () { return BasicBlocks.rend(); } 886ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner const_reverse_iterator rend () const { return BasicBlocks.rend(); } 896ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner 906ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner unsigned size() const { return BasicBlocks.size(); } 916ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner bool empty() const { return BasicBlocks.empty(); } 926ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner 936ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner BasicBlock *operator[] (unsigned i) const { return BasicBlocks[i]; } 946ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner BasicBlock *getBlock (unsigned i) const { return BasicBlocks[i]; } 956ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner 966ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// Returns true if B1 and B2 appear on a path from START to an exit 976ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// block => B1 appears before B2. If START is not provided, defaults 986ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// to 0, which means use getEntryBasicBlock(). 996ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner /// 1006ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner bool dominates (const BasicBlock *B1, const BasicBlock *B2, 1016ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner const BasicBlock *start = 0); 1026ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner}; 1036ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner 1046ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner} // end namespace llvm 1056ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner 1066ba8972919b79996e7b9d646ca005d81dbebd04aChris Lattner#endif // TRACE_H 107