llvm-6502/lib/Analysis/ProfileInfo.cpp
Devang Patel 3e15bf33e0 Use 'static const char' instead of 'static const int'.
Due to darwin gcc bug, one version of darwin linker coalesces
static const int, which defauts PassID based pass identification.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36652 91177308-0d34-0410-b5e6-96231b3b80d8
2007-05-02 21:39:20 +00:00

103 lines
3.5 KiB
C++

//===- ProfileInfo.cpp - Profile Info Interface ---------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file was developed by the LLVM research group and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file implements the abstract ProfileInfo interface, and the default
// "no profile" implementation.
//
//===----------------------------------------------------------------------===//
#include "llvm/Analysis/Passes.h"
#include "llvm/Analysis/ProfileInfo.h"
#include "llvm/Pass.h"
#include "llvm/Support/CFG.h"
#include "llvm/Support/Compiler.h"
#include <set>
using namespace llvm;
// Register the ProfileInfo interface, providing a nice name to refer to.
namespace {
RegisterAnalysisGroup<ProfileInfo> Z("Profile Information");
}
const char ProfileInfo::ID = 0;
ProfileInfo::~ProfileInfo() {}
unsigned ProfileInfo::getExecutionCount(BasicBlock *BB) const {
pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
// Are there zero predecessors of this block?
if (PI == PE) {
// If this is the entry block, look for the Null -> Entry edge.
if (BB == &BB->getParent()->getEntryBlock())
return getEdgeWeight(0, BB);
else
return 0; // Otherwise, this is a dead block.
}
// Otherwise, if there are predecessors, the execution count of this block is
// the sum of the edge frequencies from the incoming edges. Note that if
// there are multiple edges from a predecessor to this block that we don't
// want to count its weight multiple times. For this reason, we keep track of
// the predecessors we've seen and only count them if we haven't run into them
// yet.
//
// We don't want to create an std::set unless we are dealing with a block that
// has a LARGE number of in-edges. Handle the common case of having only a
// few in-edges with special code.
//
BasicBlock *FirstPred = *PI;
unsigned Count = getEdgeWeight(FirstPred, BB);
++PI;
if (PI == PE) return Count; // Quick exit for single predecessor blocks
BasicBlock *SecondPred = *PI;
if (SecondPred != FirstPred) Count += getEdgeWeight(SecondPred, BB);
++PI;
if (PI == PE) return Count; // Quick exit for two predecessor blocks
BasicBlock *ThirdPred = *PI;
if (ThirdPred != FirstPred && ThirdPred != SecondPred)
Count += getEdgeWeight(ThirdPred, BB);
++PI;
if (PI == PE) return Count; // Quick exit for three predecessor blocks
std::set<BasicBlock*> ProcessedPreds;
ProcessedPreds.insert(FirstPred);
ProcessedPreds.insert(SecondPred);
ProcessedPreds.insert(ThirdPred);
for (; PI != PE; ++PI)
if (ProcessedPreds.insert(*PI).second)
Count += getEdgeWeight(*PI, BB);
return Count;
}
//===----------------------------------------------------------------------===//
// NoProfile ProfileInfo implementation
//
namespace {
struct VISIBILITY_HIDDEN NoProfileInfo
: public ImmutablePass, public ProfileInfo {
static const char ID; // Class identification, replacement for typeinfo
NoProfileInfo() : ImmutablePass((intptr_t)&ID) {}
};
const char NoProfileInfo::ID = 0;
// Register this pass...
RegisterPass<NoProfileInfo>
X("no-profile", "No Profile Information");
// Declare that we implement the ProfileInfo interface
RegisterAnalysisGroup<ProfileInfo, true> Y(X);
} // End of anonymous namespace
ImmutablePass *llvm::createNoProfileInfoPass() { return new NoProfileInfo(); }