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