Skip to content

Commit

Permalink
Port InstrProfiling pass to the new pass manager
Browse files Browse the repository at this point in the history
Differential Revision: http://reviews.llvm.org/D18126

llvm-svn: 266637
  • Loading branch information
david-xl committed Apr 18, 2016
1 parent 7deb1ac commit e6b8929
Show file tree
Hide file tree
Showing 14 changed files with 55 additions and 91 deletions.
2 changes: 1 addition & 1 deletion llvm/include/llvm/InitializePasses.h
Expand Up @@ -124,7 +124,7 @@ void initializeAAResultsWrapperPassPass(PassRegistry &);
void initializeGCOVProfilerPass(PassRegistry&);
void initializePGOInstrumentationGenPass(PassRegistry&);
void initializePGOInstrumentationUsePass(PassRegistry&);
void initializeInstrProfilingPass(PassRegistry&);
void initializeInstrProfilingLegacyPassPass(PassRegistry &);
void initializeAddressSanitizerPass(PassRegistry&);
void initializeAddressSanitizerModulePass(PassRegistry&);
void initializeMemorySanitizerPass(PassRegistry&);
Expand Down
2 changes: 1 addition & 1 deletion llvm/include/llvm/LinkAllPasses.h
Expand Up @@ -91,7 +91,7 @@ namespace {
(void) llvm::createGCOVProfilerPass();
(void) llvm::createPGOInstrumentationGenPass();
(void) llvm::createPGOInstrumentationUsePass();
(void) llvm::createInstrProfilingPass();
(void) llvm::createInstrProfilingLegacyPass();
(void) llvm::createFunctionImportPass();
(void) llvm::createFunctionInliningPass();
(void) llvm::createAlwaysInlinerPass();
Expand Down
2 changes: 1 addition & 1 deletion llvm/include/llvm/Transforms/Instrumentation.h
Expand Up @@ -96,7 +96,7 @@ struct InstrProfOptions {
};

/// Insert frontend instrumentation based profiling.
ModulePass *createInstrProfilingPass(
ModulePass *createInstrProfilingLegacyPass(
const InstrProfOptions &Options = InstrProfOptions());

// Insert AddressSanitizer (address sanity checking) instrumentation
Expand Down
1 change: 1 addition & 0 deletions llvm/lib/Passes/PassBuilder.cpp
Expand Up @@ -49,6 +49,7 @@
#include "llvm/Transforms/IPO/InferFunctionAttrs.h"
#include "llvm/Transforms/IPO/StripDeadPrototypes.h"
#include "llvm/Transforms/InstCombine/InstCombine.h"
#include "llvm/Transforms/InstrProfiling.h"
#include "llvm/Transforms/Scalar/ADCE.h"
#include "llvm/Transforms/Scalar/EarlyCSE.h"
#include "llvm/Transforms/Scalar/LowerExpectIntrinsic.h"
Expand Down
1 change: 1 addition & 0 deletions llvm/lib/Passes/PassRegistry.def
Expand Up @@ -37,6 +37,7 @@ MODULE_ALIAS_ANALYSIS("globals-aa", GlobalsAA())
#endif
MODULE_PASS("forceattrs", ForceFunctionAttrsPass())
MODULE_PASS("inferattrs", InferFunctionAttrsPass())
MODULE_PASS("instrprof", InstrProfiling())
MODULE_PASS("invalidate<all>", InvalidateAllAnalysesPass())
MODULE_PASS("no-op-module", NoOpModulePass())
MODULE_PASS("print", PrintModulePass(dbgs()))
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Transforms/IPO/PassManagerBuilder.cpp
Expand Up @@ -220,7 +220,7 @@ void PassManagerBuilder::addPGOInstrPasses(legacy::PassManagerBase &MPM) {
// Add the profile lowering pass.
InstrProfOptions Options;
Options.InstrProfileOutput = PGOInstrGen;
MPM.add(createInstrProfilingPass(Options));
MPM.add(createInstrProfilingLegacyPass(Options));
}
if (!PGOInstrUse.empty())
MPM.add(createPGOInstrumentationUsePass(PGOInstrUse));
Expand Down
127 changes: 41 additions & 86 deletions llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp
Expand Up @@ -18,7 +18,7 @@
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Module.h"
#include "llvm/ProfileData/InstrProf.h"
#include "llvm/Transforms/Instrumentation.h"
#include "llvm/Transforms/InstrProfiling.h"
#include "llvm/Transforms/Utils/ModuleUtils.h"

using namespace llvm;
Expand All @@ -31,113 +31,68 @@ cl::opt<bool> DoNameCompression("enable-name-compression",
cl::desc("Enable name string compression"),
cl::init(true));

class InstrProfiling : public ModulePass {
class InstrProfilingLegacyPass : public ModulePass {
InstrProfiling InstrProf;

public:
static char ID;

InstrProfiling() : ModulePass(ID) {}

InstrProfiling(const InstrProfOptions &Options)
: ModulePass(ID), Options(Options) {}

InstrProfilingLegacyPass() : ModulePass(ID), InstrProf() {}
InstrProfilingLegacyPass(const InstrProfOptions &Options)
: ModulePass(ID), InstrProf(Options) {}
const char *getPassName() const override {
return "Frontend instrumentation-based coverage lowering";
}

bool runOnModule(Module &M) override;
bool runOnModule(Module &M) override { return InstrProf.run(M); }

void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.setPreservesCFG();
}
};

private:
InstrProfOptions Options;
Module *M;
typedef struct PerFunctionProfileData {
uint32_t NumValueSites[IPVK_Last+1];
GlobalVariable* RegionCounters;
GlobalVariable* DataVar;
PerFunctionProfileData() : RegionCounters(nullptr), DataVar(nullptr) {
memset(NumValueSites, 0, sizeof(uint32_t) * (IPVK_Last+1));
}
} PerFunctionProfileData;
DenseMap<GlobalVariable *, PerFunctionProfileData> ProfileDataMap;
std::vector<Value *> UsedVars;
std::vector<GlobalVariable *> ReferencedNames;
GlobalVariable *NamesVar;
size_t NamesSize;

bool isMachO() const {
return Triple(M->getTargetTriple()).isOSBinFormatMachO();
}

/// Get the section name for the counter variables.
StringRef getCountersSection() const {
return getInstrProfCountersSectionName(isMachO());
}

/// Get the section name for the name variables.
StringRef getNameSection() const {
return getInstrProfNameSectionName(isMachO());
}

/// Get the section name for the profile data variables.
StringRef getDataSection() const {
return getInstrProfDataSectionName(isMachO());
}

/// Get the section name for the coverage mapping data.
StringRef getCoverageSection() const {
return getInstrProfCoverageSectionName(isMachO());
}

/// Count the number of instrumented value sites for the function.
void computeNumValueSiteCounts(InstrProfValueProfileInst *Ins);

/// Replace instrprof_value_profile with a call to runtime library.
void lowerValueProfileInst(InstrProfValueProfileInst *Ins);

/// Replace instrprof_increment with an increment of the appropriate value.
void lowerIncrement(InstrProfIncrementInst *Inc);

/// Force emitting of name vars for unused functions.
void lowerCoverageData(GlobalVariable *CoverageNamesVar);
} // anonymous namespace

/// Get the region counters for an increment, creating them if necessary.
///
/// If the counter array doesn't yet exist, the profile data variables
/// referring to them will also be created.
GlobalVariable *getOrCreateRegionCounters(InstrProfIncrementInst *Inc);
PreservedAnalyses InstrProfiling::run(Module &M, AnalysisManager<Module> &AM) {
if (!run(M))
return PreservedAnalyses::all();

/// Emit the section with compressed function names.
void emitNameData();
return PreservedAnalyses::none();
}

/// Emit runtime registration functions for each profile data variable.
void emitRegistration();
char InstrProfilingLegacyPass::ID = 0;
INITIALIZE_PASS(InstrProfilingLegacyPass, "instrprof",
"Frontend instrumentation-based coverage lowering.", false,
false)

/// Emit the necessary plumbing to pull in the runtime initialization.
void emitRuntimeHook();
ModulePass *llvm::createInstrProfilingLegacyPass(const InstrProfOptions &Options) {
return new InstrProfilingLegacyPass(Options);
}

/// Add uses of our data variables and runtime hook.
void emitUses();
bool InstrProfiling::isMachO() const {
return Triple(M->getTargetTriple()).isOSBinFormatMachO();
}

/// Create a static initializer for our data, on platforms that need it,
/// and for any profile output file that was specified.
void emitInitialization();
};
/// Get the section name for the counter variables.
StringRef InstrProfiling::getCountersSection() const {
return getInstrProfCountersSectionName(isMachO());
}

} // anonymous namespace
/// Get the section name for the name variables.
StringRef InstrProfiling::getNameSection() const {
return getInstrProfNameSectionName(isMachO());
}

