[llvm-commits] CVS: llvm/include/llvm/Analysis/Trace.h
Chris Lattner
lattner at cs.uiuc.edu
Mon Mar 8 14:58:01 PST 2004
Changes in directory llvm/include/llvm/Analysis:
Trace.h added (r1.1)
---
Log message:
Import the trace class from the reoptimizer
---
Diffs of the changes: (+106 -0)
Index: llvm/include/llvm/Analysis/Trace.h
diff -c /dev/null llvm/include/llvm/Analysis/Trace.h:1.1
*** /dev/null Mon Mar 8 14:57:36 2004
--- llvm/include/llvm/Analysis/Trace.h Mon Mar 8 14:57:25 2004
***************
*** 0 ****
--- 1,106 ----
+ //===- llvm/Analysis/Trace.h - Represent one trace of LLVM code -*- C++ -*-===//
+ //
+ // The LLVM Compiler Infrastructure
+ //
+ // This file was developed by the LLVM research group and 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 <iosfwd>
+ #include <vector>
+
+ namespace llvm {
+ class BasicBlock;
+ class Function;
+ class Module;
+
+ class Trace {
+ typedef std::vector<BasicBlock *> BasicBlockListType;
+ BasicBlockListType BasicBlocks;
+
+ public:
+ /// contains - Returns true if this trace contains the given basic
+ /// block.
+ ///
+ inline bool contains (const BasicBlock *X) {
+ for (unsigned i = 0, e = BasicBlocks.size(); i != e; ++i)
+ if (BasicBlocks[i] == X)
+ return true;
+ return false;
+ }
+
+ /// 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]; }
+
+ /// getFunction - Return this trace's parent function.
+ ///
+ Function *getFunction () const;
+
+ /// getModule - Return this Module that contains this trace's parent
+ /// function.
+ ///
+ Module *getModule () const;
+
+ /// print - Write trace to output stream.
+ ///
+ void print (std::ostream &O) const;
+
+ /// dump - Debugger convenience method; writes trace to standard error
+ /// output stream.
+ ///
+ void dump () const;
+
+ // 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(); }
+
+ BasicBlock *operator[] (unsigned i) const { return BasicBlocks[i]; }
+ BasicBlock *getBlock (unsigned i) const { return BasicBlocks[i]; }
+
+ /// Returns true if B1 and B2 appear on a path from START to an exit
+ /// block => B1 appears before B2. If START is not provided, defaults
+ /// to 0, which means use getEntryBasicBlock().
+ ///
+ bool dominates (const BasicBlock *B1, const BasicBlock *B2,
+ const BasicBlock *start = 0);
+ };
+
+ } // end namespace llvm
+
+ #endif // TRACE_H
More information about the llvm-commits
mailing list