mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
Port InstrProfiling pass to the new pass manager
Differential Revision: http://reviews.llvm.org/D18126 llvm-svn: 266637
This commit is contained in:
parent
3b3d060fd0
commit
8a449b13f6
@ -124,7 +124,7 @@ void initializeAAResultsWrapperPassPass(PassRegistry &);
|
|||||||
void initializeGCOVProfilerPass(PassRegistry&);
|
void initializeGCOVProfilerPass(PassRegistry&);
|
||||||
void initializePGOInstrumentationGenPass(PassRegistry&);
|
void initializePGOInstrumentationGenPass(PassRegistry&);
|
||||||
void initializePGOInstrumentationUsePass(PassRegistry&);
|
void initializePGOInstrumentationUsePass(PassRegistry&);
|
||||||
void initializeInstrProfilingPass(PassRegistry&);
|
void initializeInstrProfilingLegacyPassPass(PassRegistry &);
|
||||||
void initializeAddressSanitizerPass(PassRegistry&);
|
void initializeAddressSanitizerPass(PassRegistry&);
|
||||||
void initializeAddressSanitizerModulePass(PassRegistry&);
|
void initializeAddressSanitizerModulePass(PassRegistry&);
|
||||||
void initializeMemorySanitizerPass(PassRegistry&);
|
void initializeMemorySanitizerPass(PassRegistry&);
|
||||||
|
@ -91,7 +91,7 @@ namespace {
|
|||||||
(void) llvm::createGCOVProfilerPass();
|
(void) llvm::createGCOVProfilerPass();
|
||||||
(void) llvm::createPGOInstrumentationGenPass();
|
(void) llvm::createPGOInstrumentationGenPass();
|
||||||
(void) llvm::createPGOInstrumentationUsePass();
|
(void) llvm::createPGOInstrumentationUsePass();
|
||||||
(void) llvm::createInstrProfilingPass();
|
(void) llvm::createInstrProfilingLegacyPass();
|
||||||
(void) llvm::createFunctionImportPass();
|
(void) llvm::createFunctionImportPass();
|
||||||
(void) llvm::createFunctionInliningPass();
|
(void) llvm::createFunctionInliningPass();
|
||||||
(void) llvm::createAlwaysInlinerPass();
|
(void) llvm::createAlwaysInlinerPass();
|
||||||
|
@ -96,7 +96,7 @@ struct InstrProfOptions {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/// Insert frontend instrumentation based profiling.
|
/// Insert frontend instrumentation based profiling.
|
||||||
ModulePass *createInstrProfilingPass(
|
ModulePass *createInstrProfilingLegacyPass(
|
||||||
const InstrProfOptions &Options = InstrProfOptions());
|
const InstrProfOptions &Options = InstrProfOptions());
|
||||||
|
|
||||||
// Insert AddressSanitizer (address sanity checking) instrumentation
|
// Insert AddressSanitizer (address sanity checking) instrumentation
|
||||||
|
@ -49,6 +49,7 @@
|
|||||||
#include "llvm/Transforms/IPO/InferFunctionAttrs.h"
|
#include "llvm/Transforms/IPO/InferFunctionAttrs.h"
|
||||||
#include "llvm/Transforms/IPO/StripDeadPrototypes.h"
|
#include "llvm/Transforms/IPO/StripDeadPrototypes.h"
|
||||||
#include "llvm/Transforms/InstCombine/InstCombine.h"
|
#include "llvm/Transforms/InstCombine/InstCombine.h"
|
||||||
|
#include "llvm/Transforms/InstrProfiling.h"
|
||||||
#include "llvm/Transforms/Scalar/ADCE.h"
|
#include "llvm/Transforms/Scalar/ADCE.h"
|
||||||
#include "llvm/Transforms/Scalar/EarlyCSE.h"
|
#include "llvm/Transforms/Scalar/EarlyCSE.h"
|
||||||
#include "llvm/Transforms/Scalar/LowerExpectIntrinsic.h"
|
#include "llvm/Transforms/Scalar/LowerExpectIntrinsic.h"
|
||||||
|
@ -37,6 +37,7 @@ MODULE_ALIAS_ANALYSIS("globals-aa", GlobalsAA())
|
|||||||
#endif
|
#endif
|
||||||
MODULE_PASS("forceattrs", ForceFunctionAttrsPass())
|
MODULE_PASS("forceattrs", ForceFunctionAttrsPass())
|
||||||
MODULE_PASS("inferattrs", InferFunctionAttrsPass())
|
MODULE_PASS("inferattrs", InferFunctionAttrsPass())
|
||||||
|
MODULE_PASS("instrprof", InstrProfiling())
|
||||||
MODULE_PASS("invalidate<all>", InvalidateAllAnalysesPass())
|
MODULE_PASS("invalidate<all>", InvalidateAllAnalysesPass())
|
||||||
MODULE_PASS("no-op-module", NoOpModulePass())
|
MODULE_PASS("no-op-module", NoOpModulePass())
|
||||||
MODULE_PASS("print", PrintModulePass(dbgs()))
|
MODULE_PASS("print", PrintModulePass(dbgs()))
|
||||||
|
@ -220,7 +220,7 @@ void PassManagerBuilder::addPGOInstrPasses(legacy::PassManagerBase &MPM) {
|
|||||||
// Add the profile lowering pass.
|
// Add the profile lowering pass.
|
||||||
InstrProfOptions Options;
|
InstrProfOptions Options;
|
||||||
Options.InstrProfileOutput = PGOInstrGen;
|
Options.InstrProfileOutput = PGOInstrGen;
|
||||||
MPM.add(createInstrProfilingPass(Options));
|
MPM.add(createInstrProfilingLegacyPass(Options));
|
||||||
}
|
}
|
||||||
if (!PGOInstrUse.empty())
|
if (!PGOInstrUse.empty())
|
||||||
MPM.add(createPGOInstrumentationUsePass(PGOInstrUse));
|
MPM.add(createPGOInstrumentationUsePass(PGOInstrUse));
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
#include "llvm/IR/IntrinsicInst.h"
|
#include "llvm/IR/IntrinsicInst.h"
|
||||||
#include "llvm/IR/Module.h"
|
#include "llvm/IR/Module.h"
|
||||||
#include "llvm/ProfileData/InstrProf.h"
|
#include "llvm/ProfileData/InstrProf.h"
|
||||||
#include "llvm/Transforms/Instrumentation.h"
|
#include "llvm/Transforms/InstrProfiling.h"
|
||||||
#include "llvm/Transforms/Utils/ModuleUtils.h"
|
#include "llvm/Transforms/Utils/ModuleUtils.h"
|
||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
@ -31,113 +31,68 @@ cl::opt<bool> DoNameCompression("enable-name-compression",
|
|||||||
cl::desc("Enable name string compression"),
|
cl::desc("Enable name string compression"),
|
||||||
cl::init(true));
|
cl::init(true));
|
||||||
|
|
||||||
class InstrProfiling : public ModulePass {
|
class InstrProfilingLegacyPass : public ModulePass {
|
||||||
|
InstrProfiling InstrProf;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static char ID;
|
static char ID;
|
||||||
|
InstrProfilingLegacyPass() : ModulePass(ID), InstrProf() {}
|
||||||
InstrProfiling() : ModulePass(ID) {}
|
InstrProfilingLegacyPass(const InstrProfOptions &Options)
|
||||||
|
: ModulePass(ID), InstrProf(Options) {}
|
||||||
InstrProfiling(const InstrProfOptions &Options)
|
|
||||||
: ModulePass(ID), Options(Options) {}
|
|
||||||
|
|
||||||
const char *getPassName() const override {
|
const char *getPassName() const override {
|
||||||
return "Frontend instrumentation-based coverage lowering";
|
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 {
|
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||||
AU.setPreservesCFG();
|
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);
|
|
||||||
|
|
||||||
/// 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);
|
|
||||||
|
|
||||||
/// Emit the section with compressed function names.
|
|
||||||
void emitNameData();
|
|
||||||
|
|
||||||
/// Emit runtime registration functions for each profile data variable.
|
|
||||||
void emitRegistration();
|
|
||||||
|
|
||||||
/// Emit the necessary plumbing to pull in the runtime initialization.
|
|
||||||
void emitRuntimeHook();
|
|
||||||
|
|
||||||
/// Add uses of our data variables and runtime hook.
|
|
||||||
void emitUses();
|
|
||||||
|
|
||||||
/// Create a static initializer for our data, on platforms that need it,
|
|
||||||
/// and for any profile output file that was specified.
|
|
||||||
void emitInitialization();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // anonymous namespace
|
} // anonymous namespace
|
||||||
|
|
||||||
char InstrProfiling::ID = 0;
|
PreservedAnalyses InstrProfiling::run(Module &M, AnalysisManager<Module> &AM) {
|
||||||
INITIALIZE_PASS(InstrProfiling, "instrprof",
|
if (!run(M))
|
||||||
|
return PreservedAnalyses::all();
|
||||||
|
|
||||||
|
return PreservedAnalyses::none();
|
||||||
|
}
|
||||||
|
|
||||||
|
char InstrProfilingLegacyPass::ID = 0;
|
||||||
|
INITIALIZE_PASS(InstrProfilingLegacyPass, "instrprof",
|
||||||
"Frontend instrumentation-based coverage lowering.", false,
|
"Frontend instrumentation-based coverage lowering.", false,
|
||||||
false)
|
false)
|
||||||
|
|
||||||
ModulePass *llvm::createInstrProfilingPass(const InstrProfOptions &Options) {
|
ModulePass *llvm::createInstrProfilingLegacyPass(const InstrProfOptions &Options) {
|
||||||
return new InstrProfiling(Options);
|
return new InstrProfilingLegacyPass(Options);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InstrProfiling::runOnModule(Module &M) {
|
bool InstrProfiling::isMachO() const {
|
||||||
|
return Triple(M->getTargetTriple()).isOSBinFormatMachO();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get the section name for the counter variables.
|
||||||
|
StringRef InstrProfiling::getCountersSection() const {
|
||||||
|
return getInstrProfCountersSectionName(isMachO());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get the section name for the name variables.
|
||||||
|
StringRef InstrProfiling::getNameSection() const {
|
||||||
|
return getInstrProfNameSectionName(isMachO());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get the section name for the profile data variables.
|
||||||
|
StringRef InstrProfiling::getDataSection() const {
|
||||||
|
return getInstrProfDataSectionName(isMachO());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get the section name for the coverage mapping data.
|
||||||
|
StringRef InstrProfiling::getCoverageSection() const {
|
||||||
|
return getInstrProfCoverageSectionName(isMachO());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InstrProfiling::run(Module &M) {
|
||||||
bool MadeChange = false;
|
bool MadeChange = false;
|
||||||
|
|
||||||
this->M = &M;
|
this->M = &M;
|
||||||
|
@ -62,7 +62,7 @@ void llvm::initializeInstrumentation(PassRegistry &Registry) {
|
|||||||
initializeGCOVProfilerPass(Registry);
|
initializeGCOVProfilerPass(Registry);
|
||||||
initializePGOInstrumentationGenPass(Registry);
|
initializePGOInstrumentationGenPass(Registry);
|
||||||
initializePGOInstrumentationUsePass(Registry);
|
initializePGOInstrumentationUsePass(Registry);
|
||||||
initializeInstrProfilingPass(Registry);
|
initializeInstrProfilingLegacyPassPass(Registry);
|
||||||
initializeMemorySanitizerPass(Registry);
|
initializeMemorySanitizerPass(Registry);
|
||||||
initializeThreadSanitizerPass(Registry);
|
initializeThreadSanitizerPass(Registry);
|
||||||
initializeSanitizerCoverageModulePass(Registry);
|
initializeSanitizerCoverageModulePass(Registry);
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
; RUN: opt < %s -mtriple=x86_64-apple-macosx10.10.0 -instrprof -S | FileCheck %s
|
; 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 -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
|
; RUN: opt < %s -mtriple=x86_64-pc-win32-coff -instrprof -S | FileCheck %s --check-prefix=COFF
|
||||||
|
|
||||||
$_Z3barIvEvv = comdat any
|
$_Z3barIvEvv = comdat any
|
||||||
|
@ -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-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-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 = hidden constant [3 x i8] c"foo"
|
||||||
@__profn_foo_weak = weak hidden constant [8 x i8] c"foo_weak"
|
@__profn_foo_weak = weak hidden constant [8 x i8] c"foo_weak"
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
;; No instrumentation should be emitted if there are no counter increments.
|
;; No instrumentation should be emitted if there are no counter increments.
|
||||||
|
|
||||||
; RUN: opt < %s -instrprof -S | FileCheck %s
|
; RUN: opt < %s -instrprof -S | FileCheck %s
|
||||||
|
; RUN: opt < %s -passes=instrprof -S | FileCheck %s
|
||||||
; CHECK-NOT: @__profc
|
; CHECK-NOT: @__profc
|
||||||
; CHECK-NOT: @__profd
|
; CHECK-NOT: @__profd
|
||||||
; CHECK-NOT: @__llvm_profile_runtime
|
; CHECK-NOT: @__llvm_profile_runtime
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
;; Check that we don't emit the runtime hooks if the user provided them.
|
;; Check that we don't emit the runtime hooks if the user provided them.
|
||||||
|
|
||||||
; RUN: opt < %s -instrprof -S | FileCheck %s
|
; RUN: opt < %s -instrprof -S | FileCheck %s
|
||||||
|
; RUN: opt < %s -passes=instrprof -S | FileCheck %s
|
||||||
; CHECK-NOT: define {{.*}} @__llvm_profile_runtime_user()
|
; CHECK-NOT: define {{.*}} @__llvm_profile_runtime_user()
|
||||||
; CHECK-NOT: load i32, i32* @__llvm_profile_runtime
|
; CHECK-NOT: load i32, i32* @__llvm_profile_runtime
|
||||||
|
|
||||||
|
@ -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-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 -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-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-scei-ps4 -instrprof -S | FileCheck %s -check-prefix=PS4
|
||||||
; RUN: opt < %s -mtriple=x86_64-pc-solaris -instrprof -S | FileCheck %s -check-prefix=SOLARIS
|
; RUN: opt < %s -mtriple=x86_64-pc-solaris -instrprof -S | FileCheck %s -check-prefix=SOLARIS
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
; RUN: opt < %s -instrprof -S | FileCheck %s
|
; RUN: opt < %s -instrprof -S | FileCheck %s
|
||||||
|
; RUN: opt < %s -passes=instrprof -S | FileCheck %s
|
||||||
|
|
||||||
target triple = "x86_64-apple-macosx10.10.0"
|
target triple = "x86_64-apple-macosx10.10.0"
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user