char InstrProfiling::ID = 0;
INITIALIZE_PASS(InstrProfiling, "instrprof",
"Frontend instrumentation-based coverage lowering.", false,
false)
/// Get the section name for the profile data variables.
StringRef InstrProfiling::getDataSection() const {
return getInstrProfDataSectionName(isMachO());
}

ModulePass *llvm::createInstrProfilingPass(const InstrProfOptions &Options) {
return new InstrProfiling(Options);
/// Get the section name for the coverage mapping data.
StringRef InstrProfiling::getCoverageSection() const {
return getInstrProfCoverageSectionName(isMachO());
}

bool InstrProfiling::runOnModule(Module &M) {
bool InstrProfiling::run(Module &M) {
bool MadeChange = false;

this->M = &M;
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Transforms/Instrumentation/Instrumentation.cpp
Expand Up @@ -62,7 +62,7 @@ void llvm::initializeInstrumentation(PassRegistry &Registry) {
initializeGCOVProfilerPass(Registry);
initializePGOInstrumentationGenPass(Registry);
initializePGOInstrumentationUsePass(Registry);
initializeInstrProfilingPass(Registry);
initializeInstrProfilingLegacyPassPass(Registry);
initializeMemorySanitizerPass(Registry);
initializeThreadSanitizerPass(Registry);
initializeSanitizerCoverageModulePass(Registry);
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Instrumentation/InstrProfiling/PR23499.ll
Expand Up @@ -4,6 +4,7 @@

; RUN: opt < %s -mtriple=x86_64-apple-macosx10.10.0 -instrprof -S | FileCheck %s
; RUN: opt < %s -mtriple=x86_64-unknown-linux -instrprof -S | FileCheck %s
; RUN: opt < %s -mtriple=x86_64-unknown-linux -passes=instrprof -S | FileCheck %s
; RUN: opt < %s -mtriple=x86_64-pc-win32-coff -instrprof -S | FileCheck %s --check-prefix=COFF

$_Z3barIvEvv = comdat any
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/Instrumentation/InstrProfiling/linkage.ll
Expand Up @@ -2,6 +2,8 @@

; RUN: opt < %s -mtriple=x86_64-apple-macosx10.10.0 -instrprof -S | FileCheck %s --check-prefix=OTHER --check-prefix=COMMON
; RUN: opt < %s -mtriple=x86_64-unknown-linux -instrprof -S | FileCheck %s --check-prefix=LINUX --check-prefix=COMMON
; RUN: opt < %s -mtriple=x86_64-apple-macosx10.10.0 -passes=instrprof -S | FileCheck %s --check-prefix=OTHER --check-prefix=COMMON
; RUN: opt < %s -mtriple=x86_64-unknown-linux -passes=instrprof -S | FileCheck %s --check-prefix=LINUX --check-prefix=COMMON

@__profn_foo = hidden constant [3 x i8] c"foo"
@__profn_foo_weak = weak hidden constant [8 x i8] c"foo_weak"
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Instrumentation/InstrProfiling/no-counters.ll
@@ -1,6 +1,7 @@
;; No instrumentation should be emitted if there are no counter increments.

; RUN: opt < %s -instrprof -S | FileCheck %s
; RUN: opt < %s -passes=instrprof -S | FileCheck %s
; CHECK-NOT: @__profc
; CHECK-NOT: @__profd
; CHECK-NOT: @__llvm_profile_runtime
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Instrumentation/InstrProfiling/noruntime.ll
@@ -1,6 +1,7 @@
;; Check that we don't emit the runtime hooks if the user provided them.

; RUN: opt < %s -instrprof -S | FileCheck %s
; RUN: opt < %s -passes=instrprof -S | FileCheck %s
; CHECK-NOT: define {{.*}} @__llvm_profile_runtime_user()
; CHECK-NOT: load i32, i32* @__llvm_profile_runtime

Expand Down
1 change: 1 addition & 0 deletions llvm/test/Instrumentation/InstrProfiling/platform.ll
Expand Up @@ -2,6 +2,7 @@

; RUN: opt < %s -mtriple=x86_64-apple-macosx10.10.0 -instrprof -S | FileCheck %s -check-prefix=MACHO
; RUN: opt < %s -mtriple=x86_64-unknown-linux -instrprof -S | FileCheck %s -check-prefix=LINUX
; RUN: opt < %s -mtriple=x86_64-unknown-linux -passes=instrprof -S | FileCheck %s -check-prefix=LINUX
; RUN: opt < %s -mtriple=x86_64-unknown-freebsd -instrprof -S | FileCheck %s -check-prefix=FREEBSD
; RUN: opt < %s -mtriple=x86_64-scei-ps4 -instrprof -S | FileCheck %s -check-prefix=PS4
; RUN: opt < %s -mtriple=x86_64-pc-solaris -instrprof -S | FileCheck %s -check-prefix=SOLARIS
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Instrumentation/InstrProfiling/profiling.ll
@@ -1,4 +1,5 @@
; RUN: opt < %s -instrprof -S | FileCheck %s
; RUN: opt < %s -passes=instrprof -S | FileCheck %s

target triple = "x86_64-apple-macosx10.10.0"

Expand Down

0 comments on commit e6b8929

Please sign in to comment.