mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[PGO] Control Height Reduction
Summary: Control height reduction merges conditional blocks of code and reduces the number of conditional branches in the hot path based on profiles. if (hot_cond1) { // Likely true. do_stg_hot1(); } if (hot_cond2) { // Likely true. do_stg_hot2(); } -> if (hot_cond1 && hot_cond2) { // Hot path. do_stg_hot1(); do_stg_hot2(); } else { // Cold path. if (hot_cond1) { do_stg_hot1(); } if (hot_cond2) { do_stg_hot2(); } } This speeds up some internal benchmarks up to ~30%. Reviewers: davidxl Reviewed By: davidxl Subscribers: xbolva00, dmgreen, mehdi_amini, llvm-commits, mgorny Differential Revision: https://reviews.llvm.org/D50591 llvm-svn: 341386
This commit is contained in:
parent
e97aca491d
commit
a56dc5d07f
@ -103,6 +103,7 @@ void initializeCodeGenPreparePass(PassRegistry&);
|
||||
void initializeConstantHoistingLegacyPassPass(PassRegistry&);
|
||||
void initializeConstantMergeLegacyPassPass(PassRegistry&);
|
||||
void initializeConstantPropagationPass(PassRegistry&);
|
||||
void initializeControlHeightReductionLegacyPassPass(PassRegistry&);
|
||||
void initializeCorrelatedValuePropagationPass(PassRegistry&);
|
||||
void initializeCostModelAnalysisPass(PassRegistry&);
|
||||
void initializeCrossDSOCFIPass(PassRegistry&);
|
||||
|
@ -88,6 +88,7 @@ namespace {
|
||||
(void) llvm::createCalledValuePropagationPass();
|
||||
(void) llvm::createConstantMergePass();
|
||||
(void) llvm::createConstantPropagationPass();
|
||||
(void) llvm::createControlHeightReductionLegacyPass();
|
||||
(void) llvm::createCostModelAnalysisPass();
|
||||
(void) llvm::createDeadArgEliminationPass();
|
||||
(void) llvm::createDeadCodeEliminationPass();
|
||||
|
@ -0,0 +1,32 @@
|
||||
//===- ControlHeightReduction.h - Control Height Reduction ------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This pass merges conditional blocks of code and reduces the number of
|
||||
// conditional branches in the hot paths based on profiles.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_INSTRUMENTATION_CONTROLHEIGHTREDUCTION_H
|
||||
#define LLVM_TRANSFORMS_INSTRUMENTATION_CONTROLHEIGHTREDUCTION_H
|
||||
|
||||
#include "llvm/Analysis/LoopInfo.h"
|
||||
#include "llvm/IR/PassManager.h"
|
||||
#include "llvm/Transforms/Scalar/LoopPassManager.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class ControlHeightReductionPass :
|
||||
public PassInfoMixin<ControlHeightReductionPass> {
|
||||
public:
|
||||
ControlHeightReductionPass();
|
||||
PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM);
|
||||
};
|
||||
} // end namespace llvm
|
||||
|
||||
#endif // LLVM_TRANSFORMS_INSTRUMENTATION_CONTROLHEIGHTREDUCTION_H
|
@ -113,6 +113,13 @@ extern char &LoopSimplifyID;
|
||||
/// This function returns a new pass that downgrades the debug info in the
|
||||
/// module to line tables only.
|
||||
ModulePass *createStripNonLineTableDebugInfoPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// ControlHeightReudction - Merges conditional blocks of code and reduces the
|
||||
// number of conditional branches in the hot paths based on profiles.
|
||||
//
|
||||
FunctionPass *createControlHeightReductionLegacyPass();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -87,6 +87,7 @@
|
||||
#include "llvm/Transforms/IPO/WholeProgramDevirt.h"
|
||||
#include "llvm/Transforms/InstCombine/InstCombine.h"
|
||||
#include "llvm/Transforms/Instrumentation/BoundsChecking.h"
|
||||
#include "llvm/Transforms/Instrumentation/ControlHeightReduction.h"
|
||||
#include "llvm/Transforms/Instrumentation/GCOVProfiler.h"
|
||||
#include "llvm/Transforms/Instrumentation/InstrProfiling.h"
|
||||
#include "llvm/Transforms/Instrumentation/PGOInstrumentation.h"
|
||||
@ -193,6 +194,10 @@ static cl::opt<bool> EnableSyntheticCounts(
|
||||
static Regex DefaultAliasRegex(
|
||||
"^(default|thinlto-pre-link|thinlto|lto-pre-link|lto)<(O[0123sz])>$");
|
||||
|
||||
static cl::opt<bool>
|
||||
EnableCHR("enable-chr-npm", cl::init(true), cl::Hidden,
|
||||
cl::desc("Enable control height reduction optimization (CHR)"));
|
||||
|
||||
static bool isOptimizingForSize(PassBuilder::OptimizationLevel Level) {
|
||||
switch (Level) {
|
||||
case PassBuilder::O0:
|
||||
@ -486,6 +491,10 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
|
||||
FPM.addPass(InstCombinePass());
|
||||
invokePeepholeEPCallbacks(FPM, Level);
|
||||
|
||||
if (EnableCHR && Level == O3 && PGOOpt &&
|
||||
(!PGOOpt->ProfileUseFile.empty() || !PGOOpt->SampleProfileFile.empty()))
|
||||
FPM.addPass(ControlHeightReductionPass());
|
||||
|
||||
return FPM;
|
||||
}
|
||||
|
||||
|
@ -148,6 +148,7 @@ FUNCTION_PASS("bounds-checking", BoundsCheckingPass())
|
||||
FUNCTION_PASS("break-crit-edges", BreakCriticalEdgesPass())
|
||||
FUNCTION_PASS("callsite-splitting", CallSiteSplittingPass())
|
||||
FUNCTION_PASS("consthoist", ConstantHoistingPass())
|
||||
FUNCTION_PASS("chr", ControlHeightReductionPass())
|
||||
FUNCTION_PASS("correlated-propagation", CorrelatedValuePropagationPass())
|
||||
FUNCTION_PASS("dce", DCEPass())
|
||||
FUNCTION_PASS("div-rem-pairs", DivRemPairsPass())
|
||||
|
@ -152,6 +152,10 @@ static cl::opt<bool> EnableGVNSink(
|
||||
"enable-gvn-sink", cl::init(false), cl::Hidden,
|
||||
cl::desc("Enable the GVN sinking pass (default = off)"));
|
||||
|
||||
static cl::opt<bool>
|
||||
EnableCHR("enable-chr", cl::init(true), cl::Hidden,
|
||||
cl::desc("Enable control height reduction optimization (CHR)"));
|
||||
|
||||
PassManagerBuilder::PassManagerBuilder() {
|
||||
OptLevel = 2;
|
||||
SizeLevel = 0;
|
||||
@ -411,6 +415,10 @@ void PassManagerBuilder::addFunctionSimplificationPasses(
|
||||
// Clean up after everything.
|
||||
addInstructionCombiningPass(MPM);
|
||||
addExtensionsToPM(EP_Peephole, MPM);
|
||||
|
||||
if (EnableCHR && OptLevel >= 3 &&
|
||||
(!PGOInstrUse.empty() || !PGOSampleUse.empty()))
|
||||
MPM.add(createControlHeightReductionLegacyPass());
|
||||
}
|
||||
|
||||
void PassManagerBuilder::populateModulePassManager(
|
||||
|
@ -2,6 +2,7 @@ add_llvm_library(LLVMInstrumentation
|
||||
AddressSanitizer.cpp
|
||||
BoundsChecking.cpp
|
||||
CGProfile.cpp
|
||||
ControlHeightReduction.cpp
|
||||
DataFlowSanitizer.cpp
|
||||
GCOVProfiling.cpp
|
||||
MemorySanitizer.cpp
|
||||
|
2010
lib/Transforms/Instrumentation/ControlHeightReduction.cpp
Normal file
2010
lib/Transforms/Instrumentation/ControlHeightReduction.cpp
Normal file
File diff suppressed because it is too large
Load Diff
@ -59,6 +59,7 @@ void llvm::initializeInstrumentation(PassRegistry &Registry) {
|
||||
initializeAddressSanitizerPass(Registry);
|
||||
initializeAddressSanitizerModulePass(Registry);
|
||||
initializeBoundsCheckingLegacyPassPass(Registry);
|
||||
initializeControlHeightReductionLegacyPassPass(Registry);
|
||||
initializeGCOVProfilerLegacyPassPass(Registry);
|
||||
initializePGOInstrumentationGenLegacyPassPass(Registry);
|
||||
initializePGOInstrumentationUseLegacyPassPass(Registry);
|
||||
|
1912
test/Transforms/PGOProfile/chr.ll
Normal file
1912
test/Transforms/PGOProfile/chr.ll
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user