Refactor optimization pass handling.
Refactor the optimization passes to explicitly use the passes. This commit just re-implements the same passes as were already being run. It also adds an option (behind `-Z`) to run the LLVM lint pass on the unoptimized IR.
This commit is contained in:
parent
e3d0c1eb0e
commit
d694e283b3
11 changed files with 716 additions and 98 deletions
160
src/rustllvm/PassWrapper.cpp
Normal file
160
src/rustllvm/PassWrapper.cpp
Normal file
|
@ -0,0 +1,160 @@
|
|||
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#include "rustllvm.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
// Pass conversion fns
|
||||
typedef struct LLVMOpaquePass *LLVMPassRef;
|
||||
|
||||
inline Pass *unwrap(LLVMPassRef P) {
|
||||
return reinterpret_cast<Pass*>(P);
|
||||
}
|
||||
|
||||
inline LLVMPassRef wrap(const Pass *P) {
|
||||
return reinterpret_cast<LLVMPassRef>(const_cast<Pass*>(P));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
inline T *unwrap(LLVMPassRef P) {
|
||||
T *Q = (T*)unwrap(P);
|
||||
assert(Q && "Invalid cast!");
|
||||
return Q;
|
||||
}
|
||||
|
||||
#define WRAP_PASS(name) \
|
||||
extern "C" LLVMPassRef LLVMCreate##name##Pass() { \
|
||||
return wrap(llvm::create##name##Pass()); \
|
||||
}
|
||||
|
||||
extern "C" void LLVMAddPass(LLVMPassManagerRef PM, LLVMPassRef P) {
|
||||
PassManagerBase * pm = unwrap(PM);
|
||||
Pass * p = unwrap(P);
|
||||
|
||||
pm->add(p);
|
||||
}
|
||||
|
||||
////////////////
|
||||
// Transforms //
|
||||
// /////////////
|
||||
|
||||
// IPO Passes
|
||||
WRAP_PASS(StripSymbols)
|
||||
WRAP_PASS(StripNonDebugSymbols)
|
||||
WRAP_PASS(StripDebugDeclare)
|
||||
WRAP_PASS(StripDeadDebugInfo)
|
||||
WRAP_PASS(ConstantMerge)
|
||||
WRAP_PASS(GlobalOptimizer)
|
||||
WRAP_PASS(GlobalDCE)
|
||||
WRAP_PASS(AlwaysInliner)
|
||||
WRAP_PASS(PruneEH)
|
||||
WRAP_PASS(Internalize)
|
||||
WRAP_PASS(DeadArgElimination)
|
||||
WRAP_PASS(DeadArgHacking)
|
||||
WRAP_PASS(ArgumentPromotion)
|
||||
WRAP_PASS(IPConstantPropagation)
|
||||
WRAP_PASS(IPSCCP)
|
||||
WRAP_PASS(LoopExtractor)
|
||||
WRAP_PASS(SingleLoopExtractor)
|
||||
WRAP_PASS(BlockExtractor)
|
||||
WRAP_PASS(StripDeadPrototypes)
|
||||
WRAP_PASS(FunctionAttrs)
|
||||
WRAP_PASS(MergeFunctions)
|
||||
WRAP_PASS(PartialInlining)
|
||||
WRAP_PASS(MetaRenamer)
|
||||
WRAP_PASS(BarrierNoop)
|
||||
|
||||
extern "C" LLVMPassRef LLVMCreateFunctionInliningPass(int Threshold) {
|
||||
return wrap(llvm::createFunctionInliningPass(Threshold));
|
||||
}
|
||||
|
||||
// Instrumentation Passes
|
||||
WRAP_PASS(EdgeProfiler)
|
||||
WRAP_PASS(OptimalEdgeProfiler)
|
||||
WRAP_PASS(PathProfiler)
|
||||
WRAP_PASS(GCOVProfiler)
|
||||
WRAP_PASS(BoundsChecking)
|
||||
|
||||
// Scalar Passes
|
||||
WRAP_PASS(ConstantPropagation)
|
||||
WRAP_PASS(SCCP)
|
||||
WRAP_PASS(DeadInstElimination)
|
||||
WRAP_PASS(DeadCodeElimination)
|
||||
WRAP_PASS(DeadStoreElimination)
|
||||
WRAP_PASS(AggressiveDCE)
|
||||
WRAP_PASS(SROA)
|
||||
WRAP_PASS(ScalarReplAggregates)
|
||||
WRAP_PASS(IndVarSimplify)
|
||||
WRAP_PASS(InstructionCombining)
|
||||
WRAP_PASS(LICM)
|
||||
WRAP_PASS(LoopStrengthReduce)
|
||||
WRAP_PASS(GlobalMerge)
|
||||
WRAP_PASS(LoopUnswitch)
|
||||
WRAP_PASS(LoopInstSimplify)
|
||||
WRAP_PASS(LoopUnroll)
|
||||
WRAP_PASS(LoopRotate)
|
||||
WRAP_PASS(LoopIdiom)
|
||||
WRAP_PASS(PromoteMemoryToRegister)
|
||||
WRAP_PASS(DemoteRegisterToMemory)
|
||||
WRAP_PASS(Reassociate)
|
||||
WRAP_PASS(JumpThreading)
|
||||
WRAP_PASS(CFGSimplification)
|
||||
WRAP_PASS(BreakCriticalEdges)
|
||||
WRAP_PASS(LoopSimplify)
|
||||
WRAP_PASS(TailCallElimination)
|
||||
WRAP_PASS(LowerSwitch)
|
||||
WRAP_PASS(LowerInvoke)
|
||||
WRAP_PASS(BlockPlacement)
|
||||
WRAP_PASS(LCSSA)
|
||||
WRAP_PASS(EarlyCSE)
|
||||
WRAP_PASS(GVN)
|
||||
WRAP_PASS(MemCpyOpt)
|
||||
WRAP_PASS(LoopDeletion)
|
||||
WRAP_PASS(SimplifyLibCalls)
|
||||
WRAP_PASS(CodeGenPrepare)
|
||||
WRAP_PASS(InstructionNamer)
|
||||
WRAP_PASS(Sinking)
|
||||
WRAP_PASS(LowerAtomic)
|
||||
WRAP_PASS(CorrelatedValuePropagation)
|
||||
WRAP_PASS(InstructionSimplifier)
|
||||
WRAP_PASS(LowerExpectIntrinsic)
|
||||
|
||||
// Vectorize Passes
|
||||
WRAP_PASS(BBVectorize)
|
||||
WRAP_PASS(LoopVectorize)
|
||||
|
||||
//////////////
|
||||
// Analyses //
|
||||
//////////////
|
||||
|
||||
WRAP_PASS(GlobalsModRef)
|
||||
WRAP_PASS(AliasAnalysisCounter)
|
||||
WRAP_PASS(AAEval)
|
||||
WRAP_PASS(NoAA)
|
||||
WRAP_PASS(BasicAliasAnalysis)
|
||||
WRAP_PASS(ScalarEvolutionAliasAnalysis)
|
||||
WRAP_PASS(TypeBasedAliasAnalysis)
|
||||
WRAP_PASS(ProfileLoader)
|
||||
WRAP_PASS(ProfileMetadataLoader)
|
||||
WRAP_PASS(NoProfileInfo)
|
||||
WRAP_PASS(ProfileEstimator)
|
||||
WRAP_PASS(ProfileVerifier)
|
||||
WRAP_PASS(PathProfileLoader)
|
||||
WRAP_PASS(NoPathProfileInfo)
|
||||
WRAP_PASS(PathProfileVerifier)
|
||||
WRAP_PASS(LazyValueInfo)
|
||||
WRAP_PASS(DependenceAnalysis)
|
||||
WRAP_PASS(CostModelAnalysis)
|
||||
WRAP_PASS(InstCount)
|
||||
WRAP_PASS(RegionInfo)
|
||||
WRAP_PASS(ModuleDebugInfoPrinter)
|
||||
WRAP_PASS(Lint)
|
||||
WRAP_PASS(Verifier)
|
Loading…
Add table
Add a link
Reference in a new issue