Skip to content

Commit

Permalink
[utils/llvm] Switch compilation pipeline to new pass manager
Browse files Browse the repository at this point in the history
  • Loading branch information
yuyichao committed Mar 14, 2024
1 parent 77cb2fd commit 8ad6bc7
Show file tree
Hide file tree
Showing 3 changed files with 198 additions and 2 deletions.
169 changes: 167 additions & 2 deletions lib/nacs-utils/llvm/compile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,156 @@
#include <llvm/Support/Host.h>
#include <llvm/Support/TargetSelect.h>
#include <llvm/Transforms/InstCombine/InstCombine.h>
#include <llvm/Transforms/IPO.h>
#include <llvm/Transforms/IPO/AlwaysInliner.h>
#include <llvm/Transforms/Scalar.h>
#include <llvm/Transforms/Scalar/GVN.h>
#include <llvm/Transforms/Utils/ModuleUtils.h>
#include <llvm/Transforms/Utils.h>
#include <llvm/Transforms/Vectorize.h>

#if NACS_ENABLE_NEW_PASS
# include <llvm/Transforms/IPO/ConstantMerge.h>
# include <llvm/Transforms/IPO/GlobalDCE.h>
# include <llvm/Transforms/IPO/MergeFunctions.h>
# include <llvm/Transforms/Scalar/ADCE.h>
# include <llvm/Transforms/Scalar/DCE.h>
# include <llvm/Transforms/Scalar/DeadStoreElimination.h>
# include <llvm/Transforms/Scalar/EarlyCSE.h>
# include <llvm/Transforms/Scalar/JumpThreading.h>
# include <llvm/Transforms/Scalar/IndVarSimplify.h>
# include <llvm/Transforms/Scalar/LICM.h>
# include <llvm/Transforms/Scalar/LoopDeletion.h>
# include <llvm/Transforms/Scalar/LoopIdiomRecognize.h>
# include <llvm/Transforms/Scalar/LoopRotation.h>
# include <llvm/Transforms/Scalar/LoopUnrollPass.h>
# include <llvm/Transforms/Scalar/Reassociate.h>
# include <llvm/Transforms/Scalar/SCCP.h>
# include <llvm/Transforms/Scalar/Sink.h>
# include <llvm/Transforms/Scalar/SROA.h>
# include <llvm/Transforms/Scalar/SimplifyCFG.h>
# include <llvm/Transforms/Scalar/SimpleLoopUnswitch.h>
#else
# include <llvm/Transforms/IPO.h>
# include <llvm/Transforms/Scalar.h>
#endif

#include <mutex>

namespace NaCs::LLVM::Compile {

#if NACS_ENABLE_NEW_PASS
static void addOptimization(ModulePassManager &MPM)
{
#ifndef NDEBUG
MPM.addPass(VerifierPass());
#endif
{
FunctionPassManager FPM;
FPM.addPass(SimplifyCFGPass());
FPM.addPass(DCEPass());
FPM.addPass(EarlyCSEPass());
FPM.addPass(DCEPass());
FPM.addPass(InstCombinePass());
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
}

#ifndef NDEBUG
MPM.addPass(VerifierPass());
#endif
MPM.addPass(VectorABIPass()); // Fix vector ABI
#ifndef NDEBUG
MPM.addPass(VerifierPass());
#endif
MPM.addPass(AlwaysInlinerPass()); // Respect always_inline
{
FunctionPassManager FPM;
FPM.addPass(InstCombinePass()); // Cleanup for scalarrepl.
FPM.addPass(SROAPass(SROAOptions::PreserveCFG)); // Break up aggregate allocas
FPM.addPass(InstCombinePass()); // Cleanup for scalarrepl.
FPM.addPass(JumpThreadingPass()); // Thread jumps.
FPM.addPass(InstCombinePass()); // Combine silly seq's
FPM.addPass(ReassociatePass()); // Reassociate expressions
FPM.addPass(EarlyCSEPass()); //// ****
{
LoopPassManager LPM;
LPM.addPass(LoopIdiomRecognizePass()); //// ****
LPM.addPass(LoopRotatePass()); // Rotate loops.
LPM.addPass(LICMPass(LICMOptions())); // Hoist loop invariants
LPM.addPass(SimpleLoopUnswitchPass()); // Unswitch loops.

FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM)));
}
FPM.addPass(InstCombinePass()); // Combine silly seq's

{
LoopPassManager LPM;
LPM.addPass(IndVarSimplifyPass()); // Canonicalize indvars
LPM.addPass(LoopDeletionPass()); // Delete dead loops

FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM)));
}

FPM.addPass(LoopUnrollPass()); // Unroll small loops
FPM.addPass(SROAPass(SROAOptions::PreserveCFG)); // Break up aggregate allocas

FPM.addPass(InstCombinePass()); // Clean up after the unroller
FPM.addPass(GVNPass()); // Remove redundancies
FPM.addPass(SCCPPass()); // Constant prop with SCCP
FPM.addPass(SinkingPass()); ////////////// ****

#ifndef NDEBUG
FPM.addPass(VerifierPass());
#endif
FPM.addPass(NaCsInstSimplifyPass()); // TODO support external symbol
#ifndef NDEBUG
FPM.addPass(VerifierPass());
#endif

FPM.addPass(InstCombinePass());
FPM.addPass(JumpThreadingPass()); // Thread jumps.
FPM.addPass(DSEPass()); // Delete dead stores

// see if all of the constant folding has exposed more loops
// to simplification and deletion
// this helps significantly with cleaning up iteration
FPM.addPass(SimplifyCFGPass()); // Merge & remove BBs

