[llvm] r191835 - Remove the very substantial, largely unmaintained legacy PGO

Alexey Samsonov samsonov at google.com
Fri Oct 4 03:45:41 PDT 2013


FYI, I've restored LLVM_BUILD_RUNTIME CMake option in r191948 - otherwise
this change silently discarded building compiler-rt and libcxx :)


On Wed, Oct 2, 2013 at 7:57 PM, Rafael EspĂ­ndola <rafael.espindola at gmail.com
> wrote:

> 61 files changed, 12 insertions(+), 8640 deletions(-)
>
> Nice!
>
> On 2 October 2013 11:42, Chandler Carruth <chandlerc at gmail.com> wrote:
> > Author: chandlerc
> > Date: Wed Oct  2 10:42:23 2013
> > New Revision: 191835
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=191835&view=rev
> > Log:
> > Remove the very substantial, largely unmaintained legacy PGO
> > infrastructure.
> >
> > This was essentially work toward PGO based on a design that had several
> > flaws, partially dating from a time when LLVM had a different
> > architecture, and with an effort to modernize it abandoned without being
> > completed. Since then, it has bitrotted for several years further. The
> > result is nearly unusable, and isn't helping any of the modern PGO
> > efforts. Instead, it is getting in the way, adding confusion about PGO
> > in LLVM and distracting everyone with maintenance on essentially dead
> > code. Removing it paves the way for modern efforts around PGO.
> >
> > Among other effects, this removes the last of the runtime libraries from
> > LLVM. Those are being developed in the separate 'compiler-rt' project
> > now, with somewhat different licensing specifically more approriate for
> > runtimes.
> >
> > Removed:
> >     llvm/trunk/include/llvm/Analysis/PathNumbering.h
> >     llvm/trunk/include/llvm/Analysis/PathProfileInfo.h
> >     llvm/trunk/include/llvm/Analysis/ProfileDataLoader.h
> >     llvm/trunk/include/llvm/Analysis/ProfileDataTypes.h
> >     llvm/trunk/include/llvm/Analysis/ProfileInfo.h
> >     llvm/trunk/include/llvm/Analysis/ProfileInfoLoader.h
> >     llvm/trunk/include/llvm/Analysis/ProfileInfoTypes.h
> >     llvm/trunk/lib/Analysis/PathNumbering.cpp
> >     llvm/trunk/lib/Analysis/PathProfileInfo.cpp
> >     llvm/trunk/lib/Analysis/PathProfileVerifier.cpp
> >     llvm/trunk/lib/Analysis/ProfileDataLoader.cpp
> >     llvm/trunk/lib/Analysis/ProfileDataLoaderPass.cpp
> >     llvm/trunk/lib/Analysis/ProfileEstimatorPass.cpp
> >     llvm/trunk/lib/Analysis/ProfileInfo.cpp
> >     llvm/trunk/lib/Analysis/ProfileInfoLoader.cpp
> >     llvm/trunk/lib/Analysis/ProfileInfoLoaderPass.cpp
> >     llvm/trunk/lib/Analysis/ProfileVerifierPass.cpp
> >     llvm/trunk/lib/Transforms/Instrumentation/EdgeProfiling.cpp
> >     llvm/trunk/lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp
> >     llvm/trunk/lib/Transforms/Instrumentation/PathProfiling.cpp
> >     llvm/trunk/runtime/
> >     llvm/trunk/test/Analysis/Profiling/
> >     llvm/trunk/tools/llvm-prof/
> > Modified:
> >     llvm/trunk/CMakeLists.txt
> >     llvm/trunk/LLVMBuild.txt
> >     llvm/trunk/Makefile
> >     llvm/trunk/include/llvm/Analysis/Passes.h
> >     llvm/trunk/include/llvm/InitializePasses.h
> >     llvm/trunk/include/llvm/LinkAllPasses.h
> >     llvm/trunk/include/llvm/Transforms/Instrumentation.h
> >     llvm/trunk/lib/Analysis/Analysis.cpp
> >     llvm/trunk/lib/Analysis/CMakeLists.txt
> >     llvm/trunk/lib/CodeGen/UnreachableBlockElim.cpp
> >     llvm/trunk/lib/Transforms/Instrumentation/CMakeLists.txt
> >     llvm/trunk/lib/Transforms/Instrumentation/Instrumentation.cpp
> >     llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp
> >     llvm/trunk/lib/Transforms/Utils/BreakCriticalEdges.cpp
> >     llvm/trunk/lib/Transforms/Utils/Local.cpp
> >     llvm/trunk/test/lit.cfg
> >     llvm/trunk/tools/CMakeLists.txt
> >     llvm/trunk/tools/LLVMBuild.txt
> >     llvm/trunk/tools/Makefile
> >
> > Modified: llvm/trunk/CMakeLists.txt
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/CMakeLists.txt?rev=191835&r1=191834&r2=191835&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/CMakeLists.txt (original)
> > +++ llvm/trunk/CMakeLists.txt Wed Oct  2 10:42:23 2013
> > @@ -246,18 +246,13 @@ if( WIN32 AND NOT CYGWIN )
> >  endif()
> >
> >  # Define options to control the inclusion and default build behavior for
> > -# components which may not strictly be necessary (tools, runtime,
> examples, and
> > -# tests).
> > +# components which may not strictly be necessary (tools, examples, and
> tests).
> >  #
> >  # This is primarily to support building smaller or faster project files.
> >  option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools."
> ON)
> >  option(LLVM_BUILD_TOOLS
> >    "Build the LLVM tools. If OFF, just generate build targets." ON)
> >
> > -option(LLVM_INCLUDE_RUNTIME "Generate build targets for the LLVM
> runtimes" ON)
> > -option(LLVM_BUILD_RUNTIME
> > -  "Build the LLVM runtime libraries. If OFF, just generate build
> targets." ON)
> > -
> >  option(LLVM_BUILD_EXAMPLES
> >    "Build the LLVM example programs. If OFF, just generate build
> targets." OFF)
> >  option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM
> examples" ON)
> > @@ -471,10 +466,6 @@ if( LLVM_INCLUDE_TOOLS )
> >    add_subdirectory(tools)
> >  endif()
> >
> > -if( LLVM_INCLUDE_RUNTIME )
> > -  add_subdirectory(runtime)
> > -endif()
> > -
> >  if( LLVM_INCLUDE_EXAMPLES )
> >    add_subdirectory(examples)
> >  endif()
> >
> > Modified: llvm/trunk/LLVMBuild.txt
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/LLVMBuild.txt?rev=191835&r1=191834&r2=191835&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/LLVMBuild.txt (original)
> > +++ llvm/trunk/LLVMBuild.txt Wed Oct  2 10:42:23 2013
> > @@ -16,7 +16,7 @@
> >
>  ;===------------------------------------------------------------------------===;
> >
> >  [common]
> > -subdirectories = bindings docs examples lib projects runtime tools utils
> > +subdirectories = bindings docs examples lib projects tools utils
> >
> >  [component_0]
> >  type = Group
> >
> > Modified: llvm/trunk/Makefile
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/Makefile?rev=191835&r1=191834&r2=191835&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/Makefile (original)
> > +++ llvm/trunk/Makefile Wed Oct  2 10:42:23 2013
> > @@ -15,7 +15,7 @@ LEVEL := .
> >  #   3. Build IR, which builds the Intrinsics.inc file used by libs.
> >  #   4. Build libs, which are needed by llvm-config.
> >  #   5. Build llvm-config, which determines inter-lib dependencies for
> tools.
> > -#   6. Build tools, runtime, docs.
> > +#   6. Build tools and docs.
> >  #
> >  # When cross-compiling, there are some things (tablegen) that need to
> >  # be build for the build system first.
> > @@ -31,7 +31,7 @@ ifeq ($(BUILD_DIRS_ONLY),1)
> >    OPTIONAL_DIRS := tools/clang/utils/TableGen
> >  else
> >    DIRS := lib/Support lib/TableGen utils lib/IR lib tools/llvm-shlib \
> > -          tools/llvm-config tools runtime docs unittests
> > +          tools/llvm-config tools docs unittests
> >    OPTIONAL_DIRS := projects bindings
> >  endif
> >
> > @@ -52,17 +52,17 @@ ifneq ($(ENABLE_DOCS),1)
> >  endif
> >
> >  ifeq ($(MAKECMDGOALS),libs-only)
> > -  DIRS := $(filter-out tools runtime docs, $(DIRS))
> > +  DIRS := $(filter-out tools docs, $(DIRS))
> >    OPTIONAL_DIRS :=
> >  endif
> >
> >  ifeq ($(MAKECMDGOALS),install-libs)
> > -  DIRS := $(filter-out tools runtime docs, $(DIRS))
> > +  DIRS := $(filter-out tools docs, $(DIRS))
> >    OPTIONAL_DIRS := $(filter bindings, $(OPTIONAL_DIRS))
> >  endif
> >
> >  ifeq ($(MAKECMDGOALS),tools-only)
> > -  DIRS := $(filter-out runtime docs, $(DIRS))
> > +  DIRS := $(filter-out docs, $(DIRS))
> >    OPTIONAL_DIRS :=
> >  endif
> >
> > @@ -72,7 +72,7 @@ ifeq ($(MAKECMDGOALS),install-clang)
> >            tools/clang/tools/c-index-test \
> >            tools/clang/include/clang-c \
> >            tools/clang/runtime tools/clang/docs \
> > -          tools/lto runtime
> > +          tools/lto
> >    OPTIONAL_DIRS :=
> >    NO_INSTALL = 1
> >  endif
> > @@ -84,7 +84,7 @@ ifeq ($(MAKECMDGOALS),clang-only)
> >  endif
> >
> >  ifeq ($(MAKECMDGOALS),unittests)
> > -  DIRS := $(filter-out tools runtime docs, $(DIRS)) utils unittests
> > +  DIRS := $(filter-out tools docs, $(DIRS)) utils unittests
> >    OPTIONAL_DIRS :=
> >  endif
> >
> >
> > Modified: llvm/trunk/include/llvm/Analysis/Passes.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/Passes.h?rev=191835&r1=191834&r2=191835&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/Analysis/Passes.h (original)
> > +++ llvm/trunk/include/llvm/Analysis/Passes.h Wed Oct  2 10:42:23 2013
> > @@ -95,64 +95,6 @@ namespace llvm {
> >
> >
>  //===--------------------------------------------------------------------===//
> >    //
> > -  // createProfileLoaderPass - This pass loads information from a
> profile dump
> > -  // file.
> > -  //
> > -  ModulePass *createProfileLoaderPass();
> > -  extern char &ProfileLoaderPassID;
> > -
> > -
>  //===--------------------------------------------------------------------===//
> > -  //
> > -  // createProfileMetadataLoaderPass - This pass loads information from
> a
> > -  // profile dump file and sets branch weight metadata.
> > -  //
> > -  ModulePass *createProfileMetadataLoaderPass();
> > -  extern char &ProfileMetadataLoaderPassID;
> > -
> > -
>  //===--------------------------------------------------------------------===//
> > -  //
> > -  // createNoProfileInfoPass - This pass implements the default "no
> profile".
> > -  //
> > -  ImmutablePass *createNoProfileInfoPass();
> > -
> > -
>  //===--------------------------------------------------------------------===//
> > -  //
> > -  // createProfileEstimatorPass - This pass estimates profiling
> information
> > -  // instead of loading it from a previous run.
> > -  //
> > -  FunctionPass *createProfileEstimatorPass();
> > -  extern char &ProfileEstimatorPassID;
> > -
> > -
>  //===--------------------------------------------------------------------===//
> > -  //
> > -  // createProfileVerifierPass - This pass verifies profiling
> information.
> > -  //
> > -  FunctionPass *createProfileVerifierPass();
> > -
> > -
>  //===--------------------------------------------------------------------===//
> > -  //
> > -  // createPathProfileLoaderPass - This pass loads information from a
> path
> > -  // profile dump file.
> > -  //
> > -  ModulePass *createPathProfileLoaderPass();
> > -  extern char &PathProfileLoaderPassID;
> > -
> > -
>  //===--------------------------------------------------------------------===//
> > -  //
> > -  // createNoPathProfileInfoPass - This pass implements the default
> > -  // "no path profile".
> > -  //
> > -  ImmutablePass *createNoPathProfileInfoPass();
> > -
> > -
>  //===--------------------------------------------------------------------===//
> > -  //
> > -  // createPathProfileVerifierPass - This pass verifies path profiling
> > -  // information.
> > -  //
> > -  ModulePass *createPathProfileVerifierPass();
> > -
> > -
>  //===--------------------------------------------------------------------===//
> > -  //
> >    // createDSAAPass - This pass implements simple context sensitive
> alias
> >    // analysis.
> >    //
> >
> > Removed: llvm/trunk/include/llvm/Analysis/PathNumbering.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/PathNumbering.h?rev=191834&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/Analysis/PathNumbering.h (original)
> > +++ llvm/trunk/include/llvm/Analysis/PathNumbering.h (removed)
> > @@ -1,304 +0,0 @@
> > -//===- PathNumbering.h ----------------------------------------*- C++
> -*---===//
> > -//
> > -//                     The LLVM Compiler Infrastructure
> > -//
> > -// This file is distributed under the University of Illinois Open Source
> > -// License. See LICENSE.TXT for details.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -//
> > -// Ball-Larus path numbers uniquely identify paths through a directed
> acyclic
> > -// graph (DAG) [Ball96].  For a CFG backedges are removed and replaced
> by phony
> > -// edges to obtain a DAG, and thus the unique path numbers [Ball96].
> > -//
> > -// The purpose of this analysis is to enumerate the edges in a CFG in
> order
> > -// to obtain paths from path numbers in a convenient manner.  As
> described in
> > -// [Ball96] edges can be enumerated such that given a path number by
> following
> > -// the CFG and updating the path number, the path is obtained.
> > -//
> > -// [Ball96]
> > -//  T. Ball and J. R. Larus. "Efficient Path Profiling."
> > -//  International Symposium on Microarchitecture, pages 46-57, 1996.
> > -//  http://portal.acm.org/citation.cfm?id=243857
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -
> > -#ifndef LLVM_ANALYSIS_PATHNUMBERING_H
> > -#define LLVM_ANALYSIS_PATHNUMBERING_H
> > -
> > -#include "llvm/Analysis/ProfileInfoTypes.h"
> > -#include "llvm/IR/BasicBlock.h"
> > -#include "llvm/IR/Instructions.h"
> > -#include "llvm/Pass.h"
> > -#include "llvm/Support/CFG.h"
> > -#include <map>
> > -#include <stack>
> > -#include <vector>
> > -
> > -namespace llvm {
> > -class BallLarusNode;
> > -class BallLarusEdge;
> > -class BallLarusDag;
> > -
> > -// typedefs for storage/ interators of various DAG components
> > -typedef std::vector<BallLarusNode*> BLNodeVector;
> > -typedef std::vector<BallLarusNode*>::iterator BLNodeIterator;
> > -typedef std::vector<BallLarusEdge*> BLEdgeVector;
> > -typedef std::vector<BallLarusEdge*>::iterator BLEdgeIterator;
> > -typedef std::map<BasicBlock*, BallLarusNode*> BLBlockNodeMap;
> > -typedef std::stack<BallLarusNode*> BLNodeStack;
> > -
> > -// Represents a basic block with information necessary for the BallLarus
> > -// algorithms.
> > -class BallLarusNode {
> > -public:
> > -  enum NodeColor { WHITE, GRAY, BLACK };
> > -
> > -  // Constructor: Initializes a new Node for the given BasicBlock
> > -  BallLarusNode(BasicBlock* BB) :
> > -    _basicBlock(BB), _numberPaths(0), _color(WHITE) {
> > -    static unsigned nextUID = 0;
> > -    _uid = nextUID++;
> > -  }
> > -
> > -  // Returns the basic block for the BallLarusNode
> > -  BasicBlock* getBlock();
> > -
> > -  // Get/set the number of paths to the exit starting at the node.
> > -  unsigned getNumberPaths();
> > -  void setNumberPaths(unsigned numberPaths);
> > -
> > -  // Get/set the NodeColor used in graph algorithms.
> > -  NodeColor getColor();
> > -  void setColor(NodeColor color);
> > -
> > -  // Iterator information for predecessor edges. Includes phony and
> > -  // backedges.
> > -  BLEdgeIterator predBegin();
> > -  BLEdgeIterator predEnd();
> > -  unsigned getNumberPredEdges();
> > -
> > -  // Iterator information for successor edges. Includes phony and
> > -  // backedges.
> > -  BLEdgeIterator succBegin();
> > -  BLEdgeIterator succEnd();
> > -  unsigned getNumberSuccEdges();
> > -
> > -  // Add an edge to the predecessor list.
> > -  void addPredEdge(BallLarusEdge* edge);
> > -
> > -  // Remove an edge from the predecessor list.
> > -  void removePredEdge(BallLarusEdge* edge);
> > -
> > -  // Add an edge to the successor list.
> > -  void addSuccEdge(BallLarusEdge* edge);
> > -
> > -  // Remove an edge from the successor list.
> > -  void removeSuccEdge(BallLarusEdge* edge);
> > -
> > -  // Returns the name of the BasicBlock being represented.  If
> BasicBlock
> > -  // is null then returns "<null>".  If BasicBlock has no name, then
> > -  // "<unnamed>" is returned.  Intended for use with debug output.
> > -  std::string getName();
> > -
> > -private:
> > -  // The corresponding underlying BB.
> > -  BasicBlock* _basicBlock;
> > -
> > -  // Holds the predecessor edges of this node.
> > -  BLEdgeVector _predEdges;
> > -
> > -  // Holds the successor edges of this node.
> > -  BLEdgeVector _succEdges;
> > -
> > -  // The number of paths from the node to the exit.
> > -  unsigned _numberPaths;
> > -
> > -  // 'Color' used by graph algorithms to mark the node.
> > -  NodeColor _color;
> > -
> > -  // Unique ID to ensure naming difference with dotgraphs
> > -  unsigned _uid;
> > -
> > -  // Removes an edge from an edgeVector.  Used by removePredEdge and
> > -  // removeSuccEdge.
> > -  void removeEdge(BLEdgeVector& v, BallLarusEdge* e);
> > -};
> > -
> > -// Represents an edge in the Dag.  For an edge, v -> w, v is the
> source, and
> > -// w is the target.
> > -class BallLarusEdge {
> > -public:
> > -  enum EdgeType { NORMAL, BACKEDGE, SPLITEDGE,
> > -    BACKEDGE_PHONY, SPLITEDGE_PHONY, CALLEDGE_PHONY };
> > -
> > -  // Constructor: Initializes an BallLarusEdge with a source and target.
> > -  BallLarusEdge(BallLarusNode* source, BallLarusNode* target,
> > -                                unsigned duplicateNumber)
> > -    : _source(source), _target(target), _weight(0), _edgeType(NORMAL),
> > -      _realEdge(NULL), _duplicateNumber(duplicateNumber) {}
> > -
> > -  // Returns the source/ target node of this edge.
> > -  BallLarusNode* getSource() const;
> > -  BallLarusNode* getTarget() const;
> > -
> > -  // Sets the type of the edge.
> > -  EdgeType getType() const;
> > -
> > -  // Gets the type of the edge.
> > -  void setType(EdgeType type);
> > -
> > -  // Returns the weight of this edge.  Used to decode path numbers to
> > -  // sequences of basic blocks.
> > -  unsigned getWeight();
> > -
> > -  // Sets the weight of the edge.  Used during path numbering.
> > -  void setWeight(unsigned weight);
> > -
> > -  // Gets/sets the phony edge originating at the root.
> > -  BallLarusEdge* getPhonyRoot();
> > -  void setPhonyRoot(BallLarusEdge* phonyRoot);
> > -
> > -  // Gets/sets the phony edge terminating at the exit.
> > -  BallLarusEdge* getPhonyExit();
> > -  void setPhonyExit(BallLarusEdge* phonyExit);
> > -
> > -  // Gets/sets the associated real edge if this is a phony edge.
> > -  BallLarusEdge* getRealEdge();
> > -  void setRealEdge(BallLarusEdge* realEdge);
> > -
> > -  // Returns the duplicate number of the edge.
> > -  unsigned getDuplicateNumber();
> > -
> > -protected:
> > -  // Source node for this edge.
> > -  BallLarusNode* _source;
> > -
> > -  // Target node for this edge.
> > -  BallLarusNode* _target;
> > -
> > -private:
> > -  // Edge weight cooresponding to path number increments before removing
> > -  // increments along a spanning tree. The sum over the edge weights
> gives
> > -  // the path number.
> > -  unsigned _weight;
> > -
> > -  // Type to represent for what this edge is intended
> > -  EdgeType _edgeType;
> > -
> > -  // For backedges and split-edges, the phony edge which is linked to
> the
> > -  // root node of the DAG. This contains a path number initialization.
> > -  BallLarusEdge* _phonyRoot;
> > -
> > -  // For backedges and split-edges, the phony edge which is linked to
> the
> > -  // exit node of the DAG. This contains a path counter increment, and
> > -  // potentially a path number increment.
> > -  BallLarusEdge* _phonyExit;
> > -
> > -  // If this is a phony edge, _realEdge is a link to the back or split
> > -  // edge. Otherwise, this is null.
> > -  BallLarusEdge* _realEdge;
> > -
> > -  // An ID to differentiate between those edges which have the same
> source
> > -  // and destination blocks.
> > -  unsigned _duplicateNumber;
> > -};
> > -
> > -// Represents the Ball Larus DAG for a given Function.  Can calculate
> > -// various properties required for instrumentation or analysis.  E.g.
> the
> > -// edge weights that determine the path number.
> > -class BallLarusDag {
> > -public:
> > -  // Initializes a BallLarusDag from the CFG of a given function.  Must
> > -  // call init() after creation, since some initialization requires
> > -  // virtual functions.
> > -  BallLarusDag(Function &F)
> > -    : _root(NULL), _exit(NULL), _function(F) {}
> > -
> > -  // Initialization that requires virtual functions which are not fully
> > -  // functional in the constructor.
> > -  void init();
> > -
> > -  // Frees all memory associated with the DAG.
> > -  virtual ~BallLarusDag();
> > -
> > -  // Calculate the path numbers by assigning edge increments as
> prescribed
> > -  // in Ball-Larus path profiling.
> > -  void calculatePathNumbers();
> > -
> > -  // Returns the number of paths for the DAG.
> > -  unsigned getNumberOfPaths();
> > -
> > -  // Returns the root (i.e. entry) node for the DAG.
> > -  BallLarusNode* getRoot();
> > -
> > -  // Returns the exit node for the DAG.
> > -  BallLarusNode* getExit();
> > -
> > -  // Returns the function for the DAG.
> > -  Function& getFunction();
> > -
> > -  // Clears the node colors.
> > -  void clearColors(BallLarusNode::NodeColor color);
> > -
> > -protected:
> > -  // All nodes in the DAG.
> > -  BLNodeVector _nodes;
> > -
> > -  // All edges in the DAG.
> > -  BLEdgeVector _edges;
> > -
> > -  // All backedges in the DAG.
> > -  BLEdgeVector _backEdges;
> > -
> > -  // Allows subclasses to determine which type of Node is created.
> > -  // Override this method to produce subclasses of BallLarusNode if
> > -  // necessary. The destructor of BallLarusDag will call free on each
> pointer
> > -  // created.
> > -  virtual BallLarusNode* createNode(BasicBlock* BB);
> > -
> > -  // Allows subclasses to determine which type of Edge is created.
> > -  // Override this method to produce subclasses of BallLarusEdge if
> > -  // necessary.  Parameters source and target will have been created by
> > -  // createNode and can be cast to the subclass of BallLarusNode*
> > -  // returned by createNode. The destructor of BallLarusDag will call
> free
> > -  // on each pointer created.
> > -  virtual BallLarusEdge* createEdge(BallLarusNode* source,
> BallLarusNode*
> > -                                    target, unsigned duplicateNumber);
> > -
> > -  // Proxy to node's constructor.  Updates the DAG state.
> > -  BallLarusNode* addNode(BasicBlock* BB);
> > -
> > -  // Proxy to edge's constructor.  Updates the DAG state.
> > -  BallLarusEdge* addEdge(BallLarusNode* source, BallLarusNode* target,
> > -                         unsigned duplicateNumber);
> > -
> > -private:
> > -  // The root (i.e. entry) node for this DAG.
> > -  BallLarusNode* _root;
> > -
> > -  // The exit node for this DAG.
> > -  BallLarusNode* _exit;
> > -
> > -  // The function represented by this DAG.
> > -  Function& _function;
> > -
> > -  // Processes one node and its imediate edges for building the DAG.
> > -  void buildNode(BLBlockNodeMap& inDag, std::stack<BallLarusNode*>&
> dfsStack);
> > -
> > -  // Process an edge in the CFG for DAG building.
> > -  void buildEdge(BLBlockNodeMap& inDag, std::stack<BallLarusNode*>&
> dfsStack,
> > -                 BallLarusNode* currentNode, BasicBlock* succBB,
> > -                 unsigned duplicateNumber);
> > -
> > -  // The weight on each edge is the increment required along any path
> that
> > -  // contains that edge.
> > -  void calculatePathNumbersFrom(BallLarusNode* node);
> > -
> > -  // Adds a backedge with its phony edges.  Updates the DAG state.
> > -  void addBackedge(BallLarusNode* source, BallLarusNode* target,
> > -                   unsigned duplicateCount);
> > -};
> > -} // end namespace llvm
> > -
> > -#endif
> >
> > Removed: llvm/trunk/include/llvm/Analysis/PathProfileInfo.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/PathProfileInfo.h?rev=191834&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/Analysis/PathProfileInfo.h (original)
> > +++ llvm/trunk/include/llvm/Analysis/PathProfileInfo.h (removed)
> > @@ -1,112 +0,0 @@
> > -//===- PathProfileInfo.h --------------------------------------*- C++
> -*---===//
> > -//
> > -//                     The LLVM Compiler Infrastructure
> > -//
> > -// This file is distributed under the University of Illinois Open Source
> > -// License. See LICENSE.TXT for details.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -//
> > -// This file outlines the interface used by optimizers to load path
> profiles.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -
> > -#ifndef LLVM_ANALYSIS_PATHPROFILEINFO_H
> > -#define LLVM_ANALYSIS_PATHPROFILEINFO_H
> > -
> > -#include "llvm/Analysis/PathNumbering.h"
> > -#include "llvm/IR/BasicBlock.h"
> > -
> > -namespace llvm {
> > -
> > -class ProfilePath;
> > -class ProfilePathEdge;
> > -class PathProfileInfo;
> > -
> > -typedef std::vector<ProfilePathEdge> ProfilePathEdgeVector;
> > -typedef std::vector<ProfilePathEdge>::iterator ProfilePathEdgeIterator;
> > -
> > -typedef std::vector<BasicBlock*> ProfilePathBlockVector;
> > -typedef std::vector<BasicBlock*>::iterator ProfilePathBlockIterator;
> > -
> > -typedef std::map<unsigned int,ProfilePath*> ProfilePathMap;
> > -typedef std::map<unsigned int,ProfilePath*>::iterator
> ProfilePathIterator;
> > -
> > -typedef std::map<Function*,unsigned int> FunctionPathCountMap;
> > -typedef std::map<Function*,ProfilePathMap> FunctionPathMap;
> > -typedef std::map<Function*,ProfilePathMap>::iterator
> FunctionPathIterator;
> > -
> > -class ProfilePathEdge {
> > -public:
> > -  ProfilePathEdge(BasicBlock* source, BasicBlock* target,
> > -                  unsigned duplicateNumber);
> > -
> > -  inline unsigned getDuplicateNumber() { return _duplicateNumber; }
> > -  inline BasicBlock* getSource() { return _source; }
> > -  inline BasicBlock* getTarget() { return _target; }
> > -
> > -protected:
> > -  BasicBlock* _source;
> > -  BasicBlock* _target;
> > -  unsigned _duplicateNumber;
> > -};
> > -
> > -class ProfilePath {
> > -public:
> > -  ProfilePath(unsigned int number, unsigned int count,
> > -              double countStdDev, PathProfileInfo* ppi);
> > -
> > -  double getFrequency() const;
> > -
> > -  inline unsigned int getNumber() const { return _number; }
> > -  inline unsigned int getCount() const { return _count; }
> > -  inline double getCountStdDev() const { return _countStdDev; }
> > -
> > -  ProfilePathEdgeVector* getPathEdges() const;
> > -  ProfilePathBlockVector* getPathBlocks() const;
> > -
> > -  BasicBlock* getFirstBlockInPath() const;
> > -
> > -private:
> > -  unsigned int _number;
> > -  unsigned int _count;
> > -  double _countStdDev;
> > -
> > -  // double pointer back to the profiling info
> > -  PathProfileInfo* _ppi;
> > -};
> > -
> > -// TODO: overload [] operator for getting path
> > -// Add: getFunctionCallCount()
> > -class PathProfileInfo {
> > -  public:
> > -  PathProfileInfo();
> > -  ~PathProfileInfo();
> > -
> > -  void setCurrentFunction(Function* F);
> > -  Function* getCurrentFunction() const;
> > -  BasicBlock* getCurrentFunctionEntry();
> > -
> > -  ProfilePath* getPath(unsigned int number);
> > -  unsigned int getPotentialPathCount();
> > -
> > -  ProfilePathIterator pathBegin();
> > -  ProfilePathIterator pathEnd();
> > -  unsigned int pathsRun();
> > -
> > -  static char ID; // Pass identification
> > -  std::string argList;
> > -
> > -protected:
> > -  FunctionPathMap _functionPaths;
> > -  FunctionPathCountMap _functionPathCounts;
> > -
> > -private:
> > -  BallLarusDag* _currentDag;
> > -  Function* _currentFunction;
> > -
> > -  friend class ProfilePath;
> > -};
> > -} // end namespace llvm
> > -
> > -#endif
> >
> > Removed: llvm/trunk/include/llvm/Analysis/ProfileDataLoader.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ProfileDataLoader.h?rev=191834&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/Analysis/ProfileDataLoader.h (original)
> > +++ llvm/trunk/include/llvm/Analysis/ProfileDataLoader.h (removed)
> > @@ -1,140 +0,0 @@
> > -//===- ProfileDataLoader.h - Load & convert profile info ----*- C++
> -*-===//
> > -//
> > -//                      The LLVM Compiler Infrastructure
> > -//
> > -// This file is distributed under the University of Illinois Open Source
> > -// License. See LICENSE.TXT for details.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -//
> > -// The ProfileDataLoader class is used to load profiling data from a
> dump file.
> > -// The ProfileDataT<FType, BType> class is used to store the mapping of
> this
> > -// data to control flow edges.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -
> > -#ifndef LLVM_ANALYSIS_PROFILEDATALOADER_H
> > -#define LLVM_ANALYSIS_PROFILEDATALOADER_H
> > -
> > -#include "llvm/ADT/ArrayRef.h"
> > -#include "llvm/ADT/DenseMap.h"
> > -#include "llvm/ADT/SmallVector.h"
> > -#include "llvm/Support/Debug.h"
> > -#include "llvm/Support/ErrorHandling.h"
> > -#include <string>
> > -
> > -namespace llvm {
> > -
> > -class ModulePass;
> > -class Function;
> > -class BasicBlock;
> > -
> > -// Helper for dumping edges to dbgs().
> > -raw_ostream& operator<<(raw_ostream &O, std::pair<const BasicBlock *,
> > -                                                  const BasicBlock *>
> E);
> > -
> > -/// \brief The ProfileDataT<FType, BType> class is used to store the
> mapping of
> > -/// profiling data to control flow edges.
> > -///
> > -/// An edge is defined by its source and sink basic blocks.
> > -template<class FType, class BType>
> > -class ProfileDataT {
> > -public:
> > -  // The profiling information defines an Edge by its source and sink
> basic
> > -  // blocks.
> > -  typedef std::pair<const BType*, const BType*> Edge;
> > -
> > -private:
> > -  typedef DenseMap<Edge, unsigned> EdgeWeights;
> > -
> > -  /// \brief Count the number of times a transition between two blocks
> is
> > -  /// executed.
> > -  ///
> > -  /// As a special case, we also hold an edge from the null BasicBlock
> to the
> > -  /// entry block to indicate how many times the function was entered.
> > -  DenseMap<const FType*, EdgeWeights> EdgeInformation;
> > -
> > -public:
> > -  /// getFunction() - Returns the Function for an Edge.
> > -  static const FType *getFunction(Edge e) {
> > -    // e.first may be NULL
> > -    assert(((!e.first) || (e.first->getParent() ==
> e.second->getParent()))
> > -           && "A ProfileData::Edge can not be between two functions");
> > -    assert(e.second && "A ProfileData::Edge must have a real sink");
> > -    return e.second->getParent();
> > -  }
> > -
> > -  /// getEdge() - Creates an Edge between two BasicBlocks.
> > -  static Edge getEdge(const BType *Src, const BType *Dest) {
> > -    return Edge(Src, Dest);
> > -  }
> > -
> > -  /// getEdgeWeight - Return the number of times that a given edge was
> > -  /// executed.
> > -  unsigned getEdgeWeight(Edge e) const {
> > -    const FType *f = getFunction(e);
> > -    assert((EdgeInformation.find(f) != EdgeInformation.end())
> > -           && "No profiling information for function");
> > -    EdgeWeights weights = EdgeInformation.find(f)->second;
> > -
> > -    assert((weights.find(e) != weights.end())
> > -           && "No profiling information for edge");
> > -    return weights.find(e)->second;
> > -  }
> > -
> > -  /// addEdgeWeight - Add 'weight' to the already stored execution
> count for
> > -  /// this edge.
> > -  void addEdgeWeight(Edge e, unsigned weight) {
> > -    EdgeInformation[getFunction(e)][e] += weight;
> > -  }
> > -};
> > -
> > -typedef ProfileDataT<Function, BasicBlock> ProfileData;
> > -//typedef ProfileDataT<MachineFunction, MachineBasicBlock>
> MachineProfileData;
> > -
> > -/// The ProfileDataLoader class is used to load raw profiling data from
> the
> > -/// dump file.
> > -class ProfileDataLoader {
> > -private:
> > -  /// The name of the file where the raw profiling data is stored.
> > -  const std::string &Filename;
> > -
> > -  /// A vector of the command line arguments used when the target
> program was
> > -  /// run to generate profiling data.  One entry per program run.
> > -  SmallVector<std::string, 1> CommandLines;
> > -
> > -  /// The raw values for how many times each edge was traversed, values
> from
> > -  /// multiple program runs are accumulated.
> > -  SmallVector<unsigned, 32> EdgeCounts;
> > -
> > -public:
> > -  /// ProfileDataLoader ctor - Read the specified profiling data file,
> exiting
> > -  /// the program if the file is invalid or broken.
> > -  ProfileDataLoader(const char *ToolName, const std::string &Filename);
> > -
> > -  /// A special value used to represent the weight of an edge which has
> not
> > -  /// been counted yet.
> > -  static const unsigned Uncounted;
> > -
> > -  /// getNumExecutions - Return the number of times the target program
> was run
> > -  /// to generate this profiling data.
> > -  unsigned getNumExecutions() const { return CommandLines.size(); }
> > -
> > -  /// getExecution - Return the command line parameters used to
> generate the
> > -  /// i'th set of profiling data.
> > -  const std::string &getExecution(unsigned i) const { return
> CommandLines[i]; }
> > -
> > -  const std::string &getFileName() const { return Filename; }
> > -
> > -  /// getRawEdgeCounts - Return the raw profiling data, this is just a
> list of
> > -  /// numbers with no mappings to edges.
> > -  ArrayRef<unsigned> getRawEdgeCounts() const { return EdgeCounts; }
> > -};
> > -
> > -/// createProfileMetadataLoaderPass - This function returns a Pass that
> loads
> > -/// the profiling information for the module from the specified
> filename.
> > -ModulePass *createProfileMetadataLoaderPass(const std::string
> &Filename);
> > -
> > -} // End llvm namespace
> > -
> > -#endif
> >
> > Removed: llvm/trunk/include/llvm/Analysis/ProfileDataTypes.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ProfileDataTypes.h?rev=191834&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/Analysis/ProfileDataTypes.h (original)
> > +++ llvm/trunk/include/llvm/Analysis/ProfileDataTypes.h (removed)
> > @@ -1,39 +0,0 @@
> > -/*===-- ProfileDataTypes.h - Profiling info shared constants
> --------------===*\
> > -|*
> > -|*                     The LLVM Compiler Infrastructure
> > -|*
> > -|* This file is distributed under the University of Illinois Open Source
> > -|* License. See LICENSE.TXT for details.
> > -|*
> >
> -|*===----------------------------------------------------------------------===*|
> > -|*
> > -|* This file defines constants shared by the various different profiling
> > -|* runtime libraries and the LLVM C++ profile metadata loader. It must
> be a
> > -|* C header because, at present, the profiling runtimes are written in
> C.
> > -|*
> >
> -\*===----------------------------------------------------------------------===*/
> > -
> > -#ifndef LLVM_ANALYSIS_PROFILEDATATYPES_H
> > -#define LLVM_ANALYSIS_PROFILEDATATYPES_H
> > -
> > -/* Included by libprofile. */
> > -#if defined(__cplusplus)
> > -extern "C" {
> > -#endif
> > -
> > -/* TODO: Strip out unused entries once ProfileInfo etc has been
> removed. */
> > -enum ProfilingType {
> > -  ArgumentInfo  = 1,   /* The command line argument block */
> > -  FunctionInfo  = 2,   /* Function profiling information  */
> > -  BlockInfo     = 3,   /* Block profiling information     */
> > -  EdgeInfo      = 4,   /* Edge profiling information      */
> > -  PathInfo      = 5,   /* Path profiling information      */
> > -  BBTraceInfo   = 6,   /* Basic block trace information   */
> > -  OptEdgeInfo   = 7    /* Edge profiling information, optimal version */
> > -};
> > -
> > -#if defined(__cplusplus)
> > -}
> > -#endif
> > -
> > -#endif /* LLVM_ANALYSIS_PROFILEDATATYPES_H */
> >
> > Removed: llvm/trunk/include/llvm/Analysis/ProfileInfo.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ProfileInfo.h?rev=191834&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/Analysis/ProfileInfo.h (original)
> > +++ llvm/trunk/include/llvm/Analysis/ProfileInfo.h (removed)
> > @@ -1,247 +0,0 @@
> > -//===- llvm/Analysis/ProfileInfo.h - Profile Info Interface -----*- C++
> -*-===//
> > -//
> > -//                     The LLVM Compiler Infrastructure
> > -//
> > -// This file is distributed under the University of Illinois Open Source
> > -// License. See LICENSE.TXT for details.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -//
> > -// This file defines the generic ProfileInfo interface, which is used
> as the
> > -// common interface used by all clients of profiling information, and
> > -// implemented either by making static guestimations, or by actually
> reading in
> > -// profiling information gathered by running the program.
> > -//
> > -// Note that to be useful, all profile-based optimizations should
> preserve
> > -// ProfileInfo, which requires that they notify it when changes to the
> CFG are
> > -// made. (This is not implemented yet.)
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -
> > -#ifndef LLVM_ANALYSIS_PROFILEINFO_H
> > -#define LLVM_ANALYSIS_PROFILEINFO_H
> > -
> > -#include "llvm/Support/Debug.h"
> > -#include "llvm/Support/ErrorHandling.h"
> > -#include "llvm/Support/Format.h"
> > -#include "llvm/Support/raw_ostream.h"
> > -#include <cassert>
> > -#include <map>
> > -#include <set>
> > -#include <string>
> > -
> > -namespace llvm {
> > -  class Pass;
> > -  class raw_ostream;
> > -
> > -  class BasicBlock;
> > -  class Function;
> > -  class MachineBasicBlock;
> > -  class MachineFunction;
> > -
> > -  // Helper for dumping edges to dbgs().
> > -  raw_ostream& operator<<(raw_ostream &O, std::pair<const BasicBlock *,
> const BasicBlock *> E);
> > -  raw_ostream& operator<<(raw_ostream &O, std::pair<const
> MachineBasicBlock *, const MachineBasicBlock *> E);
> > -
> > -  raw_ostream& operator<<(raw_ostream &O, const BasicBlock *BB);
> > -  raw_ostream& operator<<(raw_ostream &O, const MachineBasicBlock *MBB);
> > -
> > -  raw_ostream& operator<<(raw_ostream &O, const Function *F);
> > -  raw_ostream& operator<<(raw_ostream &O, const MachineFunction *MF);
> > -
> > -  /// ProfileInfo Class - This class holds and maintains profiling
> > -  /// information for some unit of code.
> > -  template<class FType, class BType>
> > -  class ProfileInfoT {
> > -  public:
> > -    // Types for handling profiling information.
> > -    typedef std::pair<const BType*, const BType*> Edge;
> > -    typedef std::pair<Edge, double> EdgeWeight;
> > -    typedef std::map<Edge, double> EdgeWeights;
> > -    typedef std::map<const BType*, double> BlockCounts;
> > -    typedef std::map<const BType*, const BType*> Path;
> > -
> > -  protected:
> > -    // EdgeInformation - Count the number of times a transition between
> two
> > -    // blocks is executed. As a special case, we also hold an edge from
> the
> > -    // null BasicBlock to the entry block to indicate how many times the
> > -    // function was entered.
> > -    std::map<const FType*, EdgeWeights> EdgeInformation;
> > -
> > -    // BlockInformation - Count the number of times a block is executed.
> > -    std::map<const FType*, BlockCounts> BlockInformation;
> > -
> > -    // FunctionInformation - Count the number of times a function is
> executed.
> > -    std::map<const FType*, double> FunctionInformation;
> > -
> > -    ProfileInfoT<MachineFunction, MachineBasicBlock> *MachineProfile;
> > -  public:
> > -    static char ID; // Class identification, replacement for typeinfo
> > -    ProfileInfoT();
> > -    ~ProfileInfoT();  // We want to be subclassed
> > -
> > -    // MissingValue - The value that is returned for execution counts
> in case
> > -    // no value is available.
> > -    static const double MissingValue;
> > -
> > -    // getFunction() - Returns the Function for an Edge, checking for
> validity.
> > -    static const FType* getFunction(Edge e) {
> > -      if (e.first)
> > -        return e.first->getParent();
> > -      if (e.second)
> > -        return e.second->getParent();
> > -      llvm_unreachable("Invalid ProfileInfo::Edge");
> > -    }
> > -
> > -    // getEdge() - Creates an Edge from two BasicBlocks.
> > -    static Edge getEdge(const BType *Src, const BType *Dest) {
> > -      return std::make_pair(Src, Dest);
> > -    }
> > -
> > -
>  //===------------------------------------------------------------------===//
> > -    /// Profile Information Queries
> > -    ///
> > -    double getExecutionCount(const FType *F);
> > -
> > -    double getExecutionCount(const BType *BB);
> > -
> > -    void setExecutionCount(const BType *BB, double w);
> > -
> > -    void addExecutionCount(const BType *BB, double w);
> > -
> > -    double getEdgeWeight(Edge e) const {
> > -      typename std::map<const FType*, EdgeWeights>::const_iterator J =
> > -        EdgeInformation.find(getFunction(e));
> > -      if (J == EdgeInformation.end()) return MissingValue;
> > -
> > -      typename EdgeWeights::const_iterator I = J->second.find(e);
> > -      if (I == J->second.end()) return MissingValue;
> > -
> > -      return I->second;
> > -    }
> > -
> > -    void setEdgeWeight(Edge e, double w) {
> > -      DEBUG_WITH_TYPE("profile-info",
> > -            dbgs() << "Creating Edge " << e
> > -                   << " (weight: " << format("%.20g",w) << ")\n");
> > -      EdgeInformation[getFunction(e)][e] = w;
> > -    }
> > -
> > -    void addEdgeWeight(Edge e, double w);
> > -
> > -    EdgeWeights &getEdgeWeights (const FType *F) {
> > -      return EdgeInformation[F];
> > -    }
> > -
> > -
>  //===------------------------------------------------------------------===//
> > -    /// Analysis Update Methods
> > -    ///
> > -    void removeBlock(const BType *BB);
> > -
> > -    void removeEdge(Edge e);
> > -
> > -    void replaceEdge(const Edge &, const Edge &);
> > -
> > -    enum GetPathMode {
> > -      GetPathToExit = 1,
> > -      GetPathToValue = 2,
> > -      GetPathToDest = 4,
> > -      GetPathWithNewEdges = 8
> > -    };
> > -
> > -    const BType *GetPath(const BType *Src, const BType *Dest,
> > -                              Path &P, unsigned Mode);
> > -
> > -    void divertFlow(const Edge &, const Edge &);
> > -
> > -    void splitEdge(const BType *FirstBB, const BType *SecondBB,
> > -                   const BType *NewBB, bool MergeIdenticalEdges =
> false);
> > -
> > -    void splitBlock(const BType *Old, const BType* New);
> > -
> > -    void splitBlock(const BType *BB, const BType* NewBB,
> > -                    BType *const *Preds, unsigned NumPreds);
> > -
> > -    void replaceAllUses(const BType *RmBB, const BType *DestBB);
> > -
> > -    void transfer(const FType *Old, const FType *New);
> > -
> > -    void repair(const FType *F);
> > -
> > -    void dump(FType *F = 0, bool real = true) {
> > -      dbgs() << "**** This is ProfileInfo " << this << " speaking:\n";
> > -      if (!real) {
> > -        typename std::set<const FType*> Functions;
> > -
> > -        dbgs() << "Functions: \n";
> > -        if (F) {
> > -          dbgs() << F << "@" << format("%p", F) << ": " <<
> format("%.20g",getExecutionCount(F)) << "\n";
> > -          Functions.insert(F);
> > -        } else {
> > -          for (typename std::map<const FType*, double>::iterator fi =
> FunctionInformation.begin(),
> > -               fe = FunctionInformation.end(); fi != fe; ++fi) {
> > -            dbgs() << fi->first << "@" << format("%p",fi->first) << ":
> " << format("%.20g",fi->second) << "\n";
> > -            Functions.insert(fi->first);
> > -          }
> > -        }
> > -
> > -        for (typename std::set<const FType*>::iterator FI =
> Functions.begin(), FE = Functions.end();
> > -             FI != FE; ++FI) {
> > -          const FType *F = *FI;
> > -          typename std::map<const FType*, BlockCounts>::iterator bwi =
> BlockInformation.find(F);
> > -          dbgs() << "BasicBlocks for Function " << F << ":\n";
> > -          for (typename BlockCounts::const_iterator bi =
> bwi->second.begin(), be = bwi->second.end(); bi != be; ++bi) {
> > -            dbgs() << bi->first << "@" << format("%p", bi->first) << ":
> " << format("%.20g",bi->second) << "\n";
> > -          }
> > -        }
> > -
> > -        for (typename std::set<const FType*>::iterator FI =
> Functions.begin(), FE = Functions.end();
> > -             FI != FE; ++FI) {
> > -          typename std::map<const FType*, EdgeWeights>::iterator ei =
> EdgeInformation.find(*FI);
> > -          dbgs() << "Edges for Function " << ei->first << ":\n";
> > -          for (typename EdgeWeights::iterator ewi = ei->second.begin(),
> ewe = ei->second.end();
> > -               ewi != ewe; ++ewi) {
> > -            dbgs() << ewi->first << ": " << format("%.20g",ewi->second)
> << "\n";
> > -          }
> > -        }
> > -      } else {
> > -        assert(F && "No function given, this is not supported!");
> > -        dbgs() << "Functions: \n";
> > -        dbgs() << F << "@" << format("%p", F) << ": " <<
> format("%.20g",getExecutionCount(F)) << "\n";
> > -
> > -        dbgs() << "BasicBlocks for Function " << F << ":\n";
> > -        for (typename FType::const_iterator BI = F->begin(), BE =
> F->end();
> > -             BI != BE; ++BI) {
> > -          const BType *BB = &(*BI);
> > -          dbgs() << BB << "@" << format("%p", BB) << ": " <<
> format("%.20g",getExecutionCount(BB)) << "\n";
> > -        }
> > -      }
> > -      dbgs() << "**** ProfileInfo " << this << ", over and out.\n";
> > -    }
> > -
> > -    bool CalculateMissingEdge(const BType *BB, Edge &removed, bool
> assumeEmptyExit = false);
> > -
> > -    bool EstimateMissingEdges(const BType *BB);
> > -
> > -    ProfileInfoT<MachineFunction, MachineBasicBlock> *MI() {
> > -      if (MachineProfile == 0)
> > -        MachineProfile = new ProfileInfoT<MachineFunction,
> MachineBasicBlock>();
> > -      return MachineProfile;
> > -    }
> > -
> > -    bool hasMI() const {
> > -      return (MachineProfile != 0);
> > -    }
> > -  };
> > -
> > -  typedef ProfileInfoT<Function, BasicBlock> ProfileInfo;
> > -  typedef ProfileInfoT<MachineFunction, MachineBasicBlock>
> MachineProfileInfo;
> > -
> > -  /// createProfileLoaderPass - This function returns a Pass that loads
> the
> > -  /// profiling information for the module from the specified filename,
> making
> > -  /// it available to the optimizers.
> > -  Pass *createProfileLoaderPass(const std::string &Filename);
> > -
> > -} // End llvm namespace
> > -
> > -#endif
> >
> > Removed: llvm/trunk/include/llvm/Analysis/ProfileInfoLoader.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ProfileInfoLoader.h?rev=191834&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/Analysis/ProfileInfoLoader.h (original)
> > +++ llvm/trunk/include/llvm/Analysis/ProfileInfoLoader.h (removed)
> > @@ -1,81 +0,0 @@
> > -//===- ProfileInfoLoader.h - Load & convert profile information -*- C++
> -*-===//
> > -//
> > -//                      The LLVM Compiler Infrastructure
> > -//
> > -// This file is distributed under the University of Illinois Open Source
> > -// License. See LICENSE.TXT for details.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -//
> > -// The ProfileInfoLoader class is used to load and represent profiling
> > -// information read in from the dump file.  If conversions between
> formats are
> > -// needed, it can also do this.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -
> > -#ifndef LLVM_ANALYSIS_PROFILEINFOLOADER_H
> > -#define LLVM_ANALYSIS_PROFILEINFOLOADER_H
> > -
> > -#include <string>
> > -#include <utility>
> > -#include <vector>
> > -
> > -namespace llvm {
> > -
> > -class Module;
> > -class Function;
> > -class BasicBlock;
> > -
> > -class ProfileInfoLoader {
> > -  const std::string &Filename;
> > -  std::vector<std::string> CommandLines;
> > -  std::vector<unsigned>    FunctionCounts;
> > -  std::vector<unsigned>    BlockCounts;
> > -  std::vector<unsigned>    EdgeCounts;
> > -  std::vector<unsigned>    OptimalEdgeCounts;
> > -  std::vector<unsigned>    BBTrace;
> > -public:
> > -  // ProfileInfoLoader ctor - Read the specified profiling data file,
> exiting
> > -  // the program if the file is invalid or broken.
> > -  ProfileInfoLoader(const char *ToolName, const std::string &Filename);
> > -
> > -  static const unsigned Uncounted;
> > -
> > -  unsigned getNumExecutions() const { return CommandLines.size(); }
> > -  const std::string &getExecution(unsigned i) const { return
> CommandLines[i]; }
> > -
> > -  const std::string &getFileName() const { return Filename; }
> > -
> > -  // getRawFunctionCounts - This method is used by consumers of function
> > -  // counting information.
> > -  //
> > -  const std::vector<unsigned> &getRawFunctionCounts() const {
> > -    return FunctionCounts;
> > -  }
> > -
> > -  // getRawBlockCounts - This method is used by consumers of block
> counting
> > -  // information.
> > -  //
> > -  const std::vector<unsigned> &getRawBlockCounts() const {
> > -    return BlockCounts;
> > -  }
> > -
> > -  // getEdgeCounts - This method is used by consumers of edge counting
> > -  // information.
> > -  //
> > -  const std::vector<unsigned> &getRawEdgeCounts() const {
> > -    return EdgeCounts;
> > -  }
> > -
> > -  // getEdgeOptimalCounts - This method is used by consumers of optimal
> edge
> > -  // counting information.
> > -  //
> > -  const std::vector<unsigned> &getRawOptimalEdgeCounts() const {
> > -    return OptimalEdgeCounts;
> > -  }
> > -
> > -};
> > -
> > -} // End llvm namespace
> > -
> > -#endif
> >
> > Removed: llvm/trunk/include/llvm/Analysis/ProfileInfoTypes.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ProfileInfoTypes.h?rev=191834&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/Analysis/ProfileInfoTypes.h (original)
> > +++ llvm/trunk/include/llvm/Analysis/ProfileInfoTypes.h (removed)
> > @@ -1,52 +0,0 @@
> > -/*===-- ProfileInfoTypes.h - Profiling info shared constants
> --------------===*\
> > -|*
> > -|*                     The LLVM Compiler Infrastructure
> > -|*
> > -|* This file is distributed under the University of Illinois Open Source
> > -|* License. See LICENSE.TXT for details.
> > -|*
> >
> -|*===----------------------------------------------------------------------===*|
> > -|*
> > -|* This file defines constants shared by the various different profiling
> > -|* runtime libraries and the LLVM C++ profile info loader. It must be a
> > -|* C header because, at present, the profiling runtimes are written in
> C.
> > -|*
> >
> -\*===----------------------------------------------------------------------===*/
> > -
> > -#ifndef LLVM_ANALYSIS_PROFILEINFOTYPES_H
> > -#define LLVM_ANALYSIS_PROFILEINFOTYPES_H
> > -
> > -/* Included by libprofile. */
> > -#if defined(__cplusplus)
> > -extern "C" {
> > -#endif
> > -
> > -/* IDs to distinguish between those path counters stored in hashses vs
> arrays */
> > -enum ProfilingStorageType {
> > -  ProfilingArray = 1,
> > -  ProfilingHash = 2
> > -};
> > -
> > -#include "llvm/Analysis/ProfileDataTypes.h"
> > -
> > -/*
> > - * The header for tables that map path numbers to path counters.
> > - */
> > -typedef struct {
> > -  unsigned fnNumber; /* function number for these counters */
> > -  unsigned numEntries;   /* number of entries stored */
> > -} PathProfileHeader;
> > -
> > -/*
> > - * Describes an entry in a tagged table for path counters.
> > - */
> > -typedef struct {
> > -  unsigned pathNumber;
> > -  unsigned pathCounter;
> > -} PathProfileTableEntry;
> > -
> > -#if defined(__cplusplus)
> > -}
> > -#endif
> > -
> > -#endif /* LLVM_ANALYSIS_PROFILEINFOTYPES_H */
> >
> > Modified: llvm/trunk/include/llvm/InitializePasses.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/InitializePasses.h?rev=191835&r1=191834&r2=191835&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/InitializePasses.h (original)
> > +++ llvm/trunk/include/llvm/InitializePasses.h Wed Oct  2 10:42:23 2013
> > @@ -113,9 +113,7 @@ void initializeDominanceFrontierPass(Pas
> >  void initializeDominatorTreePass(PassRegistry&);
> >  void initializeEarlyIfConverterPass(PassRegistry&);
> >  void initializeEdgeBundlesPass(PassRegistry&);
> > -void initializeEdgeProfilerPass(PassRegistry&);
> >  void initializeExpandPostRAPass(PassRegistry&);
> > -void initializePathProfilerPass(PassRegistry&);
> >  void initializeGCOVProfilerPass(PassRegistry&);
> >  void initializeAddressSanitizerPass(PassRegistry&);
> >  void initializeAddressSanitizerModulePass(PassRegistry&);
> > @@ -155,8 +153,6 @@ void initializeLiveRegMatrixPass(PassReg
> >  void initializeLiveStacksPass(PassRegistry&);
> >  void initializeLiveVariablesPass(PassRegistry&);
> >  void initializeLoaderPassPass(PassRegistry&);
> > -void initializeProfileMetadataLoaderPassPass(PassRegistry&);
> > -void initializePathProfileLoaderPassPass(PassRegistry&);
> >  void initializeLocalStackSlotPassPass(PassRegistry&);
> >  void initializeLoopDeletionPass(PassRegistry&);
> >  void initializeLoopExtractorPass(PassRegistry&);
> > @@ -195,14 +191,11 @@ void initializeMetaRenamerPass(PassRegis
> >  void initializeMergeFunctionsPass(PassRegistry&);
> >  void initializeModuleDebugInfoPrinterPass(PassRegistry&);
> >  void initializeNoAAPass(PassRegistry&);
> > -void initializeNoProfileInfoPass(PassRegistry&);
> > -void initializeNoPathProfileInfoPass(PassRegistry&);
> >  void initializeObjCARCAliasAnalysisPass(PassRegistry&);
> >  void initializeObjCARCAPElimPass(PassRegistry&);
> >  void initializeObjCARCExpandPass(PassRegistry&);
> >  void initializeObjCARCContractPass(PassRegistry&);
> >  void initializeObjCARCOptPass(PassRegistry&);
> > -void initializeOptimalEdgeProfilerPass(PassRegistry&);
> >  void initializeOptimizePHIsPass(PassRegistry&);
> >  void initializePartiallyInlineLibCallsPass(PassRegistry&);
> >  void initializePEIPass(PassRegistry&);
> > @@ -220,11 +213,6 @@ void initializePrintFunctionPassPass(Pas
> >  void initializePrintModulePassPass(PassRegistry&);
> >  void initializePrintBasicBlockPassPass(PassRegistry&);
> >  void initializeProcessImplicitDefsPass(PassRegistry&);
> > -void initializeProfileEstimatorPassPass(PassRegistry&);
> > -void initializeProfileInfoAnalysisGroup(PassRegistry&);
> > -void initializePathProfileInfoAnalysisGroup(PassRegistry&);
> > -void initializePathProfileVerifierPass(PassRegistry&);
> > -void initializeProfileVerifierPassPass(PassRegistry&);
> >  void initializePromotePassPass(PassRegistry&);
> >  void initializePruneEHPass(PassRegistry&);
> >  void initializeReassociatePass(PassRegistry&);
> >
> > Modified: llvm/trunk/include/llvm/LinkAllPasses.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/LinkAllPasses.h?rev=191835&r1=191834&r2=191835&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/LinkAllPasses.h (original)
> > +++ llvm/trunk/include/llvm/LinkAllPasses.h Wed Oct  2 10:42:23 2013
> > @@ -74,9 +74,6 @@ namespace {
> >        (void) llvm::createDomPrinterPass();
> >        (void) llvm::createDomOnlyViewerPass();
> >        (void) llvm::createDomViewerPass();
> > -      (void) llvm::createEdgeProfilerPass();
> > -      (void) llvm::createOptimalEdgeProfilerPass();
> > -      (void) llvm::createPathProfilerPass();
> >        (void) llvm::createGCOVProfilerPass();
> >        (void) llvm::createFunctionInliningPass();
> >        (void) llvm::createAlwaysInlinerPass();
> > @@ -102,18 +99,11 @@ namespace {
> >        (void) llvm::createLowerInvokePass();
> >        (void) llvm::createLowerSwitchPass();
> >        (void) llvm::createNoAAPass();
> > -      (void) llvm::createNoProfileInfoPass();
> >        (void) llvm::createObjCARCAliasAnalysisPass();
> >        (void) llvm::createObjCARCAPElimPass();
> >        (void) llvm::createObjCARCExpandPass();
> >        (void) llvm::createObjCARCContractPass();
> >        (void) llvm::createObjCARCOptPass();
> > -      (void) llvm::createProfileEstimatorPass();
> > -      (void) llvm::createProfileVerifierPass();
> > -      (void) llvm::createPathProfileVerifierPass();
> > -      (void) llvm::createProfileLoaderPass();
> > -      (void) llvm::createProfileMetadataLoaderPass();
> > -      (void) llvm::createPathProfileLoaderPass();
> >        (void) llvm::createPromoteMemoryToRegisterPass();
> >        (void) llvm::createDemoteRegisterToMemoryPass();
> >        (void) llvm::createPruneEHPass();
> >
> > Modified: llvm/trunk/include/llvm/Transforms/Instrumentation.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Instrumentation.h?rev=191835&r1=191834&r2=191835&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/Transforms/Instrumentation.h (original)
> > +++ llvm/trunk/include/llvm/Transforms/Instrumentation.h Wed Oct  2
> 10:42:23 2013
> > @@ -35,15 +35,6 @@ namespace llvm {
> >  class ModulePass;
> >  class FunctionPass;
> >
> > -// Insert edge profiling instrumentation
> > -ModulePass *createEdgeProfilerPass();
> > -
> > -// Insert optimal edge profiling instrumentation
> > -ModulePass *createOptimalEdgeProfilerPass();
> > -
> > -// Insert path profiling instrumentation
> > -ModulePass *createPathProfilerPass();
> > -
> >  // Insert GCOV profiling instrumentation
> >  struct GCOVOptions {
> >    static GCOVOptions getDefault();
> >
> > Modified: llvm/trunk/lib/Analysis/Analysis.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/Analysis.cpp?rev=191835&r1=191834&r2=191835&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/Analysis/Analysis.cpp (original)
> > +++ llvm/trunk/lib/Analysis/Analysis.cpp Wed Oct  2 10:42:23 2013
> > @@ -54,16 +54,6 @@ void llvm::initializeAnalysis(PassRegist
> >    initializeMemoryDependenceAnalysisPass(Registry);
> >    initializeModuleDebugInfoPrinterPass(Registry);
> >    initializePostDominatorTreePass(Registry);
> > -  initializeProfileEstimatorPassPass(Registry);
> > -  initializeNoProfileInfoPass(Registry);
> > -  initializeNoPathProfileInfoPass(Registry);
> > -  initializeProfileInfoAnalysisGroup(Registry);
> > -  initializePathProfileInfoAnalysisGroup(Registry);
> > -  initializeLoaderPassPass(Registry);
> > -  initializePathProfileLoaderPassPass(Registry);
> > -  initializeProfileVerifierPassPass(Registry);
> > -  initializePathProfileVerifierPass(Registry);
> > -  initializeProfileMetadataLoaderPassPass(Registry);
> >    initializeRegionInfoPass(Registry);
> >    initializeRegionViewerPass(Registry);
> >    initializeRegionPrinterPass(Registry);
> >
> > Modified: llvm/trunk/lib/Analysis/CMakeLists.txt
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CMakeLists.txt?rev=191835&r1=191834&r2=191835&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/Analysis/CMakeLists.txt (original)
> > +++ llvm/trunk/lib/Analysis/CMakeLists.txt Wed Oct  2 10:42:23 2013
> > @@ -35,17 +35,7 @@ add_llvm_library(LLVMAnalysis
> >    ModuleDebugInfoPrinter.cpp
> >    NoAliasAnalysis.cpp
> >    PHITransAddr.cpp
> > -  PathNumbering.cpp
> > -  PathProfileInfo.cpp
> > -  PathProfileVerifier.cpp
> >    PostDominators.cpp
> > -  ProfileEstimatorPass.cpp
> > -  ProfileInfo.cpp
> > -  ProfileInfoLoader.cpp
> > -  ProfileInfoLoaderPass.cpp
> > -  ProfileVerifierPass.cpp
> > -  ProfileDataLoader.cpp
> > -  ProfileDataLoaderPass.cpp
> >    PtrUseVisitor.cpp
> >    RegionInfo.cpp
> >    RegionPass.cpp
> >
> > Removed: llvm/trunk/lib/Analysis/PathNumbering.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/PathNumbering.cpp?rev=191834&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/lib/Analysis/PathNumbering.cpp (original)
> > +++ llvm/trunk/lib/Analysis/PathNumbering.cpp (removed)
> > @@ -1,521 +0,0 @@
> > -//===- PathNumbering.cpp --------------------------------------*- C++
> -*---===//
> > -//
> > -//                     The LLVM Compiler Infrastructure
> > -//
> > -// This file is distributed under the University of Illinois Open Source
> > -// License. See LICENSE.TXT for details.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -//
> > -// Ball-Larus path numbers uniquely identify paths through a directed
> acyclic
> > -// graph (DAG) [Ball96].  For a CFG backedges are removed and replaced
> by phony
> > -// edges to obtain a DAG, and thus the unique path numbers [Ball96].
> > -//
> > -// The purpose of this analysis is to enumerate the edges in a CFG in
> order
> > -// to obtain paths from path numbers in a convenient manner.  As
> described in
> > -// [Ball96] edges can be enumerated such that given a path number by
> following
> > -// the CFG and updating the path number, the path is obtained.
> > -//
> > -// [Ball96]
> > -//  T. Ball and J. R. Larus. "Efficient Path Profiling."
> > -//  International Symposium on Microarchitecture, pages 46-57, 1996.
> > -//  http://portal.acm.org/citation.cfm?id=243857
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -#define DEBUG_TYPE "ball-larus-numbering"
> > -
> > -#include "llvm/Analysis/PathNumbering.h"
> > -#include "llvm/IR/Constants.h"
> > -#include "llvm/IR/DerivedTypes.h"
> > -#include "llvm/IR/InstrTypes.h"
> > -#include "llvm/IR/Instructions.h"
> > -#include "llvm/IR/Module.h"
> > -#include "llvm/IR/TypeBuilder.h"
> > -#include "llvm/Pass.h"
> > -#include "llvm/Support/CFG.h"
> > -#include "llvm/Support/CommandLine.h"
> > -#include "llvm/Support/Compiler.h"
> > -#include "llvm/Support/Debug.h"
> > -#include "llvm/Support/raw_ostream.h"
> > -#include <queue>
> > -#include <sstream>
> > -#include <stack>
> > -#include <string>
> > -#include <utility>
> > -
> > -using namespace llvm;
> > -
> > -// Are we enabling early termination
> > -static cl::opt<bool> ProcessEarlyTermination(
> > -  "path-profile-early-termination", cl::Hidden,
> > -  cl::desc("In path profiling, insert extra instrumentation to account
> for "
> > -           "unexpected function termination."));
> > -
> > -// Returns the basic block for the BallLarusNode
> > -BasicBlock* BallLarusNode::getBlock() {
> > -  return(_basicBlock);
> > -}
> > -
> > -// Returns the number of paths to the exit starting at the node.
> > -unsigned BallLarusNode::getNumberPaths() {
> > -  return(_numberPaths);
> > -}
> > -
> > -// Sets the number of paths to the exit starting at the node.
> > -void BallLarusNode::setNumberPaths(unsigned numberPaths) {
> > -  _numberPaths = numberPaths;
> > -}
> > -
> > -// Gets the NodeColor used in graph algorithms.
> > -BallLarusNode::NodeColor BallLarusNode::getColor() {
> > -  return(_color);
> > -}
> > -
> > -// Sets the NodeColor used in graph algorithms.
> > -void BallLarusNode::setColor(BallLarusNode::NodeColor color) {
> > -  _color = color;
> > -}
> > -
> > -// Returns an iterator over predecessor edges. Includes phony and
> > -// backedges.
> > -BLEdgeIterator BallLarusNode::predBegin() {
> > -  return(_predEdges.begin());
> > -}
> > -
> > -// Returns the end sentinel for the predecessor iterator.
> > -BLEdgeIterator BallLarusNode::predEnd() {
> > -  return(_predEdges.end());
> > -}
> > -
> > -// Returns the number of predecessor edges.  Includes phony and
> > -// backedges.
> > -unsigned BallLarusNode::getNumberPredEdges() {
> > -  return(_predEdges.size());
> > -}
> > -
> > -// Returns an iterator over successor edges. Includes phony and
> > -// backedges.
> > -BLEdgeIterator BallLarusNode::succBegin() {
> > -  return(_succEdges.begin());
> > -}
> > -
> > -// Returns the end sentinel for the successor iterator.
> > -BLEdgeIterator BallLarusNode::succEnd() {
> > -  return(_succEdges.end());
> > -}
> > -
> > -// Returns the number of successor edges.  Includes phony and
> > -// backedges.
> > -unsigned BallLarusNode::getNumberSuccEdges() {
> > -  return(_succEdges.size());
> > -}
> > -
> > -// Add an edge to the predecessor list.
> > -void BallLarusNode::addPredEdge(BallLarusEdge* edge) {
> > -  _predEdges.push_back(edge);
> > -}
> > -
> > -// Remove an edge from the predecessor list.
> > -void BallLarusNode::removePredEdge(BallLarusEdge* edge) {
> > -  removeEdge(_predEdges, edge);
> > -}
> > -
> > -// Add an edge to the successor list.
> > -void BallLarusNode::addSuccEdge(BallLarusEdge* edge) {
> > -  _succEdges.push_back(edge);
> > -}
> > -
> > -// Remove an edge from the successor list.
> > -void BallLarusNode::removeSuccEdge(BallLarusEdge* edge) {
> > -  removeEdge(_succEdges, edge);
> > -}
> > -
> > -// Returns the name of the BasicBlock being represented.  If BasicBlock
> > -// is null then returns "<null>".  If BasicBlock has no name, then
> > -// "<unnamed>" is returned.  Intended for use with debug output.
> > -std::string BallLarusNode::getName() {
> > -  std::stringstream name;
> > -
> > -  if(getBlock() != NULL) {
> > -    if(getBlock()->hasName()) {
> > -      std::string tempName(getBlock()->getName());
> > -      name << tempName.c_str() << " (" << _uid << ")";
> > -    } else
> > -      name << "<unnamed> (" << _uid << ")";
> > -  } else
> > -    name << "<null> (" << _uid << ")";
> > -
> > -  return name.str();
> > -}
> > -
> > -// Removes an edge from an edgeVector.  Used by removePredEdge and
> > -// removeSuccEdge.
> > -void BallLarusNode::removeEdge(BLEdgeVector& v, BallLarusEdge* e) {
> > -  // TODO: Avoid linear scan by using a set instead
> > -  for(BLEdgeIterator i = v.begin(),
> > -        end = v.end();
> > -      i != end;
> > -      ++i) {
> > -    if((*i) == e) {
> > -      v.erase(i);
> > -      break;
> > -    }
> > -  }
> > -}
> > -
> > -// Returns the source node of this edge.
> > -BallLarusNode* BallLarusEdge::getSource() const {
> > -  return(_source);
> > -}
> > -
> > -// Returns the target node of this edge.
> > -BallLarusNode* BallLarusEdge::getTarget() const {
> > -  return(_target);
> > -}
> > -
> > -// Sets the type of the edge.
> > -BallLarusEdge::EdgeType BallLarusEdge::getType() const {
> > -  return _edgeType;
> > -}
> > -
> > -// Gets the type of the edge.
> > -void BallLarusEdge::setType(EdgeType type) {
> > -  _edgeType = type;
> > -}
> > -
> > -// Returns the weight of this edge.  Used to decode path numbers to
> sequences
> > -// of basic blocks.
> > -unsigned BallLarusEdge::getWeight() {
> > -  return(_weight);
> > -}
> > -
> > -// Sets the weight of the edge.  Used during path numbering.
> > -void BallLarusEdge::setWeight(unsigned weight) {
> > -  _weight = weight;
> > -}
> > -
> > -// Gets the phony edge originating at the root.
> > -BallLarusEdge* BallLarusEdge::getPhonyRoot() {
> > -  return _phonyRoot;
> > -}
> > -
> > -// Sets the phony edge originating at the root.
> > -void BallLarusEdge::setPhonyRoot(BallLarusEdge* phonyRoot) {
> > -  _phonyRoot = phonyRoot;
> > -}
> > -
> > -// Gets the phony edge terminating at the exit.
> > -BallLarusEdge* BallLarusEdge::getPhonyExit() {
> > -  return _phonyExit;
> > -}
> > -
> > -// Sets the phony edge terminating at the exit.
> > -void BallLarusEdge::setPhonyExit(BallLarusEdge* phonyExit) {
> > -  _phonyExit = phonyExit;
> > -}
> > -
> > -// Gets the associated real edge if this is a phony edge.
> > -BallLarusEdge* BallLarusEdge::getRealEdge() {
> > -  return _realEdge;
> > -}
> > -
> > -// Sets the associated real edge if this is a phony edge.
> > -void BallLarusEdge::setRealEdge(BallLarusEdge* realEdge) {
> > -  _realEdge = realEdge;
> > -}
> > -
> > -// Returns the duplicate number of the edge.
> > -unsigned BallLarusEdge::getDuplicateNumber() {
> > -  return(_duplicateNumber);
> > -}
> > -
> > -// Initialization that requires virtual functions which are not fully
> > -// functional in the constructor.
> > -void BallLarusDag::init() {
> > -  BLBlockNodeMap inDag;
> > -  std::stack<BallLarusNode*> dfsStack;
> > -
> > -  _root = addNode(&(_function.getEntryBlock()));
> > -  _exit = addNode(NULL);
> > -
> > -  // start search from root
> > -  dfsStack.push(getRoot());
> > -
> > -  // dfs to add each bb into the dag
> > -  while(dfsStack.size())
> > -    buildNode(inDag, dfsStack);
> > -
> > -  // put in the final edge
> > -  addEdge(getExit(),getRoot(),0);
> > -}
> > -
> > -// Frees all memory associated with the DAG.
> > -BallLarusDag::~BallLarusDag() {
> > -  for(BLEdgeIterator edge = _edges.begin(), end = _edges.end(); edge !=
> end;
> > -      ++edge)
> > -    delete (*edge);
> > -
> > -  for(BLNodeIterator node = _nodes.begin(), end = _nodes.end(); node !=
> end;
> > -      ++node)
> > -    delete (*node);
> > -}
> > -
> > -// Calculate the path numbers by assigning edge increments as prescribed
> > -// in Ball-Larus path profiling.
> > -void BallLarusDag::calculatePathNumbers() {
> > -  BallLarusNode* node;
> > -  std::queue<BallLarusNode*> bfsQueue;
> > -  bfsQueue.push(getExit());
> > -
> > -  while(bfsQueue.size() > 0) {
> > -    node = bfsQueue.front();
> > -
> > -    DEBUG(dbgs() << "calculatePathNumbers on " << node->getName() <<
> "\n");
> > -
> > -    bfsQueue.pop();
> > -    unsigned prevPathNumber = node->getNumberPaths();
> > -    calculatePathNumbersFrom(node);
> > -
> > -    // Check for DAG splitting
> > -    if( node->getNumberPaths() > 100000000 && node != getRoot() ) {
> > -      // Add new phony edge from the split-node to the DAG's exit
> > -      BallLarusEdge* exitEdge = addEdge(node, getExit(), 0);
> > -      exitEdge->setType(BallLarusEdge::SPLITEDGE_PHONY);
> > -
> > -      // Counters to handle the possibility of a multi-graph
> > -      BasicBlock* oldTarget = 0;
> > -      unsigned duplicateNumber = 0;
> > -
> > -      // Iterate through each successor edge, adding phony edges
> > -      for( BLEdgeIterator succ = node->succBegin(), end =
> node->succEnd();
> > -           succ != end; oldTarget = (*succ)->getTarget()->getBlock(),
> succ++ ) {
> > -
> > -        if( (*succ)->getType() == BallLarusEdge::NORMAL ) {
> > -          // is this edge a duplicate?
> > -          if( oldTarget != (*succ)->getTarget()->getBlock() )
> > -            duplicateNumber = 0;
> > -
> > -          // create the new phony edge: root -> succ
> > -          BallLarusEdge* rootEdge =
> > -            addEdge(getRoot(), (*succ)->getTarget(), duplicateNumber++);
> > -          rootEdge->setType(BallLarusEdge::SPLITEDGE_PHONY);
> > -          rootEdge->setRealEdge(*succ);
> > -
> > -          // split on this edge and reference it's exit/root phony edges
> > -          (*succ)->setType(BallLarusEdge::SPLITEDGE);
> > -          (*succ)->setPhonyRoot(rootEdge);
> > -          (*succ)->setPhonyExit(exitEdge);
> > -          (*succ)->setWeight(0);
> > -        }
> > -      }
> > -
> > -      calculatePathNumbersFrom(node);
> > -    }
> > -
> > -    DEBUG(dbgs() << "prev, new number paths " << prevPathNumber << ", "
> > -          << node->getNumberPaths() << ".\n");
> > -
> > -    if(prevPathNumber == 0 && node->getNumberPaths() != 0) {
> > -      DEBUG(dbgs() << "node ready : " << node->getName() << "\n");
> > -      for(BLEdgeIterator pred = node->predBegin(), end =
> node->predEnd();
> > -          pred != end; pred++) {
> > -        if( (*pred)->getType() == BallLarusEdge::BACKEDGE ||
> > -            (*pred)->getType() == BallLarusEdge::SPLITEDGE )
> > -          continue;
> > -
> > -        BallLarusNode* nextNode = (*pred)->getSource();
> > -        // not yet visited?
> > -        if(nextNode->getNumberPaths() == 0)
> > -          bfsQueue.push(nextNode);
> > -      }
> > -    }
> > -  }
> > -
> > -  DEBUG(dbgs() << "\tNumber of paths: " << getRoot()->getNumberPaths()
> << "\n");
> > -}
> > -
> > -// Returns the number of paths for the Dag.
> > -unsigned BallLarusDag::getNumberOfPaths() {
> > -  return(getRoot()->getNumberPaths());
> > -}
> > -
> > -// Returns the root (i.e. entry) node for the DAG.
> > -BallLarusNode* BallLarusDag::getRoot() {
> > -  return _root;
> > -}
> > -
> > -// Returns the exit node for the DAG.
> > -BallLarusNode* BallLarusDag::getExit() {
> > -  return _exit;
> > -}
> > -
> > -// Returns the function for the DAG.
> > -Function& BallLarusDag::getFunction() {
> > -  return(_function);
> > -}
> > -
> > -// Clears the node colors.
> > -void BallLarusDag::clearColors(BallLarusNode::NodeColor color) {
> > -  for (BLNodeIterator nodeIt = _nodes.begin(); nodeIt != _nodes.end();
> nodeIt++)
> > -    (*nodeIt)->setColor(color);
> > -}
> > -
> > -// Processes one node and its imediate edges for building the DAG.
> > -void BallLarusDag::buildNode(BLBlockNodeMap& inDag, BLNodeStack&
> dfsStack) {
> > -  BallLarusNode* currentNode = dfsStack.top();
> > -  BasicBlock* currentBlock = currentNode->getBlock();
> > -
> > -  if(currentNode->getColor() != BallLarusNode::WHITE) {
> > -    // we have already visited this node
> > -    dfsStack.pop();
> > -    currentNode->setColor(BallLarusNode::BLACK);
> > -  } else {
> > -    // are there any external procedure calls?
> > -    if( ProcessEarlyTermination ) {
> > -      for( BasicBlock::iterator bbCurrent =
> currentNode->getBlock()->begin(),
> > -             bbEnd = currentNode->getBlock()->end(); bbCurrent != bbEnd;
> > -           bbCurrent++ ) {
> > -        Instruction& instr = *bbCurrent;
> > -        if( instr.getOpcode() == Instruction::Call ) {
> > -          BallLarusEdge* callEdge = addEdge(currentNode, getExit(), 0);
> > -          callEdge->setType(BallLarusEdge::CALLEDGE_PHONY);
> > -          break;
> > -        }
> > -      }
> > -    }
> > -
> > -    TerminatorInst* terminator =
> currentNode->getBlock()->getTerminator();
> > -    if(isa<ReturnInst>(terminator) || isa<UnreachableInst>(terminator)
> ||
> > -       isa<ResumeInst>(terminator))
> > -      addEdge(currentNode, getExit(),0);
> > -
> > -    currentNode->setColor(BallLarusNode::GRAY);
> > -    inDag[currentBlock] = currentNode;
> > -
> > -    BasicBlock* oldSuccessor = 0;
> > -    unsigned duplicateNumber = 0;
> > -
> > -    // iterate through this node's successors
> > -    for(succ_iterator successor = succ_begin(currentBlock),
> > -          succEnd = succ_end(currentBlock); successor != succEnd;
> > -        oldSuccessor = *successor, ++successor ) {
> > -      BasicBlock* succBB = *successor;
> > -
> > -      // is this edge a duplicate?
> > -      if (oldSuccessor == succBB)
> > -        duplicateNumber++;
> > -      else
> > -        duplicateNumber = 0;
> > -
> > -      buildEdge(inDag, dfsStack, currentNode, succBB, duplicateNumber);
> > -    }
> > -  }
> > -}
> > -
> > -// Process an edge in the CFG for DAG building.
> > -void BallLarusDag::buildEdge(BLBlockNodeMap& inDag,
> std::stack<BallLarusNode*>&
> > -                             dfsStack, BallLarusNode* currentNode,
> > -                             BasicBlock* succBB, unsigned
> duplicateCount) {
> > -  BallLarusNode* succNode = inDag[succBB];
> > -
> > -  if(succNode && succNode->getColor() == BallLarusNode::BLACK) {
> > -    // visited node and forward edge
> > -    addEdge(currentNode, succNode, duplicateCount);
> > -  } else if(succNode && succNode->getColor() == BallLarusNode::GRAY) {
> > -    // visited node and back edge
> > -    DEBUG(dbgs() << "Backedge detected.\n");
> > -    addBackedge(currentNode, succNode, duplicateCount);
> > -  } else {
> > -    BallLarusNode* childNode;
> > -    // not visited node and forward edge
> > -    if(succNode) // an unvisited node that is child of a gray node
> > -      childNode = succNode;
> > -    else { // an unvisited node that is a child of a an unvisted node
> > -      childNode = addNode(succBB);
> > -      inDag[succBB] = childNode;
> > -    }
> > -    addEdge(currentNode, childNode, duplicateCount);
> > -    dfsStack.push(childNode);
> > -  }
> > -}
> > -
> > -// The weight on each edge is the increment required along any path that
> > -// contains that edge.
> > -void BallLarusDag::calculatePathNumbersFrom(BallLarusNode* node) {
> > -  if(node == getExit())
> > -    // The Exit node must be base case
> > -    node->setNumberPaths(1);
> > -  else {
> > -    unsigned sumPaths = 0;
> > -    BallLarusNode* succNode;
> > -
> > -    for(BLEdgeIterator succ = node->succBegin(), end = node->succEnd();
> > -        succ != end; succ++) {
> > -      if( (*succ)->getType() == BallLarusEdge::BACKEDGE ||
> > -          (*succ)->getType() == BallLarusEdge::SPLITEDGE )
> > -        continue;
> > -
> > -      (*succ)->setWeight(sumPaths);
> > -      succNode = (*succ)->getTarget();
> > -
> > -      if( !succNode->getNumberPaths() )
> > -        return;
> > -      sumPaths += succNode->getNumberPaths();
> > -    }
> > -
> > -    node->setNumberPaths(sumPaths);
> > -  }
> > -}
> > -
> > -// Allows subclasses to determine which type of Node is created.
> > -// Override this method to produce subclasses of BallLarusNode if
> > -// necessary. The destructor of BallLarusDag will call free on each
> > -// pointer created.
> > -BallLarusNode* BallLarusDag::createNode(BasicBlock* BB) {
> > -  return( new BallLarusNode(BB) );
> > -}
> > -
> > -// Allows subclasses to determine which type of Edge is created.
> > -// Override this method to produce subclasses of BallLarusEdge if
> > -// necessary. The destructor of BallLarusDag will call free on each
> > -// pointer created.
> > -BallLarusEdge* BallLarusDag::createEdge(BallLarusNode* source,
> > -                                        BallLarusNode* target,
> > -                                        unsigned duplicateCount) {
> > -  return( new BallLarusEdge(source, target, duplicateCount) );
> > -}
> > -
> > -// Proxy to node's constructor.  Updates the DAG state.
> > -BallLarusNode* BallLarusDag::addNode(BasicBlock* BB) {
> > -  BallLarusNode* newNode = createNode(BB);
> > -  _nodes.push_back(newNode);
> > -  return( newNode );
> > -}
> > -
> > -// Proxy to edge's constructor. Updates the DAG state.
> > -BallLarusEdge* BallLarusDag::addEdge(BallLarusNode* source,
> > -                                     BallLarusNode* target,
> > -                                     unsigned duplicateCount) {
> > -  BallLarusEdge* newEdge = createEdge(source, target, duplicateCount);
> > -  _edges.push_back(newEdge);
> > -  source->addSuccEdge(newEdge);
> > -  target->addPredEdge(newEdge);
> > -  return(newEdge);
> > -}
> > -
> > -// Adds a backedge with its phony edges. Updates the DAG state.
> > -void BallLarusDag::addBackedge(BallLarusNode* source, BallLarusNode*
> target,
> > -                               unsigned duplicateCount) {
> > -  BallLarusEdge* childEdge = addEdge(source, target, duplicateCount);
> > -  childEdge->setType(BallLarusEdge::BACKEDGE);
> > -
> > -  childEdge->setPhonyRoot(addEdge(getRoot(), target,0));
> > -  childEdge->setPhonyExit(addEdge(source, getExit(),0));
> > -
> > -  childEdge->getPhonyRoot()->setRealEdge(childEdge);
> > -  childEdge->getPhonyRoot()->setType(BallLarusEdge::BACKEDGE_PHONY);
> > -
> > -  childEdge->getPhonyExit()->setRealEdge(childEdge);
> > -  childEdge->getPhonyExit()->setType(BallLarusEdge::BACKEDGE_PHONY);
> > -  _backEdges.push_back(childEdge);
> > -}
> >
> > Removed: llvm/trunk/lib/Analysis/PathProfileInfo.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/PathProfileInfo.cpp?rev=191834&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/lib/Analysis/PathProfileInfo.cpp (original)
> > +++ llvm/trunk/lib/Analysis/PathProfileInfo.cpp (removed)
> > @@ -1,433 +0,0 @@
> > -//===- PathProfileInfo.cpp ------------------------------------*- C++
> -*---===//
> > -//
> > -//                     The LLVM Compiler Infrastructure
> > -//
> > -// This file is distributed under the University of Illinois Open Source
> > -// License. See LICENSE.TXT for details.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -//
> > -// This file defines the interface used by optimizers to load path
> profiles,
> > -// and provides a loader pass which reads a path profile file.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -#define DEBUG_TYPE "path-profile-info"
> > -
> > -#include "llvm/Analysis/PathProfileInfo.h"
> > -#include "llvm/Analysis/Passes.h"
> > -#include "llvm/Analysis/ProfileInfoTypes.h"
> > -#include "llvm/IR/Module.h"
> > -#include "llvm/Pass.h"
> > -#include "llvm/Support/CommandLine.h"
> > -#include "llvm/Support/Debug.h"
> > -#include "llvm/Support/raw_ostream.h"
> > -#include <cstdio>
> > -
> > -using namespace llvm;
> > -
> > -// command line option for loading path profiles
> > -static cl::opt<std::string>
> > -PathProfileInfoFilename("path-profile-loader-file",
> cl::init("llvmprof.out"),
> > -  cl::value_desc("filename"),
> > -  cl::desc("Path profile file loaded by -path-profile-loader"),
> cl::Hidden);
> > -
> > -namespace {
> > -  class PathProfileLoaderPass : public ModulePass, public
> PathProfileInfo {
> > -  public:
> > -    PathProfileLoaderPass() : ModulePass(ID) { }
> > -    ~PathProfileLoaderPass();
> > -
> > -    // this pass doesn't change anything (only loads information)
> > -    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
> > -      AU.setPreservesAll();
> > -    }
> > -
> > -    // the full name of the loader pass
> > -    virtual const char* getPassName() const {
> > -      return "Path Profiling Information Loader";
> > -    }
> > -
> > -    // required since this pass implements multiple inheritance
> > -                virtual void *getAdjustedAnalysisPointer(AnalysisID PI)
> {
> > -      if (PI == &PathProfileInfo::ID)
> > -        return (PathProfileInfo*)this;
> > -      return this;
> > -    }
> > -
> > -    // entry point to run the pass
> > -    bool runOnModule(Module &M);
> > -
> > -    // pass identification
> > -    static char ID;
> > -
> > -  private:
> > -    // make a reference table to refer to function by number
> > -    void buildFunctionRefs(Module &M);
> > -
> > -    // process argument info of a program from the input file
> > -    void handleArgumentInfo();
> > -
> > -    // process path number information from the input file
> > -    void handlePathInfo();
> > -
> > -    // array of references to the functions in the module
> > -    std::vector<Function*> _functions;
> > -
> > -    // path profile file handle
> > -    FILE* _file;
> > -
> > -    // path profile file name
> > -    std::string _filename;
> > -  };
> > -}
> > -
> > -// register PathLoader
> > -char PathProfileLoaderPass::ID = 0;
> > -
> > -INITIALIZE_ANALYSIS_GROUP(PathProfileInfo, "Path Profile Information",
> > -                          NoPathProfileInfo)
> > -INITIALIZE_AG_PASS(PathProfileLoaderPass, PathProfileInfo,
> > -                   "path-profile-loader",
> > -                   "Load path profile information from file",
> > -                   false, true, false)
> > -
> > -char &llvm::PathProfileLoaderPassID = PathProfileLoaderPass::ID;
> > -
> > -// link PathLoader as a pass, and make it available as an optimisation
> > -ModulePass *llvm::createPathProfileLoaderPass() {
> > -  return new PathProfileLoaderPass;
> > -}
> > -
> > -//
> ----------------------------------------------------------------------------
> > -// PathEdge implementation
> > -//
> > -ProfilePathEdge::ProfilePathEdge (BasicBlock* source, BasicBlock*
> target,
> > -                                  unsigned duplicateNumber)
> > -  : _source(source), _target(target), _duplicateNumber(duplicateNumber)
> {}
> > -
> > -//
> ----------------------------------------------------------------------------
> > -// Path implementation
> > -//
> > -
> > -ProfilePath::ProfilePath (unsigned int number, unsigned int count,
> > -                          double countStdDev,   PathProfileInfo* ppi)
> > -  : _number(number) , _count(count), _countStdDev(countStdDev),
> _ppi(ppi) {}
> > -
> > -double ProfilePath::getFrequency() const {
> > -  return 100 * double(_count) /
> > -    double(_ppi->_functionPathCounts[_ppi->_currentFunction]);
> > -}
> > -
> > -static BallLarusEdge* getNextEdge (BallLarusNode* node,
> > -                                   unsigned int pathNumber) {
> > -  BallLarusEdge* best = 0;
> > -
> > -  for( BLEdgeIterator next = node->succBegin(),
> > -         end = node->succEnd(); next != end; next++ ) {
> > -    if( (*next)->getType() != BallLarusEdge::BACKEDGE && // no backedges
> > -        (*next)->getType() != BallLarusEdge::SPLITEDGE && // no split
> edges
> > -        (*next)->getWeight() <= pathNumber && // weight must be <=
> pathNumber
> > -        (!best || (best->getWeight() < (*next)->getWeight())) ) // best
> one?
> > -      best = *next;
> > -  }
> > -
> > -  return best;
> > -}
> > -
> > -ProfilePathEdgeVector* ProfilePath::getPathEdges() const {
> > -  BallLarusNode* currentNode = _ppi->_currentDag->getRoot ();
> > -  unsigned int increment = _number;
> > -  ProfilePathEdgeVector* pev = new ProfilePathEdgeVector;
> > -
> > -  while (currentNode != _ppi->_currentDag->getExit()) {
> > -    BallLarusEdge* next = getNextEdge(currentNode, increment);
> > -
> > -    increment -= next->getWeight();
> > -
> > -    if( next->getType() != BallLarusEdge::BACKEDGE_PHONY &&
> > -        next->getType() != BallLarusEdge::SPLITEDGE_PHONY &&
> > -        next->getTarget() != _ppi->_currentDag->getExit() )
> > -      pev->push_back(ProfilePathEdge(
> > -                       next->getSource()->getBlock(),
> > -                       next->getTarget()->getBlock(),
> > -                       next->getDuplicateNumber()));
> > -
> > -    if( next->getType() == BallLarusEdge::BACKEDGE_PHONY &&
> > -        next->getTarget() == _ppi->_currentDag->getExit() )
> > -      pev->push_back(ProfilePathEdge(
> > -                       next->getRealEdge()->getSource()->getBlock(),
> > -                       next->getRealEdge()->getTarget()->getBlock(),
> > -                       next->getDuplicateNumber()));
> > -
> > -    if( next->getType() == BallLarusEdge::SPLITEDGE_PHONY &&
> > -        next->getSource() == _ppi->_currentDag->getRoot() )
> > -      pev->push_back(ProfilePathEdge(
> > -                       next->getRealEdge()->getSource()->getBlock(),
> > -                       next->getRealEdge()->getTarget()->getBlock(),
> > -                       next->getDuplicateNumber()));
> > -
> > -    // set the new node
> > -    currentNode = next->getTarget();
> > -  }
> > -
> > -  return pev;
> > -}
> > -
> > -ProfilePathBlockVector* ProfilePath::getPathBlocks() const {
> > -  BallLarusNode* currentNode = _ppi->_currentDag->getRoot ();
> > -  unsigned int increment = _number;
> > -  ProfilePathBlockVector* pbv = new ProfilePathBlockVector;
> > -
> > -  while (currentNode != _ppi->_currentDag->getExit()) {
> > -    BallLarusEdge* next = getNextEdge(currentNode, increment);
> > -    increment -= next->getWeight();
> > -
> > -    // add block to the block list if it is a real edge
> > -    if( next->getType() == BallLarusEdge::NORMAL)
> > -      pbv->push_back (currentNode->getBlock());
> > -    // make the back edge the last edge since we are at the end
> > -    else if( next->getTarget() == _ppi->_currentDag->getExit() ) {
> > -      pbv->push_back (currentNode->getBlock());
> > -      pbv->push_back (next->getRealEdge()->getTarget()->getBlock());
> > -    }
> > -
> > -    // set the new node
> > -    currentNode = next->getTarget();
> > -  }
> > -
> > -  return pbv;
> > -}
> > -
> > -BasicBlock* ProfilePath::getFirstBlockInPath() const {
> > -  BallLarusNode* root = _ppi->_currentDag->getRoot();
> > -  BallLarusEdge* edge = getNextEdge(root, _number);
> > -
> > -  if( edge && (edge->getType() == BallLarusEdge::BACKEDGE_PHONY ||
> > -               edge->getType() == BallLarusEdge::SPLITEDGE_PHONY) )
> > -    return edge->getTarget()->getBlock();
> > -
> > -  return root->getBlock();
> > -}
> > -
> > -//
> ----------------------------------------------------------------------------
> > -// PathProfileInfo implementation
> > -//
> > -
> > -// Pass identification
> > -char llvm::PathProfileInfo::ID = 0;
> > -
> > -PathProfileInfo::PathProfileInfo () : _currentDag(0) ,
> _currentFunction(0) {
> > -}
> > -
> > -PathProfileInfo::~PathProfileInfo() {
> > -  if (_currentDag)
> > -    delete _currentDag;
> > -}
> > -
> > -// set the function for which paths are currently begin processed
> > -void PathProfileInfo::setCurrentFunction(Function* F) {
> > -  // Make sure it exists
> > -  if (!F) return;
> > -
> > -  if (_currentDag)
> > -    delete _currentDag;
> > -
> > -  _currentFunction = F;
> > -  _currentDag = new BallLarusDag(*F);
> > -  _currentDag->init();
> > -  _currentDag->calculatePathNumbers();
> > -}
> > -
> > -// get the function for which paths are currently being processed
> > -Function* PathProfileInfo::getCurrentFunction() const {
> > -  return _currentFunction;
> > -}
> > -
> > -// get the entry block of the function
> > -BasicBlock* PathProfileInfo::getCurrentFunctionEntry() {
> > -  return _currentDag->getRoot()->getBlock();
> > -}
> > -
> > -// return the path based on its number
> > -ProfilePath* PathProfileInfo::getPath(unsigned int number) {
> > -  return _functionPaths[_currentFunction][number];
> > -}
> > -
> > -// return the number of paths which a function may potentially execute
> > -unsigned int PathProfileInfo::getPotentialPathCount() {
> > -  return _currentDag ? _currentDag->getNumberOfPaths() : 0;
> > -}
> > -
> > -// return an iterator for the beginning of a functions executed paths
> > -ProfilePathIterator PathProfileInfo::pathBegin() {
> > -  return _functionPaths[_currentFunction].begin();
> > -}
> > -
> > -// return an iterator for the end of a functions executed paths
> > -ProfilePathIterator PathProfileInfo::pathEnd() {
> > -  return _functionPaths[_currentFunction].end();
> > -}
> > -
> > -// returns the total number of paths run in the function
> > -unsigned int PathProfileInfo::pathsRun() {
> > -  return _currentFunction ? _functionPaths[_currentFunction].size() : 0;
> > -}
> > -
> > -//
> ----------------------------------------------------------------------------
> > -// PathLoader implementation
> > -//
> > -
> > -// remove all generated paths
> > -PathProfileLoaderPass::~PathProfileLoaderPass() {
> > -  for( FunctionPathIterator funcNext = _functionPaths.begin(),
> > -         funcEnd = _functionPaths.end(); funcNext != funcEnd;
> funcNext++)
> > -    for( ProfilePathIterator pathNext = funcNext->second.begin(),
> > -           pathEnd = funcNext->second.end(); pathNext != pathEnd;
> pathNext++)
> > -      delete pathNext->second;
> > -}
> > -
> > -// entry point of the pass; this loads and parses a file
> > -bool PathProfileLoaderPass::runOnModule(Module &M) {
> > -  // get the filename and setup the module's function references
> > -  _filename = PathProfileInfoFilename;
> > -  buildFunctionRefs (M);
> > -
> > -  if (!(_file = fopen(_filename.c_str(), "rb"))) {
> > -    errs () << "error: input '" << _filename << "' file does not
> exist.\n";
> > -    return false;
> > -  }
> > -
> > -  ProfilingType profType;
> > -
> > -  while( fread(&profType, sizeof(ProfilingType), 1, _file) ) {
> > -    switch (profType) {
> > -    case ArgumentInfo:
> > -      handleArgumentInfo ();
> > -      break;
> > -    case PathInfo:
> > -      handlePathInfo ();
> > -      break;
> > -    default:
> > -      errs () << "error: bad path profiling file syntax, " << profType
> << "\n";
> > -      fclose (_file);
> > -      return false;
> > -    }
> > -  }
> > -
> > -  fclose (_file);
> > -
> > -  return true;
> > -}
> > -
> > -// create a reference table for functions defined in the path profile
> file
> > -void PathProfileLoaderPass::buildFunctionRefs (Module &M) {
> > -  _functions.push_back(0); // make the 0 index a null pointer
> > -
> > -  for (Module::iterator F = M.begin(), E = M.end(); F != E; F++) {
> > -    if (F->isDeclaration())
> > -      continue;
> > -    _functions.push_back(F);
> > -  }
> > -}
> > -
> > -// handle command like argument infor in the output file
> > -void PathProfileLoaderPass::handleArgumentInfo() {
> > -  // get the argument list's length
> > -  unsigned savedArgsLength;
> > -  if( fread(&savedArgsLength, sizeof(unsigned), 1, _file) != 1 ) {
> > -    errs() << "warning: argument info header/data mismatch\n";
> > -    return;
> > -  }
> > -
> > -  // allocate a buffer, and get the arguments
> > -  char* args = new char[savedArgsLength+1];
> > -  if( fread(args, 1, savedArgsLength, _file) != savedArgsLength )
> > -    errs() << "warning: argument info header/data mismatch\n";
> > -
> > -  args[savedArgsLength] = '\0';
> > -  argList = std::string(args);
> > -  delete [] args; // cleanup dynamic string
> > -
> > -  // byte alignment
> > -  if (savedArgsLength & 3)
> > -    fseek(_file, 4-(savedArgsLength&3), SEEK_CUR);
> > -}
> > -
> > -// Handle path profile information in the output file
> > -void PathProfileLoaderPass::handlePathInfo () {
> > -  // get the number of functions in this profile
> > -  unsigned functionCount;
> > -  if( fread(&functionCount, sizeof(functionCount), 1, _file) != 1 ) {
> > -    errs() << "warning: path info header/data mismatch\n";
> > -    return;
> > -  }
> > -
> > -  // gather path information for each function
> > -  for (unsigned i = 0; i < functionCount; i++) {
> > -    PathProfileHeader pathHeader;
> > -    if( fread(&pathHeader, sizeof(pathHeader), 1, _file) != 1 ) {
> > -      errs() << "warning: bad header for path function info\n";
> > -      break;
> > -    }
> > -
> > -    Function* f = _functions[pathHeader.fnNumber];
> > -
> > -    // dynamically allocate a table to store path numbers
> > -    PathProfileTableEntry* pathTable =
> > -      new PathProfileTableEntry[pathHeader.numEntries];
> > -
> > -    if( fread(pathTable, sizeof(PathProfileTableEntry),
> > -              pathHeader.numEntries, _file) != pathHeader.numEntries) {
> > -      delete [] pathTable;
> > -      errs() << "warning: path function info header/data mismatch\n";
> > -      return;
> > -    }
> > -
> > -    // Build a new path for the current function
> > -    unsigned int totalPaths = 0;
> > -    for (unsigned int j = 0; j < pathHeader.numEntries; j++) {
> > -      totalPaths += pathTable[j].pathCounter;
> > -      _functionPaths[f][pathTable[j].pathNumber]
> > -        = new ProfilePath(pathTable[j].pathNumber,
> pathTable[j].pathCounter,
> > -                          0, this);
> > -    }
> > -
> > -    _functionPathCounts[f] = totalPaths;
> > -
> > -    delete [] pathTable;
> > -  }
> > -}
> > -
> >
> -//===----------------------------------------------------------------------===//
> > -//  NoProfile PathProfileInfo implementation
> > -//
> > -
> > -namespace {
> > -  struct NoPathProfileInfo : public ImmutablePass, public
> PathProfileInfo {
> > -    static char ID; // Class identification, replacement for typeinfo
> > -    NoPathProfileInfo() : ImmutablePass(ID) {
> > -      initializeNoPathProfileInfoPass(*PassRegistry::getPassRegistry());
> > -    }
> > -
> > -    /// getAdjustedAnalysisPointer - This method is used when a pass
> implements
> > -    /// an analysis interface through multiple inheritance.  If needed,
> it
> > -    /// should override this to adjust the this pointer as needed for
> the
> > -    /// specified pass info.
> > -    virtual void *getAdjustedAnalysisPointer(AnalysisID PI) {
> > -      if (PI == &PathProfileInfo::ID)
> > -        return (PathProfileInfo*)this;
> > -      return this;
> > -    }
> > -
> > -    virtual const char *getPassName() const {
> > -      return "NoPathProfileInfo";
> > -    }
> > -  };
> > -}  // End of anonymous namespace
> > -
> > -char NoPathProfileInfo::ID = 0;
> > -// Register this pass...
> > -INITIALIZE_AG_PASS(NoPathProfileInfo, PathProfileInfo,
> "no-path-profile",
> > -                   "No Path Profile Information", false, true, true)
> > -
> > -ImmutablePass *llvm::createNoPathProfileInfoPass() { return new
> NoPathProfileInfo(); }
> >
> > Removed: llvm/trunk/lib/Analysis/PathProfileVerifier.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/PathProfileVerifier.cpp?rev=191834&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/lib/Analysis/PathProfileVerifier.cpp (original)
> > +++ llvm/trunk/lib/Analysis/PathProfileVerifier.cpp (removed)
> > @@ -1,205 +0,0 @@
> > -//===- PathProfileVerifier.cpp --------------------------------*- C++
> -*---===//
> > -//
> > -//                     The LLVM Compiler Infrastructure
> > -//
> > -// This file is distributed under the University of Illinois Open Source
> > -// License. See LICENSE.TXT for details.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -//
> > -// This verifier derives an edge profile file from current path profile
> > -// information
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -#define DEBUG_TYPE "path-profile-verifier"
> > -
> > -#include "llvm/Analysis/Passes.h"
> > -#include "llvm/Analysis/PathProfileInfo.h"
> > -#include "llvm/Analysis/ProfileInfoTypes.h"
> > -#include "llvm/IR/Module.h"
> > -#include "llvm/Pass.h"
> > -#include "llvm/Support/CommandLine.h"
> > -#include "llvm/Support/Debug.h"
> > -#include "llvm/Support/raw_ostream.h"
> > -#include <stdio.h>
> > -
> > -using namespace llvm;
> > -
> > -namespace {
> > -  class PathProfileVerifier : public ModulePass {
> > -  private:
> > -    bool runOnModule(Module &M);
> > -
> > -  public:
> > -    static char ID; // Pass identification, replacement for typeid
> > -    PathProfileVerifier() : ModulePass(ID) {
> > -
>  initializePathProfileVerifierPass(*PassRegistry::getPassRegistry());
> > -    }
> > -
> > -
> > -    virtual const char *getPassName() const {
> > -      return "Path Profiler Verifier";
> > -    }
> > -
> > -    // The verifier requires the path profile and edge profile.
> > -    virtual void getAnalysisUsage(AnalysisUsage& AU) const;
> > -  };
> > -}
> > -
> > -static cl::opt<std::string>
> > -EdgeProfileFilename("path-profile-verifier-file",
> > -  cl::init("edgefrompath.llvmprof.out"),
> > -  cl::value_desc("filename"),
> > -  cl::desc("Edge profile file generated by -path-profile-verifier"),
> > -  cl::Hidden);
> > -
> > -char PathProfileVerifier::ID = 0;
> > -INITIALIZE_PASS(PathProfileVerifier, "path-profile-verifier",
> > -                "Compare the path profile derived edge profile against
> the "
> > -                "edge profile.", true, true)
> > -
> > -ModulePass *llvm::createPathProfileVerifierPass() {
> > -  return new PathProfileVerifier();
> > -}
> > -
> > -// The verifier requires the path profile and edge profile.
> > -void PathProfileVerifier::getAnalysisUsage(AnalysisUsage& AU) const {
> > -  AU.addRequired<PathProfileInfo>();
> > -  AU.addPreserved<PathProfileInfo>();
> > -}
> > -
> > -typedef std::map<unsigned, unsigned> DuplicateToIndexMap;
> > -typedef std::map<BasicBlock*,DuplicateToIndexMap> BlockToDuplicateMap;
> > -typedef std::map<BasicBlock*,BlockToDuplicateMap> NestedBlockToIndexMap;
> > -
> > -// the verifier iterates through each path to gather the total
> > -// number of edge frequencies
> > -bool PathProfileVerifier::runOnModule (Module &M) {
> > -  PathProfileInfo& pathProfileInfo = getAnalysis<PathProfileInfo>();
> > -
> > -  // setup a data structure to map path edges which index an
> > -  // array of edge counters
> > -  NestedBlockToIndexMap arrayMap;
> > -  unsigned i = 0;
> > -  for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) {
> > -    if (F->isDeclaration()) continue;
> > -
> > -    arrayMap[(BasicBlock*)0][F->begin()][0] = i++;
> > -
> > -    for (Function::iterator BB = F->begin(), E = F->end(); BB != E;
> ++BB) {
> > -      TerminatorInst *TI = BB->getTerminator();
> > -
> > -      unsigned duplicate = 0;
> > -      BasicBlock* prev = 0;
> > -      for (unsigned s = 0, e = TI->getNumSuccessors(); s != e;
> > -           prev = TI->getSuccessor(s), ++s) {
> > -        if (prev == TI->getSuccessor(s))
> > -          duplicate++;
> > -        else duplicate = 0;
> > -
> > -        arrayMap[BB][TI->getSuccessor(s)][duplicate] = i++;
> > -      }
> > -    }
> > -  }
> > -
> > -  std::vector<unsigned> edgeArray(i);
> > -
> > -  // iterate through each path and increment the edge counters as needed
> > -  for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) {
> > -    if (F->isDeclaration()) continue;
> > -
> > -    pathProfileInfo.setCurrentFunction(F);
> > -
> > -    DEBUG(dbgs() << "function '" << F->getName() << "' ran "
> > -          << pathProfileInfo.pathsRun()
> > -          << "/" << pathProfileInfo.getPotentialPathCount()
> > -          << " potential paths\n");
> > -
> > -    for( ProfilePathIterator nextPath = pathProfileInfo.pathBegin(),
> > -           endPath = pathProfileInfo.pathEnd();
> > -         nextPath != endPath; nextPath++ ) {
> > -      ProfilePath* currentPath = nextPath->second;
> > -
> > -      ProfilePathEdgeVector* pev = currentPath->getPathEdges();
> > -      DEBUG(dbgs () << "path #" << currentPath->getNumber() << ": "
> > -            << currentPath->getCount() << "\n");
> > -      // setup the entry edge (normally path profiling doesn't care
> about this)
> > -      if (currentPath->getFirstBlockInPath() == &F->getEntryBlock())
> > -
>  edgeArray[arrayMap[(BasicBlock*)0][currentPath->getFirstBlockInPath()][0]]
> > -          += currentPath->getCount();
> > -
> > -      for( ProfilePathEdgeIterator nextEdge = pev->begin(),
> > -             endEdge = pev->end(); nextEdge != endEdge; nextEdge++ ) {
> > -        if (nextEdge != pev->begin())
> > -          DEBUG(dbgs() << " :: ");
> > -
> > -        BasicBlock* source = nextEdge->getSource();
> > -        BasicBlock* target = nextEdge->getTarget();
> > -        unsigned duplicateNumber = nextEdge->getDuplicateNumber();
> > -        DEBUG(dbgs() << source->getName() << " --{" << duplicateNumber
> > -                     << "}--> " << target->getName());
> > -
> > -        // Ensure all the referenced edges exist
> > -        // TODO: make this a separate function
> > -        if( !arrayMap.count(source) ) {
> > -          errs() << "  error [" << F->getName() << "()]: source '"
> > -                 << source->getName()
> > -                 << "' does not exist in the array map.\n";
> > -        } else if( !arrayMap[source].count(target) ) {
> > -          errs() << "  error [" << F->getName() << "()]: target '"
> > -                 << target->getName()
> > -                 << "' does not exist in the array map.\n";
> > -        } else if( !arrayMap[source][target].count(duplicateNumber) ) {
> > -          errs() << "  error [" << F->getName() << "()]: edge "
> > -                 << source->getName() << " -> " << target->getName()
> > -                 << " duplicate number " << duplicateNumber
> > -                 << " does not exist in the array map.\n";
> > -        } else {
> > -          edgeArray[arrayMap[source][target][duplicateNumber]]
> > -            += currentPath->getCount();
> > -        }
> > -      }
> > -
> > -      DEBUG(errs() << "\n");
> > -
> > -      delete pev;
> > -    }
> > -  }
> > -
> > -  std::string filename = EdgeProfileFilename;
> > -
> > -  // Open a handle to the file
> > -  FILE* edgeFile = fopen(filename.c_str(),"wb");
> > -
> > -  if (!edgeFile) {
> > -    errs() << "error: unable to open file '" << filename << "' for
> output.\n";
> > -    return false;
> > -  }
> > -
> > -  errs() << "Generating edge profile '" << filename << "' ...\n";
> > -
> > -  // write argument info
> > -  unsigned type = ArgumentInfo;
> > -  unsigned num = pathProfileInfo.argList.size();
> > -  int zeros = 0;
> > -
> > -  fwrite(&type,sizeof(unsigned),1,edgeFile);
> > -  fwrite(&num,sizeof(unsigned),1,edgeFile);
> > -  fwrite(pathProfileInfo.argList.c_str(),1,num,edgeFile);
> > -  if (num&3)
> > -    fwrite(&zeros, 1, 4-(num&3), edgeFile);
> > -
> > -  type = EdgeInfo;
> > -  num = edgeArray.size();
> > -  fwrite(&type,sizeof(unsigned),1,edgeFile);
> > -  fwrite(&num,sizeof(unsigned),1,edgeFile);
> > -
> > -  // write each edge to the file
> > -  for( std::vector<unsigned>::iterator s = edgeArray.begin(),
> > -         e = edgeArray.end(); s != e; s++)
> > -    fwrite(&*s, sizeof (unsigned), 1, edgeFile);
> > -
> > -  fclose (edgeFile);
> > -
> > -  return true;
> > -}
> >
> > Removed: llvm/trunk/lib/Analysis/ProfileDataLoader.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ProfileDataLoader.cpp?rev=191834&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/lib/Analysis/ProfileDataLoader.cpp (original)
> > +++ llvm/trunk/lib/Analysis/ProfileDataLoader.cpp (removed)
> > @@ -1,155 +0,0 @@
> > -//===- ProfileDataLoader.cpp - Load profile information from disk
> ---------===//
> > -//
> > -//                      The LLVM Compiler Infrastructure
> > -//
> > -// This file is distributed under the University of Illinois Open Source
> > -// License. See LICENSE.TXT for details.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -//
> > -// The ProfileDataLoader class is used to load raw profiling data from
> the dump
> > -// file.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -
> > -#include "llvm/Analysis/ProfileDataLoader.h"
> > -#include "llvm/ADT/ArrayRef.h"
> > -#include "llvm/ADT/OwningPtr.h"
> > -#include "llvm/Analysis/ProfileDataTypes.h"
> > -#include "llvm/IR/InstrTypes.h"
> > -#include "llvm/IR/Module.h"
> > -#include "llvm/Support/raw_ostream.h"
> > -#include "llvm/Support/system_error.h"
> > -#include <cstdio>
> > -#include <cstdlib>
> > -using namespace llvm;
> > -
> > -raw_ostream &llvm::operator<<(raw_ostream &O, std::pair<const
> BasicBlock *,
> > -                                                        const
> BasicBlock *> E) {
> > -  O << "(";
> > -
> > -  if (E.first)
> > -    O << E.first->getName();
> > -  else
> > -    O << "0";
> > -
> > -  O << ",";
> > -
> > -  if (E.second)
> > -    O << E.second->getName();
> > -  else
> > -    O << "0";
> > -
> > -  return O << ")";
> > -}
> > -
> > -/// AddCounts - Add 'A' and 'B', accounting for the fact that the value
> of one
> > -/// (or both) may not be defined.
> > -static unsigned AddCounts(unsigned A, unsigned B) {
> > -  // If either value is undefined, use the other.
> > -  // Undefined + undefined = undefined.
> > -  if (A == ProfileDataLoader::Uncounted) return B;
> > -  if (B == ProfileDataLoader::Uncounted) return A;
> > -
> > -  return A + B;
> > -}
> > -
> > -/// ReadProfilingData - Load 'NumEntries' items of type 'T' from file
> 'F'
> > -template <typename T>
> > -static void ReadProfilingData(const char *ToolName, FILE *F,
> > -                              T *Data, size_t NumEntries) {
> > -  // Read in the block of data...
> > -  if (fread(Data, sizeof(T), NumEntries, F) != NumEntries)
> > -    report_fatal_error(Twine(ToolName) + ": Profiling data truncated");
> > -}
> > -
> > -/// ReadProfilingNumEntries - Read how many entries are in this
> profiling data
> > -/// packet.
> > -static unsigned ReadProfilingNumEntries(const char *ToolName, FILE *F,
> > -                                        bool ShouldByteSwap) {
> > -  unsigned Entry;
> > -  ReadProfilingData<unsigned>(ToolName, F, &Entry, 1);
> > -  return ShouldByteSwap ? ByteSwap_32(Entry) : Entry;
> > -}
> > -
> > -/// ReadProfilingBlock - Read the number of entries in the next
> profiling data
> > -/// packet and then accumulate the entries into 'Data'.
> > -static void ReadProfilingBlock(const char *ToolName, FILE *F,
> > -                               bool ShouldByteSwap,
> > -                               SmallVectorImpl<unsigned> &Data) {
> > -  // Read the number of entries...
> > -  unsigned NumEntries = ReadProfilingNumEntries(ToolName, F,
> ShouldByteSwap);
> > -
> > -  // Read in the data.
> > -  SmallVector<unsigned, 8> TempSpace(NumEntries);
> > -  ReadProfilingData<unsigned>(ToolName, F, TempSpace.data(),
> NumEntries);
> > -
> > -  // Make sure we have enough space ...
> > -  if (Data.size() < NumEntries)
> > -    Data.resize(NumEntries, ProfileDataLoader::Uncounted);
> > -
> > -  // Accumulate the data we just read into the existing data.
> > -  for (unsigned i = 0; i < NumEntries; ++i) {
> > -    unsigned Entry = ShouldByteSwap ? ByteSwap_32(TempSpace[i]) :
> TempSpace[i];
> > -    Data[i] = AddCounts(Entry, Data[i]);
> > -  }
> > -}
> > -
> > -/// ReadProfilingArgBlock - Read the command line arguments that the
> progam was
> > -/// run with when the current profiling data packet(s) were generated.
> > -static void ReadProfilingArgBlock(const char *ToolName, FILE *F,
> > -                                  bool ShouldByteSwap,
> > -                                  SmallVectorImpl<std::string>
> &CommandLines) {
> > -  // Read the number of bytes ...
> > -  unsigned ArgLength = ReadProfilingNumEntries(ToolName, F,
> ShouldByteSwap);
> > -
> > -  // Read in the arguments (if there are any to read).  Round up the
> length to
> > -  // the nearest 4-byte multiple.
> > -  SmallVector<char, 8> Args(ArgLength+4);
> > -  if (ArgLength)
> > -    ReadProfilingData<char>(ToolName, F, Args.data(), (ArgLength+3) &
> ~3);
> > -
> > -  // Store the arguments.
> > -  CommandLines.push_back(std::string(&Args[0], &Args[ArgLength]));
> > -}
> > -
> > -const unsigned ProfileDataLoader::Uncounted = ~0U;
> > -
> > -/// ProfileDataLoader ctor - Read the specified profiling data file,
> reporting
> > -/// a fatal error if the file is invalid or broken.
> > -ProfileDataLoader::ProfileDataLoader(const char *ToolName,
> > -                                     const std::string &Filename)
> > -  : Filename(Filename) {
> > -  FILE *F = fopen(Filename.c_str(), "rb");
> > -  if (F == 0)
> > -    report_fatal_error(Twine(ToolName) + ": Error opening '" +
> > -                       Filename + "': ");
> > -
> > -  // Keep reading packets until we run out of them.
> > -  unsigned PacketType;
> > -  while (fread(&PacketType, sizeof(unsigned), 1, F) == 1) {
> > -    // If the low eight bits of the packet are zero, we must be dealing
> with an
> > -    // endianness mismatch.  Byteswap all words read from the profiling
> > -    // information.  This can happen when the compiler host and target
> have
> > -    // different endianness.
> > -    bool ShouldByteSwap = (char)PacketType == 0;
> > -    PacketType = ShouldByteSwap ? ByteSwap_32(PacketType) : PacketType;
> > -
> > -    switch (PacketType) {
> > -      case ArgumentInfo:
> > -        ReadProfilingArgBlock(ToolName, F, ShouldByteSwap,
> CommandLines);
> > -        break;
> > -
> > -      case EdgeInfo:
> > -        ReadProfilingBlock(ToolName, F, ShouldByteSwap, EdgeCounts);
> > -        break;
> > -
> > -      default:
> > -        report_fatal_error(std::string(ToolName)
> > -                           + ": Unknown profiling packet type");
> > -        break;
> > -    }
> > -  }
> > -
> > -  fclose(F);
> > -}
> >
> > Removed: llvm/trunk/lib/Analysis/ProfileDataLoaderPass.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ProfileDataLoaderPass.cpp?rev=191834&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/lib/Analysis/ProfileDataLoaderPass.cpp (original)
> > +++ llvm/trunk/lib/Analysis/ProfileDataLoaderPass.cpp (removed)
> > @@ -1,188 +0,0 @@
> > -//===- ProfileDataLoaderPass.cpp - Set branch weight metadata from prof
> ---===//
> > -//
> > -//                     The LLVM Compiler Infrastructure
> > -//
> > -// This file is distributed under the University of Illinois Open Source
> > -// License. See LICENSE.TXT for details.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -//
> > -// This pass loads profiling data from a dump file and sets branch
> weight
> > -// metadata.
> > -//
> > -// TODO: Replace all "profile-metadata-loader" strings with
> "profile-loader"
> > -// once ProfileInfo etc. has been removed.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -#define DEBUG_TYPE "profile-metadata-loader"
> > -#include "llvm/Analysis/Passes.h"
> > -#include "llvm/ADT/ArrayRef.h"
> > -#include "llvm/ADT/Statistic.h"
> > -#include "llvm/Analysis/ProfileDataLoader.h"
> > -#include "llvm/IR/BasicBlock.h"
> > -#include "llvm/IR/InstrTypes.h"
> > -#include "llvm/IR/LLVMContext.h"
> > -#include "llvm/IR/MDBuilder.h"
> > -#include "llvm/IR/Metadata.h"
> > -#include "llvm/IR/Module.h"
> > -#include "llvm/Pass.h"
> > -#include "llvm/Support/CFG.h"
> > -#include "llvm/Support/CommandLine.h"
> > -#include "llvm/Support/Debug.h"
> > -#include "llvm/Support/Format.h"
> > -#include "llvm/Support/raw_ostream.h"
> > -using namespace llvm;
> > -
> > -STATISTIC(NumEdgesRead, "The # of edges read.");
> > -STATISTIC(NumTermsAnnotated, "The # of terminator instructions
> annotated.");
> > -
> > -static cl::opt<std::string>
> > -ProfileMetadataFilename("profile-file", cl::init("llvmprof.out"),
> > -                  cl::value_desc("filename"),
> > -                  cl::desc("Profile file loaded by
> -profile-metadata-loader"));
> > -
> > -namespace {
> > -  /// This pass loads profiling data from a dump file and sets branch
> weight
> > -  /// metadata.
> > -  class ProfileMetadataLoaderPass : public ModulePass {
> > -    std::string Filename;
> > -  public:
> > -    static char ID; // Class identification, replacement for typeinfo
> > -    explicit ProfileMetadataLoaderPass(const std::string &filename = "")
> > -        : ModulePass(ID), Filename(filename) {
> > -
>  initializeProfileMetadataLoaderPassPass(*PassRegistry::getPassRegistry());
> > -      if (filename.empty()) Filename = ProfileMetadataFilename;
> > -    }
> > -
> > -    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
> > -      AU.setPreservesAll();
> > -    }
> > -
> > -    virtual const char *getPassName() const {
> > -      return "Profile loader";
> > -    }
> > -
> > -    virtual void readEdge(unsigned, ProfileData&, ProfileData::Edge,
> > -                          ArrayRef<unsigned>);
> > -    virtual unsigned matchEdges(Module&, ProfileData&,
> ArrayRef<unsigned>);
> > -    virtual void setBranchWeightMetadata(Module&, ProfileData&);
> > -
> > -    virtual bool runOnModule(Module &M);
> > -  };
> > -}  // End of anonymous namespace
> > -
> > -char ProfileMetadataLoaderPass::ID = 0;
> > -INITIALIZE_PASS_BEGIN(ProfileMetadataLoaderPass,
> "profile-metadata-loader",
> > -              "Load profile information from llvmprof.out", false, true)
> > -INITIALIZE_PASS_END(ProfileMetadataLoaderPass,
> "profile-metadata-loader",
> > -              "Load profile information from llvmprof.out", false, true)
> > -
> > -char &llvm::ProfileMetadataLoaderPassID = ProfileMetadataLoaderPass::ID;
> > -
> > -/// createProfileMetadataLoaderPass - This function returns a Pass that
> loads
> > -/// the profiling information for the module from the specified
> filename,
> > -/// making it available to the optimizers.
> > -ModulePass *llvm::createProfileMetadataLoaderPass() {
> > -    return new ProfileMetadataLoaderPass();
> > -}
> > -ModulePass *llvm::createProfileMetadataLoaderPass(const std::string
> &Filename) {
> > -  return new ProfileMetadataLoaderPass(Filename);
> > -}
> > -
> > -/// readEdge - Take the value from a profile counter and assign it to
> an edge.
> > -void ProfileMetadataLoaderPass::readEdge(unsigned ReadCount,
> > -                                         ProfileData &PB,
> ProfileData::Edge e,
> > -                                         ArrayRef<unsigned> Counters) {
> > -  if (ReadCount >= Counters.size()) return;
> > -
> > -  unsigned weight = Counters[ReadCount];
> > -  assert(weight != ProfileDataLoader::Uncounted);
> > -  PB.addEdgeWeight(e, weight);
> > -
> > -  DEBUG(dbgs() << "-- Read Edge Counter for " << e
> > -               << " (# "<< (ReadCount) << "): "
> > -               << PB.getEdgeWeight(e) << "\n");
> > -}
> > -
> > -/// matchEdges - Link every profile counter with an edge.
> > -unsigned ProfileMetadataLoaderPass::matchEdges(Module &M, ProfileData
> &PB,
> > -                                               ArrayRef<unsigned>
> Counters) {
> > -  if (Counters.size() == 0) return 0;
> > -
> > -  unsigned ReadCount = 0;
> > -
> > -  for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) {
> > -    if (F->isDeclaration()) continue;
> > -    DEBUG(dbgs() << "Loading edges in '" << F->getName() << "'\n");
> > -    readEdge(ReadCount++, PB, PB.getEdge(0, &F->getEntryBlock()),
> Counters);
> > -    for (Function::iterator BB = F->begin(), E = F->end(); BB != E;
> ++BB) {
> > -      TerminatorInst *TI = BB->getTerminator();
> > -      for (unsigned s = 0, e = TI->getNumSuccessors(); s != e; ++s) {
> > -        readEdge(ReadCount++, PB, PB.getEdge(BB,TI->getSuccessor(s)),
> > -                 Counters);
> > -      }
> > -    }
> > -  }
> > -
> > -  return ReadCount;
> > -}
> > -
> > -/// setBranchWeightMetadata - Translate the counter values associated
> with each
> > -/// edge into branch weights for each conditional branch (a branch with
> 2 or
> > -/// more desinations).
> > -void ProfileMetadataLoaderPass::setBranchWeightMetadata(Module &M,
> > -                                                        ProfileData
> &PB) {
> > -  for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) {
> > -    if (F->isDeclaration()) continue;
> > -    DEBUG(dbgs() << "Setting branch metadata in '" << F->getName() <<
> "'\n");
> > -
> > -    for (Function::iterator BB = F->begin(), E = F->end(); BB != E;
> ++BB) {
> > -      TerminatorInst *TI = BB->getTerminator();
> > -      unsigned NumSuccessors = TI->getNumSuccessors();
> > -
> > -      // If there is only one successor then we can not set a branch
> > -      // probability as the target is certain.
> > -      if (NumSuccessors < 2) continue;
> > -
> > -      // Load the weights of all edges leading from this terminator.
> > -      DEBUG(dbgs() << "-- Terminator with " << NumSuccessors
> > -                   << " successors:\n");
> > -      SmallVector<uint32_t, 4> Weights(NumSuccessors);
> > -      for (unsigned s = 0 ; s < NumSuccessors ; ++s) {
> > -          ProfileData::Edge edge = PB.getEdge(BB, TI->getSuccessor(s));
> > -          Weights[s] = (uint32_t)PB.getEdgeWeight(edge);
> > -          DEBUG(dbgs() << "---- Edge '" << edge << "' has weight "
> > -                       << Weights[s] << "\n");
> > -      }
> > -
> > -      // Set branch weight metadata.  This will set branch
> probabilities of
> > -      // 100%/0% if that is true of the dynamic execution.
> > -      // BranchProbabilityInfo can account for this when it loads this
> metadata
> > -      // (it gives the unexectuted branch a weight of 1 for the
> purposes of
> > -      // probability calculations).
> > -      MDBuilder MDB(TI->getContext());
> > -      MDNode *Node = MDB.createBranchWeights(Weights);
> > -      TI->setMetadata(LLVMContext::MD_prof, Node);
> > -      NumTermsAnnotated++;
> > -    }
> > -  }
> > -}
> > -
> > -bool ProfileMetadataLoaderPass::runOnModule(Module &M) {
> > -  ProfileDataLoader PDL("profile-data-loader", Filename);
> > -  ProfileData PB;
> > -
> > -  ArrayRef<unsigned> Counters = PDL.getRawEdgeCounts();
> > -
> > -  unsigned ReadCount = matchEdges(M, PB, Counters);
> > -
> > -  if (ReadCount != Counters.size()) {
> > -    errs() << "WARNING: profile information is inconsistent with "
> > -           << "the current program!\n";
> > -  }
> > -  NumEdgesRead = ReadCount;
> > -
> > -  setBranchWeightMetadata(M, PB);
> > -
> > -  return ReadCount > 0;
> > -}
> >
> > Removed: llvm/trunk/lib/Analysis/ProfileEstimatorPass.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ProfileEstimatorPass.cpp?rev=191834&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/lib/Analysis/ProfileEstimatorPass.cpp (original)
> > +++ llvm/trunk/lib/Analysis/ProfileEstimatorPass.cpp (removed)
> > @@ -1,426 +0,0 @@
> > -//===- ProfileEstimatorPass.cpp - LLVM Pass to estimate profile info
> ------===//
> > -//
> > -//                     The LLVM Compiler Infrastructure
> > -//
> > -// This file is distributed under the University of Illinois Open Source
> > -// License. See LICENSE.TXT for details.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -//
> > -// This file implements a concrete implementation of profiling
> information that
> > -// estimates the profiling information in a very crude and
> unimaginative way.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -#define DEBUG_TYPE "profile-estimator"
> > -#include "llvm/Analysis/Passes.h"
> > -#include "llvm/Analysis/LoopInfo.h"
> > -#include "llvm/Analysis/ProfileInfo.h"
> > -#include "llvm/Pass.h"
> > -#include "llvm/Support/CommandLine.h"
> > -#include "llvm/Support/Debug.h"
> > -#include "llvm/Support/Format.h"
> > -#include "llvm/Support/raw_ostream.h"
> > -using namespace llvm;
> > -
> > -static cl::opt<double>
> > -LoopWeight(
> > -    "profile-estimator-loop-weight", cl::init(10),
> > -    cl::value_desc("loop-weight"),
> > -    cl::desc("Number of loop executions used for profile-estimator")
> > -);
> > -
> > -namespace {
> > -  class ProfileEstimatorPass : public FunctionPass, public ProfileInfo {
> > -    double ExecCount;
> > -    LoopInfo *LI;
> > -    std::set<BasicBlock*>  BBToVisit;
> > -    std::map<Loop*,double> LoopExitWeights;
> > -    std::map<Edge,double>  MinimalWeight;
> > -  public:
> > -    static char ID; // Class identification, replacement for typeinfo
> > -    explicit ProfileEstimatorPass(const double execcount = 0)
> > -        : FunctionPass(ID), ExecCount(execcount) {
> > -
>  initializeProfileEstimatorPassPass(*PassRegistry::getPassRegistry());
> > -      if (execcount == 0) ExecCount = LoopWeight;
> > -    }
> > -
> > -    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
> > -      AU.setPreservesAll();
> > -      AU.addRequired<LoopInfo>();
> > -    }
> > -
> > -    virtual const char *getPassName() const {
> > -      return "Profiling information estimator";
> > -    }
> > -
> > -    /// run - Estimate the profile information from the specified file.
> > -    virtual bool runOnFunction(Function &F);
> > -
> > -    /// getAdjustedAnalysisPointer - This method is used when a pass
> implements
> > -    /// an analysis interface through multiple inheritance.  If needed,
> it
> > -    /// should override this to adjust the this pointer as needed for
> the
> > -    /// specified pass info.
> > -    virtual void *getAdjustedAnalysisPointer(AnalysisID PI) {
> > -      if (PI == &ProfileInfo::ID)
> > -        return (ProfileInfo*)this;
> > -      return this;
> > -    }
> > -
> > -    virtual void recurseBasicBlock(BasicBlock *BB);
> > -
> > -    void inline printEdgeWeight(Edge);
> > -  };
> > -}  // End of anonymous namespace
> > -
> > -char ProfileEstimatorPass::ID = 0;
> > -INITIALIZE_AG_PASS_BEGIN(ProfileEstimatorPass, ProfileInfo,
> "profile-estimator",
> > -                "Estimate profiling information", false, true, false)
> > -INITIALIZE_PASS_DEPENDENCY(LoopInfo)
> > -INITIALIZE_AG_PASS_END(ProfileEstimatorPass, ProfileInfo,
> "profile-estimator",
> > -                "Estimate profiling information", false, true, false)
> > -
> > -namespace llvm {
> > -  char &ProfileEstimatorPassID = ProfileEstimatorPass::ID;
> > -
> > -  FunctionPass *createProfileEstimatorPass() {
> > -    return new ProfileEstimatorPass();
> > -  }
> > -
> > -  /// createProfileEstimatorPass - This function returns a Pass that
> estimates
> > -  /// profiling information using the given loop execution count.
> > -  Pass *createProfileEstimatorPass(const unsigned execcount) {
> > -    return new ProfileEstimatorPass(execcount);
> > -  }
> > -}
> > -
> > -static double ignoreMissing(double w) {
> > -  if (w == ProfileInfo::MissingValue) return 0;
> > -  return w;
> > -}
> > -
> > -static void inline printEdgeError(ProfileInfo::Edge e, const char *M) {
> > -  DEBUG(dbgs() << "-- Edge " << e << " is not calculated, " << M <<
> "\n");
> > -}
> > -
> > -void inline ProfileEstimatorPass::printEdgeWeight(Edge E) {
> > -  DEBUG(dbgs() << "-- Weight of Edge " << E << ":"
> > -               << format("%20.20g", getEdgeWeight(E)) << "\n");
> > -}
> > -
> > -// recurseBasicBlock() - This calculates the ProfileInfo estimation for
> a
> > -// single block and then recurses into the successors.
> > -// The algorithm preserves the flow condition, meaning that the sum of
> the
> > -// weight of the incoming edges must be equal the block weight which
> must in
> > -// turn be equal to the sume of the weights of the outgoing edges.
> > -// Since the flow of an block is deterimined from the current state of
> the
> > -// flow, once an edge has a flow assigned this flow is never changed
> again,
> > -// otherwise it would be possible to violate the flow condition in
> another
> > -// block.
> > -void ProfileEstimatorPass::recurseBasicBlock(BasicBlock *BB) {
> > -
> > -  // Break the recursion if this BasicBlock was already visited.
> > -  if (BBToVisit.find(BB) == BBToVisit.end()) return;
> > -
> > -  // Read the LoopInfo for this block.
> > -  bool  BBisHeader = LI->isLoopHeader(BB);
> > -  Loop* BBLoop     = LI->getLoopFor(BB);
> > -
> > -  // To get the block weight, read all incoming edges.
> > -  double BBWeight = 0;
> > -  std::set<BasicBlock*> ProcessedPreds;
> > -  for ( pred_iterator bbi = pred_begin(BB), bbe = pred_end(BB);
> > -        bbi != bbe; ++bbi ) {
> > -    // If this block was not considered already, add weight.
> > -    Edge edge = getEdge(*bbi,BB);
> > -    double w = getEdgeWeight(edge);
> > -    if (ProcessedPreds.insert(*bbi).second) {
> > -      BBWeight += ignoreMissing(w);
> > -    }
> > -    // If this block is a loop header and the predecessor is contained
> in this
> > -    // loop, thus the edge is a backedge, continue and do not check if
> the
> > -    // value is valid.
> > -    if (BBisHeader && BBLoop->contains(*bbi)) {
> > -      printEdgeError(edge, "but is backedge, continuing");
> > -      continue;
> > -    }
> > -    // If the edges value is missing (and this is no loop header, and
> this is
> > -    // no backedge) return, this block is currently non estimatable.
> > -    if (w == MissingValue) {
> > -      printEdgeError(edge, "returning");
> > -      return;
> > -    }
> > -  }
> > -  if (getExecutionCount(BB) != MissingValue) {
> > -    BBWeight = getExecutionCount(BB);
> > -  }
> > -
> > -  // Fetch all necessary information for current block.
> > -  SmallVector<Edge, 8> ExitEdges;
> > -  SmallVector<Edge, 8> Edges;
> > -  if (BBLoop) {
> > -    BBLoop->getExitEdges(ExitEdges);
> > -  }
> > -
> > -  // If this is a loop header, consider the following:
> > -  // Exactly the flow that is entering this block, must exit this block
> too. So
> > -  // do the following:
> > -  // *) get all the exit edges, read the flow that is already leaving
> this
> > -  // loop, remember the edges that do not have any flow on them right
> now.
> > -  // (The edges that have already flow on them are most likely exiting
> edges of
> > -  // other loops, do not touch those flows because the previously
> caclulated
> > -  // loopheaders would not be exact anymore.)
> > -  // *) In case there is not a single exiting edge left, create one at
> the loop
> > -  // latch to prevent the flow from building up in the loop.
> > -  // *) Take the flow that is not leaving the loop already and
> distribute it on
> > -  // the remaining exiting edges.
> > -  // (This ensures that all flow that enters the loop also leaves it.)
> > -  // *) Increase the flow into the loop by increasing the weight of
> this block.
> > -  // There is at least one incoming backedge that will bring us this
> flow later
> > -  // on. (So that the flow condition in this node is valid again.)
> > -  if (BBisHeader) {
> > -    double incoming = BBWeight;
> > -    // Subtract the flow leaving the loop.
> > -    std::set<Edge> ProcessedExits;
> > -    for (SmallVectorImpl<Edge>::iterator ei = ExitEdges.begin(),
> > -         ee = ExitEdges.end(); ei != ee; ++ei) {
> > -      if (ProcessedExits.insert(*ei).second) {
> > -        double w = getEdgeWeight(*ei);
> > -        if (w == MissingValue) {
> > -          Edges.push_back(*ei);
> > -          // Check if there is a necessary minimal weight, if yes,
> subtract it
> > -          // from weight.
> > -          if (MinimalWeight.find(*ei) != MinimalWeight.end()) {
> > -            incoming -= MinimalWeight[*ei];
> > -            DEBUG(dbgs() << "Reserving " <<
> format("%.20g",MinimalWeight[*ei]) << " at " << (*ei) << "\n");
> > -          }
> > -        } else {
> > -          incoming -= w;
> > -        }
> > -      }
> > -    }
> > -    // If no exit edges, create one:
> > -    if (Edges.size() == 0) {
> > -      BasicBlock *Latch = BBLoop->getLoopLatch();
> > -      if (Latch) {
> > -        Edge edge = getEdge(Latch,0);
> > -        EdgeInformation[BB->getParent()][edge] = BBWeight;
> > -        printEdgeWeight(edge);
> > -        edge = getEdge(Latch, BB);
> > -        EdgeInformation[BB->getParent()][edge] = BBWeight * ExecCount;
> > -        printEdgeWeight(edge);
> > -      }
> > -    }
> > -
> > -    // Distribute remaining weight to the exting edges. To prevent
> fractions
> > -    // from building up and provoking precision problems the weight
> which is to
> > -    // be distributed is split and the rounded, the last edge gets a
> somewhat
> > -    // bigger value, but we are close enough for an estimation.
> > -    double fraction = floor(incoming/Edges.size());
> > -    for (SmallVectorImpl<Edge>::iterator ei = Edges.begin(), ee =
> Edges.end();
> > -         ei != ee; ++ei) {
> > -      double w = 0;
> > -      if (ei != (ee-1)) {
> > -        w = fraction;
> > -        incoming -= fraction;
> > -      } else {
> > -        w = incoming;
> > -      }
> > -      EdgeInformation[BB->getParent()][*ei] += w;
> > -      // Read necessary minimal weight.
> > -      if (MinimalWeight.find(*ei) != MinimalWeight.end()) {
> > -        EdgeInformation[BB->getParent()][*ei] += MinimalWeight[*ei];
> > -        DEBUG(dbgs() << "Additionally " <<
> format("%.20g",MinimalWeight[*ei]) << " at " << (*ei) << "\n");
> > -      }
> > -      printEdgeWeight(*ei);
> > -
> > -      // Add minimal weight to paths to all exit edges, this is used to
> ensure
> > -      // that enough flow is reaching this edges.
> > -      Path p;
> > -      const BasicBlock *Dest = GetPath(BB, (*ei).first, p,
> GetPathToDest);
> > -      while (Dest != BB) {
> > -        const BasicBlock *Parent = p.find(Dest)->second;
> > -        Edge e = getEdge(Parent, Dest);
> > -        if (MinimalWeight.find(e) == MinimalWeight.end()) {
> > -          MinimalWeight[e] = 0;
> > -        }
> > -        MinimalWeight[e] += w;
> > -        DEBUG(dbgs() << "Minimal Weight for " << e << ": " <<
> format("%.20g",MinimalWeight[e]) << "\n");
> > -        Dest = Parent;
> > -      }
> > -    }
> > -    // Increase flow into the loop.
> > -    BBWeight *= (ExecCount+1);
> > -  }
> > -
> > -  BlockInformation[BB->getParent()][BB] = BBWeight;
> > -  // Up until now we considered only the loop exiting edges, now we
> have a
> > -  // definite block weight and must distribute this onto the outgoing
> edges.
> > -  // Since there may be already flow attached to some of the edges,
> read this
> > -  // flow first and remember the edges that have still now flow
> attached.
> > -  Edges.clear();
> > -  std::set<BasicBlock*> ProcessedSuccs;
> > -
> > -  succ_iterator bbi = succ_begin(BB), bbe = succ_end(BB);
> > -  // Also check for (BB,0) edges that may already contain some flow.
> (But only
> > -  // in case there are no successors.)
> > -  if (bbi == bbe) {
> > -    Edge edge = getEdge(BB,0);
> > -    EdgeInformation[BB->getParent()][edge] = BBWeight;
> > -    printEdgeWeight(edge);
> > -  }
> > -  for ( ; bbi != bbe; ++bbi ) {
> > -    if (ProcessedSuccs.insert(*bbi).second) {
> > -      Edge edge = getEdge(BB,*bbi);
> > -      double w = getEdgeWeight(edge);
> > -      if (w != MissingValue) {
> > -        BBWeight -= getEdgeWeight(edge);
> > -      } else {
> > -        Edges.push_back(edge);
> > -        // If minimal weight is necessary, reserve weight by
> subtracting weight
> > -        // from block weight, this is readded later on.
> > -        if (MinimalWeight.find(edge) != MinimalWeight.end()) {
> > -          BBWeight -= MinimalWeight[edge];
> > -          DEBUG(dbgs() << "Reserving " <<
> format("%.20g",MinimalWeight[edge]) << " at " << edge << "\n");
> > -        }
> > -      }
> > -    }
> > -  }
> > -
> > -  double fraction = Edges.size() ? floor(BBWeight/Edges.size()) : 0.0;
> > -  // Finally we know what flow is still not leaving the block,
> distribute this
> > -  // flow onto the empty edges.
> > -  for (SmallVectorImpl<Edge>::iterator ei = Edges.begin(), ee =
> Edges.end();
> > -       ei != ee; ++ei) {
> > -    if (ei != (ee-1)) {
> > -      EdgeInformation[BB->getParent()][*ei] += fraction;
> > -      BBWeight -= fraction;
> > -    } else {
> > -      EdgeInformation[BB->getParent()][*ei] += BBWeight;
> > -    }
> > -    // Readd minial necessary weight.
> > -    if (MinimalWeight.find(*ei) != MinimalWeight.end()) {
> > -      EdgeInformation[BB->getParent()][*ei] += MinimalWeight[*ei];
> > -      DEBUG(dbgs() << "Additionally " <<
> format("%.20g",MinimalWeight[*ei]) << " at " << (*ei) << "\n");
> > -    }
> > -    printEdgeWeight(*ei);
> > -  }
> > -
> > -  // This block is visited, mark this before the recursion.
> > -  BBToVisit.erase(BB);
> > -
> > -  // Recurse into successors.
> > -  for (succ_iterator bbi = succ_begin(BB), bbe = succ_end(BB);
> > -       bbi != bbe; ++bbi) {
> > -    recurseBasicBlock(*bbi);
> > -  }
> > -}
> > -
> > -bool ProfileEstimatorPass::runOnFunction(Function &F) {
> > -  if (F.isDeclaration()) return false;
> > -
> > -  // Fetch LoopInfo and clear ProfileInfo for this function.
> > -  LI = &getAnalysis<LoopInfo>();
> > -  FunctionInformation.erase(&F);
> > -  BlockInformation[&F].clear();
> > -  EdgeInformation[&F].clear();
> > -  BBToVisit.clear();
> > -
> > -  // Mark all blocks as to visit.
> > -  for (Function::iterator bi = F.begin(), be = F.end(); bi != be; ++bi)
> > -    BBToVisit.insert(bi);
> > -
> > -  // Clear Minimal Edges.
> > -  MinimalWeight.clear();
> > -
> > -  DEBUG(dbgs() << "Working on function " << F.getName() << "\n");
> > -
> > -  // Since the entry block is the first one and has no predecessors,
> the edge
> > -  // (0,entry) is inserted with the starting weight of 1.
> > -  BasicBlock *entry = &F.getEntryBlock();
> > -  BlockInformation[&F][entry] = pow(2.0, 32.0);
> > -  Edge edge = getEdge(0,entry);
> > -  EdgeInformation[&F][edge] = BlockInformation[&F][entry];
> > -  printEdgeWeight(edge);
> > -
> > -  // Since recurseBasicBlock() maybe returns with a block which was not
> fully
> > -  // estimated, use recurseBasicBlock() until everything is calculated.
> > -  bool cleanup = false;
> > -  recurseBasicBlock(entry);
> > -  while (BBToVisit.size() > 0 && !cleanup) {
> > -    // Remember number of open blocks, this is later used to check if
> progress
> > -    // was made.
> > -    unsigned size = BBToVisit.size();
> > -
> > -    // Try to calculate all blocks in turn.
> > -    for (std::set<BasicBlock*>::iterator bi = BBToVisit.begin(),
> > -         be = BBToVisit.end(); bi != be; ++bi) {
> > -      recurseBasicBlock(*bi);
> > -      // If at least one block was finished, break because iterator may
> be
> > -      // invalid.
> > -      if (BBToVisit.size() < size) break;
> > -    }
> > -
> > -    // If there was not a single block resolved, make some assumptions.
> > -    if (BBToVisit.size() == size) {
> > -      bool found = false;
> > -      for (std::set<BasicBlock*>::iterator BBI = BBToVisit.begin(), BBE
> = BBToVisit.end();
> > -           (BBI != BBE) && (!found); ++BBI) {
> > -        BasicBlock *BB = *BBI;
> > -        // Try each predecessor if it can be assumend.
> > -        for (pred_iterator bbi = pred_begin(BB), bbe = pred_end(BB);
> > -             (bbi != bbe) && (!found); ++bbi) {
> > -          Edge e = getEdge(*bbi,BB);
> > -          double w = getEdgeWeight(e);
> > -          // Check that edge from predecessor is still free.
> > -          if (w == MissingValue) {
> > -            // Check if there is a circle from this block to
> predecessor.
> > -            Path P;
> > -            const BasicBlock *Dest = GetPath(BB, *bbi, P,
> GetPathToDest);
> > -            if (Dest != *bbi) {
> > -              // If there is no circle, just set edge weight to 0
> > -              EdgeInformation[&F][e] = 0;
> > -              DEBUG(dbgs() << "Assuming edge weight: ");
> > -              printEdgeWeight(e);
> > -              found = true;
> > -            }
> > -          }
> > -        }
> > -      }
> > -      if (!found) {
> > -        cleanup = true;
> > -        DEBUG(dbgs() << "No assumption possible in Fuction
> "<<F.getName()<<", setting all to zero\n");
> > -      }
> > -    }
> > -  }
> > -  // In case there was no safe way to assume edges, set as a last
> measure,
> > -  // set _everything_ to zero.
> > -  if (cleanup) {
> > -    FunctionInformation[&F] = 0;
> > -    BlockInformation[&F].clear();
> > -    EdgeInformation[&F].clear();
> > -    for (Function::const_iterator FI = F.begin(), FE = F.end(); FI !=
> FE; ++FI) {
> > -      const BasicBlock *BB = &(*FI);
> > -      BlockInformation[&F][BB] = 0;
> > -      const_pred_iterator predi = pred_begin(BB), prede = pred_end(BB);
> > -      if (predi == prede) {
> > -        Edge e = getEdge(0,BB);
> > -        setEdgeWeight(e,0);
> > -      }
> > -      for (;predi != prede; ++predi) {
> > -        Edge e = getEdge(*predi,BB);
> > -        setEdgeWeight(e,0);
> > -      }
> > -      succ_const_iterator succi = succ_begin(BB), succe = succ_end(BB);
> > -      if (succi == succe) {
> > -        Edge e = getEdge(BB,0);
> > -        setEdgeWeight(e,0);
> > -      }
> > -      for (;succi != succe; ++succi) {
> > -        Edge e = getEdge(*succi,BB);
> > -        setEdgeWeight(e,0);
> > -      }
> > -    }
> > -  }
> > -
> > -  return false;
> > -}
> >
> > Removed: llvm/trunk/lib/Analysis/ProfileInfo.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ProfileInfo.cpp?rev=191834&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/lib/Analysis/ProfileInfo.cpp (original)
> > +++ llvm/trunk/lib/Analysis/ProfileInfo.cpp (removed)
> > @@ -1,1079 +0,0 @@
> > -//===- ProfileInfo.cpp - Profile Info Interface
> ---------------------------===//
> > -//
> > -//                     The LLVM Compiler Infrastructure
> > -//
> > -// This file is distributed under the University of Illinois Open Source
> > -// License. See LICENSE.TXT for details.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -//
> > -// This file implements the abstract ProfileInfo interface, and the
> default
> > -// "no profile" implementation.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -#define DEBUG_TYPE "profile-info"
> > -#include "llvm/Analysis/ProfileInfo.h"
> > -#include "llvm/ADT/SmallSet.h"
> > -#include "llvm/Analysis/Passes.h"
> > -#include "llvm/CodeGen/MachineBasicBlock.h"
> > -#include "llvm/CodeGen/MachineFunction.h"
> > -#include "llvm/Pass.h"
> > -#include "llvm/Support/CFG.h"
> > -#include <limits>
> > -#include <queue>
> > -#include <set>
> > -using namespace llvm;
> > -
> > -namespace llvm {
> > -  template<> char ProfileInfoT<Function,BasicBlock>::ID = 0;
> > -}
> > -
> > -// Register the ProfileInfo interface, providing a nice name to refer
> to.
> > -INITIALIZE_ANALYSIS_GROUP(ProfileInfo, "Profile Information",
> NoProfileInfo)
> > -
> > -namespace llvm {
> > -
> > -template <>
> > -ProfileInfoT<MachineFunction, MachineBasicBlock>::ProfileInfoT() {}
> > -template <>
> > -ProfileInfoT<MachineFunction, MachineBasicBlock>::~ProfileInfoT() {}
> > -
> > -template <>
> > -ProfileInfoT<Function, BasicBlock>::ProfileInfoT() {
> > -  MachineProfile = 0;
> > -}
> > -template <>
> > -ProfileInfoT<Function, BasicBlock>::~ProfileInfoT() {
> > -  if (MachineProfile) delete MachineProfile;
> > -}
> > -
> > -template<>
> > -char ProfileInfoT<MachineFunction, MachineBasicBlock>::ID = 0;
> > -
> > -template<>
> > -const double ProfileInfoT<Function,BasicBlock>::MissingValue = -1;
> > -
> > -template<> const
> > -double ProfileInfoT<MachineFunction, MachineBasicBlock>::MissingValue =
> -1;
> > -
> > -template<> double
> > -ProfileInfoT<Function,BasicBlock>::getExecutionCount(const BasicBlock
> *BB) {
> > -  std::map<const Function*, BlockCounts>::iterator J =
> > -    BlockInformation.find(BB->getParent());
> > -  if (J != BlockInformation.end()) {
> > -    BlockCounts::iterator I = J->second.find(BB);
> > -    if (I != J->second.end())
> > -      return I->second;
> > -  }
> > -
> > -  double Count = MissingValue;
> > -
> > -  const_pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
> > -
> > -  // Are there zero predecessors of this block?
> > -  if (PI == PE) {
> > -    Edge e = getEdge(0, BB);
> > -    Count = getEdgeWeight(e);
> > -  } else {
> > -    // Otherwise, if there are predecessors, the execution count of
> this block is
> > -    // the sum of the edge frequencies from the incoming edges.
> > -    std::set<const BasicBlock*> ProcessedPreds;
> > -    Count = 0;
> > -    for (; PI != PE; ++PI) {
> > -      const BasicBlock *P = *PI;
> > -      if (ProcessedPreds.insert(P).second) {
> > -        double w = getEdgeWeight(getEdge(P, BB));
> > -        if (w == MissingValue) {
> > -          Count = MissingValue;
> > -          break;
> > -        }
> > -        Count += w;
> > -      }
> > -    }
> > -  }
> > -
> > -  // If the predecessors did not suffice to get block weight, try
> successors.
> > -  if (Count == MissingValue) {
> > -
> > -    succ_const_iterator SI = succ_begin(BB), SE = succ_end(BB);
> > -
> > -    // Are there zero successors of this block?
> > -    if (SI == SE) {
> > -      Edge e = getEdge(BB,0);
> > -      Count = getEdgeWeight(e);
> > -    } else {
> > -      std::set<const BasicBlock*> ProcessedSuccs;
> > -      Count = 0;
> > -      for (; SI != SE; ++SI)
> > -        if (ProcessedSuccs.insert(*SI).second) {
> > -          double w = getEdgeWeight(getEdge(BB, *SI));
> > -          if (w == MissingValue) {
> > -            Count = MissingValue;
> > -            break;
> > -          }
> > -          Count += w;
> > -        }
> > -    }
> > -  }
> > -
> > -  if (Count != MissingValue) BlockInformation[BB->getParent()][BB] =
> Count;
> > -  return Count;
> > -}
> > -
> > -template<>
> > -double ProfileInfoT<MachineFunction, MachineBasicBlock>::
> > -        getExecutionCount(const MachineBasicBlock *MBB) {
> > -  std::map<const MachineFunction*, BlockCounts>::iterator J =
> > -    BlockInformation.find(MBB->getParent());
> > -  if (J != BlockInformation.end()) {
> > -    BlockCounts::iterator I = J->second.find(MBB);
> > -    if (I != J->second.end())
> > -      return I->second;
> > -  }
> > -
> > -  return MissingValue;
> > -}
> > -
> > -template<>
> > -double ProfileInfoT<Function,BasicBlock>::getExecutionCount(const
> Function *F) {
> > -  std::map<const Function*, double>::iterator J =
> > -    FunctionInformation.find(F);
> > -  if (J != FunctionInformation.end())
> > -    return J->second;
> > -
> > -  // isDeclaration() is checked here and not at start of function to
> allow
> > -  // functions without a body still to have a execution count.
> > -  if (F->isDeclaration()) return MissingValue;
> > -
> > -  double Count = getExecutionCount(&F->getEntryBlock());
> > -  if (Count != MissingValue) FunctionInformation[F] = Count;
> > -  return Count;
> > -}
> > -
> > -template<>
> > -double ProfileInfoT<MachineFunction, MachineBasicBlock>::
> > -        getExecutionCount(const MachineFunction *MF) {
> > -  std::map<const MachineFunction*, double>::iterator J =
> > -    FunctionInformation.find(MF);
> > -  if (J != FunctionInformation.end())
> > -    return J->second;
> > -
> > -  double Count = getExecutionCount(&MF->front());
> > -  if (Count != MissingValue) FunctionInformation[MF] = Count;
> > -  return Count;
> > -}
> > -
> > -template<>
> > -void ProfileInfoT<Function,BasicBlock>::
> > -        setExecutionCount(const BasicBlock *BB, double w) {
> > -  DEBUG(dbgs() << "Creating Block " << BB->getName()
> > -               << " (weight: " << format("%.20g",w) << ")\n");
> > -  BlockInformation[BB->getParent()][BB] = w;
> > -}
> > -
> > -template<>
> > -void ProfileInfoT<MachineFunction, MachineBasicBlock>::
> > -        setExecutionCount(const MachineBasicBlock *MBB, double w) {
> > -  DEBUG(dbgs() << "Creating Block " << MBB->getBasicBlock()->getName()
> > -               << " (weight: " << format("%.20g",w) << ")\n");
> > -  BlockInformation[MBB->getParent()][MBB] = w;
> > -}
> > -
> > -template<>
> > -void ProfileInfoT<Function,BasicBlock>::addEdgeWeight(Edge e, double w)
> {
> > -  double oldw = getEdgeWeight(e);
> > -  assert (oldw != MissingValue && "Adding weight to Edge with no
> previous weight");
> > -  DEBUG(dbgs() << "Adding to Edge " << e
> > -               << " (new weight: " << format("%.20g",oldw + w) <<
> ")\n");
> > -  EdgeInformation[getFunction(e)][e] = oldw + w;
> > -}
> > -
> > -template<>
> > -void ProfileInfoT<Function,BasicBlock>::
> > -        addExecutionCount(const BasicBlock *BB, double w) {
> > -  double oldw = getExecutionCount(BB);
> > -  assert (oldw != MissingValue && "Adding weight to Block with no
> previous weight");
> > -  DEBUG(dbgs() << "Adding to Block " << BB->getName()
> > -               << " (new weight: " << format("%.20g",oldw + w) <<
> ")\n");
> > -  BlockInformation[BB->getParent()][BB] = oldw + w;
> > -}
> > -
> > -template<>
> > -void ProfileInfoT<Function,BasicBlock>::removeBlock(const BasicBlock
> *BB) {
> > -  std::map<const Function*, BlockCounts>::iterator J =
> > -    BlockInformation.find(BB->getParent());
> > -  if (J == BlockInformation.end()) return;
> > -
> > -  DEBUG(dbgs() << "Deleting " << BB->getName() << "\n");
> > -  J->second.erase(BB);
> > -}
> > -
> > -template<>
> > -void ProfileInfoT<Function,BasicBlock>::removeEdge(Edge e) {
> > -  std::map<const Function*, EdgeWeights>::iterator J =
> > -    EdgeInformation.find(getFunction(e));
> > -  if (J == EdgeInformation.end()) return;
> > -
> > -  DEBUG(dbgs() << "Deleting" << e << "\n");
> > -  J->second.erase(e);
> > -}
> > -
> > -template<>
> > -void ProfileInfoT<Function,BasicBlock>::
> > -        replaceEdge(const Edge &oldedge, const Edge &newedge) {
> > -  double w;
> > -  if ((w = getEdgeWeight(newedge)) == MissingValue) {
> > -    w = getEdgeWeight(oldedge);
> > -    DEBUG(dbgs() << "Replacing " << oldedge << " with " << newedge  <<
> "\n");
> > -  } else {
> > -    w += getEdgeWeight(oldedge);
> > -    DEBUG(dbgs() << "Adding " << oldedge << " to " << newedge  << "\n");
> > -  }
> > -  setEdgeWeight(newedge,w);
> > -  removeEdge(oldedge);
> > -}
> > -
> > -template<>
> > -const BasicBlock *ProfileInfoT<Function,BasicBlock>::
> > -        GetPath(const BasicBlock *Src, const BasicBlock *Dest,
> > -                Path &P, unsigned Mode) {
> > -  const BasicBlock *BB = 0;
> > -  bool hasFoundPath = false;
> > -
> > -  std::queue<const BasicBlock *> BFS;
> > -  BFS.push(Src);
> > -
> > -  while(BFS.size() && !hasFoundPath) {
> > -    BB = BFS.front();
> > -    BFS.pop();
> > -
> > -    succ_const_iterator Succ = succ_begin(BB), End = succ_end(BB);
> > -    if (Succ == End) {
> > -      P[(const BasicBlock*)0] = BB;
> > -      if (Mode & GetPathToExit) {
> > -        hasFoundPath = true;
> > -        BB = 0;
> > -      }
> > -    }
> > -    for(;Succ != End; ++Succ) {
> > -      if (P.find(*Succ) != P.end()) continue;
> > -      Edge e = getEdge(BB,*Succ);
> > -      if ((Mode & GetPathWithNewEdges) && (getEdgeWeight(e) !=
> MissingValue)) continue;
> > -      P[*Succ] = BB;
> > -      BFS.push(*Succ);
> > -      if ((Mode & GetPathToDest) && *Succ == Dest) {
> > -        hasFoundPath = true;
> > -        BB = *Succ;
> > -        break;
> > -      }
> > -      if ((Mode & GetPathToValue) && (getExecutionCount(*Succ) !=
> MissingValue)) {
> > -        hasFoundPath = true;
> > -        BB = *Succ;
> > -        break;
> > -      }
> > -    }
> > -  }
> > -
> > -  return BB;
> > -}
> > -
> > -template<>
> > -void ProfileInfoT<Function,BasicBlock>::
> > -        divertFlow(const Edge &oldedge, const Edge &newedge) {
> > -  DEBUG(dbgs() << "Diverting " << oldedge << " via " << newedge );
> > -
> > -  // First check if the old edge was taken, if not, just delete it...
> > -  if (getEdgeWeight(oldedge) == 0) {
> > -    removeEdge(oldedge);
> > -    return;
> > -  }
> > -
> > -  Path P;
> > -  P[newedge.first] = 0;
> > -  P[newedge.second] = newedge.first;
> > -  const BasicBlock *BB =
> GetPath(newedge.second,oldedge.second,P,GetPathToExit | GetPathToDest);
> > -
> > -  double w = getEdgeWeight (oldedge);
> > -  DEBUG(dbgs() << ", Weight: " << format("%.20g",w) << "\n");
> > -  do {
> > -    const BasicBlock *Parent = P.find(BB)->second;
> > -    Edge e = getEdge(Parent,BB);
> > -    double oldw = getEdgeWeight(e);
> > -    double oldc = getExecutionCount(e.first);
> > -    setEdgeWeight(e, w+oldw);
> > -    if (Parent != oldedge.first) {
> > -      setExecutionCount(e.first, w+oldc);
> > -    }
> > -    BB = Parent;
> > -  } while (BB != newedge.first);
> > -  removeEdge(oldedge);
> > -}
> > -
> > -/// Replaces all occurrences of RmBB in the ProfilingInfo with DestBB.
> > -/// This checks all edges of the function the blocks reside in and
> replaces the
> > -/// occurrences of RmBB with DestBB.
> > -template<>
> > -void ProfileInfoT<Function,BasicBlock>::
> > -        replaceAllUses(const BasicBlock *RmBB, const BasicBlock
> *DestBB) {
> > -  DEBUG(dbgs() << "Replacing " << RmBB->getName()
> > -               << " with " << DestBB->getName() << "\n");
> > -  const Function *F = DestBB->getParent();
> > -  std::map<const Function*, EdgeWeights>::iterator J =
> > -    EdgeInformation.find(F);
> > -  if (J == EdgeInformation.end()) return;
> > -
> > -  Edge e, newedge;
> > -  bool erasededge = false;
> > -  EdgeWeights::iterator I = J->second.begin(), E = J->second.end();
> > -  while(I != E) {
> > -    e = (I++)->first;
> > -    bool foundedge = false; bool eraseedge = false;
> > -    if (e.first == RmBB) {
> > -      if (e.second == DestBB) {
> > -        eraseedge = true;
> > -      } else {
> > -        newedge = getEdge(DestBB, e.second);
> > -        foundedge = true;
> > -      }
> > -    }
> > -    if (e.second == RmBB) {
> > -      if (e.first == DestBB) {
> > -        eraseedge = true;
> > -      } else {
> > -        newedge = getEdge(e.first, DestBB);
> > -        foundedge = true;
> > -      }
> > -    }
> > -    if (foundedge) {
> > -      replaceEdge(e, newedge);
> > -    }
> > -    if (eraseedge) {
> > -      if (erasededge) {
> > -        Edge newedge = getEdge(DestBB, DestBB);
> > -        replaceEdge(e, newedge);
> > -      } else {
> > -        removeEdge(e);
> > -        erasededge = true;
> > -      }
> > -    }
> > -  }
> > -}
> > -
> > -/// Splits an edge in the ProfileInfo and redirects flow over NewBB.
> > -/// Since its possible that there is more than one edge in the CFG from
> FristBB
> > -/// to SecondBB its necessary to redirect the flow proporionally.
> > -template<>
> > -void ProfileInfoT<Function,BasicBlock>::splitEdge(const BasicBlock
> *FirstBB,
> > -                                                  const BasicBlock
> *SecondBB,
> > -                                                  const BasicBlock
> *NewBB,
> > -                                                  bool
> MergeIdenticalEdges) {
> > -  const Function *F = FirstBB->getParent();
> > -  std::map<const Function*, EdgeWeights>::iterator J =
> > -    EdgeInformation.find(F);
> > -  if (J == EdgeInformation.end()) return;
> > -
> > -  // Generate edges and read current weight.
> > -  Edge e  = getEdge(FirstBB, SecondBB);
> > -  Edge n1 = getEdge(FirstBB, NewBB);
> > -  Edge n2 = getEdge(NewBB, SecondBB);
> > -  EdgeWeights &ECs = J->second;
> > -  double w = ECs[e];
> > -
> > -  int succ_count = 0;
> > -  if (!MergeIdenticalEdges) {
> > -    // First count the edges from FristBB to SecondBB, if there is more
> than
> > -    // one, only slice out a proporional part for NewBB.
> > -    for(succ_const_iterator BBI = succ_begin(FirstBB), BBE =
> succ_end(FirstBB);
> > -        BBI != BBE; ++BBI) {
> > -      if (*BBI == SecondBB) succ_count++;
> > -    }
> > -    // When the NewBB is completely new, increment the count by one so
> that
> > -    // the counts are properly distributed.
> > -    if (getExecutionCount(NewBB) == ProfileInfo::MissingValue)
> succ_count++;
> > -  } else {
> > -    // When the edges are merged anyway, then redirect all flow.
> > -    succ_count = 1;
> > -  }
> > -
> > -  // We know now how many edges there are from FirstBB to SecondBB,
> reroute a
> > -  // proportional part of the edge weight over NewBB.
> > -  double neww = floor(w / succ_count);
> > -  ECs[n1] += neww;
> > -  ECs[n2] += neww;
> > -  BlockInformation[F][NewBB] += neww;
> > -  if (succ_count == 1) {
> > -    ECs.erase(e);
> > -  } else {
> > -    ECs[e] -= neww;
> > -  }
> > -}
> > -
> > -template<>
> > -void ProfileInfoT<Function,BasicBlock>::splitBlock(const BasicBlock
> *Old,
> > -                                                   const BasicBlock*
> New) {
> > -  const Function *F = Old->getParent();
> > -  std::map<const Function*, EdgeWeights>::iterator J =
> > -    EdgeInformation.find(F);
> > -  if (J == EdgeInformation.end()) return;
> > -
> > -  DEBUG(dbgs() << "Splitting " << Old->getName() << " to " <<
> New->getName() << "\n");
> > -
> > -  std::set<Edge> Edges;
> > -  for (EdgeWeights::iterator ewi = J->second.begin(), ewe =
> J->second.end();
> > -       ewi != ewe; ++ewi) {
> > -    Edge old = ewi->first;
> > -    if (old.first == Old) {
> > -      Edges.insert(old);
> > -    }
> > -  }
> > -  for (std::set<Edge>::iterator EI = Edges.begin(), EE = Edges.end();
> > -       EI != EE; ++EI) {
> > -    Edge newedge = getEdge(New, EI->second);
> > -    replaceEdge(*EI, newedge);
> > -  }
> > -
> > -  double w = getExecutionCount(Old);
> > -  setEdgeWeight(getEdge(Old, New), w);
> > -  setExecutionCount(New, w);
> > -}
> > -
> > -template<>
> > -void ProfileInfoT<Function,BasicBlock>::splitBlock(const BasicBlock *BB,
> > -                                                   const BasicBlock*
> NewBB,
> > -                                                   BasicBlock *const
> *Preds,
> > -                                                   unsigned NumPreds) {
> > -  const Function *F = BB->getParent();
> > -  std::map<const Function*, EdgeWeights>::iterator J =
> > -    EdgeInformation.find(F);
> > -  if (J == EdgeInformation.end()) return;
> > -
> > -  DEBUG(dbgs() << "Splitting " << NumPreds << " Edges from " <<
> BB->getName()
> > -               << " to " << NewBB->getName() << "\n");
> > -
> > -  // Collect weight that was redirected over NewBB.
> > -  double newweight = 0;
> > -
> > -  std::set<const BasicBlock *> ProcessedPreds;
> > -  // For all requestes Predecessors.
> > -  for (unsigned pred = 0; pred < NumPreds; ++pred) {
> > -    const BasicBlock * Pred = Preds[pred];
> > -    if (ProcessedPreds.insert(Pred).second) {
> > -      // Create edges and read old weight.
> > -      Edge oldedge = getEdge(Pred, BB);
> > -      Edge newedge = getEdge(Pred, NewBB);
> > -
> > -      // Remember how much weight was redirected.
> > -      newweight += getEdgeWeight(oldedge);
> > -
> > -      replaceEdge(oldedge,newedge);
> > -    }
> > -  }
> > -
> > -  Edge newedge = getEdge(NewBB,BB);
> > -  setEdgeWeight(newedge, newweight);
> > -  setExecutionCount(NewBB, newweight);
> > -}
> > -
> > -template<>
> > -void ProfileInfoT<Function,BasicBlock>::transfer(const Function *Old,
> > -                                                 const Function *New) {
> > -  DEBUG(dbgs() << "Replacing Function " << Old->getName() << " with "
> > -               << New->getName() << "\n");
> > -  std::map<const Function*, EdgeWeights>::iterator J =
> > -    EdgeInformation.find(Old);
> > -  if(J != EdgeInformation.end()) {
> > -    EdgeInformation[New] = J->second;
> > -  }
> > -  EdgeInformation.erase(Old);
> > -  BlockInformation.erase(Old);
> > -  FunctionInformation.erase(Old);
> > -}
> > -
> > -static double readEdgeOrRemember(ProfileInfo::Edge edge, double w,
> > -                                 ProfileInfo::Edge &tocalc, unsigned
> &uncalc) {
> > -  if (w == ProfileInfo::MissingValue) {
> > -    tocalc = edge;
> > -    uncalc++;
> > -    return 0;
> > -  } else {
> > -    return w;
> > -  }
> > -}
> > -
> > -template<>
> > -bool ProfileInfoT<Function,BasicBlock>::
> > -        CalculateMissingEdge(const BasicBlock *BB, Edge &removed,
> > -                             bool assumeEmptySelf) {
> > -  Edge edgetocalc;
> > -  unsigned uncalculated = 0;
> > -
> > -  // collect weights of all incoming and outgoing edges, rememer edges
> that
> > -  // have no value
> > -  double incount = 0;
> > -  SmallSet<const BasicBlock*,8> pred_visited;
> > -  const_pred_iterator bbi = pred_begin(BB), bbe = pred_end(BB);
> > -  if (bbi==bbe) {
> > -    Edge e = getEdge(0,BB);
> > -    incount += readEdgeOrRemember(e, getEdgeWeight(e)
> ,edgetocalc,uncalculated);
> > -  }
> > -  for (;bbi != bbe; ++bbi) {
> > -    if (pred_visited.insert(*bbi)) {
> > -      Edge e = getEdge(*bbi,BB);
> > -      incount += readEdgeOrRemember(e, getEdgeWeight(e)
> ,edgetocalc,uncalculated);
> > -    }
> > -  }
> > -
> > -  double outcount = 0;
> > -  SmallSet<const BasicBlock*,8> succ_visited;
> > -  succ_const_iterator sbbi = succ_begin(BB), sbbe = succ_end(BB);
> > -  if (sbbi==sbbe) {
> > -    Edge e = getEdge(BB,0);
> > -    if (getEdgeWeight(e) == MissingValue) {
> > -      double w = getExecutionCount(BB);
> > -      if (w != MissingValue) {
> > -        setEdgeWeight(e,w);
> > -        removed = e;
> > -      }
> > -    }
> > -    outcount += readEdgeOrRemember(e, getEdgeWeight(e), edgetocalc,
> uncalculated);
> > -  }
> > -  for (;sbbi != sbbe; ++sbbi) {
> > -    if (succ_visited.insert(*sbbi)) {
> > -      Edge e = getEdge(BB,*sbbi);
> > -      outcount += readEdgeOrRemember(e, getEdgeWeight(e), edgetocalc,
> uncalculated);
> > -    }
> > -  }
> > -
> > -  // if exactly one edge weight was missing, calculate it and remove it
> from
> > -  // spanning tree
> > -  if (uncalculated == 0 ) {
> > -    return true;
> > -  } else
> > -  if (uncalculated == 1) {
> > -    if (incount < outcount) {
> > -      EdgeInformation[BB->getParent()][edgetocalc] = outcount-incount;
> > -    } else {
> > -      EdgeInformation[BB->getParent()][edgetocalc] = incount-outcount;
> > -    }
> > -    DEBUG(dbgs() << "--Calc Edge Counter for " << edgetocalc << ": "
> > -                 << format("%.20g", getEdgeWeight(edgetocalc)) << "\n");
> > -    removed = edgetocalc;
> > -    return true;
> > -  } else
> > -  if (uncalculated == 2 && assumeEmptySelf && edgetocalc.first ==
> edgetocalc.second && incount == outcount) {
> > -    setEdgeWeight(edgetocalc, incount * 10);
> > -    removed = edgetocalc;
> > -    return true;
> > -  } else {
> > -    return false;
> > -  }
> > -}
> > -
> > -static void readEdge(ProfileInfo *PI, ProfileInfo::Edge e, double
> &calcw, std::set<ProfileInfo::Edge> &misscount) {
> > -  double w = PI->getEdgeWeight(e);
> > -  if (w != ProfileInfo::MissingValue) {
> > -    calcw += w;
> > -  } else {
> > -    misscount.insert(e);
> > -  }
> > -}
> > -
> > -template<>
> > -bool ProfileInfoT<Function,BasicBlock>::EstimateMissingEdges(const
> BasicBlock *BB) {
> > -  double inWeight = 0;
> > -  std::set<Edge> inMissing;
> > -  std::set<const BasicBlock*> ProcessedPreds;
> > -  const_pred_iterator bbi = pred_begin(BB), bbe = pred_end(BB);
> > -  if (bbi == bbe) {
> > -    readEdge(this,getEdge(0,BB),inWeight,inMissing);
> > -  }
> > -  for( ; bbi != bbe; ++bbi ) {
> > -    if (ProcessedPreds.insert(*bbi).second) {
> > -      readEdge(this,getEdge(*bbi,BB),inWeight,inMissing);
> > -    }
> > -  }
> > -
> > -  double outWeight = 0;
> > -  std::set<Edge> outMissing;
> > -  std::set<const BasicBlock*> ProcessedSuccs;
> > -  succ_const_iterator sbbi = succ_begin(BB), sbbe = succ_end(BB);
> > -  if (sbbi == sbbe)
> > -    readEdge(this,getEdge(BB,0),outWeight,outMissing);
> > -  for ( ; sbbi != sbbe; ++sbbi ) {
> > -    if (ProcessedSuccs.insert(*sbbi).second) {
> > -      readEdge(this,getEdge(BB,*sbbi),outWeight,outMissing);
> > -    }
> > -  }
> > -
> > -  double share;
> > -  std::set<Edge>::iterator ei,ee;
> > -  if (inMissing.size() == 0 && outMissing.size() > 0) {
> > -    ei = outMissing.begin();
> > -    ee = outMissing.end();
> > -    share = inWeight/outMissing.size();
> > -    setExecutionCount(BB,inWeight);
> > -  } else
> > -  if (inMissing.size() > 0 && outMissing.size() == 0 && outWeight == 0)
> {
> > -    ei = inMissing.begin();
> > -    ee = inMissing.end();
> > -    share = 0;
> > -    setExecutionCount(BB,0);
> > -  } else
> > -  if (inMissing.size() == 0 && outMissing.size() == 0) {
> > -    setExecutionCount(BB,outWeight);
> > -    return true;
> > -  } else {
> > -    return false;
> > -  }
> > -  for ( ; ei != ee; ++ei ) {
> > -    setEdgeWeight(*ei,share);
> > -  }
> > -  return true;
> > -}
> > -
> > -template<>
> > -void ProfileInfoT<Function,BasicBlock>::repair(const Function *F) {
> > -//  if (getExecutionCount(&(F->getEntryBlock())) == 0) {
> > -//    for (Function::const_iterator FI = F->begin(), FE = F->end();
> > -//         FI != FE; ++FI) {
> > -//      const BasicBlock* BB = &(*FI);
> > -//      {
> > -//        const_pred_iterator NBB = pred_begin(BB), End = pred_end(BB);
> > -//        if (NBB == End) {
> > -//          setEdgeWeight(getEdge(0,BB),0);
> > -//        }
> > -//        for(;NBB != End; ++NBB) {
> > -//          setEdgeWeight(getEdge(*NBB,BB),0);
> > -//        }
> > -//      }
> > -//      {
> > -//        succ_const_iterator NBB = succ_begin(BB), End = succ_end(BB);
> > -//        if (NBB == End) {
> > -//          setEdgeWeight(getEdge(0,BB),0);
> > -//        }
> > -//        for(;NBB != End; ++NBB) {
> > -//          setEdgeWeight(getEdge(*NBB,BB),0);
> > -//        }
> > -//      }
> > -//    }
> > -//    return;
> > -//  }
> > -  // The set of BasicBlocks that are still unvisited.
> > -  std::set<const BasicBlock*> Unvisited;
> > -
> > -  // The set of return edges (Edges with no successors).
> > -  std::set<Edge> ReturnEdges;
> > -  double ReturnWeight = 0;
> > -
> > -  // First iterate over the whole function and collect:
> > -  // 1) The blocks in this function in the Unvisited set.
> > -  // 2) The return edges in the ReturnEdges set.
> > -  // 3) The flow that is leaving the function already via return edges.
> > -
> > -  // Data structure for searching the function.
> > -  std::queue<const BasicBlock *> BFS;
> > -  const BasicBlock *BB = &(F->getEntryBlock());
> > -  BFS.push(BB);
> > -  Unvisited.insert(BB);
> > -
> > -  while (BFS.size()) {
> > -    BB = BFS.front(); BFS.pop();
> > -    succ_const_iterator NBB = succ_begin(BB), End = succ_end(BB);
> > -    if (NBB == End) {
> > -      Edge e = getEdge(BB,0);
> > -      double w = getEdgeWeight(e);
> > -      if (w == MissingValue) {
> > -        // If the return edge has no value, try to read value from
> block.
> > -        double bw = getExecutionCount(BB);
> > -        if (bw != MissingValue) {
> > -          setEdgeWeight(e,bw);
> > -          ReturnWeight += bw;
> > -        } else {
> > -          // If both return edge and block provide no value, collect
> edge.
> > -          ReturnEdges.insert(e);
> > -        }
> > -      } else {
> > -        // If the return edge has a proper value, collect it.
> > -        ReturnWeight += w;
> > -      }
> > -    }
> > -    for (;NBB != End; ++NBB) {
> > -      if (Unvisited.insert(*NBB).second) {
> > -        BFS.push(*NBB);
> > -      }
> > -    }
> > -  }
> > -
> > -  while (Unvisited.size() > 0) {
> > -    unsigned oldUnvisitedCount = Unvisited.size();
> > -    bool FoundPath = false;
> > -
> > -    // If there is only one edge left, calculate it.
> > -    if (ReturnEdges.size() == 1) {
> > -      ReturnWeight = getExecutionCount(&(F->getEntryBlock())) -
> ReturnWeight;
> > -
> > -      Edge e = *ReturnEdges.begin();
> > -      setEdgeWeight(e,ReturnWeight);
> > -      setExecutionCount(e.first,ReturnWeight);
> > -
> > -      Unvisited.erase(e.first);
> > -      ReturnEdges.erase(e);
> > -      continue;
> > -    }
> > -
> > -    // Calculate all blocks where only one edge is missing, this may
> also
> > -    // resolve furhter return edges.
> > -    std::set<const BasicBlock *>::iterator FI = Unvisited.begin(), FE =
> Unvisited.end();
> > -    while(FI != FE) {
> > -      const BasicBlock *BB = *FI; ++FI;
> > -      Edge e;
> > -      if(CalculateMissingEdge(BB,e,true)) {
> > -        if (BlockInformation[F].find(BB) == BlockInformation[F].end()) {
> > -          setExecutionCount(BB,getExecutionCount(BB));
> > -        }
> > -        Unvisited.erase(BB);
> > -        if (e.first != 0 && e.second == 0) {
> > -          ReturnEdges.erase(e);
> > -          ReturnWeight += getEdgeWeight(e);
> > -        }
> > -      }
> > -    }
> > -    if (oldUnvisitedCount > Unvisited.size()) continue;
> > -
> > -    // Estimate edge weights by dividing the flow proportionally.
> > -    FI = Unvisited.begin(), FE = Unvisited.end();
> > -    while(FI != FE) {
> > -      const BasicBlock *BB = *FI; ++FI;
> > -      const BasicBlock *Dest = 0;
> > -      bool AllEdgesHaveSameReturn = true;
> > -      // Check each Successor, these must all end up in the same or an
> empty
> > -      // return block otherwise its dangerous to do an estimation on
> them.
> > -      for (succ_const_iterator Succ = succ_begin(BB), End =
> succ_end(BB);
> > -           Succ != End; ++Succ) {
> > -        Path P;
> > -        GetPath(*Succ, 0, P, GetPathToExit);
> > -        if (Dest && Dest != P[(const BasicBlock*)0]) {
> > -          AllEdgesHaveSameReturn = false;
> > -        }
> > -        Dest = P[(const BasicBlock*)0];
> > -      }
> > -      if (AllEdgesHaveSameReturn) {
> > -        if(EstimateMissingEdges(BB)) {
> > -          Unvisited.erase(BB);
> > -          break;
> > -        }
> > -      }
> > -    }
> > -    if (oldUnvisitedCount > Unvisited.size()) continue;
> > -
> > -    // Check if there is a path to an block that has a known value and
> redirect
> > -    // flow accordingly.
> > -    FI = Unvisited.begin(), FE = Unvisited.end();
> > -    while(FI != FE && !FoundPath) {
> > -      // Fetch path.
> > -      const BasicBlock *BB = *FI; ++FI;
> > -      Path P;
> > -      const BasicBlock *Dest = GetPath(BB, 0, P, GetPathToValue);
> > -
> > -      // Calculate incoming flow.
> > -      double iw = 0; unsigned inmissing = 0; unsigned incount = 0;
> unsigned invalid = 0;
> > -      std::set<const BasicBlock *> Processed;
> > -      for (const_pred_iterator NBB = pred_begin(BB), End = pred_end(BB);
> > -           NBB != End; ++NBB) {
> > -        if (Processed.insert(*NBB).second) {
> > -          Edge e = getEdge(*NBB, BB);
> > -          double ew = getEdgeWeight(e);
> > -          if (ew != MissingValue) {
> > -            iw += ew;
> > -            invalid++;
> > -          } else {
> > -            // If the path contains the successor, this means its a
> backedge,
> > -            // do not count as missing.
> > -            if (P.find(*NBB) == P.end())
> > -              inmissing++;
> > -          }
> > -          incount++;
> > -        }
> > -      }
> > -      if (inmissing == incount) continue;
> > -      if (invalid == 0) continue;
> > -
> > -      // Subtract (already) outgoing flow.
> > -      Processed.clear();
> > -      for (succ_const_iterator NBB = succ_begin(BB), End = succ_end(BB);
> > -           NBB != End; ++NBB) {
> > -        if (Processed.insert(*NBB).second) {
> > -          Edge e = getEdge(BB, *NBB);
> > -          double ew = getEdgeWeight(e);
> > -          if (ew != MissingValue) {
> > -            iw -= ew;
> > -          }
> > -        }
> > -      }
> > -      if (iw < 0) continue;
> > -
> > -      // Check the receiving end of the path if it can handle the flow.
> > -      double ow = getExecutionCount(Dest);
> > -      Processed.clear();
> > -      for (succ_const_iterator NBB = succ_begin(BB), End = succ_end(BB);
> > -           NBB != End; ++NBB) {
> > -        if (Processed.insert(*NBB).second) {
> > -          Edge e = getEdge(BB, *NBB);
> > -          double ew = getEdgeWeight(e);
> > -          if (ew != MissingValue) {
> > -            ow -= ew;
> > -          }
> > -        }
> > -      }
> > -      if (ow < 0) continue;
> > -
> > -      // Determine how much flow shall be used.
> > -      double ew = getEdgeWeight(getEdge(P[Dest],Dest));
> > -      if (ew != MissingValue) {
> > -        ew = ew<ow?ew:ow;
> > -        ew = ew<iw?ew:iw;
> > -      } else {
> > -        if (inmissing == 0)
> > -          ew = iw;
> > -      }
> > -
> > -      // Create flow.
> > -      if (ew != MissingValue) {
> > -        do {
> > -          Edge e = getEdge(P[Dest],Dest);
> > -          if (getEdgeWeight(e) == MissingValue) {
> > -            setEdgeWeight(e,ew);
> > -            FoundPath = true;
> > -          }
> > -          Dest = P[Dest];
> > -        } while (Dest != BB);
> > -      }
> > -    }
> > -    if (FoundPath) continue;
> > -
> > -    // Calculate a block with self loop.
> > -    FI = Unvisited.begin(), FE = Unvisited.end();
> > -    while(FI != FE && !FoundPath) {
> > -      const BasicBlock *BB = *FI; ++FI;
> > -      bool SelfEdgeFound = false;
> > -      for (succ_const_iterator NBB = succ_begin(BB), End = succ_end(BB);
> > -           NBB != End; ++NBB) {
> > -        if (*NBB == BB) {
> > -          SelfEdgeFound = true;
> > -          break;
> > -        }
> > -      }
> > -      if (SelfEdgeFound) {
> > -        Edge e = getEdge(BB,BB);
> > -        if (getEdgeWeight(e) == MissingValue) {
> > -          double iw = 0;
> > -          std::set<const BasicBlock *> Processed;
> > -          for (const_pred_iterator NBB = pred_begin(BB), End =
> pred_end(BB);
> > -               NBB != End; ++NBB) {
> > -            if (Processed.insert(*NBB).second) {
> > -              Edge e = getEdge(*NBB, BB);
> > -              double ew = getEdgeWeight(e);
> > -              if (ew != MissingValue) {
> > -                iw += ew;
> > -              }
> > -            }
> > -          }
> > -          setEdgeWeight(e,iw * 10);
> > -          FoundPath = true;
> > -        }
> > -      }
> > -    }
> > -    if (FoundPath) continue;
> > -
> > -    // Determine backedges, set them to zero.
> > -    FI = Unvisited.begin(), FE = Unvisited.end();
> > -    while(FI != FE && !FoundPath) {
> > -      const BasicBlock *BB = *FI; ++FI;
> > -      const BasicBlock *Dest = 0;
> > -      Path P;
> > -      bool BackEdgeFound = false;
> > -      for (const_pred_iterator NBB = pred_begin(BB), End = pred_end(BB);
> > -           NBB != End; ++NBB) {
> > -        Dest = GetPath(BB, *NBB, P, GetPathToDest |
> GetPathWithNewEdges);
> > -        if (Dest == *NBB) {
> > -          BackEdgeFound = true;
> > -          break;
> > -        }
> > -      }
> > -      if (BackEdgeFound) {
> > -        Edge e = getEdge(Dest,BB);
> > -        double w = getEdgeWeight(e);
> > -        if (w == MissingValue) {
> > -          setEdgeWeight(e,0);
> > -          FoundPath = true;
> > -        }
> > -        do {
> > -          Edge e = getEdge(P[Dest], Dest);
> > -          double w = getEdgeWeight(e);
> > -          if (w == MissingValue) {
> > -            setEdgeWeight(e,0);
> > -            FoundPath = true;
> > -          }
> > -          Dest = P[Dest];
> > -        } while (Dest != BB);
> > -      }
> > -    }
> > -    if (FoundPath) continue;
> > -
> > -    // Channel flow to return block.
> > -    FI = Unvisited.begin(), FE = Unvisited.end();
> > -    while(FI != FE && !FoundPath) {
> > -      const BasicBlock *BB = *FI; ++FI;
> > -
> > -      Path P;
> > -      const BasicBlock *Dest = GetPath(BB, 0, P, GetPathToExit |
> GetPathWithNewEdges);
> > -      Dest = P[(const BasicBlock*)0];
> > -      if (!Dest) continue;
> > -
> > -      if (getEdgeWeight(getEdge(Dest,0)) == MissingValue) {
> > -        // Calculate incoming flow.
> > -        double iw = 0;
> > -        std::set<const BasicBlock *> Processed;
> > -        for (const_pred_iterator NBB = pred_begin(BB), End =
> pred_end(BB);
> > -             NBB != End; ++NBB) {
> > -          if (Processed.insert(*NBB).second) {
> > -            Edge e = getEdge(*NBB, BB);
> > -            double ew = getEdgeWeight(e);
> > -            if (ew != MissingValue) {
> > -              iw += ew;
> > -            }
> > -          }
> > -        }
> > -        do {
> > -          Edge e = getEdge(P[Dest], Dest);
> > -          double w = getEdgeWeight(e);
> > -          if (w == MissingValue) {
> > -            setEdgeWeight(e,iw);
> > -            FoundPath = true;
> > -          } else {
> > -            assert(0 && "Edge should not have value already!");
> > -          }
> > -          Dest = P[Dest];
> > -        } while (Dest != BB);
> > -      }
> > -    }
> > -    if (FoundPath) continue;
> > -
> > -    // Speculatively set edges to zero.
> > -    FI = Unvisited.begin(), FE = Unvisited.end();
> > -    while(FI != FE && !FoundPath) {
> > -      const BasicBlock *BB = *FI; ++FI;
> > -
> > -      for (const_pred_iterator NBB = pred_begin(BB), End = pred_end(BB);
> > -           NBB != End; ++NBB) {
> > -        Edge e = getEdge(*NBB,BB);
> > -        double w = getEdgeWeight(e);
> > -        if (w == MissingValue) {
> > -          setEdgeWeight(e,0);
> > -          FoundPath = true;
> > -          break;
> > -        }
> > -      }
> > -    }
> > -    if (FoundPath) continue;
> > -
> > -    errs() << "{";
> > -    FI = Unvisited.begin(), FE = Unvisited.end();
> > -    while(FI != FE) {
> > -      const BasicBlock *BB = *FI; ++FI;
> > -      dbgs() << BB->getName();
> > -      if (FI != FE)
> > -        dbgs() << ",";
> > -    }
> > -    errs() << "}";
> > -
> > -    errs() << "ASSERT: could not repair function";
> > -    assert(0 && "could not repair function");
> > -  }
> > -
> > -  EdgeWeights J = EdgeInformation[F];
> > -  for (EdgeWeights::iterator EI = J.begin(), EE = J.end(); EI != EE;
> ++EI) {
> > -    Edge e = EI->first;
> > -
> > -    bool SuccFound = false;
> > -    if (e.first != 0) {
> > -      succ_const_iterator NBB = succ_begin(e.first), End =
> succ_end(e.first);
> > -      if (NBB == End) {
> > -        if (0 == e.second) {
> > -          SuccFound = true;
> > -        }
> > -      }
> > -      for (;NBB != End; ++NBB) {
> > -        if (*NBB == e.second) {
> > -          SuccFound = true;
> > -          break;
> > -        }
> > -      }
> > -      if (!SuccFound) {
> > -        removeEdge(e);
> > -      }
> > -    }
> > -  }
> > -}
> > -
> > -raw_ostream& operator<<(raw_ostream &O, const MachineFunction *MF) {
> > -  return O << MF->getFunction()->getName() << "(MF)";
> > -}
> > -
> > -raw_ostream& operator<<(raw_ostream &O, const MachineBasicBlock *MBB) {
> > -  return O << MBB->getBasicBlock()->getName() << "(MB)";
> > -}
> > -
> > -raw_ostream& operator<<(raw_ostream &O, std::pair<const
> MachineBasicBlock *, const MachineBasicBlock *> E) {
> > -  O << "(";
> > -
> > -  if (E.first)
> > -    O << E.first;
> > -  else
> > -    O << "0";
> > -
> > -  O << ",";
> > -
> > -  if (E.second)
> > -    O << E.second;
> > -  else
> > -    O << "0";
> > -
> > -  return O << ")";
> > -}
> > -
> > -} // namespace llvm
> > -
> >
> -//===----------------------------------------------------------------------===//
> > -//  NoProfile ProfileInfo implementation
> > -//
> > -
> > -namespace {
> > -  struct NoProfileInfo : public ImmutablePass, public ProfileInfo {
> > -    static char ID; // Class identification, replacement for typeinfo
> > -    NoProfileInfo() : ImmutablePass(ID) {
> > -      initializeNoProfileInfoPass(*PassRegistry::getPassRegistry());
> > -    }
> > -
> > -    /// getAdjustedAnalysisPointer - This method is used when a pass
> implements
> > -    /// an analysis interface through multiple inheritance.  If needed,
> it
> > -    /// should override this to adjust the this pointer as needed for
> the
> > -    /// specified pass info.
> > -    virtual void *getAdjustedAnalysisPointer(AnalysisID PI) {
> > -      if (PI == &ProfileInfo::ID)
> > -        return (ProfileInfo*)this;
> > -      return this;
> > -    }
> > -
> > -    virtual const char *getPassName() const {
> > -      return "NoProfileInfo";
> > -    }
> > -  };
> > -}  // End of anonymous namespace
> > -
> > -char NoProfileInfo::ID = 0;
> > -// Register this pass...
> > -INITIALIZE_AG_PASS(NoProfileInfo, ProfileInfo, "no-profile",
> > -                   "No Profile Information", false, true, true)
> > -
> > -ImmutablePass *llvm::createNoProfileInfoPass() { return new
> NoProfileInfo(); }
> >
> > Removed: llvm/trunk/lib/Analysis/ProfileInfoLoader.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ProfileInfoLoader.cpp?rev=191834&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/lib/Analysis/ProfileInfoLoader.cpp (original)
> > +++ llvm/trunk/lib/Analysis/ProfileInfoLoader.cpp (removed)
> > @@ -1,155 +0,0 @@
> > -//===- ProfileInfoLoad.cpp - Load profile information from disk
> -----------===//
> > -//
> > -//                      The LLVM Compiler Infrastructure
> > -//
> > -// This file is distributed under the University of Illinois Open Source
> > -// License. See LICENSE.TXT for details.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -//
> > -// The ProfileInfoLoader class is used to load and represent profiling
> > -// information read in from the dump file.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -
> > -#include "llvm/Analysis/ProfileInfoLoader.h"
> > -#include "llvm/Analysis/ProfileInfoTypes.h"
> > -#include "llvm/IR/InstrTypes.h"
> > -#include "llvm/IR/Module.h"
> > -#include "llvm/Support/raw_ostream.h"
> > -#include <cstdio>
> > -#include <cstdlib>
> > -using namespace llvm;
> > -
> > -// ByteSwap - Byteswap 'Var' if 'Really' is true.
> > -//
> > -static inline unsigned ByteSwap(unsigned Var, bool Really) {
> > -  if (!Really) return Var;
> > -  return ((Var & (255U<< 0U)) << 24U) |
> > -         ((Var & (255U<< 8U)) <<  8U) |
> > -         ((Var & (255U<<16U)) >>  8U) |
> > -         ((Var & (255U<<24U)) >> 24U);
> > -}
> > -
> > -static unsigned AddCounts(unsigned A, unsigned B) {
> > -  // If either value is undefined, use the other.
> > -  if (A == ProfileInfoLoader::Uncounted) return B;
> > -  if (B == ProfileInfoLoader::Uncounted) return A;
> > -  return A + B;
> > -}
> > -
> > -static void ReadProfilingBlock(const char *ToolName, FILE *F,
> > -                               bool ShouldByteSwap,
> > -                               std::vector<unsigned> &Data) {
> > -  // Read the number of entries...
> > -  unsigned NumEntries;
> > -  if (fread(&NumEntries, sizeof(unsigned), 1, F) != 1) {
> > -    errs() << ToolName << ": data packet truncated!\n";
> > -    perror(0);
> > -    exit(1);
> > -  }
> > -  NumEntries = ByteSwap(NumEntries, ShouldByteSwap);
> > -
> > -  // Read the counts...
> > -  std::vector<unsigned> TempSpace(NumEntries);
> > -
> > -  // Read in the block of data...
> > -  if (fread(&TempSpace[0], sizeof(unsigned)*NumEntries, 1, F) != 1) {
> > -    errs() << ToolName << ": data packet truncated!\n";
> > -    perror(0);
> > -    exit(1);
> > -  }
> > -
> > -  // Make sure we have enough space... The space is initialised to -1 to
> > -  // facitiltate the loading of missing values for OptimalEdgeProfiling.
> > -  if (Data.size() < NumEntries)
> > -    Data.resize(NumEntries, ProfileInfoLoader::Uncounted);
> > -
> > -  // Accumulate the data we just read into the data.
> > -  if (!ShouldByteSwap) {
> > -    for (unsigned i = 0; i != NumEntries; ++i) {
> > -      Data[i] = AddCounts(TempSpace[i], Data[i]);
> > -    }
> > -  } else {
> > -    for (unsigned i = 0; i != NumEntries; ++i) {
> > -      Data[i] = AddCounts(ByteSwap(TempSpace[i], true), Data[i]);
> > -    }
> > -  }
> > -}
> > -
> > -const unsigned ProfileInfoLoader::Uncounted = ~0U;
> > -
> > -// ProfileInfoLoader ctor - Read the specified profiling data file,
> exiting the
> > -// program if the file is invalid or broken.
> > -//
> > -ProfileInfoLoader::ProfileInfoLoader(const char *ToolName,
> > -                                     const std::string &Filename)
> > -  : Filename(Filename) {
> > -  FILE *F = fopen(Filename.c_str(), "rb");
> > -  if (F == 0) {
> > -    errs() << ToolName << ": Error opening '" << Filename << "': ";
> > -    perror(0);
> > -    exit(1);
> > -  }
> > -
> > -  // Keep reading packets until we run out of them.
> > -  unsigned PacketType;
> > -  while (fread(&PacketType, sizeof(unsigned), 1, F) == 1) {
> > -    // If the low eight bits of the packet are zero, we must be dealing
> with an
> > -    // endianness mismatch.  Byteswap all words read from the profiling
> > -    // information.
> > -    bool ShouldByteSwap = (char)PacketType == 0;
> > -    PacketType = ByteSwap(PacketType, ShouldByteSwap);
> > -
> > -    switch (PacketType) {
> > -    case ArgumentInfo: {
> > -      unsigned ArgLength;
> > -      if (fread(&ArgLength, sizeof(unsigned), 1, F) != 1) {
> > -        errs() << ToolName << ": arguments packet truncated!\n";
> > -        perror(0);
> > -        exit(1);
> > -      }
> > -      ArgLength = ByteSwap(ArgLength, ShouldByteSwap);
> > -
> > -      // Read in the arguments...
> > -      std::vector<char> Chars(ArgLength+4);
> > -
> > -      if (ArgLength)
> > -        if (fread(&Chars[0], (ArgLength+3) & ~3, 1, F) != 1) {
> > -          errs() << ToolName << ": arguments packet truncated!\n";
> > -          perror(0);
> > -          exit(1);
> > -        }
> > -      CommandLines.push_back(std::string(&Chars[0], &Chars[ArgLength]));
> > -      break;
> > -    }
> > -
> > -    case FunctionInfo:
> > -      ReadProfilingBlock(ToolName, F, ShouldByteSwap, FunctionCounts);
> > -      break;
> > -
> > -    case BlockInfo:
> > -      ReadProfilingBlock(ToolName, F, ShouldByteSwap, BlockCounts);
> > -      break;
> > -
> > -    case EdgeInfo:
> > -      ReadProfilingBlock(ToolName, F, ShouldByteSwap, EdgeCounts);
> > -      break;
> > -
> > -    case OptEdgeInfo:
> > -      ReadProfilingBlock(ToolName, F, ShouldByteSwap,
> OptimalEdgeCounts);
> > -      break;
> > -
> > -    case BBTraceInfo:
> > -      ReadProfilingBlock(ToolName, F, ShouldByteSwap, BBTrace);
> > -      break;
> > -
> > -    default:
> > -      errs() << ToolName << ": Unknown packet type #" << PacketType <<
> "!\n";
> > -      exit(1);
> > -    }
> > -  }
> > -
> > -  fclose(F);
> > -}
> > -
> >
> > Removed: llvm/trunk/lib/Analysis/ProfileInfoLoaderPass.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ProfileInfoLoaderPass.cpp?rev=191834&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/lib/Analysis/ProfileInfoLoaderPass.cpp (original)
> > +++ llvm/trunk/lib/Analysis/ProfileInfoLoaderPass.cpp (removed)
> > @@ -1,267 +0,0 @@
> > -//===- ProfileInfoLoaderPass.cpp - LLVM Pass to load profile info
> ---------===//
> > -//
> > -//                     The LLVM Compiler Infrastructure
> > -//
> > -// This file is distributed under the University of Illinois Open Source
> > -// License. See LICENSE.TXT for details.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -//
> > -// This file implements a concrete implementation of profiling
> information that
> > -// loads the information from a profile dump file.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -#define DEBUG_TYPE "profile-loader"
> > -#include "llvm/Analysis/Passes.h"
> > -#include "llvm/ADT/SmallSet.h"
> > -#include "llvm/ADT/Statistic.h"
> > -#include "llvm/Analysis/ProfileInfo.h"
> > -#include "llvm/Analysis/ProfileInfoLoader.h"
> > -#include "llvm/IR/BasicBlock.h"
> > -#include "llvm/IR/InstrTypes.h"
> > -#include "llvm/IR/Module.h"
> > -#include "llvm/Pass.h"
> > -#include "llvm/Support/CFG.h"
> > -#include "llvm/Support/CommandLine.h"
> > -#include "llvm/Support/Debug.h"
> > -#include "llvm/Support/Format.h"
> > -#include "llvm/Support/raw_ostream.h"
> > -#include <set>
> > -using namespace llvm;
> > -
> > -STATISTIC(NumEdgesRead, "The # of edges read.");
> > -
> > -static cl::opt<std::string>
> > -ProfileInfoFilename("profile-info-file", cl::init("llvmprof.out"),
> > -                    cl::value_desc("filename"),
> > -                    cl::desc("Profile file loaded by -profile-loader"));
> > -
> > -namespace {
> > -  class LoaderPass : public ModulePass, public ProfileInfo {
> > -    std::string Filename;
> > -    std::set<Edge> SpanningTree;
> > -    std::set<const BasicBlock*> BBisUnvisited;
> > -    unsigned ReadCount;
> > -  public:
> > -    static char ID; // Class identification, replacement for typeinfo
> > -    explicit LoaderPass(const std::string &filename = "")
> > -      : ModulePass(ID), Filename(filename) {
> > -      initializeLoaderPassPass(*PassRegistry::getPassRegistry());
> > -      if (filename.empty()) Filename = ProfileInfoFilename;
> > -    }
> > -
> > -    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
> > -      AU.setPreservesAll();
> > -    }
> > -
> > -    virtual const char *getPassName() const {
> > -      return "Profiling information loader";
> > -    }
> > -
> > -    // recurseBasicBlock() - Calculates the edge weights for as much
> basic
> > -    // blocks as possbile.
> > -    virtual void recurseBasicBlock(const BasicBlock *BB);
> > -    virtual void readEdgeOrRemember(Edge, Edge&, unsigned &, double &);
> > -    virtual void readEdge(ProfileInfo::Edge, std::vector<unsigned>&);
> > -
> > -    /// getAdjustedAnalysisPointer - This method is used when a pass
> implements
> > -    /// an analysis interface through multiple inheritance.  If needed,
> it
> > -    /// should override this to adjust the this pointer as needed for
> the
> > -    /// specified pass info.
> > -    virtual void *getAdjustedAnalysisPointer(AnalysisID PI) {
> > -      if (PI == &ProfileInfo::ID)
> > -        return (ProfileInfo*)this;
> > -      return this;
> > -    }
> > -
> > -    /// run - Load the profile information from the specified file.
> > -    virtual bool runOnModule(Module &M);
> > -  };
> > -}  // End of anonymous namespace
> > -
> > -char LoaderPass::ID = 0;
> > -INITIALIZE_AG_PASS(LoaderPass, ProfileInfo, "profile-loader",
> > -              "Load profile information from llvmprof.out", false,
> true, false)
> > -
> > -char &llvm::ProfileLoaderPassID = LoaderPass::ID;
> > -
> > -ModulePass *llvm::createProfileLoaderPass() { return new LoaderPass(); }
> > -
> > -/// createProfileLoaderPass - This function returns a Pass that loads
> the
> > -/// profiling information for the module from the specified filename,
> making it
> > -/// available to the optimizers.
> > -Pass *llvm::createProfileLoaderPass(const std::string &Filename) {
> > -  return new LoaderPass(Filename);
> > -}
> > -
> > -void LoaderPass::readEdgeOrRemember(Edge edge, Edge &tocalc,
> > -                                    unsigned &uncalc, double &count) {
> > -  double w;
> > -  if ((w = getEdgeWeight(edge)) == MissingValue) {
> > -    tocalc = edge;
> > -    uncalc++;
> > -  } else {
> > -    count+=w;
> > -  }
> > -}
> > -
> > -// recurseBasicBlock - Visits all neighbours of a block and then tries
> to
> > -// calculate the missing edge values.
> > -void LoaderPass::recurseBasicBlock(const BasicBlock *BB) {
> > -
> > -  // break recursion if already visited
> > -  if (BBisUnvisited.find(BB) == BBisUnvisited.end()) return;
> > -  BBisUnvisited.erase(BB);
> > -  if (!BB) return;
> > -
> > -  for (succ_const_iterator bbi = succ_begin(BB), bbe = succ_end(BB);
> > -       bbi != bbe; ++bbi) {
> > -    recurseBasicBlock(*bbi);
> > -  }
> > -  for (const_pred_iterator bbi = pred_begin(BB), bbe = pred_end(BB);
> > -       bbi != bbe; ++bbi) {
> > -    recurseBasicBlock(*bbi);
> > -  }
> > -
> > -  Edge tocalc;
> > -  if (CalculateMissingEdge(BB, tocalc)) {
> > -    SpanningTree.erase(tocalc);
> > -  }
> > -}
> > -
> > -void LoaderPass::readEdge(ProfileInfo::Edge e,
> > -                          std::vector<unsigned> &ECs) {
> > -  if (ReadCount < ECs.size()) {
> > -    double weight = ECs[ReadCount++];
> > -    if (weight != ProfileInfoLoader::Uncounted) {
> > -      // Here the data realm changes from the unsigned of the file to
> the
> > -      // double of the ProfileInfo. This conversion is save because we
> know
> > -      // that everything thats representable in unsinged is also
> representable
> > -      // in double.
> > -      EdgeInformation[getFunction(e)][e] += (double)weight;
> > -
> > -      DEBUG(dbgs() << "--Read Edge Counter for " << e
> > -                   << " (# "<< (ReadCount-1) << "): "
> > -                   << (unsigned)getEdgeWeight(e) << "\n");
> > -    } else {
> > -      // This happens only if reading optimal profiling information,
> not when
> > -      // reading regular profiling information.
> > -      SpanningTree.insert(e);
> > -    }
> > -  }
> > -}
> > -
> > -bool LoaderPass::runOnModule(Module &M) {
> > -  ProfileInfoLoader PIL("profile-loader", Filename);
> > -
> > -  EdgeInformation.clear();
> > -  std::vector<unsigned> Counters = PIL.getRawEdgeCounts();
> > -  if (Counters.size() > 0) {
> > -    ReadCount = 0;
> > -    for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) {
> > -      if (F->isDeclaration()) continue;
> > -      DEBUG(dbgs() << "Working on " << F->getName() << "\n");
> > -      readEdge(getEdge(0,&F->getEntryBlock()), Counters);
> > -      for (Function::iterator BB = F->begin(), E = F->end(); BB != E;
> ++BB) {
> > -        TerminatorInst *TI = BB->getTerminator();
> > -        for (unsigned s = 0, e = TI->getNumSuccessors(); s != e; ++s) {
> > -          readEdge(getEdge(BB,TI->getSuccessor(s)), Counters);
> > -        }
> > -      }
> > -    }
> > -    if (ReadCount != Counters.size()) {
> > -      errs() << "WARNING: profile information is inconsistent with "
> > -             << "the current program!\n";
> > -    }
> > -    NumEdgesRead = ReadCount;
> > -  }
> > -
> > -  Counters = PIL.getRawOptimalEdgeCounts();
> > -  if (Counters.size() > 0) {
> > -    ReadCount = 0;
> > -    for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) {
> > -      if (F->isDeclaration()) continue;
> > -      DEBUG(dbgs() << "Working on " << F->getName() << "\n");
> > -      readEdge(getEdge(0,&F->getEntryBlock()), Counters);
> > -      for (Function::iterator BB = F->begin(), E = F->end(); BB != E;
> ++BB) {
> > -        TerminatorInst *TI = BB->getTerminator();
> > -        if (TI->getNumSuccessors() == 0) {
> > -          readEdge(getEdge(BB,0), Counters);
> > -        }
> > -        for (unsigned s = 0, e = TI->getNumSuccessors(); s != e; ++s) {
> > -          readEdge(getEdge(BB,TI->getSuccessor(s)), Counters);
> > -        }
> > -      }
> > -      while (SpanningTree.size() > 0) {
> > -
> > -        unsigned size = SpanningTree.size();
> > -
> > -        BBisUnvisited.clear();
> > -        for (std::set<Edge>::iterator ei = SpanningTree.begin(),
> > -             ee = SpanningTree.end(); ei != ee; ++ei) {
> > -          BBisUnvisited.insert(ei->first);
> > -          BBisUnvisited.insert(ei->second);
> > -        }
> > -        while (BBisUnvisited.size() > 0) {
> > -          recurseBasicBlock(*BBisUnvisited.begin());
> > -        }
> > -
> > -        if (SpanningTree.size() == size) {
> > -          DEBUG(dbgs()<<"{");
> > -          for (std::set<Edge>::iterator ei = SpanningTree.begin(),
> > -               ee = SpanningTree.end(); ei != ee; ++ei) {
> > -            DEBUG(dbgs()<< *ei <<",");
> > -          }
> > -          assert(0 && "No edge calculated!");
> > -        }
> > -
> > -      }
> > -    }
> > -    if (ReadCount != Counters.size()) {
> > -      errs() << "WARNING: profile information is inconsistent with "
> > -             << "the current program!\n";
> > -    }
> > -    NumEdgesRead = ReadCount;
> > -  }
> > -
> > -  BlockInformation.clear();
> > -  Counters = PIL.getRawBlockCounts();
> > -  if (Counters.size() > 0) {
> > -    ReadCount = 0;
> > -    for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) {
> > -      if (F->isDeclaration()) continue;
> > -      for (Function::iterator BB = F->begin(), E = F->end(); BB != E;
> ++BB)
> > -        if (ReadCount < Counters.size())
> > -          // Here the data realm changes from the unsigned of the file
> to the
> > -          // double of the ProfileInfo. This conversion is save because
> we know
> > -          // that everything thats representable in unsinged is also
> > -          // representable in double.
> > -          BlockInformation[F][BB] = (double)Counters[ReadCount++];
> > -    }
> > -    if (ReadCount != Counters.size()) {
> > -      errs() << "WARNING: profile information is inconsistent with "
> > -             << "the current program!\n";
> > -    }
> > -  }
> > -
> > -  FunctionInformation.clear();
> > -  Counters = PIL.getRawFunctionCounts();
> > -  if (Counters.size() > 0) {
> > -    ReadCount = 0;
> > -    for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) {
> > -      if (F->isDeclaration()) continue;
> > -      if (ReadCount < Counters.size())
> > -        // Here the data realm changes from the unsigned of the file to
> the
> > -        // double of the ProfileInfo. This conversion is save because
> we know
> > -        // that everything thats representable in unsinged is also
> > -        // representable in double.
> > -        FunctionInformation[F] = (double)Counters[ReadCount++];
> > -    }
> > -    if (ReadCount != Counters.size()) {
> > -      errs() << "WARNING: profile information is inconsistent with "
> > -             << "the current program!\n";
> > -    }
> > -  }
> > -
> > -  return false;
> > -}
> >
> > Removed: llvm/trunk/lib/Analysis/ProfileVerifierPass.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ProfileVerifierPass.cpp?rev=191834&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/lib/Analysis/ProfileVerifierPass.cpp (original)
> > +++ llvm/trunk/lib/Analysis/ProfileVerifierPass.cpp (removed)
> > @@ -1,383 +0,0 @@
> > -//===- ProfileVerifierPass.cpp - LLVM Pass to estimate profile info
> -------===//
> > -//
> > -//                     The LLVM Compiler Infrastructure
> > -//
> > -// This file is distributed under the University of Illinois Open Source
> > -// License. See LICENSE.TXT for details.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -//
> > -// This file implements a pass that checks profiling information for
> > -// plausibility.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -#define DEBUG_TYPE "profile-verifier"
> > -#include "llvm/Analysis/Passes.h"
> > -#include "llvm/Analysis/ProfileInfo.h"
> > -#include "llvm/IR/Instructions.h"
> > -#include "llvm/IR/Module.h"
> > -#include "llvm/Pass.h"
> > -#include "llvm/Support/CFG.h"
> > -#include "llvm/Support/CallSite.h"
> > -#include "llvm/Support/CommandLine.h"
> > -#include "llvm/Support/Debug.h"
> > -#include "llvm/Support/Format.h"
> > -#include "llvm/Support/InstIterator.h"
> > -#include "llvm/Support/raw_ostream.h"
> > -#include <set>
> > -using namespace llvm;
> > -
> > -static cl::opt<bool,false>
> > -ProfileVerifierDisableAssertions("profile-verifier-noassert",
> > -     cl::desc("Disable assertions"));
> > -
> > -namespace {
> > -  template<class FType, class BType>
> > -  class ProfileVerifierPassT : public FunctionPass {
> > -
> > -    struct DetailedBlockInfo {
> > -      const BType *BB;
> > -      double      BBWeight;
> > -      double      inWeight;
> > -      int         inCount;
> > -      double      outWeight;
> > -      int         outCount;
> > -    };
> > -
> > -    ProfileInfoT<FType, BType> *PI;
> > -    std::set<const BType*> BBisVisited;
> > -    std::set<const FType*>   FisVisited;
> > -    bool DisableAssertions;
> > -
> > -    // When debugging is enabled, the verifier prints a whole slew of
> debug
> > -    // information, otherwise its just the assert. These are all the
> helper
> > -    // functions.
> > -    bool PrintedDebugTree;
> > -    std::set<const BType*> BBisPrinted;
> > -    void debugEntry(DetailedBlockInfo*);
> > -    void printDebugInfo(const BType *BB);
> > -
> > -  public:
> > -    static char ID; // Class identification, replacement for typeinfo
> > -
> > -    explicit ProfileVerifierPassT () : FunctionPass(ID) {
> > -
>  initializeProfileVerifierPassPass(*PassRegistry::getPassRegistry());
> > -      DisableAssertions = ProfileVerifierDisableAssertions;
> > -    }
> > -    explicit ProfileVerifierPassT (bool da) : FunctionPass(ID),
> > -                                              DisableAssertions(da) {
> > -
>  initializeProfileVerifierPassPass(*PassRegistry::getPassRegistry());
> > -    }
> > -
> > -    void getAnalysisUsage(AnalysisUsage &AU) const {
> > -      AU.setPreservesAll();
> > -      AU.addRequired<ProfileInfoT<FType, BType> >();
> > -    }
> > -
> > -    const char *getPassName() const {
> > -      return "Profiling information verifier";
> > -    }
> > -
> > -    /// run - Verify the profile information.
> > -    bool runOnFunction(FType &F);
> > -    void recurseBasicBlock(const BType*);
> > -
> > -    bool   exitReachable(const FType*);
> > -    double ReadOrAssert(typename ProfileInfoT<FType, BType>::Edge);
> > -    void   CheckValue(bool, const char*, DetailedBlockInfo*);
> > -  };
> > -
> > -  typedef ProfileVerifierPassT<Function, BasicBlock>
> ProfileVerifierPass;
> > -
> > -  template<class FType, class BType>
> > -  void ProfileVerifierPassT<FType, BType>::printDebugInfo(const BType
> *BB) {
> > -
> > -    if (BBisPrinted.find(BB) != BBisPrinted.end()) return;
> > -
> > -    double BBWeight = PI->getExecutionCount(BB);
> > -    if (BBWeight == ProfileInfoT<FType, BType>::MissingValue) {
> BBWeight = 0; }
> > -    double inWeight = 0;
> > -    int inCount = 0;
> > -    std::set<const BType*> ProcessedPreds;
> > -    for (const_pred_iterator bbi = pred_begin(BB), bbe = pred_end(BB);
> > -         bbi != bbe; ++bbi ) {
> > -      if (ProcessedPreds.insert(*bbi).second) {
> > -        typename ProfileInfoT<FType, BType>::Edge E =
> PI->getEdge(*bbi,BB);
> > -        double EdgeWeight = PI->getEdgeWeight(E);
> > -        if (EdgeWeight == ProfileInfoT<FType, BType>::MissingValue) {
> EdgeWeight = 0; }
> > -        dbgs() << "calculated in-edge " << E << ": "
> > -               << format("%20.20g",EdgeWeight) << "\n";
> > -        inWeight += EdgeWeight;
> > -        inCount++;
> > -      }
> > -    }
> > -    double outWeight = 0;
> > -    int outCount = 0;
> > -    std::set<const BType*> ProcessedSuccs;
> > -    for ( succ_const_iterator bbi = succ_begin(BB), bbe = succ_end(BB);
> > -          bbi != bbe; ++bbi ) {
> > -      if (ProcessedSuccs.insert(*bbi).second) {
> > -        typename ProfileInfoT<FType, BType>::Edge E =
> PI->getEdge(BB,*bbi);
> > -        double EdgeWeight = PI->getEdgeWeight(E);
> > -        if (EdgeWeight == ProfileInfoT<FType, BType>::MissingValue) {
> EdgeWeight = 0; }
> > -        dbgs() << "calculated out-edge " << E << ": "
> > -               << format("%20.20g",EdgeWeight) << "\n";
> > -        outWeight += EdgeWeight;
> > -        outCount++;
> > -      }
> > -    }
> > -    dbgs() << "Block " << BB->getName()                   << " in "
> > -           << BB->getParent()->getName()                  << ":"
> > -           << "BBWeight="  << format("%20.20g",BBWeight)  << ","
> > -           << "inWeight="  << format("%20.20g",inWeight)  << ","
> > -           << "inCount="   << inCount                     << ","
> > -           << "outWeight=" << format("%20.20g",outWeight) << ","
> > -           << "outCount"   << outCount                    << "\n";
> > -
> > -    // mark as visited and recurse into subnodes
> > -    BBisPrinted.insert(BB);
> > -    for ( succ_const_iterator bbi = succ_begin(BB), bbe = succ_end(BB);
> > -          bbi != bbe; ++bbi ) {
> > -      printDebugInfo(*bbi);
> > -    }
> > -  }
> > -
> > -  template<class FType, class BType>
> > -  void ProfileVerifierPassT<FType, BType>::debugEntry
> (DetailedBlockInfo *DI) {
> > -    dbgs() << "TROUBLE: Block " << DI->BB->getName()          << " in "
> > -           << DI->BB->getParent()->getName()                  << ":"
> > -           << "BBWeight="  << format("%20.20g",DI->BBWeight)  << ","
> > -           << "inWeight="  << format("%20.20g",DI->inWeight)  << ","
> > -           << "inCount="   << DI->inCount                     << ","
> > -           << "outWeight=" << format("%20.20g",DI->outWeight) << ","
> > -           << "outCount="  << DI->outCount                    << "\n";
> > -    if (!PrintedDebugTree) {
> > -      PrintedDebugTree = true;
> > -      printDebugInfo(&(DI->BB->getParent()->getEntryBlock()));
> > -    }
> > -  }
> > -
> > -  // This compares A and B for equality.
> > -  static bool Equals(double A, double B) {
> > -    return A == B;
> > -  }
> > -
> > -  // This checks if the function "exit" is reachable from an given
> function
> > -  // via calls, this is necessary to check if a profile is valid
> despite the
> > -  // counts not fitting exactly.
> > -  template<class FType, class BType>
> > -  bool ProfileVerifierPassT<FType, BType>::exitReachable(const FType
> *F) {
> > -    if (!F) return false;
> > -
> > -    if (FisVisited.count(F)) return false;
> > -
> > -    FType *Exit = F->getParent()->getFunction("exit");
> > -    if (Exit == F) {
> > -      return true;
> > -    }
> > -
> > -    FisVisited.insert(F);
> > -    bool exits = false;
> > -    for (const_inst_iterator I = inst_begin(F), E = inst_end(F); I !=
> E; ++I) {
> > -      if (const CallInst *CI = dyn_cast<CallInst>(&*I)) {
> > -        FType *F = CI->getCalledFunction();
> > -        if (F) {
> > -          exits |= exitReachable(F);
> > -        } else {
> > -          // This is a call to a pointer, all bets are off...
> > -          exits = true;
> > -        }
> > -        if (exits) break;
> > -      }
> > -    }
> > -    return exits;
> > -  }
> > -
> > -  #define ASSERTMESSAGE(M) \
> > -    { dbgs() << "ASSERT:" << (M) << "\n"; \
> > -      if (!DisableAssertions) assert(0 && (M)); }
> > -
> > -  template<class FType, class BType>
> > -  double ProfileVerifierPassT<FType, BType>::ReadOrAssert(typename
> ProfileInfoT<FType, BType>::Edge E) {
> > -    double EdgeWeight = PI->getEdgeWeight(E);
> > -    if (EdgeWeight == ProfileInfoT<FType, BType>::MissingValue) {
> > -      dbgs() << "Edge " << E << " in Function "
> > -             << ProfileInfoT<FType, BType>::getFunction(E)->getName()
> << ": ";
> > -      ASSERTMESSAGE("Edge has missing value");
> > -      return 0;
> > -    } else {
> > -      if (EdgeWeight < 0) {
> > -        dbgs() << "Edge " << E << " in Function "
> > -               << ProfileInfoT<FType, BType>::getFunction(E)->getName()
> << ": ";
> > -        ASSERTMESSAGE("Edge has negative value");
> > -      }
> > -      return EdgeWeight;
> > -    }
> > -  }
> > -
> > -  template<class FType, class BType>
> > -  void ProfileVerifierPassT<FType, BType>::CheckValue(bool Error,
> > -                                                      const char
> *Message,
> > -                                                      DetailedBlockInfo
> *DI) {
> > -    if (Error) {
> > -      DEBUG(debugEntry(DI));
> > -      dbgs() << "Block " << DI->BB->getName() << " in Function "
> > -             << DI->BB->getParent()->getName() << ": ";
> > -      ASSERTMESSAGE(Message);
> > -    }
> > -    return;
> > -  }
> > -
> > -  // This calculates the Information for a block and then recurses into
> the
> > -  // successors.
> > -  template<class FType, class BType>
> > -  void ProfileVerifierPassT<FType, BType>::recurseBasicBlock(const
> BType *BB) {
> > -
> > -    // Break the recursion by remembering all visited blocks.
> > -    if (BBisVisited.find(BB) != BBisVisited.end()) return;
> > -
> > -    // Use a data structure to store all the information, this can then
> be handed
> > -    // to debug printers.
> > -    DetailedBlockInfo DI;
> > -    DI.BB = BB;
> > -    DI.outCount = DI.inCount = 0;
> > -    DI.inWeight = DI.outWeight = 0;
> > -
> > -    // Read predecessors.
> > -    std::set<const BType*> ProcessedPreds;
> > -    const_pred_iterator bpi = pred_begin(BB), bpe = pred_end(BB);
> > -    // If there are none, check for (0,BB) edge.
> > -    if (bpi == bpe) {
> > -      DI.inWeight += ReadOrAssert(PI->getEdge(0,BB));
> > -      DI.inCount++;
> > -    }
> > -    for (;bpi != bpe; ++bpi) {
> > -      if (ProcessedPreds.insert(*bpi).second) {
> > -        DI.inWeight += ReadOrAssert(PI->getEdge(*bpi,BB));
> > -        DI.inCount++;
> > -      }
> > -    }
> > -
> > -    // Read successors.
> > -    std::set<const BType*> ProcessedSuccs;
> > -    succ_const_iterator bbi = succ_begin(BB), bbe = succ_end(BB);
> > -    // If there is an (0,BB) edge, consider it too. (This is done not
> only when
> > -    // there are no successors, but every time; not every function
> contains
> > -    // return blocks with no successors (think loop latch as return
> block)).
> > -    double w = PI->getEdgeWeight(PI->getEdge(BB,0));
> > -    if (w != ProfileInfoT<FType, BType>::MissingValue) {
> > -      DI.outWeight += w;
> > -      DI.outCount++;
> > -    }
> > -    for (;bbi != bbe; ++bbi) {
> > -      if (ProcessedSuccs.insert(*bbi).second) {
> > -        DI.outWeight += ReadOrAssert(PI->getEdge(BB,*bbi));
> > -        DI.outCount++;
> > -      }
> > -    }
> > -
> > -    // Read block weight.
> > -    DI.BBWeight = PI->getExecutionCount(BB);
> > -    CheckValue(DI.BBWeight == ProfileInfoT<FType, BType>::MissingValue,
> > -               "BasicBlock has missing value", &DI);
> > -    CheckValue(DI.BBWeight < 0,
> > -               "BasicBlock has negative value", &DI);
> > -
> > -    // Check if this block is a setjmp target.
> > -    bool isSetJmpTarget = false;
> > -    if (DI.outWeight > DI.inWeight) {
> > -      for (typename BType::const_iterator i = BB->begin(), ie =
> BB->end();
> > -           i != ie; ++i) {
> > -        if (const CallInst *CI = dyn_cast<CallInst>(&*i)) {
> > -          FType *F = CI->getCalledFunction();
> > -          if (F && (F->getName() == "_setjmp")) {
> > -            isSetJmpTarget = true; break;
> > -          }
> > -        }
> > -      }
> > -    }
> > -    // Check if this block is eventually reaching exit.
> > -    bool isExitReachable = false;
> > -    if (DI.inWeight > DI.outWeight) {
> > -      for (typename BType::const_iterator i = BB->begin(), ie =
> BB->end();
> > -           i != ie; ++i) {
> > -        if (const CallInst *CI = dyn_cast<CallInst>(&*i)) {
> > -          FType *F = CI->getCalledFunction();
> > -          if (F) {
> > -            FisVisited.clear();
> > -            isExitReachable |= exitReachable(F);
> > -          } else {
> > -            // This is a call to a pointer, all bets are off...
> > -            isExitReachable = true;
> > -          }
> > -          if (isExitReachable) break;
> > -        }
> > -      }
> > -    }
> > -
> > -    if (DI.inCount > 0 && DI.outCount == 0) {
> > -       // If this is a block with no successors.
> > -      if (!isSetJmpTarget) {
> > -        CheckValue(!Equals(DI.inWeight,DI.BBWeight),
> > -                   "inWeight and BBWeight do not match", &DI);
> > -      }
> > -    } else if (DI.inCount == 0 && DI.outCount > 0) {
> > -      // If this is a block with no predecessors.
> > -      if (!isExitReachable)
> > -        CheckValue(!Equals(DI.BBWeight,DI.outWeight),
> > -                   "BBWeight and outWeight do not match", &DI);
> > -    } else {
> > -      // If this block has successors and predecessors.
> > -      if (DI.inWeight > DI.outWeight && !isExitReachable)
> > -        CheckValue(!Equals(DI.inWeight,DI.outWeight),
> > -                   "inWeight and outWeight do not match", &DI);
> > -      if (DI.inWeight < DI.outWeight && !isSetJmpTarget)
> > -        CheckValue(!Equals(DI.inWeight,DI.outWeight),
> > -                   "inWeight and outWeight do not match", &DI);
> > -    }
> > -
> > -
> > -    // Mark this block as visited, rescurse into successors.
> > -    BBisVisited.insert(BB);
> > -    for ( succ_const_iterator bbi = succ_begin(BB), bbe = succ_end(BB);
> > -          bbi != bbe; ++bbi ) {
> > -      recurseBasicBlock(*bbi);
> > -    }
> > -  }
> > -
> > -  template<class FType, class BType>
> > -  bool ProfileVerifierPassT<FType, BType>::runOnFunction(FType &F) {
> > -    PI = getAnalysisIfAvailable<ProfileInfoT<FType, BType> >();
> > -    if (!PI)
> > -      ASSERTMESSAGE("No ProfileInfo available");
> > -
> > -    // Prepare global variables.
> > -    PrintedDebugTree = false;
> > -    BBisVisited.clear();
> > -
> > -    // Fetch entry block and recurse into it.
> > -    const BType *entry = &F.getEntryBlock();
> > -    recurseBasicBlock(entry);
> > -
> > -    if (PI->getExecutionCount(&F) != PI->getExecutionCount(entry))
> > -      ASSERTMESSAGE("Function count and entry block count do not
> match");
> > -
> > -    return false;
> > -  }
> > -
> > -  template<class FType, class BType>
> > -  char ProfileVerifierPassT<FType, BType>::ID = 0;
> > -}
> > -
> > -INITIALIZE_PASS_BEGIN(ProfileVerifierPass, "profile-verifier",
> > -                "Verify profiling information", false, true)
> > -INITIALIZE_AG_DEPENDENCY(ProfileInfo)
> > -INITIALIZE_PASS_END(ProfileVerifierPass, "profile-verifier",
> > -                "Verify profiling information", false, true)
> > -
> > -namespace llvm {
> > -  FunctionPass *createProfileVerifierPass() {
> > -    return new ProfileVerifierPass(ProfileVerifierDisableAssertions);
> > -  }
> > -}
> > -
> >
> > Modified: llvm/trunk/lib/CodeGen/UnreachableBlockElim.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/UnreachableBlockElim.cpp?rev=191835&r1=191834&r2=191835&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/CodeGen/UnreachableBlockElim.cpp (original)
> > +++ llvm/trunk/lib/CodeGen/UnreachableBlockElim.cpp Wed Oct  2 10:42:23
> 2013
> > @@ -24,7 +24,6 @@
> >  #include "llvm/ADT/DepthFirstIterator.h"
> >  #include "llvm/ADT/SmallPtrSet.h"
> >  #include "llvm/Analysis/Dominators.h"
> > -#include "llvm/Analysis/ProfileInfo.h"
> >  #include "llvm/CodeGen/MachineDominators.h"
> >  #include "llvm/CodeGen/MachineFunctionPass.h"
> >  #include "llvm/CodeGen/MachineLoopInfo.h"
> > @@ -50,7 +49,6 @@ namespace {
> >
> >      virtual void getAnalysisUsage(AnalysisUsage &AU) const {
> >        AU.addPreserved<DominatorTree>();
> > -      AU.addPreserved<ProfileInfo>();
> >      }
> >    };
> >  }
> > @@ -87,9 +85,7 @@ bool UnreachableBlockElim::runOnFunction
> >      }
> >
> >    // Actually remove the blocks now.
> > -  ProfileInfo *PI = getAnalysisIfAvailable<ProfileInfo>();
> >    for (unsigned i = 0, e = DeadBlocks.size(); i != e; ++i) {
> > -    if (PI) PI->removeBlock(DeadBlocks[i]);
> >      DeadBlocks[i]->eraseFromParent();
> >    }
> >
> >
> > Modified: llvm/trunk/lib/Transforms/Instrumentation/CMakeLists.txt
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/CMakeLists.txt?rev=191835&r1=191834&r2=191835&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/Transforms/Instrumentation/CMakeLists.txt (original)
> > +++ llvm/trunk/lib/Transforms/Instrumentation/CMakeLists.txt Wed Oct  2
> 10:42:23 2013
> > @@ -3,12 +3,9 @@ add_llvm_library(LLVMInstrumentation
> >    BoundsChecking.cpp
> >    DataFlowSanitizer.cpp
> >    DebugIR.cpp
> > -  EdgeProfiling.cpp
> >    GCOVProfiling.cpp
> >    MemorySanitizer.cpp
> >    Instrumentation.cpp
> > -  OptimalEdgeProfiling.cpp
> > -  PathProfiling.cpp
> >    ProfilingUtils.cpp
> >    ThreadSanitizer.cpp
> >    )
> >
> > Removed: llvm/trunk/lib/Transforms/Instrumentation/EdgeProfiling.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/EdgeProfiling.cpp?rev=191834&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/lib/Transforms/Instrumentation/EdgeProfiling.cpp
> (original)
> > +++ llvm/trunk/lib/Transforms/Instrumentation/EdgeProfiling.cpp (removed)
> > @@ -1,117 +0,0 @@
> > -//===- EdgeProfiling.cpp - Insert counters for edge profiling
> -------------===//
> > -//
> > -//                      The LLVM Compiler Infrastructure
> > -//
> > -// This file is distributed under the University of Illinois Open Source
> > -// License. See LICENSE.TXT for details.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -//
> > -// This pass instruments the specified program with counters for edge
> profiling.
> > -// Edge profiling can give a reasonable approximation of the hot paths
> through a
> > -// program, and is used for a wide variety of program transformations.
> > -//
> > -// Note that this implementation is very naive.  We insert a counter
> for *every*
> > -// edge in the program, instead of using control flow information to
> prune the
> > -// number of counters inserted.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -#define DEBUG_TYPE "insert-edge-profiling"
> > -
> > -#include "llvm/Transforms/Instrumentation.h"
> > -#include "ProfilingUtils.h"
> > -#include "llvm/ADT/Statistic.h"
> > -#include "llvm/IR/Module.h"
> > -#include "llvm/Pass.h"
> > -#include "llvm/Support/raw_ostream.h"
> > -#include "llvm/Transforms/Utils/BasicBlockUtils.h"
> > -#include <set>
> > -using namespace llvm;
> > -
> > -STATISTIC(NumEdgesInserted, "The # of edges inserted.");
> > -
> > -namespace {
> > -  class EdgeProfiler : public ModulePass {
> > -    bool runOnModule(Module &M);
> > -  public:
> > -    static char ID; // Pass identification, replacement for typeid
> > -    EdgeProfiler() : ModulePass(ID) {
> > -      initializeEdgeProfilerPass(*PassRegistry::getPassRegistry());
> > -    }
> > -
> > -    virtual const char *getPassName() const {
> > -      return "Edge Profiler";
> > -    }
> > -  };
> > -}
> > -
> > -char EdgeProfiler::ID = 0;
> > -INITIALIZE_PASS(EdgeProfiler, "insert-edge-profiling",
> > -                "Insert instrumentation for edge profiling", false,
> false)
> > -
> > -ModulePass *llvm::createEdgeProfilerPass() { return new EdgeProfiler();
> }
> > -
> > -bool EdgeProfiler::runOnModule(Module &M) {
> > -  Function *Main = M.getFunction("main");
> > -  if (Main == 0) {
> > -    errs() << "WARNING: cannot insert edge profiling into a module"
> > -           << " with no main function!\n";
> > -    return false;  // No main, no instrumentation!
> > -  }
> > -
> > -  std::set<BasicBlock*> BlocksToInstrument;
> > -  unsigned NumEdges = 0;
> > -  for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) {
> > -    if (F->isDeclaration()) continue;
> > -    // Reserve space for (0,entry) edge.
> > -    ++NumEdges;
> > -    for (Function::iterator BB = F->begin(), E = F->end(); BB != E;
> ++BB) {
> > -      // Keep track of which blocks need to be instrumented.  We don't
> want to
> > -      // instrument blocks that are added as the result of breaking
> critical
> > -      // edges!
> > -      BlocksToInstrument.insert(BB);
> > -      NumEdges += BB->getTerminator()->getNumSuccessors();
> > -    }
> > -  }
> > -
> > -  Type *ATy = ArrayType::get(Type::getInt32Ty(M.getContext()),
> NumEdges);
> > -  GlobalVariable *Counters =
> > -    new GlobalVariable(M, ATy, false, GlobalValue::InternalLinkage,
> > -                       Constant::getNullValue(ATy), "EdgeProfCounters");
> > -  NumEdgesInserted = NumEdges;
> > -
> > -  // Instrument all of the edges...
> > -  unsigned i = 0;
> > -  for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) {
> > -    if (F->isDeclaration()) continue;
> > -    // Create counter for (0,entry) edge.
> > -    IncrementCounterInBlock(&F->getEntryBlock(), i++, Counters);
> > -    for (Function::iterator BB = F->begin(), E = F->end(); BB != E;
> ++BB)
> > -      if (BlocksToInstrument.count(BB)) {  // Don't instrument inserted
> blocks
> > -        // Okay, we have to add a counter of each outgoing edge.  If the
> > -        // outgoing edge is not critical don't split it, just insert
> the counter
> > -        // in the source or destination of the edge.
> > -        TerminatorInst *TI = BB->getTerminator();
> > -        for (unsigned s = 0, e = TI->getNumSuccessors(); s != e; ++s) {
> > -          // If the edge is critical, split it.
> > -          SplitCriticalEdge(TI, s, this);
> > -
> > -          // Okay, we are guaranteed that the edge is no longer
> critical.  If we
> > -          // only have a single successor, insert the counter in this
> block,
> > -          // otherwise insert it in the successor block.
> > -          if (TI->getNumSuccessors() == 1) {
> > -            // Insert counter at the start of the block
> > -            IncrementCounterInBlock(BB, i++, Counters, false);
> > -          } else {
> > -            // Insert counter at the start of the block
> > -            IncrementCounterInBlock(TI->getSuccessor(s), i++, Counters);
> > -          }
> > -        }
> > -      }
> > -  }
> > -
> > -  // Add the initialization call to main.
> > -  InsertProfilingInitCall(Main, "llvm_start_edge_profiling", Counters);
> > -  return true;
> > -}
> > -
> >
> > Modified: llvm/trunk/lib/Transforms/Instrumentation/Instrumentation.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/Instrumentation.cpp?rev=191835&r1=191834&r2=191835&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/Transforms/Instrumentation/Instrumentation.cpp
> (original)
> > +++ llvm/trunk/lib/Transforms/Instrumentation/Instrumentation.cpp Wed
> Oct  2 10:42:23 2013
> > @@ -24,10 +24,7 @@ void llvm::initializeInstrumentation(Pas
> >    initializeAddressSanitizerPass(Registry);
> >    initializeAddressSanitizerModulePass(Registry);
> >    initializeBoundsCheckingPass(Registry);
> > -  initializeEdgeProfilerPass(Registry);
> >    initializeGCOVProfilerPass(Registry);
> > -  initializeOptimalEdgeProfilerPass(Registry);
> > -  initializePathProfilerPass(Registry);
> >    initializeMemorySanitizerPass(Registry);
> >    initializeThreadSanitizerPass(Registry);
> >    initializeDataFlowSanitizerPass(Registry);
> >
> > Removed:
> llvm/trunk/lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp?rev=191834&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp
> (original)
> > +++ llvm/trunk/lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp
> (removed)
> > @@ -1,225 +0,0 @@
> > -//===- OptimalEdgeProfiling.cpp - Insert counters for opt. edge
> profiling -===//
> > -//
> > -//                      The LLVM Compiler Infrastructure
> > -//
> > -// This file is distributed under the University of Illinois Open Source
> > -// License. See LICENSE.TXT for details.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -//
> > -// This pass instruments the specified program with counters for edge
> profiling.
> > -// Edge profiling can give a reasonable approximation of the hot paths
> through a
> > -// program, and is used for a wide variety of program transformations.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -#define DEBUG_TYPE "insert-optimal-edge-profiling"
> > -#include "llvm/Transforms/Instrumentation.h"
> > -#include "MaximumSpanningTree.h"
> > -#include "ProfilingUtils.h"
> > -#include "llvm/ADT/DenseSet.h"
> > -#include "llvm/ADT/Statistic.h"
> > -#include "llvm/Analysis/Passes.h"
> > -#include "llvm/Analysis/ProfileInfo.h"
> > -#include "llvm/Analysis/ProfileInfoLoader.h"
> > -#include "llvm/IR/Constants.h"
> > -#include "llvm/IR/Module.h"
> > -#include "llvm/Pass.h"
> > -#include "llvm/Support/Debug.h"
> > -#include "llvm/Support/raw_ostream.h"
> > -#include "llvm/Transforms/Utils/BasicBlockUtils.h"
> > -using namespace llvm;
> > -
> > -STATISTIC(NumEdgesInserted, "The # of edges inserted.");
> > -
> > -namespace {
> > -  class OptimalEdgeProfiler : public ModulePass {
> > -    bool runOnModule(Module &M);
> > -  public:
> > -    static char ID; // Pass identification, replacement for typeid
> > -    OptimalEdgeProfiler() : ModulePass(ID) {
> > -
>  initializeOptimalEdgeProfilerPass(*PassRegistry::getPassRegistry());
> > -    }
> > -
> > -    void getAnalysisUsage(AnalysisUsage &AU) const {
> > -      AU.addRequiredID(ProfileEstimatorPassID);
> > -      AU.addRequired<ProfileInfo>();
> > -    }
> > -
> > -    virtual const char *getPassName() const {
> > -      return "Optimal Edge Profiler";
> > -    }
> > -  };
> > -}
> > -
> > -char OptimalEdgeProfiler::ID = 0;
> > -INITIALIZE_PASS_BEGIN(OptimalEdgeProfiler,
> "insert-optimal-edge-profiling",
> > -                "Insert optimal instrumentation for edge profiling",
> > -                false, false)
> > -INITIALIZE_PASS_DEPENDENCY(ProfileEstimatorPass)
> > -INITIALIZE_AG_DEPENDENCY(ProfileInfo)
> > -INITIALIZE_PASS_END(OptimalEdgeProfiler,
> "insert-optimal-edge-profiling",
> > -                "Insert optimal instrumentation for edge profiling",
> > -                false, false)
> > -
> > -ModulePass *llvm::createOptimalEdgeProfilerPass() {
> > -  return new OptimalEdgeProfiler();
> > -}
> > -
> > -inline static void printEdgeCounter(ProfileInfo::Edge e,
> > -                                    BasicBlock* b,
> > -                                    unsigned i) {
> > -  DEBUG(dbgs() << "--Edge Counter for " << (e) << " in " \
> > -               << ((b)?(b)->getName():"0") << " (# " << (i) << ")\n");
> > -}
> > -
> > -bool OptimalEdgeProfiler::runOnModule(Module &M) {
> > -  Function *Main = M.getFunction("main");
> > -  if (Main == 0) {
> > -    errs() << "WARNING: cannot insert edge profiling into a module"
> > -           << " with no main function!\n";
> > -    return false;  // No main, no instrumentation!
> > -  }
> > -
> > -  // NumEdges counts all the edges that may be instrumented. Later on
> its
> > -  // decided which edges to actually instrument, to achieve optimal
> profiling.
> > -  // For the entry block a virtual edge (0,entry) is reserved, for each
> block
> > -  // with no successors an edge (BB,0) is reserved. These edges are
> necessary
> > -  // to calculate a truly optimal maximum spanning tree and thus an
> optimal
> > -  // instrumentation.
> > -  unsigned NumEdges = 0;
> > -
> > -  for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) {
> > -    if (F->isDeclaration()) continue;
> > -    // Reserve space for (0,entry) edge.
> > -    ++NumEdges;
> > -    for (Function::iterator BB = F->begin(), E = F->end(); BB != E;
> ++BB) {
> > -      // Keep track of which blocks need to be instrumented.  We don't
> want to
> > -      // instrument blocks that are added as the result of breaking
> critical
> > -      // edges!
> > -      if (BB->getTerminator()->getNumSuccessors() == 0) {
> > -        // Reserve space for (BB,0) edge.
> > -        ++NumEdges;
> > -      } else {
> > -        NumEdges += BB->getTerminator()->getNumSuccessors();
> > -      }
> > -    }
> > -  }
> > -
> > -  // In the profiling output a counter for each edge is reserved, but
> only few
> > -  // are used. This is done to be able to read back in the profile
> without
> > -  // calulating the maximum spanning tree again, instead each edge
> counter that
> > -  // is not used is initialised with -1 to signal that this edge
> counter has to
> > -  // be calculated from other edge counters on reading the profile info
> back
> > -  // in.
> > -
> > -  Type *Int32 = Type::getInt32Ty(M.getContext());
> > -  ArrayType *ATy = ArrayType::get(Int32, NumEdges);
> > -  GlobalVariable *Counters =
> > -    new GlobalVariable(M, ATy, false, GlobalValue::InternalLinkage,
> > -                       Constant::getNullValue(ATy),
> "OptEdgeProfCounters");
> > -  NumEdgesInserted = 0;
> > -
> > -  std::vector<Constant*> Initializer(NumEdges);
> > -  Constant *Zero = ConstantInt::get(Int32, 0);
> > -  Constant *Uncounted = ConstantInt::get(Int32,
> ProfileInfoLoader::Uncounted);
> > -
> > -  // Instrument all of the edges not in MST...
> > -  unsigned i = 0;
> > -  for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) {
> > -    if (F->isDeclaration()) continue;
> > -    DEBUG(dbgs() << "Working on " << F->getName() << "\n");
> > -
> > -    // Calculate a Maximum Spanning Tree with the edge weights
> determined by
> > -    // ProfileEstimator. ProfileEstimator also assign weights to the
> virtual
> > -    // edges (0,entry) and (BB,0) (for blocks with no successors) and
> this
> > -    // edges also participate in the maximum spanning tree calculation.
> > -    // The third parameter of MaximumSpanningTree() has the effect that
> not the
> > -    // actual MST is returned but the edges _not_ in the MST.
> > -
> > -    ProfileInfo::EdgeWeights ECs =
> > -      getAnalysis<ProfileInfo>(*F).getEdgeWeights(F);
> > -    std::vector<ProfileInfo::EdgeWeight> EdgeVector(ECs.begin(),
> ECs.end());
> > -    MaximumSpanningTree<BasicBlock> MST(EdgeVector);
> > -    std::stable_sort(MST.begin(), MST.end());
> > -
> > -    // Check if (0,entry) not in the MST. If not, instrument edge
> > -    // (IncrementCounterInBlock()) and set the counter initially to
> zero, if
> > -    // the edge is in the MST the counter is initialised to -1.
> > -
> > -    BasicBlock *entry = &(F->getEntryBlock());
> > -    ProfileInfo::Edge edge = ProfileInfo::getEdge(0, entry);
> > -    if (!std::binary_search(MST.begin(), MST.end(), edge)) {
> > -      printEdgeCounter(edge, entry, i);
> > -      IncrementCounterInBlock(entry, i, Counters); ++NumEdgesInserted;
> > -      Initializer[i++] = (Zero);
> > -    } else{
> > -      Initializer[i++] = (Uncounted);
> > -    }
> > -
> > -    // InsertedBlocks contains all blocks that were inserted for
> splitting an
> > -    // edge, this blocks do not have to be instrumented.
> > -    DenseSet<BasicBlock*> InsertedBlocks;
> > -    for (Function::iterator BB = F->begin(), E = F->end(); BB != E;
> ++BB) {
> > -      // Check if block was not inserted and thus does not have to be
> > -      // instrumented.
> > -      if (InsertedBlocks.count(BB)) continue;
> > -
> > -      // Okay, we have to add a counter of each outgoing edge not in
> MST. If
> > -      // the outgoing edge is not critical don't split it, just insert
> the
> > -      // counter in the source or destination of the edge. Also, if the
> block
> > -      // has no successors, the virtual edge (BB,0) is processed.
> > -      TerminatorInst *TI = BB->getTerminator();
> > -      if (TI->getNumSuccessors() == 0) {
> > -        ProfileInfo::Edge edge = ProfileInfo::getEdge(BB, 0);
> > -        if (!std::binary_search(MST.begin(), MST.end(), edge)) {
> > -          printEdgeCounter(edge, BB, i);
> > -          IncrementCounterInBlock(BB, i, Counters); ++NumEdgesInserted;
> > -          Initializer[i++] = (Zero);
> > -        } else{
> > -          Initializer[i++] = (Uncounted);
> > -        }
> > -      }
> > -      for (unsigned s = 0, e = TI->getNumSuccessors(); s != e; ++s) {
> > -        BasicBlock *Succ = TI->getSuccessor(s);
> > -        ProfileInfo::Edge edge = ProfileInfo::getEdge(BB,Succ);
> > -        if (!std::binary_search(MST.begin(), MST.end(), edge)) {
> > -
> > -          // If the edge is critical, split it.
> > -          bool wasInserted = SplitCriticalEdge(TI, s, this);
> > -          Succ = TI->getSuccessor(s);
> > -          if (wasInserted)
> > -            InsertedBlocks.insert(Succ);
> > -
> > -          // Okay, we are guaranteed that the edge is no longer
> critical.  If
> > -          // we only have a single successor, insert the counter in
> this block,
> > -          // otherwise insert it in the successor block.
> > -          if (TI->getNumSuccessors() == 1) {
> > -            // Insert counter at the start of the block
> > -            printEdgeCounter(edge, BB, i);
> > -            IncrementCounterInBlock(BB, i, Counters);
> ++NumEdgesInserted;
> > -          } else {
> > -            // Insert counter at the start of the block
> > -            printEdgeCounter(edge, Succ, i);
> > -            IncrementCounterInBlock(Succ, i, Counters);
> ++NumEdgesInserted;
> > -          }
> > -          Initializer[i++] = (Zero);
> > -        } else {
> > -          Initializer[i++] = (Uncounted);
> > -        }
> > -      }
> > -    }
> > -  }
> > -
> > -  // Check if the number of edges counted at first was the number of
> edges we
> > -  // considered for instrumentation.
> > -  assert(i == NumEdges && "the number of edges in counting array is
> wrong");
> > -
> > -  // Assign the now completely defined initialiser to the array.
> > -  Constant *init = ConstantArray::get(ATy, Initializer);
> > -  Counters->setInitializer(init);
> > -
> > -  // Add the initialization call to main.
> > -  InsertProfilingInitCall(Main, "llvm_start_opt_edge_profiling",
> Counters);
> > -  return true;
> > -}
> > -
> >
> > Removed: llvm/trunk/lib/Transforms/Instrumentation/PathProfiling.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/PathProfiling.cpp?rev=191834&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/lib/Transforms/Instrumentation/PathProfiling.cpp
> (original)
> > +++ llvm/trunk/lib/Transforms/Instrumentation/PathProfiling.cpp (removed)
> > @@ -1,1424 +0,0 @@
> > -//===- PathProfiling.cpp - Inserts counters for path profiling
> ------------===//
> > -//
> > -//                      The LLVM Compiler Infrastructure
> > -//
> > -// This file is distributed under the University of Illinois Open Source
> > -// License. See LICENSE.TXT for details.
> > -//
> >
> -//===----------------------------------------------------------------------===//
> > -//
> > -// This pass instruments functions for Ball-Larus path profiling.
>  Ball-Larus
> > -// profiling converts the CFG into a DAG by replacing backedges with
> edges
> > -// from entry to the start block and from the end block to exit.  The
> paths
> > -// along the new DAG are enumrated, i.e. each path is given a path
> number.
> > -// Edges are instrumented to increment the path number register, such
> that the
> > -// path number register will equal the path number of the path taken at
> the
> > -// exit.
> > -//
> > -// This file defines classes for building a CFG for use with different
> stages
> > -// in the Ball-Larus path profiling instrumentation [Ball96].  The
> > -// requirements are formatting the llvm CFG into the Ball-Larus DAG,
> path
> > -// numbering, finding a spanning tree, moving increments from the
> spanning
> > -// tree to chords.
> > -//
> > -// Terms:
> > -// DAG            - Directed Acyclic Graph.
> > -// Ball-Larus DAG - A CFG with an entry node, an exit node, and
> backedges
> > -//                  removed in the following manner.  For every backedge
> > -//                  v->w, insert edge ENTRY->w and edge v->EXIT.
> > -// Path Number    - The number corresponding to a specific path through
> a
> > -//                  Ball-Larus DAG.
> > -// Spanning Tree  - A subgraph, S, is a spanning tree if S covers all
> > -//                  vertices and is a tree.
> > -// Chord          - An edge not in the spanning tree.
> > -//
> > -// [Ball96]
> > -//  T. Ball and J. R. Larus. "Efficient Path Profiling."
> > -//  International Symposium on Microarchitecture, pages 46-57, 1996.
> > -//  http://portal.acm.org/citation.cfm?id=243857
> > -//
> > -// [Ball94]
> > -//  Thomas Ball.  "Efficiently Counting Program Events with Support for
> > -//  On-line queries."
> > -//  ACM Transactions on Programmmg Languages and Systems, Vol 16, No 5,
> > -//  September 1994, Pages 1399-1410.
> >
> -//===----------------------------------------------------------------------===//
> > -#define DEBUG_TYPE "insert-path-profiling"
> > -
> > -#include "llvm/Transforms/Instrumentation.h"
> > -#include "ProfilingUtils.h"
> > -#include "llvm/Analysis/PathNumbering.h"
> > -#include "llvm/IR/Constants.h"
> > -#include "llvm/IR/DerivedTypes.h"
> > -#include "llvm/IR/InstrTypes.h"
> > -#include "llvm/IR/Instructions.h"
> > -#include "llvm/IR/LLVMContext.h"
> > -#include "llvm/IR/Module.h"
> > -#include "llvm/IR/TypeBuilder.h"
> > -#include "llvm/Pass.h"
> > -#include "llvm/Support/CFG.h"
> > -#include "llvm/Support/CommandLine.h"
> > -#include "llvm/Support/Compiler.h"
> > -#include "llvm/Support/Debug.h"
> > -#include "llvm/Support/raw_ostream.h"
> > -#include "llvm/Transforms/Utils/BasicBlockUtils.h"
> > -#include <vector>
> > -
> > -#define HASH_THRESHHOLD 100000
> > -
> > -using namespace llvm;
> > -
> > -namespace {
> > -class BLInstrumentationNode;
> > -class BLInstrumentationEdge;
> > -class BLInstrumentationDag;
> > -
> > -//
> ---------------------------------------------------------------------------
> > -// BLInstrumentationNode extends BallLarusNode with member used by the
> > -// instrumentation algortihms.
> > -//
> ---------------------------------------------------------------------------
> > -class BLInstrumentationNode : public BallLarusNode {
> > -public:
> > -  // Creates a new BLInstrumentationNode from a BasicBlock.
> > -  BLInstrumentationNode(BasicBlock* BB);
> > -
> > -  // Get/sets the Value corresponding to the pathNumber register,
> > -  // constant or phinode.  Used by the instrumentation code to remember
> > -  // path number Values.
> > -  Value* getStartingPathNumber();
> > -  void setStartingPathNumber(Value* pathNumber);
> > -
> > -  Value* getEndingPathNumber();
> > -  void setEndingPathNumber(Value* pathNumber);
> > -
> > -  // Get/set the PHINode Instruction for this node.
> > -  PHINode* getPathPHI();
> > -  void setPathPHI(PHINode* pathPHI);
> > -
> > -private:
> > -
> > -  Value* _startingPathNumber; // The Value for the current pathNumber.
> > -  Value* _endingPathNumber; // The Value for the current pathNumber.
> > -  PHINode* _pathPHI; // The PHINode for current pathNumber.
> > -};
> > -
> > -//
> --------------------------------------------------------------------------
> > -// BLInstrumentationEdge extends BallLarusEdge with data about the
> > -// instrumentation that will end up on each edge.
> > -//
> --------------------------------------------------------------------------
> > -class BLInstrumentationEdge : public BallLarusEdge {
> > -public:
> > -  BLInstrumentationEdge(BLInstrumentationNode* source,
> > -                        BLInstrumentationNode* target);
> > -
> > -  // Sets the target node of this edge.  Required to split edges.
> > -  void setTarget(BallLarusNode* node);
> > -
> > -  // Get/set whether edge is in the spanning tree.
> > -  bool isInSpanningTree() const;
> > -  void setIsInSpanningTree(bool isInSpanningTree);
> > -
> > -  // Get/ set whether this edge will be instrumented with a path number
> > -  // initialization.
> > -  bool isInitialization() const;
> > -  void setIsInitialization(bool isInitialization);
> > -
> > -  // Get/set whether this edge will be instrumented with a path counter
> > -  // increment.  Notice this is incrementing the path counter
> > -  // corresponding to the path number register.  The path number
> > -  // increment is determined by getIncrement().
> > -  bool isCounterIncrement() const;
> > -  void setIsCounterIncrement(bool isCounterIncrement);
> > -
> > -  // Get/set the path number increment that this edge will be
> instrumented
> > -  // with.  This is distinct from the path counter increment and the
> > -  // weight.  The counter increment counts the number of executions of
> > -  // some path, whereas the path number keeps track of which path number
> > -  // the program is on.
> > -  long getIncrement() const;
> > -  void setIncrement(long increment);
> > -
> > -  // Get/set whether the edge has been instrumented.
> > -  bool hasInstrumentation();
> > -  void setHasInstrumentation(bool hasInstrumentation);
> > -
> > -  // Returns the successor number of this edge in the source.
> > -  unsigned getSuccessorNumber();
> > -
> > -private:
> > -  // The increment that the code will be instrumented with.
> > -  long long _increment;
> > -
> > -  // Whether this edge is in the spanning tree.
> > -  bool _isInSpanningTree;
> > -
> > -  // Whether this edge is an initialiation of the path number.
> > -  bool _isInitialization;
> > -
> > -  // Whether this edge is a path counter increment.
> > -  bool _isCounterIncrement;
> > -
> > -  // Whether this edge has been instrumented.
> > -  bool _hasInstrumentation;
> > -};
> > -
> > -//
> ---------------------------------------------------------------------------
> > -// BLInstrumentationDag extends BallLarusDag with algorithms that
> > -// determine where instrumentation should be placed.
> > -//
> ---------------------------------------------------------------------------
> > -class BLInstrumentationDag : public BallLarusDag {
> > -public:
> > -  BLInstrumentationDag(Function &F);
> > -
> > -  // Returns the Exit->Root edge. This edge is required for creating
> > -  // directed cycles in the algorithm for moving instrumentation off of
> > -  // the spanning tree
> > -  BallLarusEdge* getExitRootEdge();
> > -
> > -  // Returns an array of phony edges which mark those nodes
> > -  // with function calls
> > -  BLEdgeVector getCallPhonyEdges();
> > -
> > -  // Gets/sets the path counter array
> > -  GlobalVariable* getCounterArray();
> > -  void setCounterArray(GlobalVariable* c);
> > -
> > -  // Calculates the increments for the chords, thereby removing
> > -  // instrumentation from the spanning tree edges. Implementation is
> based
> > -  // on the algorithm in Figure 4 of [Ball94]
> > -  void calculateChordIncrements();
> > -
> > -  // Updates the state when an edge has been split
> > -  void splitUpdate(BLInstrumentationEdge* formerEdge, BasicBlock*
> newBlock);
> > -
> > -  // Calculates a spanning tree of the DAG ignoring cycles.  Whichever
> > -  // edges are in the spanning tree will not be instrumented, but this
> > -  // implementation does not try to minimize the instrumentation
> overhead
> > -  // by trying to find hot edges.
> > -  void calculateSpanningTree();
> > -
> > -  // Pushes initialization further down in order to group the first
> > -  // increment and initialization.
> > -  void pushInitialization();
> > -
> > -  // Pushes the path counter increments up in order to group the last
> path
> > -  // number increment.
> > -  void pushCounters();
> > -
> > -  // Removes phony edges from the successor list of the source, and the
> > -  // predecessor list of the target.
> > -  void unlinkPhony();
> > -
> > -  // Generate dot graph for the function
> > -  void generateDotGraph();
> > -
> > -protected:
> > -  // BLInstrumentationDag creates BLInstrumentationNode objects in this
> > -  // method overriding the creation of BallLarusNode objects.
> > -  //
> > -  // Allows subclasses to determine which type of Node is created.
> > -  // Override this method to produce subclasses of BallLarusNode if
> > -  // necessary.
> > -  virtual BallLarusNode* createNode(BasicBlock* BB);
> > -
> > -  // BLInstrumentationDag create BLInstrumentationEdges.
> > -  //
> > -  // Allows subclasses to determine which type of Edge is created.
> > -  // Override this method to produce subclasses of BallLarusEdge if
> > -  // necessary.  Parameters source and target will have been created by
> > -  // createNode and can be cast to the subclass of BallLarusNode*
> > -  // returned by createNode.
> > -  virtual BallLarusEdge* createEdge(
> > -    BallLarusNode* source, BallLarusNode* target, unsigned edgeNumber);
> > -
> > -private:
> > -  BLEdgeVector _treeEdges; // All edges in the spanning tree.
> > -  BLEdgeVector _chordEdges; // All edges not in the spanning tree.
> > -  GlobalVariable* _counterArray; // Array to store path counters
> > -
> > -  // Removes the edge from the appropriate predecessor and successor
> lists.
> > -  void unlinkEdge(BallLarusEdge* edge);
> > -
> > -  // Makes an edge part of the spanning tree.
> > -  void makeEdgeSpanning(BLInstrumentationEdge* edge);
> > -
> > -  // Pushes initialization and calls itself recursively.
> > -  void pushInitializationFromEdge(BLInstrumentationEdge* edge);
> > -
> > -  // Pushes path counter increments up recursively.
> > -  void pushCountersFromEdge(BLInstrumentationEdge* edge);
> > -
> > -  // Depth first algorithm for determining the chord increments.f
> > -  void calculateChordIncrementsDfs(
> > -    long weight, BallLarusNode* v, BallLarusEdge* e);
> > -
> > -  // Determines the relative direction of two edges.
> > -  int calculateChordIncrementsDir(BallLarusEdge* e, BallLarusEdge* f);
> > -};
> > -
> > -//
> ---------------------------------------------------------------------------
> > -// PathProfiler is a module pass which instruments path profiling
> instructions
> > -//
> ---------------------------------------------------------------------------
> > -class PathProfiler : public ModulePass {
> > -private:
> > -  // Current context for multi threading support.
> > -  LLVMContext* Context;
> > -
> > -  // Which function are we currently instrumenting
> > -  unsigned currentFunctionNumber;
> > -
> > -  // The function prototype in the profiling runtime for incrementing a
> > -  // single path counter in a hash table.
> > -  Constant* llvmIncrementHashFunction;
> > -  Constant* llvmDecrementHashFunction;
> > -
> > -  // Instruments each function with path profiling.  'main' is
> instrumented
> > -  // with code to save the profile to disk.
> > -  bool runOnModule(Module &M);
> > -
> > -  // Analyzes the function for Ball-Larus path profiling, and inserts
> code.
> > -  void runOnFunction(std::vector<Constant*> &ftInit, Function &F,
> Module &M);
> > -
> > -  // Creates an increment constant representing incr.
> > -  ConstantInt* createIncrementConstant(long incr, int bitsize);
> > -
> > -  // Creates an increment constant representing the value in
> > -  // edge->getIncrement().
> > -  ConstantInt* createIncrementConstant(BLInstrumentationEdge* edge);
> > -
> > -  // Finds the insertion point after pathNumber in block.  PathNumber
> may
> > -  // be NULL.
> > -  BasicBlock::iterator getInsertionPoint(
> > -    BasicBlock* block, Value* pathNumber);
> > -
> > -  // Inserts source's pathNumber Value* into target.  Target may or may
> not
> > -  // have multiple predecessors, and may or may not have its phiNode
> > -  // initalized.
> > -  void pushValueIntoNode(
> > -    BLInstrumentationNode* source, BLInstrumentationNode* target);
> > -
> > -  // Inserts source's pathNumber Value* into the appropriate slot of
> > -  // target's phiNode.
> > -  void pushValueIntoPHI(
> > -    BLInstrumentationNode* target, BLInstrumentationNode* source);
> > -
> > -  // The Value* in node, oldVal,  is updated with a Value*
> correspodning to
> > -  // oldVal + addition.
> > -  void insertNumberIncrement(BLInstrumentationNode* node, Value*
> addition,
> > -                             bool atBeginning);
> > -
> > -  // Creates a counter increment in the given node.  The Value* in node
> is
> > -  // taken as the index into a hash table.
> > -  void insertCounterIncrement(
> > -    Value* incValue,
> > -    BasicBlock::iterator insertPoint,
> > -    BLInstrumentationDag* dag,
> > -    bool increment = true);
> > -
> > -  // A PHINode is created in the node, and its values initialized to
> -1U.
> > -  void preparePHI(BLInstrumentationNode* node);
> > -
> > -  // Inserts instrumentation for the given edge
> > -  //
> > -  // Pre: The edge's source node has pathNumber set if edge is non zero
> > -  // path number increment.
> > -  //
> > -  // Post: Edge's target node has a pathNumber set to the path number
> Value
> > -  // corresponding to the value of the path register after edge's
> > -  // execution.
> > -  void insertInstrumentationStartingAt(
> > -    BLInstrumentationEdge* edge,
> > -    BLInstrumentationDag* dag);
> > -
> > -  // If this edge is a critical edge, then inserts a node at this edge.
> > -  // This edge becomes the first edge, and a new BallLarusEdge is
> created.
> > -  bool splitCritical(BLInstrumentationEdge* edge, BLInstrumentationDag*
> dag);
> > -
> > -  // Inserts instrumentation according to the marked edges in dag.
>  Phony
> > -  // edges must be unlinked from the DAG, but accessible from the
> > -  // backedges.  Dag must have initializations, path number increments,
> and
> > -  // counter increments present.
> > -  //
> > -  // Counter storage is created here.
> > -  void insertInstrumentation( BLInstrumentationDag& dag, Module &M);
> > -
> > -public:
> > -  static char ID; // Pass identification, replacement for typeid
> > -  PathProfiler() : ModulePass(ID) {
> > -    initializePathProfilerPass(*PassRegistry::getPassRegistry());
> > -  }
> > -
> > -  virtual const char *getPassName() const {
> > -    return "Path Profiler";
> > -  }
> > -};
> > -} // end anonymous namespace
> > -
> > -// Should we print the dot-graphs
> > -static cl::opt<bool> DotPathDag("path-profile-pathdag", cl::Hidden,
> > -        cl::desc("Output the path profiling DAG for each function."));
> > -
> > -// Register the path profiler as a pass
> > -char PathProfiler::ID = 0;
> > -INITIALIZE_PASS(PathProfiler, "insert-path-profiling",
> > -                "Insert instrumentation for Ball-Larus path profiling",
> > -                false, false)
> > -
> > -ModulePass *llvm::createPathProfilerPass() { return new PathProfiler();
> }
> > -
> > -namespace llvm {
> > -  class PathProfilingFunctionTable {};
> > -
> > -  // Type for global array storing references to hashes or arrays
> > -  template<bool xcompile> class TypeBuilder<PathProfilingFunctionTable,
> > -                                            xcompile> {
> > -  public:
> > -    static StructType *get(LLVMContext& C) {
> > -      return( StructType::get(
> > -                TypeBuilder<types::i<32>, xcompile>::get(C), // type
> > -                TypeBuilder<types::i<32>, xcompile>::get(C), // array
> size
> > -                TypeBuilder<types::i<8>*, xcompile>::get(C), //
> array/hash ptr
> > -                NULL));
> > -    }
> > -  };
> > -
> > -  typedef TypeBuilder<PathProfilingFunctionTable, true>
> > -  ftEntryTypeBuilder;
> > -
> > -  // BallLarusEdge << operator overloading
> > -  raw_ostream& operator<<(raw_ostream& os,
> > -                          const BLInstrumentationEdge& edge)
> > -      LLVM_ATTRIBUTE_USED;
> > -  raw_ostream& operator<<(raw_ostream& os,
> > -                          const BLInstrumentationEdge& edge) {
> > -    os << "[" << edge.getSource()->getName() << " -> "
> > -       << edge.getTarget()->getName() << "] init: "
> > -       << (edge.isInitialization() ? "yes" : "no")
> > -       << " incr:" << edge.getIncrement() << " cinc: "
> > -       << (edge.isCounterIncrement() ? "yes" : "no");
> > -    return(os);
> > -  }
> > -}
> > -
> > -// Creates a new BLInstrumentationNode from a BasicBlock.
> > -BLInstrumentationNode::BLInstrumentationNode(BasicBlock* BB) :
> > -  BallLarusNode(BB),
> > -  _startingPathNumber(NULL), _endingPathNumber(NULL), _pathPHI(NULL) {}
> > -
> > -// Constructor for BLInstrumentationEdge.
> > -BLInstrumentationEdge::BLInstrumentationEdge(BLInstrumentationNode*
> source,
> > -                                             BLInstrumentationNode*
> target)
> > -  : BallLarusEdge(source, target, 0),
> > -    _increment(0), _isInSpanningTree(false), _isInitialization(false),
> > -    _isCounterIncrement(false), _hasInstrumentation(false) {}
> > -
> > -// Sets the target node of this edge.  Required to split edges.
> > -void BLInstrumentationEdge::setTarget(BallLarusNode* node) {
> > -  _target = node;
> > -}
> > -
> > -// Returns whether this edge is in the spanning tree.
> > -bool BLInstrumentationEdge::isInSpanningTree() const {
> > -  return(_isInSpanningTree);
> > -}
> > -
> > -// Sets whether this edge is in the spanning tree.
> > -void BLInstrumentationEdge::setIsInSpanningTree(bool isInSpanningTree) {
> > -  _isInSpanningTree = isInSpanningTree;
> > -}
> > -
> > -// Returns whether this edge will be instrumented with a path number
> > -// initialization.
> > -bool BLInstrumentationEdge::isInitialization() const {
> > -  return(_isInitialization);
> > -}
> > -
> > -// Sets whether this edge will be instrumented with a path number
> > -// initialization.
> > -void BLInstrumentationEdge::setIsInitialization(bool isInitialization) {
> > -  _isInitialization = isInitialization;
> > -}
> > -
> > -// Returns whether this edge will be instrumented with a path counter
> > -// increment.  Notice this is incrementing the path counter
> > -// corresponding to the path number register.  The path number
> > -// increment is determined by getIncrement().
> > -bool BLInstrumentationEdge::isCounterIncrement() const {
> > -  return(_isCounterIncrement);
> > -}
> > -
> > -// Sets whether this edge will be instrumented with a path counter
> > -// increment.
> > -void BLInstrumentationEdge::setIsCounterIncrement(bool
> isCounterIncrement) {
> > -  _isCounterIncrement = isCounterIncrement;
> > -}
> > -
> > -// Gets the path number increment that this edge will be instrumented
> > -// with.  This is distinct from the path counter increment and the
> > -// weight.  The counter increment is counts the number of executions of
> > -// some path, whereas the path number keeps track of which path number
> > -// the program is on.
> > -long BLInstrumentationEdge::getIncrement() const {
> > -  return(_increment);
> > -}
> > -
> > -// Set whether this edge will be instrumented with a path number
> > -// increment.
> > -void BLInstrumentationEdge::setIncrement(long increment) {
> > -  _increment = increment;
> > -}
> > -
> > -// True iff the edge has already been instrumented.
> > -bool BLInstrumentationEdge::hasInstrumentation() {
> > -  return(_hasInstrumentation);
> > -}
> > -
> > -// Set whether this edge has been instrumented.
> > -void BLInstrumentationEdge::setHasInstrumentation(bool
> hasInstrumentation) {
> > -  _hasInstrumentation = hasInstrumentation;
> > -}
> > -
> > -// Returns the successor number of this edge in the source.
> > -unsigned BLInstrumentationEdge::getSuccessorNumber() {
> > -  BallLarusNode* sourceNode = getSource();
> > -  BallLarusNode* targetNode = getTarget();
> > -  BasicBlock* source = sourceNode->getBlock();
> > -  BasicBlock* target = targetNode->getBlock();
> > -
> > -  if(source == NULL || target == NULL)
> > -    return(0);
> > -
> > -  TerminatorInst* terminator = source->getTerminator();
> > -
> > -        unsigned i;
> > -  for(i=0; i < terminator->getNumSuccessors(); i++) {
> > -    if(terminator->getSuccessor(i) == target)
> > -      break;
> > -  }
> > -
> > -  return(i);
> > -}
> > -
> > -// BLInstrumentationDag constructor initializes a DAG for the given
> Function.
> > -BLInstrumentationDag::BLInstrumentationDag(Function &F) :
> BallLarusDag(F),
> > -
>  _counterArray(0) {
> > -}
> > -
> > -// Returns the Exit->Root edge. This edge is required for creating
> > -// directed cycles in the algorithm for moving instrumentation off of
> > -// the spanning tree
> > -BallLarusEdge* BLInstrumentationDag::getExitRootEdge() {
> > -  BLEdgeIterator erEdge = getExit()->succBegin();
> > -  return(*erEdge);
> > -}
> > -
> > -BLEdgeVector BLInstrumentationDag::getCallPhonyEdges () {
> > -  BLEdgeVector callEdges;
> > -
> > -  for( BLEdgeIterator edge = _edges.begin(), end = _edges.end();
> > -       edge != end; edge++ ) {
> > -    if( (*edge)->getType() == BallLarusEdge::CALLEDGE_PHONY )
> > -      callEdges.push_back(*edge);
> > -  }
> > -
> > -  return callEdges;
> > -}
> > -
> > -// Gets the path counter array
> > -GlobalVariable* BLInstrumentationDag::getCounterArray() {
> > -  return _counterArray;
> > -}
> > -
> > -void BLInstrumentationDag::setCounterArray(GlobalVariable* c) {
> > -  _counterArray = c;
> > -}
> > -
> > -// Calculates the increment for the chords, thereby removing
> > -// instrumentation from the spanning tree edges. Implementation is
> based on
> > -// the algorithm in Figure 4 of [Ball94]
> > -void BLInstrumentationDag::calculateChordIncrements() {
> > -  calculateChordIncrementsDfs(0, getRoot(), NULL);
> > -
> > -  BLInstrumentationEdge* chord;
> > -  for(BLEdgeIterator chordEdge = _chordEdges.begin(),
> > -      end = _chordEdges.end(); chordEdge != end; chordEdge++) {
> > -    chord = (BLInstrumentationEdge*) *chordEdge;
> > -    chord->setIncrement(chord->getIncrement() + chord->getWeight());
> > -  }
> > -}
> > -
> > -// Updates the state when an edge has been split
> > -void BLInstrumentationDag::splitUpdate(BLInstrumentationEdge*
> formerEdge,
> > -                                       BasicBlock* newBlock) {
> > -  BallLarusNode* oldTarget = formerEdge->getTarget();
> > -  BallLarusNode* newNode = addNode(newBlock);
> > -  formerEdge->setTarget(newNode);
> > -  newNode->addPredEdge(formerEdge);
> > -
> > -  DEBUG(dbgs() << "  Edge split: " << *formerEdge << "\n");
> > -
> > -  oldTarget->removePredEdge(formerEdge);
> > -  BallLarusEdge* newEdge = addEdge(newNode, oldTarget,0);
> > -
> > -  if( formerEdge->getType() == BallLarusEdge::BACKEDGE ||
> > -                        formerEdge->getType() ==
> BallLarusEdge::SPLITEDGE) {
> > -                newEdge->setType(formerEdge->getType());
> > -    newEdge->setPhonyRoot(formerEdge->getPhonyRoot());
> > -    newEdge->setPhonyExit(formerEdge->getPhonyExit());
> > -    formerEdge->setType(BallLarusEdge::NORMAL);
> > -                formerEdge->setPhonyRoot(NULL);
> > -    formerEdge->setPhonyExit(NULL);
> > -  }
> > -}
> > -
> > -// Calculates a spanning tree of the DAG ignoring cycles.  Whichever
> > -// edges are in the spanning tree will not be instrumented, but this
> > -// implementation does not try to minimize the instrumentation overhead
> > -// by trying to find hot edges.
> > -void BLInstrumentationDag::calculateSpanningTree() {
> > -  std::stack<BallLarusNode*> dfsStack;
> > -
> > -  for(BLNodeIterator nodeIt = _nodes.begin(), end = _nodes.end();
> > -      nodeIt != end; nodeIt++) {
> > -    (*nodeIt)->setColor(BallLarusNode::WHITE);
> > -  }
> > -
> > -  dfsStack.push(getRoot());
> > -  while(dfsStack.size() > 0) {
> > -    BallLarusNode* node = dfsStack.top();
> > -    dfsStack.pop();
> > -
> > -    if(node->getColor() == BallLarusNode::WHITE)
> > -      continue;
> > -
> > -    BallLarusNode* nextNode;
> > -    bool forward = true;
> > -    BLEdgeIterator succEnd = node->succEnd();
> > -
> > -    node->setColor(BallLarusNode::WHITE);
> > -    // first iterate over successors then predecessors
> > -    for(BLEdgeIterator edge = node->succBegin(), predEnd =
> node->predEnd();
> > -        edge != predEnd; edge++) {
> > -      if(edge == succEnd) {
> > -        edge = node->predBegin();
> > -        forward = false;
> > -      }
> > -
> > -      // Ignore split edges
> > -      if ((*edge)->getType() == BallLarusEdge::SPLITEDGE)
> > -        continue;
> > -
> > -      nextNode = forward? (*edge)->getTarget(): (*edge)->getSource();
> > -      if(nextNode->getColor() != BallLarusNode::WHITE) {
> > -        nextNode->setColor(BallLarusNode::WHITE);
> > -        makeEdgeSpanning((BLInstrumentationEdge*)(*edge));
> > -      }
> > -    }
> > -  }
> > -
> > -  for(BLEdgeIterator edge = _edges.begin(), end = _edges.end();
> > -      edge != end; edge++) {
> > -    BLInstrumentationEdge* instEdge = (BLInstrumentationEdge*) (*edge);
> > -      // safe since createEdge is overriden
> > -    if(!instEdge->isInSpanningTree() && (*edge)->getType()
> > -        != BallLarusEdge::SPLITEDGE)
> > -      _chordEdges.push_back(instEdge);
> > -  }
> > -}
> > -
> > -// Pushes initialization further down in order to group the first
> > -// increment and initialization.
> > -void BLInstrumentationDag::pushInitialization() {
> > -  BLInstrumentationEdge* exitRootEdge =
> > -                (BLInstrumentationEdge*) getExitRootEdge();
> > -  exitRootEdge->setIsInitialization(true);
> > -  pushInitializationFromEdge(exitRootEdge);
> > -}
> > -
> > -// Pushes the path counter increments up in order to group the last path
> > -// number increment.
> > -void BLInstrumentationDag::pushCounters() {
> > -  BLInstrumentationEdge* exitRootEdge =
> > -    (BLInstrumentationEdge*) getExitRootEdge();
> > -  exitRootEdge->setIsCounterIncrement(true);
> > -  pushCountersFromEdge(exitRootEdge);
> > -}
> > -
> > -// Removes phony edges from the successor list of the source, and the
> > -// predecessor list of the target.
> > -void BLInstrumentationDag::unlinkPhony() {
> > -  BallLarusEdge* edge;
> > -
> > -  for(BLEdgeIterator next = _edges.begin(),
> > -      end = _edges.end(); next != end; next++) {
> > -    edge = (*next);
> > -
> > -    if( edge->getType() == BallLarusEdge::BACKEDGE_PHONY ||
> > -        edge->getType() == BallLarusEdge::SPLITEDGE_PHONY ||
> > -        edge->getType() == BallLarusEdge::CALLEDGE_PHONY ) {
> > -      unlinkEdge(edge);
> > -    }
> > -  }
> > -}
> > -
> > -// Generate a .dot graph to represent the DAG and pathNumbers
> > -void BLInstrumentationDag::generateDotGraph() {
> > -  std::string errorInfo;
> > -  std::string functionName = getFunction().getName().str();
> > -  std::string filename = "pathdag." + functionName + ".dot";
> > -
> > -  DEBUG (dbgs() << "Writing '" << filename << "'...\n");
> > -  raw_fd_ostream dotFile(filename.c_str(), errorInfo);
> > -
> > -  if (!errorInfo.empty()) {
> > -    errs() << "Error opening '" << filename.c_str() <<"' for writing!";
> > -    errs() << "\n";
> > -    return;
> > -  }
> > -
> > -  dotFile << "digraph " << functionName << " {\n";
> > -
> > -  for( BLEdgeIterator edge = _edges.begin(), end = _edges.end();
> > -       edge != end; edge++) {
> > -    std::string sourceName = (*edge)->getSource()->getName();
> > -    std::string targetName = (*edge)->getTarget()->getName();
> > -
> > -    dotFile << "\t\"" << sourceName.c_str() << "\" -> \""
> > -            << targetName.c_str() << "\" ";
> > -
> > -    long inc = ((BLInstrumentationEdge*)(*edge))->getIncrement();
> > -
> > -    switch( (*edge)->getType() ) {
> > -    case BallLarusEdge::NORMAL:
> > -      dotFile << "[label=" << inc << "] [color=black];\n";
> > -      break;
> > -
> > -    case BallLarusEdge::BACKEDGE:
> > -      dotFile << "[color=cyan];\n";
> > -      break;
> > -
> > -    case BallLarusEdge::BACKEDGE_PHONY:
> > -      dotFile << "[label=" << inc
> > -              << "] [color=blue];\n";
> > -      break;
> > -
> > -    case BallLarusEdge::SPLITEDGE:
> > -      dotFile << "[color=violet];\n";
> > -      break;
> > -
> > -    case BallLarusEdge::SPLITEDGE_PHONY:
> > -      dotFile << "[label=" << inc << "] [color=red];\n";
> > -      break;
> > -
> > -    case BallLarusEdge::CALLEDGE_PHONY:
> > -      dotFile << "[label=" << inc     << "] [color=green];\n";
> > -      break;
> > -    }
> > -  }
> > -
> > -  dotFile << "}\n";
> > -}
> > -
> > -// Allows subclasses to determine which type of Node is created.
> > -// Override this method to produce subclasses of BallLarusNode if
> > -// necessary. The destructor of BallLarusDag will call free on each
> pointer
> > -// created.
> > -BallLarusNode* BLInstrumentationDag::createNode(BasicBlock* BB) {
> > -  return( new BLInstrumentationNode(BB) );
> > -}
> > -
> > -// Allows subclasses to determine which type of Edge is created.
> > -// Override this method to produce subclasses of BallLarusEdge if
> > -// necessary. The destructor of BallLarusDag will call free on each
> pointer
> > -// created.
> > -BallLarusEdge* BLInstrumentationDag::createEdge(BallLarusNode* source,
> > -                                                BallLarusNode* target,
> unsigned edgeNumber) {
> > -  // One can cast from BallLarusNode to BLInstrumentationNode since
> createNode
> > -  // is overriden to produce BLInstrumentationNode.
> > -  return( new BLInstrumentationEdge((BLInstrumentationNode*)source,
> > -                                    (BLInstrumentationNode*)target) );
> > -}
> > -
> > -// Sets the Value corresponding to the pathNumber register, constant,
> > -// or phinode.  Used by the instrumentation code to remember path
> > -// number Values.
> > -Value* BLInstrumentationNode::getStartingPathNumber(){
> > -  return(_startingPathNumber);
> > -}
> > -
> > -// Sets the Value of the pathNumber.  Used by the instrumentation code.
> > -void BLInstrumentationNode::setStartingPathNumber(Value* pathNumber) {
> > -  DEBUG(dbgs() << "  SPN-" << getName() << " <-- " << (pathNumber ?
> > -
> pathNumber->getName() :
> > -                                                       "unused") <<
> "\n");
> > -  _startingPathNumber = pathNumber;
> > -}
> > -
> > -Value* BLInstrumentationNode::getEndingPathNumber(){
> > -  return(_endingPathNumber);
> > -}
> > -
> > -void BLInstrumentationNode::setEndingPathNumber(Value* pathNumber) {
> > -  DEBUG(dbgs() << "  EPN-" << getName() << " <-- "
> > -               << (pathNumber ? pathNumber->getName() : "unused") <<
> "\n");
> > -  _endingPathNumber = pathNumber;
> > -}
> > -
> > -// Get the PHINode Instruction for this node.  Used by instrumentation
> > -// code.
> > -PHINode* BLInstrumentationNode::getPathPHI() {
> > -  return(_pathPHI);
> > -}
> > -
> > -// Set the PHINode Instruction for this node.  Used by instrumentation
> > -// code.
> > -void BLInstrumentationNode::setPathPHI(PHINode* pathPHI) {
> > -  _pathPHI = pathPHI;
> > -}
> > -
> > -// Removes the edge from the appropriate predecessor and successor
> > -// lists.
> > -void BLInstrumentationDag::unlinkEdge(BallLarusEdge* edge) {
> > -  if(edge == getExitRootEdge())
> > -    DEBUG(dbgs() << " Removing exit->root edge\n");
> > -
> > -  edge->getSource()->removeSuccEdge(edge);
> > -  edge->getTarget()->removePredEdge(edge);
> > -}
> > -
> > -// Makes an edge part of the spanning tree.
> > -void BLInstrumentationDag::makeEdgeSpanning(BLInstrumentationEdge*
> edge) {
> > -  edge->setIsInSpanningTree(true);
> > -  _treeEdges.push_back(edge);
> > -}
> > -
> > -// Pushes initialization and calls itself recursively.
> > -void BLInstrumentationDag::pushInitializationFromEdge(
> > -  BLInstrumentationEdge* edge) {
> > -  BallLarusNode* target;
> > -
> > -  target = edge->getTarget();
> > -  if( target->getNumberPredEdges() > 1 || target == getExit() ) {
> > -    return;
> > -  } else {
> > -    for(BLEdgeIterator next = target->succBegin(),
> > -          end = target->succEnd(); next != end; next++) {
> > -      BLInstrumentationEdge* intoEdge = (BLInstrumentationEdge*) *next;
> > -
> > -      // Skip split edges
> > -      if (intoEdge->getType() == BallLarusEdge::SPLITEDGE)
> > -        continue;
> > -
> > -      intoEdge->setIncrement(intoEdge->getIncrement() +
> > -                             edge->getIncrement());
> > -      intoEdge->setIsInitialization(true);
> > -      pushInitializationFromEdge(intoEdge);
> > -    }
> > -
> > -    edge->setIncrement(0);
> > -    edge->setIsInitialization(false);
> > -  }
> > -}
> > -
> > -// Pushes path counter increments up recursively.
> > -void BLInstrumentationDag::pushCountersFromEdge(BLInstrumentationEdge*
> edge) {
> > -  BallLarusNode* source;
> > -
> > -  source = edge->getSource();
> > -  if(source->getNumberSuccEdges() > 1 || source == getRoot()
> > -     || edge->isInitialization()) {
> > -    return;
> > -  } else {
> > -    for(BLEdgeIterator previous = source->predBegin(),
> > -          end = source->predEnd(); previous != end; previous++) {
> > -      BLInstrumentationEdge* fromEdge = (BLInstrumentationEdge*)
> *previous;
> > -
> > -      // Skip split edges
> > -      if (fromEdge->getType() == BallLarusEdge::SPLITEDGE)
> > -        continue;
> > -
> > -      fromEdge->setIncrement(fromEdge->getIncrement() +
> > -                             edge->getIncrement());
> > -      fromEdge->setIsCounterIncrement(true);
> > -      pushCountersFromEdge(fromEdge);
> > -    }
> > -
> > -    edge->setIncrement(0);
> > -    edge->setIsCounterIncrement(false);
> > -  }
> > -}
> > -
> > -// Depth first algorithm for determining the chord increments.
> > -void BLInstrumentationDag::calculateChordIncrementsDfs(long weight,
> > -                                                       BallLarusNode*
> v, BallLarusEdge* e) {
> > -  BLInstrumentationEdge* f;
> > -
> > -  for(BLEdgeIterator treeEdge = _treeEdges.begin(),
> > -        end = _treeEdges.end(); treeEdge != end; treeEdge++) {
> > -    f = (BLInstrumentationEdge*) *treeEdge;
> > -    if(e != f && v == f->getTarget()) {
> > -      calculateChordIncrementsDfs(
> > -        calculateChordIncrementsDir(e,f)*(weight) +
> > -        f->getWeight(), f->getSource(), f);
> > -    }
> > -    if(e != f && v == f->getSource()) {
> > -      calculateChordIncrementsDfs(
> > -        calculateChordIncrementsDir(e,f)*(weight) +
> > -        f->getWeight(), f->getTarget(), f);
> > -    }
> > -  }
> > -
> > -  for(BLEdgeIterator chordEdge = _chordEdges.begin(),
> > -        end = _chordEdges.end(); chordEdge != end; chordEdge++) {
> > -    f = (BLInstrumentationEdge*) *chordEdge;
> > -    if(v == f->getSource() || v == f->getTarget()) {
> > -      f->setIncrement(f->getIncrement() +
> > -                      calculateChordIncrementsDir(e,f)*weight);
> > -    }
> > -  }
> > -}
> > -
> > -// Determines the relative direction of two edges.
> > -int BLInstrumentationDag::calculateChordIncrementsDir(BallLarusEdge* e,
> > -                                                      BallLarusEdge* f)
> {
> > -  if( e == NULL)
> > -    return(1);
> > -  else if(e->getSource() == f->getTarget()
> > -          || e->getTarget() == f->getSource())
> > -    return(1);
> > -
> > -  return(-1);
> > -}
> > -
> > -// Creates an increment constant representing incr.
> > -ConstantInt* PathProfiler::createIncrementConstant(long incr,
> > -                                                   int bitsize) {
> > -  return(ConstantInt::get(IntegerType::get(*Context, 32), incr));
> > -}
> > -
> > -// Creates an increment constant representing the value in
> > -// edge->getIncrement().
> > -ConstantInt* PathProfiler::createIncrementConstant(
> > -  BLInstrumentationEdge* edge) {
> > -  return(createIncrementConstant(edge->getIncrement(), 32));
> > -}
> > -
> > -// Finds the insertion point after pathNumber in block.  PathNumber may
> > -// be NULL.
> > -BasicBlock::iterator PathProfiler::getInsertionPoint(BasicBlock* block,
> Value*
> > -                                                     pathNumber) {
> > -  if(pathNumber == NULL || isa<ConstantInt>(pathNumber)
> > -     || (((Instruction*)(pathNumber))->getParent()) != block) {
> > -    return(block->getFirstInsertionPt());
> > -  } else {
> > -    Instruction* pathNumberInst = (Instruction*) (pathNumber);
> > -    BasicBlock::iterator insertPoint;
> > -    BasicBlock::iterator end = block->end();
> > -
> > -    for(insertPoint = block->begin();
> > -        insertPoint != end; insertPoint++) {
> > -      Instruction* insertInst = &(*insertPoint);
> > -
> > -      if(insertInst == pathNumberInst)
> > -        return(++insertPoint);
> > -    }
> > -
> > -    return(insertPoint);
> > -  }
> > -}
> > -
> > -// A PHINode is created in the node, and its values initialized to -1U.
> > -void PathProfiler::preparePHI(BLInstrumentationNode* node) {
> > -  BasicBlock* block = node->getBlock();
> > -  BasicBlock::iterator insertPoint = block->getFirstInsertionPt();
> > -  pred_iterator PB = pred_begin(node->getBlock()),
> > -          PE = pred_end(node->getBlock());
> > -  PHINode* phi = PHINode::Create(Type::getInt32Ty(*Context),
> > -                                 std::distance(PB, PE), "pathNumber",
> > -                                 insertPoint );
> > -  node->setPathPHI(phi);
> > -  node->setStartingPathNumber(phi);
> > -  node->setEndingPathNumber(phi);
> > -
> > -  for(pred_iterator predIt = PB; predIt != PE; predIt++) {
> > -    BasicBlock* pred = (*predIt);
> > -
> > -    if(pred != NULL)
> > -      phi->addIncoming(createIncrementConstant((long)-1, 32), pred);
> > -  }
> > -}
> > -
> > -// Inserts source's pathNumber Value* into target.  Target may or may
> not
> > -// have multiple predecessors, and may or may not have its phiNode
> > -// initalized.
> > -void PathProfiler::pushValueIntoNode(BLInstrumentationNode* source,
> > -                                     BLInstrumentationNode* target) {
> > -  if(target->getBlock() == NULL)
> > -    return;
> > -
> > -
> > -  if(target->getNumberPredEdges() <= 1) {
> > -    assert(target->getStartingPathNumber() == NULL &&
> > -           "Target already has path number");
> > -    target->setStartingPathNumber(source->getEndingPathNumber());
> > -    target->setEndingPathNumber(source->getEndingPathNumber());
> > -    DEBUG(dbgs() << "  Passing path number"
> > -          << (source->getEndingPathNumber() ? "" : " (null)")
> > -          << " value through.\n");
> > -  } else {
> > -    if(target->getPathPHI() == NULL) {
> > -      DEBUG(dbgs() << "  Initializing PHI node for block '"
> > -            << target->getName() << "'\n");
> > -      preparePHI(target);
> > -    }
> > -    pushValueIntoPHI(target, source);
> > -    DEBUG(dbgs() << "  Passing number value into PHI for block '"
> > -          << target->getName() << "'\n");
> > -  }
> > -}
> > -
> > -// Inserts source's pathNumber Value* into the appropriate slot of
> > -// target's phiNode.
> > -void PathProfiler::pushValueIntoPHI(BLInstrumentationNode* target,
> > -                                    BLInstrumentationNode* source) {
> > -  PHINode* phi = target->getPathPHI();
> > -  assert(phi != NULL && "  Tried to push value into node with PHI, but
> node"
> > -         " actually had no PHI.");
> > -  phi->removeIncomingValue(source->getBlock(), false);
> > -  phi->addIncoming(source->getEndingPathNumber(), source->getBlock());
> > -}
> > -
> > -// The Value* in node, oldVal,  is updated with a Value* correspodning
> to
> > -// oldVal + addition.
> > -void PathProfiler::insertNumberIncrement(BLInstrumentationNode* node,
> > -                                         Value* addition, bool
> atBeginning) {
> > -  BasicBlock* block = node->getBlock();
> > -  assert(node->getStartingPathNumber() != NULL);
> > -  assert(node->getEndingPathNumber() != NULL);
> > -
> > -  BasicBlock::iterator insertPoint;
> > -
> > -  if( atBeginning )
> > -    insertPoint = block->getFirstInsertionPt();
> > -  else
> > -    insertPoint = block->getTerminator();
> > -
> > -  DEBUG(errs() << "  Creating addition instruction.\n");
> > -  Value* newpn = BinaryOperator::Create(Instruction::Add,
> > -                                        node->getStartingPathNumber(),
> > -                                        addition, "pathNumber",
> insertPoint);
> > -
> > -  node->setEndingPathNumber(newpn);
> > -
> > -  if( atBeginning )
> > -    node->setStartingPathNumber(newpn);
> > -}
> > -
> > -// Creates a counter increment in the given node.  The Value* in node is
> > -// taken as the index into an array or hash table.  The hash table
> access
> > -// is a call to the runtime.
> > -void PathProfiler::insertCounterIncrement(Value* incValue,
> > -                                          BasicBlock::iterator
> insertPoint,
> > -                                          BLInstrumentationDag* dag,
> > -                                          bool increment) {
> > -  // Counter increment for array
> > -  if( dag->getNumberOfPaths() <= HASH_THRESHHOLD ) {
> > -    // Get pointer to the array location
> > -    std::vector<Value*> gepIndices(2);
> > -    gepIndices[0] = Constant::getNullValue(Type::getInt32Ty(*Context));
> > -    gepIndices[1] = incValue;
> > -
> > -    GetElementPtrInst* pcPointer =
> > -      GetElementPtrInst::Create(dag->getCounterArray(), gepIndices,
> > -                                "counterInc", insertPoint);
> > -
> > -    // Load from the array - call it oldPC
> > -    LoadInst* oldPc = new LoadInst(pcPointer, "oldPC", insertPoint);
> > -
> > -    // Test to see whether adding 1 will overflow the counter
> > -    ICmpInst* isMax = new ICmpInst(insertPoint, CmpInst::ICMP_ULT,
> oldPc,
> > -                                   createIncrementConstant(0xffffffff,
> 32),
> > -                                   "isMax");
> > -
> > -    // Select increment for the path counter based on overflow
> > -    SelectInst* inc =
> > -      SelectInst::Create( isMax,
> createIncrementConstant(increment?1:-1,32),
> > -                          createIncrementConstant(0,32),
> > -                          "pathInc", insertPoint);
> > -
> > -    // newPc = oldPc + inc
> > -    BinaryOperator* newPc = BinaryOperator::Create(Instruction::Add,
> > -                                                   oldPc, inc, "newPC",
> > -                                                   insertPoint);
> > -
> > -    // Store back in to the array
> > -    new StoreInst(newPc, pcPointer, insertPoint);
> > -  } else { // Counter increment for hash
> > -    std::vector<Value*> args(2);
> > -    args[0] = ConstantInt::get(Type::getInt32Ty(*Context),
> > -                               currentFunctionNumber);
> > -    args[1] = incValue;
> > -
> > -    CallInst::Create(
> > -      increment ? llvmIncrementHashFunction : llvmDecrementHashFunction,
> > -      args, "", insertPoint);
> > -  }
> > -}
> > -
> > -// Inserts instrumentation for the given edge
> > -//
> > -// Pre: The edge's source node has pathNumber set if edge is non zero
> > -// path number increment.
> > -//
> > -// Post: Edge's target node has a pathNumber set to the path number
> Value
> > -// corresponding to the value of the path register after edge's
> > -// execution.
> > -//
> > -// FIXME: This should be reworked so it's not recursive.
> > -void
> PathProfiler::insertInstrumentationStartingAt(BLInstrumentationEdge* edge,
> > -
> BLInstrumentationDag* dag) {
> > -  // Mark the edge as instrumented
> > -  edge->setHasInstrumentation(true);
> > -  DEBUG(dbgs() << "\nInstrumenting edge: " << (*edge) << "\n");
> > -
> > -  // create a new node for this edge's instrumentation
> > -  splitCritical(edge, dag);
> > -
> > -  BLInstrumentationNode* sourceNode =
> (BLInstrumentationNode*)edge->getSource();
> > -  BLInstrumentationNode* targetNode =
> (BLInstrumentationNode*)edge->getTarget();
> > -  BLInstrumentationNode* instrumentNode;
> > -  BLInstrumentationNode* nextSourceNode;
> > -
> > -  bool atBeginning = false;
> > -
> > -  // Source node has only 1 successor so any information can be simply
> > -  // inserted in to it without splitting
> > -  if( sourceNode->getBlock() && sourceNode->getNumberSuccEdges() <= 1) {
> > -    DEBUG(dbgs() << "  Potential instructions to be placed in: "
> > -          << sourceNode->getName() << " (at end)\n");
> > -    instrumentNode = sourceNode;
> > -    nextSourceNode = targetNode; // ... since we never made any new
> nodes
> > -  }
> > -
> > -  // The target node only has one predecessor, so we can safely insert
> edge
> > -  // instrumentation into it. If there was splitting, it must have been
> > -  // successful.
> > -  else if( targetNode->getNumberPredEdges() == 1 ) {
> > -    DEBUG(dbgs() << "  Potential instructions to be placed in: "
> > -          << targetNode->getName() << " (at beginning)\n");
> > -    pushValueIntoNode(sourceNode, targetNode);
> > -    instrumentNode = targetNode;
> > -    nextSourceNode = NULL; // ... otherwise we'll just keep splitting
> > -    atBeginning = true;
> > -  }
> > -
> > -  // Somehow, splitting must have failed.
> > -  else {
> > -    errs() << "Instrumenting could not split a critical edge.\n";
> > -    DEBUG(dbgs() << "  Couldn't split edge " << (*edge) << ".\n");
> > -    return;
> > -  }
> > -
> > -  // Insert instrumentation if this is a back or split edge
> > -  if( edge->getType() == BallLarusEdge::BACKEDGE ||
> > -      edge->getType() == BallLarusEdge::SPLITEDGE ) {
> > -    BLInstrumentationEdge* top =
> > -      (BLInstrumentationEdge*) edge->getPhonyRoot();
> > -    BLInstrumentationEdge* bottom =
> > -      (BLInstrumentationEdge*) edge->getPhonyExit();
> > -
> > -    assert( top->isInitialization() && " Top phony edge did not"
> > -            " contain a path number initialization.");
> > -    assert( bottom->isCounterIncrement() && " Bottom phony edge"
> > -            " did not contain a path counter increment.");
> > -
> > -    // split edge has yet to be initialized
> > -    if( !instrumentNode->getEndingPathNumber() ) {
> > -
>  instrumentNode->setStartingPathNumber(createIncrementConstant(0,32));
> > -
>  instrumentNode->setEndingPathNumber(createIncrementConstant(0,32));
> > -    }
> > -
> > -    BasicBlock::iterator insertPoint = atBeginning ?
> > -      instrumentNode->getBlock()->getFirstInsertionPt() :
> > -      instrumentNode->getBlock()->getTerminator();
> > -
> > -    // add information from the bottom edge, if it exists
> > -    if( bottom->getIncrement() ) {
> > -      Value* newpn =
> > -        BinaryOperator::Create(Instruction::Add,
> > -                               instrumentNode->getStartingPathNumber(),
> > -                               createIncrementConstant(bottom),
> > -                               "pathNumber", insertPoint);
> > -      instrumentNode->setEndingPathNumber(newpn);
> > -    }
> > -
> > -    insertCounterIncrement(instrumentNode->getEndingPathNumber(),
> > -                           insertPoint, dag);
> > -
> > -    if( atBeginning )
> > -
>  instrumentNode->setStartingPathNumber(createIncrementConstant(top));
> > -
> > -    instrumentNode->setEndingPathNumber(createIncrementConstant(top));
> > -
> > -    // Check for path counter increments
> > -    if( top->isCounterIncrement() ) {
> > -      insertCounterIncrement(instrumentNode->getEndingPathNumber(),
> > -
> instrumentNode->getBlock()->getTerminator(),dag);
> > -      instrumentNode->setEndingPathNumber(0);
> > -    }
> > -  }
> > -
> > -  // Insert instrumentation if this is a normal edge
> > -  else {
> > -    BasicBlock::iterator insertPoint = atBeginning ?
> > -      instrumentNode->getBlock()->getFirstInsertionPt() :
> > -      instrumentNode->getBlock()->getTerminator();
> > -
> > -    if( edge->isInitialization() ) { // initialize path number
> > -
>  instrumentNode->setEndingPathNumber(createIncrementConstant(edge));
> > -    } else if( edge->getIncrement() )       {// increment path number
> > -      Value* newpn =
> > -        BinaryOperator::Create(Instruction::Add,
> > -                               instrumentNode->getStartingPathNumber(),
> > -                               createIncrementConstant(edge),
> > -                               "pathNumber", insertPoint);
> > -      instrumentNode->setEndingPathNumber(newpn);
> > -
> > -      if( atBeginning )
> > -        instrumentNode->setStartingPathNumber(newpn);
> > -    }
> > -
> > -    // Check for path counter increments
> > -    if( edge->isCounterIncrement() ) {
> > -      insertCounterIncrement(instrumentNode->getEndingPathNumber(),
> > -                             insertPoint, dag);
> > -      instrumentNode->setEndingPathNumber(0);
> > -    }
> > -  }
> > -
> > -  // Push it along
> > -  if (nextSourceNode && instrumentNode->getEndingPathNumber())
> > -    pushValueIntoNode(instrumentNode, nextSourceNode);
> > -
> > -  // Add all the successors
> > -  for( BLEdgeIterator next = targetNode->succBegin(),
> > -         end = targetNode->succEnd(); next != end; next++ ) {
> > -    // So long as it is un-instrumented, add it to the list
> > -    if( !((BLInstrumentationEdge*)(*next))->hasInstrumentation() )
> > -
>  insertInstrumentationStartingAt((BLInstrumentationEdge*)*next,dag);
> > -    else
> > -      DEBUG(dbgs() << "  Edge " << *(BLInstrumentationEdge*)(*next)
> > -            << " already instrumented.\n");
> > -  }
> > -}
> > -
> > -// Inserts instrumentation according to the marked edges in dag.  Phony
> edges
> > -// must be unlinked from the DAG, but accessible from the backedges.
>  Dag
> > -// must have initializations, path number increments, and counter
> increments
> > -// present.
> > -//
> > -// Counter storage is created here.
> > -void PathProfiler::insertInstrumentation(
> > -  BLInstrumentationDag& dag, Module &M) {
> > -
> > -  BLInstrumentationEdge* exitRootEdge =
> > -    (BLInstrumentationEdge*) dag.getExitRootEdge();
> > -  insertInstrumentationStartingAt(exitRootEdge, &dag);
> > -
> > -  // Iterate through each call edge and apply the appropriate hash
> increment
> > -  // and decrement functions
> > -  BLEdgeVector callEdges = dag.getCallPhonyEdges();
> > -  for( BLEdgeIterator edge = callEdges.begin(),
> > -         end = callEdges.end(); edge != end; edge++ ) {
> > -    BLInstrumentationNode* node =
> > -      (BLInstrumentationNode*)(*edge)->getSource();
> > -    BasicBlock::iterator insertPoint =
> node->getBlock()->getFirstInsertionPt();
> > -
> > -    // Find the first function call
> > -    while( ((Instruction&)(*insertPoint)).getOpcode() !=
> Instruction::Call )
> > -      insertPoint++;
> > -
> > -    DEBUG(dbgs() << "\nInstrumenting method call block '"
> > -                 << node->getBlock()->getName() << "'\n");
> > -    DEBUG(dbgs() << "   Path number initialized: "
> > -                 << ((node->getStartingPathNumber()) ? "yes" : "no") <<
> "\n");
> > -
> > -    Value* newpn;
> > -    if( node->getStartingPathNumber() ) {
> > -      long inc = ((BLInstrumentationEdge*)(*edge))->getIncrement();
> > -      if ( inc )
> > -        newpn = BinaryOperator::Create(Instruction::Add,
> > -                                       node->getStartingPathNumber(),
> > -                                       createIncrementConstant(inc,32),
> > -                                       "pathNumber", insertPoint);
> > -      else
> > -        newpn = node->getStartingPathNumber();
> > -    } else {
> > -      newpn = (Value*)createIncrementConstant(
> > -        ((BLInstrumentationEdge*)(*edge))->getIncrement(), 32);
> > -    }
> > -
> > -    insertCounterIncrement(newpn, insertPoint, &dag);
> > -    insertCounterIncrement(newpn, node->getBlock()->getTerminator(),
> > -                           &dag, false);
> > -  }
> > -}
> > -
> > -// Entry point of the module
> > -void PathProfiler::runOnFunction(std::vector<Constant*> &ftInit,
> > -                                 Function &F, Module &M) {
> > -  // Build DAG from CFG
> > -  BLInstrumentationDag dag = BLInstrumentationDag(F);
> > -  dag.init();
> > -
> > -  // give each path a unique integer value
> > -  dag.calculatePathNumbers();
> > -
> > -  // modify path increments to increase the efficiency
> > -  // of instrumentation
> > -  dag.calculateSpanningTree();
> > -  dag.calculateChordIncrements();
> > -  dag.pushInitialization();
> > -  dag.pushCounters();
> > -  dag.unlinkPhony();
> > -
> > -  // potentially generate .dot graph for the dag
> > -  if (DotPathDag)
> > -    dag.generateDotGraph ();
> > -
> > -  // Should we store the information in an array or hash
> > -  if( dag.getNumberOfPaths() <= HASH_THRESHHOLD ) {
> > -    Type* t = ArrayType::get(Type::getInt32Ty(*Context),
> > -                                   dag.getNumberOfPaths());
> > -
> > -    dag.setCounterArray(new GlobalVariable(M, t, false,
> > -                                           GlobalValue::InternalLinkage,
> > -                                           Constant::getNullValue(t),
> ""));
> > -  }
> > -
> > -  insertInstrumentation(dag, M);
> > -
> > -  // Add to global function reference table
> > -  unsigned type;
> > -  Type* voidPtr = TypeBuilder<types::i<8>*, true>::get(*Context);
> > -
> > -  if( dag.getNumberOfPaths() <= HASH_THRESHHOLD )
> > -    type = ProfilingArray;
> > -  else
> > -    type = ProfilingHash;
> > -
> > -  std::vector<Constant*> entryArray(3);
> > -  entryArray[0] = createIncrementConstant(type,32);
> > -  entryArray[1] = createIncrementConstant(dag.getNumberOfPaths(),32);
> > -  entryArray[2] = dag.getCounterArray() ?
> > -    ConstantExpr::getBitCast(dag.getCounterArray(), voidPtr) :
> > -    Constant::getNullValue(voidPtr);
> > -
> > -  StructType* at = ftEntryTypeBuilder::get(*Context);
> > -  ConstantStruct* functionEntry =
> > -    (ConstantStruct*)ConstantStruct::get(at, entryArray);
> > -  ftInit.push_back(functionEntry);
> > -}
> > -
> > -// Output the bitcode if we want to observe instrumentation changess
> > -#define PRINT_MODULE dbgs() <<                               \
> > -  "\n\n============= MODULE BEGIN ===============\n" << M << \
> > -  "\n============== MODULE END ================\n"
> > -
> > -bool PathProfiler::runOnModule(Module &M) {
> > -  Context = &M.getContext();
> > -
> > -  DEBUG(dbgs()
> > -        << "****************************************\n"
> > -        << "****************************************\n"
> > -        << "**                                    **\n"
> > -        << "**   PATH PROFILING INSTRUMENTATION   **\n"
> > -        << "**                                    **\n"
> > -        << "****************************************\n"
> > -        << "****************************************\n");
> > -
> > -  // No main, no instrumentation!
> > -  Function *Main = M.getFunction("main");
> > -
> > -  // Using fortran? ... this kind of works
> > -  if (!Main)
> > -    Main = M.getFunction("MAIN__");
> > -
> > -  if (!Main) {
> > -    errs() << "WARNING: cannot insert path profiling into a module"
> > -           << " with no main function!\n";
> > -    return false;
> > -  }
> > -
> > -  llvmIncrementHashFunction = M.getOrInsertFunction(
> > -    "llvm_increment_path_count",
> > -    Type::getVoidTy(*Context), // return type
> > -    Type::getInt32Ty(*Context), // function number
> > -    Type::getInt32Ty(*Context), // path number
> > -    NULL );
> > -
> > -  llvmDecrementHashFunction = M.getOrInsertFunction(
> > -    "llvm_decrement_path_count",
> > -    Type::getVoidTy(*Context), // return type
> > -    Type::getInt32Ty(*Context), // function number
> > -    Type::getInt32Ty(*Context), // path number
> > -    NULL );
> > -
> > -  std::vector<Constant*> ftInit;
> > -  unsigned functionNumber = 0;
> > -  for (Module::iterator F = M.begin(), E = M.end(); F != E; F++) {
> > -    if (F->isDeclaration())
> > -      continue;
> > -
> > -    DEBUG(dbgs() << "Function: " << F->getName() << "\n");
> > -    functionNumber++;
> > -
> > -    // set function number
> > -    currentFunctionNumber = functionNumber;
> > -    runOnFunction(ftInit, *F, M);
> > -  }
> > -
> > -  Type *t = ftEntryTypeBuilder::get(*Context);
> > -  ArrayType* ftArrayType = ArrayType::get(t, ftInit.size());
> > -  Constant* ftInitConstant = ConstantArray::get(ftArrayType, ftInit);
> > -
> > -  DEBUG(dbgs() << " ftArrayType:" << *ftArrayType << "\n");
> > -
> > -  GlobalVariable* functionTable =
> > -    new GlobalVariable(M, ftArrayType, false,
> GlobalValue::InternalLinkage,
> > -                       ftInitConstant, "functionPathTable");
> > -  Type *eltType = ftArrayType->getTypeAtIndex((unsigned)0);
> > -  InsertProfilingInitCall(Main, "llvm_start_path_profiling",
> functionTable,
> > -                          PointerType::getUnqual(eltType));
> > -
> > -  DEBUG(PRINT_MODULE);
> > -
> > -  return true;
> > -}
> > -
> > -// If this edge is a critical edge, then inserts a node at this edge.
> > -// This edge becomes the first edge, and a new BallLarusEdge is created.
> > -// Returns true if the edge was split
> > -bool PathProfiler::splitCritical(BLInstrumentationEdge* edge,
> > -                                 BLInstrumentationDag* dag) {
> > -  unsigned succNum = edge->getSuccessorNumber();
> > -  BallLarusNode* sourceNode = edge->getSource();
> > -  BallLarusNode* targetNode = edge->getTarget();
> > -  BasicBlock* sourceBlock = sourceNode->getBlock();
> > -  BasicBlock* targetBlock = targetNode->getBlock();
> > -
> > -  if(sourceBlock == NULL || targetBlock == NULL
> > -     || sourceNode->getNumberSuccEdges() <= 1
> > -     || targetNode->getNumberPredEdges() == 1 ) {
> > -    return(false);
> > -  }
> > -
> > -  TerminatorInst* terminator = sourceBlock->getTerminator();
> > -
> > -  if( SplitCriticalEdge(terminator, succNum, this, false)) {
> > -    BasicBlock* newBlock = terminator->getSuccessor(succNum);
> > -    dag->splitUpdate(edge, newBlock);
> > -    return(true);
> > -  } else
> > -    return(false);
> > -}
> >
> > Modified: llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp?rev=191835&r1=191834&r2=191835&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp (original)
> > +++ llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp Wed Oct  2
> 10:42:23 2013
> > @@ -22,7 +22,6 @@
> >  #include "llvm/Analysis/DominatorInternals.h"
> >  #include "llvm/Analysis/Dominators.h"
> >  #include "llvm/Analysis/InstructionSimplify.h"
> > -#include "llvm/Analysis/ProfileInfo.h"
> >  #include "llvm/Assembly/Writer.h"
> >  #include "llvm/IR/Constants.h"
> >  #include "llvm/IR/DataLayout.h"
> > @@ -80,7 +79,6 @@ namespace {
> >      const TargetLowering *TLI;
> >      const TargetLibraryInfo *TLInfo;
> >      DominatorTree *DT;
> > -    ProfileInfo *PFI;
> >
> >      /// CurInstIterator - As we scan instructions optimizing them, this
> is the
> >      /// next instruction to optimize.  Xforms that can invalidate this
> should
> > @@ -111,7 +109,6 @@ namespace {
> >
> >      virtual void getAnalysisUsage(AnalysisUsage &AU) const {
> >        AU.addPreserved<DominatorTree>();
> > -      AU.addPreserved<ProfileInfo>();
> >        AU.addRequired<TargetLibraryInfo>();
> >      }
> >
> > @@ -151,7 +148,6 @@ bool CodeGenPrepare::runOnFunction(Funct
> >    if (TM) TLI = TM->getTargetLowering();
> >    TLInfo = &getAnalysis<TargetLibraryInfo>();
> >    DT = getAnalysisIfAvailable<DominatorTree>();
> > -  PFI = getAnalysisIfAvailable<ProfileInfo>();
> >    OptSize = F.getAttributes().hasAttribute(AttributeSet::FunctionIndex,
> >                                             Attribute::OptimizeForSize);
> >
> > @@ -442,10 +438,6 @@ void CodeGenPrepare::EliminateMostlyEmpt
> >      DT->changeImmediateDominator(DestBB, NewIDom);
> >      DT->eraseNode(BB);
> >    }
> > -  if (PFI) {
> > -    PFI->replaceAllUses(BB, DestBB);
> > -    PFI->removeEdge(ProfileInfo::getEdge(BB, DestBB));
> > -  }
> >    BB->eraseFromParent();
> >    ++NumBlocksElim;
> >
> >
> > Modified: llvm/trunk/lib/Transforms/Utils/BreakCriticalEdges.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/BreakCriticalEdges.cpp?rev=191835&r1=191834&r2=191835&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/Transforms/Utils/BreakCriticalEdges.cpp (original)
> > +++ llvm/trunk/lib/Transforms/Utils/BreakCriticalEdges.cpp Wed Oct  2
> 10:42:23 2013
> > @@ -22,7 +22,6 @@
> >  #include "llvm/Analysis/CFG.h"
> >  #include "llvm/Analysis/Dominators.h"
> >  #include "llvm/Analysis/LoopInfo.h"
> > -#include "llvm/Analysis/ProfileInfo.h"
> >  #include "llvm/IR/Function.h"
> >  #include "llvm/IR/Instructions.h"
> >  #include "llvm/IR/Type.h"
> > @@ -45,7 +44,6 @@ namespace {
> >      virtual void getAnalysisUsage(AnalysisUsage &AU) const {
> >        AU.addPreserved<DominatorTree>();
> >        AU.addPreserved<LoopInfo>();
> > -      AU.addPreserved<ProfileInfo>();
> >
> >        // No loop canonicalization guarantees are broken by this pass.
> >        AU.addPreservedID(LoopSimplifyID);
> > @@ -213,10 +211,9 @@ BasicBlock *llvm::SplitCriticalEdge(Term
> >
> >    DominatorTree *DT = P->getAnalysisIfAvailable<DominatorTree>();
> >    LoopInfo *LI = P->getAnalysisIfAvailable<LoopInfo>();
> > -  ProfileInfo *PI = P->getAnalysisIfAvailable<ProfileInfo>();
> >
> >    // If we have nothing to update, just return.
> > -  if (DT == 0 && LI == 0 && PI == 0)
> > +  if (DT == 0 && LI == 0)
> >      return NewBB;
> >
> >    // Now update analysis information.  Since the only predecessor of
> NewBB is
> > @@ -369,9 +366,5 @@ BasicBlock *llvm::SplitCriticalEdge(Term
> >      }
> >    }
> >
> > -  // Update ProfileInfo if it is around.
> > -  if (PI)
> > -    PI->splitEdge(TIBB, DestBB, NewBB, MergeIdenticalEdges);
> > -
> >    return NewBB;
> >  }
> >
> > Modified: llvm/trunk/lib/Transforms/Utils/Local.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Local.cpp?rev=191835&r1=191834&r2=191835&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/Transforms/Utils/Local.cpp (original)
> > +++ llvm/trunk/lib/Transforms/Utils/Local.cpp Wed Oct  2 10:42:23 2013
> > @@ -20,7 +20,6 @@
> >  #include "llvm/Analysis/Dominators.h"
> >  #include "llvm/Analysis/InstructionSimplify.h"
> >  #include "llvm/Analysis/MemoryBuiltins.h"
> > -#include "llvm/Analysis/ProfileInfo.h"
> >  #include "llvm/Analysis/ValueTracking.h"
> >  #include "llvm/DIBuilder.h"
> >  #include "llvm/DebugInfo.h"
> > @@ -513,11 +512,6 @@ void llvm::MergeBasicBlockIntoOnlyPred(B
> >        DT->changeImmediateDominator(DestBB, PredBBIDom);
> >        DT->eraseNode(PredBB);
> >      }
> > -    ProfileInfo *PI = P->getAnalysisIfAvailable<ProfileInfo>();
> > -    if (PI) {
> > -      PI->replaceAllUses(PredBB, DestBB);
> > -      PI->removeEdge(ProfileInfo::getEdge(PredBB, DestBB));
> > -    }
> >    }
> >    // Nuke BB.
> >    PredBB->eraseFromParent();
> >
> > Modified: llvm/trunk/test/lit.cfg
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/lit.cfg?rev=191835&r1=191834&r2=191835&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/lit.cfg (original)
> > +++ llvm/trunk/test/lit.cfg Wed Oct  2 10:42:23 2013
> > @@ -226,7 +226,6 @@ for pattern in [r"\bbugpoint\b(?!-)",
> >                  r"\bllvm-mc\b",
> >                  r"\bllvm-nm\b",
> >                  r"\bllvm-objdump\b",
> > -                r"\bllvm-prof\b",
> >                  r"\bllvm-ranlib\b",
> >                  r"\bllvm-readobj\b",
> >                  r"\bllvm-rtdyld\b",
> >
> > Modified: llvm/trunk/tools/CMakeLists.txt
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/CMakeLists.txt?rev=191835&r1=191834&r2=191835&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/tools/CMakeLists.txt (original)
> > +++ llvm/trunk/tools/CMakeLists.txt Wed Oct  2 10:42:23 2013
> > @@ -15,7 +15,6 @@ add_llvm_tool_subdirectory(llvm-nm)
> >  add_llvm_tool_subdirectory(llvm-size)
> >
> >  add_llvm_tool_subdirectory(llvm-cov)
> > -add_llvm_tool_subdirectory(llvm-prof)
> >  add_llvm_tool_subdirectory(llvm-link)
> >  add_llvm_tool_subdirectory(lli)
> >
> >
> > Modified: llvm/trunk/tools/LLVMBuild.txt
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/LLVMBuild.txt?rev=191835&r1=191834&r2=191835&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/tools/LLVMBuild.txt (original)
> > +++ llvm/trunk/tools/LLVMBuild.txt Wed Oct  2 10:42:23 2013
> > @@ -16,7 +16,7 @@
> >
>  ;===------------------------------------------------------------------------===;
> >
> >  [common]
> > -subdirectories = bugpoint llc lli llvm-ar llvm-as llvm-bcanalyzer
> llvm-cov llvm-diff llvm-dis llvm-dwarfdump llvm-extract llvm-jitlistener
> llvm-link llvm-lto llvm-mc llvm-nm llvm-objdump llvm-prof llvm-rtdyld
> llvm-size macho-dump opt llvm-mcmarkup
> > +subdirectories = bugpoint llc lli llvm-ar llvm-as llvm-bcanalyzer
> llvm-cov llvm-diff llvm-dis llvm-dwarfdump llvm-extract llvm-jitlistener
> llvm-link llvm-lto llvm-mc llvm-nm llvm-objdump llvm-rtdyld llvm-size
> macho-dump opt llvm-mcmarkup
> >
> >  [component_0]
> >  type = Group
> >
> > Modified: llvm/trunk/tools/Makefile
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/Makefile?rev=191835&r1=191834&r2=191835&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/tools/Makefile (original)
> > +++ llvm/trunk/tools/Makefile Wed Oct  2 10:42:23 2013
> > @@ -27,7 +27,7 @@ OPTIONAL_DIRS := lldb
> >  # large and three small executables. This is done to minimize memory
> load
> >  # in parallel builds.  Please retain this ordering.
> >  DIRS := llvm-config
> > -PARALLEL_DIRS := opt llvm-as llvm-dis llc llvm-ar llvm-nm llvm-prof
> llvm-link \
> > +PARALLEL_DIRS := opt llvm-as llvm-dis llc llvm-ar llvm-nm llvm-link \
> >                   lli llvm-extract llvm-mc bugpoint llvm-bcanalyzer
> llvm-diff \
> >                   macho-dump llvm-objdump llvm-readobj llvm-rtdyld \
> >                   llvm-dwarfdump llvm-cov llvm-size llvm-stress
> llvm-mcmarkup \
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



-- 
Alexey Samsonov, MSK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131004/e2adc7ed/attachment.html>


More information about the llvm-commits mailing list