{
LoopPassManager LPM;
LPM.addPass(LoopIdiomRecognizePass());
LPM.addPass(LoopDeletionPass()); // Delete dead loops

FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM)));
}

FPM.addPass(JumpThreadingPass()); // Thread jumps.
FPM.addPass(InstCombinePass()); // Clean up after SLP loop vectorizer

MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
}

#ifndef NDEBUG
MPM.addPass(VerifierPass());
#endif
MPM.addPass(LowerVectorPass());
#ifndef NDEBUG
MPM.addPass(VerifierPass());
#endif
MPM.addPass(AlwaysInlinerPass()); // Inlining for lower vector pass

{
FunctionPassManager FPM;
FPM.addPass(ADCEPass()); // Delete dead instructions

MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
}
MPM.addPass(GlobalDCEPass());
MPM.addPass(ConstantMergePass());
MPM.addPass(MergeFunctionsPass());
#ifndef NDEBUG
MPM.addPass(VerifierPass());
#endif
}
#else
static void addOptimization(legacy::PassManagerBase &pm)
{
#ifndef NDEBUG
Expand Down Expand Up @@ -127,6 +265,7 @@ static void addOptimization(legacy::PassManagerBase &pm)
pm.add(createVerifierPass());
#endif
}
#endif

NACS_EXPORT() bool emit_objfile(raw_pwrite_stream &stm, TargetMachine *tgt, Module *M, bool opt)
{
Expand All @@ -148,6 +287,23 @@ NACS_EXPORT() bool emit_objfile(raw_pwrite_stream &stm, TargetMachine *tgt, Modu
if (!init_tramp || init_tramp->use_empty())
appendToCompilerUsed(*M, {Intrinsic::getDeclaration(M, Intrinsic::init_trampoline)});
#endif

#if NACS_ENABLE_NEW_PASS
PassBuilder PB;
AnalysisManagers AM(*tgt, PB);
ModulePassManager MPM;
if (triple.getObjectFormat() == Triple::ObjectFormatType::MachO)
MPM.addPass(ElimMachOPrefixPass());
if (opt)
addOptimization(MPM);
MPM.run(*M, AM.MAM);

legacy::PassManager pm;
MCContext *ctx;
if (tgt->addPassesToEmitMC(pm, ctx, stm))
return false;
pm.run(*M);
#else
legacy::PassManager pm;
pm.add(new TargetLibraryInfoWrapperPass(Triple(tgt->getTargetTriple())));
pm.add(createTargetTransformInfoWrapperPass(tgt->getTargetIRAnalysis()));
Expand All @@ -159,6 +315,7 @@ NACS_EXPORT() bool emit_objfile(raw_pwrite_stream &stm, TargetMachine *tgt, Modu
if (tgt->addPassesToEmitMC(pm, ctx, stm))
return false;
pm.run(*M);
#endif
return true;
}

Expand All @@ -172,9 +329,17 @@ NACS_EXPORT() bool emit_objfile(SmallVectorImpl<char> &vec, TargetMachine *tgt,
// For testing only
NACS_EXPORT() Module *optimize(Module *mod)
{
#if NACS_ENABLE_NEW_PASS
PassBuilder PB;
AnalysisManagers AM(PB);
ModulePassManager MPM;
addOptimization(MPM);
MPM.run(*mod, AM.MAM);
#else
legacy::PassManager pm;
addOptimization(pm);
pm.run(*mod);
#endif
return mod;
}

Expand Down
30 changes: 30 additions & 0 deletions lib/nacs-utils/llvm/passes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,43 @@
#include <llvm/Transforms/IPO/AlwaysInliner.h>

#if NACS_ENABLE_NEW_PASS
# include <llvm/Analysis/AliasAnalysis.h>
# include <llvm/Analysis/TargetTransformInfo.h>
# include <llvm/Target/TargetMachine.h>
#else
# include <llvm/IR/LegacyPassManager.h>
#endif

namespace NaCs::LLVM {

#if NACS_ENABLE_NEW_PASS
static FunctionAnalysisManager createFAM(TargetMachine &TM)
{
FunctionAnalysisManager FAM;
FAM.registerPass([&] {
AAManager AA;
TM.registerDefaultAliasAnalyses(AA);
return AA;
});
FAM.registerPass([&] {
return TargetIRAnalysis(TM.getTargetIRAnalysis());
});
FAM.registerPass([&] {
return TargetLibraryAnalysis(TargetLibraryInfoImpl(TM.getTargetTriple()));
});
return FAM;
}

NACS_EXPORT() AnalysisManagers::AnalysisManagers(TargetMachine &TM, PassBuilder &PB)
: LAM(), FAM(createFAM(TM)), CGAM(), MAM()
{
PB.registerLoopAnalyses(LAM);
PB.registerFunctionAnalyses(FAM);
PB.registerCGSCCAnalyses(CGAM);
PB.registerModuleAnalyses(MAM);
PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
}

NACS_EXPORT() AnalysisManagers::AnalysisManagers(PassBuilder &PB)
: LAM(), FAM(), CGAM(), MAM()
{
Expand Down
1 change: 1 addition & 0 deletions lib/nacs-utils/llvm/passes.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ struct AnalysisManagers {
ModuleAnalysisManager MAM;

AnalysisManagers(PassBuilder &PB);
AnalysisManagers(TargetMachine &TM, PassBuilder &PB);
~AnalysisManagers();
};

Expand Down

0 comments on commit 8ad6bc7

Please sign in to comment.