Skip to content

Commit

Permalink
[utils/llvm] Port most passes run to new pass manager
Browse files Browse the repository at this point in the history
yuyichao committed Mar 14, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
1 parent 5f911b6 commit d256c2a
Showing 9 changed files with 125 additions and 87 deletions.
19 changes: 3 additions & 16 deletions lib/nacs-seq/compiler.cpp
Original file line number Diff line number Diff line change
@@ -31,10 +31,6 @@
#include <algorithm>
#include <numeric>

#include <llvm/IR/LegacyPassManager.h>
#include <llvm/IR/Verifier.h>
#include <llvm/Transforms/IPO.h>

namespace NaCs::Seq {

namespace {
@@ -1697,18 +1693,9 @@ void Compiler::generate_fptrs()
ramp_func.f->setVisibility(llvm::GlobalValue::ProtectedVisibility);
ramp_func.f->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
}
llvm::legacy::PassManager PM;
#ifndef NDEBUG
PM.add(llvm::createVerifierPass());
#endif
PM.add(llvm::createGlobalDCEPass());
// Shorten all global names since we don't care what they are
// and this should slightly reduce the compiled binary size.
PM.add(LLVM::createGlobalRenamePass());
#ifndef NDEBUG
PM.add(llvm::createVerifierPass());
#endif
PM.run(mod);

LLVM::runGlobalRenamePasses(mod);

// The optimization passes below (in `emit_objfile`) may recreate the functions
// so the function handle may not be valid anymore.
// We are done with the function renaming so we can simply get the names now.
15 changes: 1 addition & 14 deletions lib/nacs-seq/env.cpp
Original file line number Diff line number Diff line change
@@ -27,8 +27,6 @@
#include <llvm/ADT/SetVector.h>
#include <llvm/ADT/StringMap.h>
#include <llvm/IR/Constants.h>
#include <llvm/IR/LegacyPassManager.h>
#include <llvm/IR/Verifier.h>
#include <llvm/Support/raw_os_ostream.h>
#include <llvm/Transforms/IPO.h>
#include <llvm/Transforms/Utils/Cloning.h>
@@ -911,19 +909,8 @@ void Env::finalize_vars()
#endif
var->_assign_call(newf, args, var->nfreeargs());
}
llvm::legacy::PassManager PM;
#ifndef NDEBUG
PM.add(llvm::createVerifierPass());
#endif
PM.add(llvm::createGlobalDCEPass());
// Shorten all global names since we don't care what they are
// and this should slightly reduce the compiled binary size.
PM.add(LLVM::createGlobalRenamePass());
#ifndef NDEBUG
PM.add(llvm::createVerifierPass());
#endif

PM.run(*llvm_module());
LLVM::runGlobalRenamePasses(*llvm_module());
}

NACS_EXPORT() void Env::print(std::ostream &stm, bool sortvar) const
31 changes: 4 additions & 27 deletions lib/nacs-seq/nidaq/backend.cpp
Original file line number Diff line number Diff line change
@@ -32,10 +32,6 @@
#include "../../nacs-utils/streams.h"

#include <llvm/ADT/StringRef.h>
#include <llvm/IR/LegacyPassManager.h>
#include <llvm/IR/Verifier.h>
#include <llvm/Transforms/IPO.h>
#include <llvm/Transforms/IPO/AlwaysInliner.h>

#include <memory>

@@ -362,17 +358,7 @@ void Backend::prepare(Manager::ExpSeq &expseq, Compiler &compiler)
f->setVisibility(llvm::GlobalValue::ProtectedVisibility);
f->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
}
{
llvm::legacy::PassManager PM0;
#ifndef NDEBUG
PM0.add(llvm::createVerifierPass());
#endif
PM0.add(llvm::createAlwaysInlinerLegacyPass());
#ifndef NDEBUG
PM0.add(llvm::createVerifierPass());
#endif
PM0.run(mod);
}
LLVM::runAlwaysInlinerPasses(mod);

auto nvalues = nconst_map + nshared_map + nspecific_map_max;
auto values_ty = llvm::ArrayType::get(cgctx.T_i8, nvalues * sizeof(double));
@@ -542,18 +528,9 @@ void Backend::prepare(Manager::ExpSeq &expseq, Compiler &compiler)
}
values_gv->setLinkage(llvm::GlobalValue::ExternalLinkage);
values_gv->setVisibility(llvm::GlobalValue::ProtectedVisibility);
llvm::legacy::PassManager PM;
#ifndef NDEBUG
PM.add(llvm::createVerifierPass());
#endif
PM.add(llvm::createGlobalDCEPass());
// Shorten all global names since we don't care what they are
// and this should slightly reduce the compiled binary size.
PM.add(LLVM::createGlobalRenamePass());
#ifndef NDEBUG
PM.add(llvm::createVerifierPass());
#endif
PM.run(mod);

LLVM::runGlobalRenamePasses(mod);

// The optimization passes below (in `emit_objfile`) may recreate the functions
// so the function handle may not be valid anymore.
// We are done with the function renaming so we can simply get the names now.
30 changes: 29 additions & 1 deletion lib/nacs-seq/var.cpp
Original file line number Diff line number Diff line change
@@ -28,12 +28,19 @@
#include <stdexcept>

#include <llvm/IR/Constants.h>
#include <llvm/IR/LegacyPassManager.h>
#include <llvm/IR/Verifier.h>
#include <llvm/Support/raw_os_ostream.h>
#include <llvm/Transforms/Scalar.h>
#include <llvm/Transforms/Utils/Cloning.h>

#if NACS_ENABLE_NEW_PASS
# include <llvm/Transforms/Scalar/EarlyCSE.h>
# include <llvm/Transforms/Scalar/SCCP.h>
# include <llvm/Transforms/Scalar/SimplifyCFG.h>
#else
# include <llvm/IR/LegacyPassManager.h>
#endif

namespace NaCs::Seq {

NACS_EXPORT() IR::Type Var::type() const
@@ -345,6 +352,26 @@ static llvm::Type *merge_type(llvm::Type *t1, llvm::Type *t2)

NACS_INTERNAL void Var::optimize_llvmf(llvm::Function *f)
{
#if NACS_ENABLE_NEW_PASS
llvm::FunctionPassManager FPM;
#ifndef NDEBUG
FPM.addPass(llvm::VerifierPass());
#endif
FPM.addPass(llvm::SCCPPass());
FPM.addPass(LLVM::NaCsInstSimplifyPass(m_env.cg_context()->get_extern_resolver()));
FPM.addPass(llvm::SimplifyCFGPass());
FPM.addPass(llvm::EarlyCSEPass());
FPM.addPass(llvm::SimplifyCFGPass());
#ifndef NDEBUG
FPM.addPass(llvm::VerifierPass());
#endif

llvm::PassBuilder PB;
LLVM::AnalysisManagers AM(PB);
FPM.run(*f, AM.FAM);

#else

llvm::legacy::FunctionPassManager FPM(f->getParent());
#ifndef NDEBUG
FPM.add(llvm::createVerifierPass());
@@ -361,6 +388,7 @@ NACS_INTERNAL void Var::optimize_llvmf(llvm::Function *f)
FPM.doInitialization();
FPM.run(*f);
FPM.doFinalization();
#endif
}

NACS_INTERNAL bool Var::reduce_args()
32 changes: 5 additions & 27 deletions lib/nacs-seq/zynq/backend.cpp
Original file line number Diff line number Diff line change
@@ -27,10 +27,6 @@
#include "../../nacs-utils/processor.h"

#include <llvm/ADT/StringRef.h>
#include <llvm/IR/LegacyPassManager.h>
#include <llvm/IR/Verifier.h>
#include <llvm/Transforms/IPO.h>
#include <llvm/Transforms/IPO/AlwaysInliner.h>

namespace NaCs::Seq::Zynq {

@@ -297,17 +293,8 @@ void Backend::generate(Manager::ExpSeq &expseq, Compiler &compiler)
f->setVisibility(llvm::GlobalValue::ProtectedVisibility);
f->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
}
{
llvm::legacy::PassManager PM0;
#ifndef NDEBUG
PM0.add(llvm::createVerifierPass());
#endif
PM0.add(llvm::createAlwaysInlinerLegacyPass());
#ifndef NDEBUG
PM0.add(llvm::createVerifierPass());
#endif
PM0.run(mod);
}

LLVM::runAlwaysInlinerPasses(mod);

struct RampFunc {
uint32_t bseq_idx;
@@ -463,18 +450,9 @@ void Backend::generate(Manager::ExpSeq &expseq, Compiler &compiler)
ramp_func.f->setVisibility(llvm::GlobalValue::ProtectedVisibility);
ramp_func.f->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
}
llvm::legacy::PassManager PM;
#ifndef NDEBUG
PM.add(llvm::createVerifierPass());
#endif
PM.add(llvm::createGlobalDCEPass());
// Shorten all global names since we don't care what they are
// and this should slightly reduce the compiled binary size.
PM.add(LLVM::createGlobalRenamePass());
#ifndef NDEBUG
PM.add(llvm::createVerifierPass());
#endif
PM.run(mod);

LLVM::runGlobalRenamePasses(mod);

// The optimization passes below (in `emit_objfile`) may recreate the functions
// so the function handle may not be valid anymore.
// We are done with the function renaming so we can simply get the names now.
2 changes: 1 addition & 1 deletion lib/nacs-utils/llvm/compile.cpp
Original file line number Diff line number Diff line change
@@ -45,7 +45,7 @@

namespace NaCs::LLVM::Compile {

void addOptimization(legacy::PassManagerBase &pm)
static void addOptimization(legacy::PassManagerBase &pm)
{
#ifndef NDEBUG
pm.add(createVerifierPass());
41 changes: 41 additions & 0 deletions lib/nacs-utils/llvm/global_rename.cpp
Original file line number Diff line number Diff line change
@@ -21,6 +21,12 @@
#include "passes.h"
#include "utils.h"

#if NACS_ENABLE_NEW_PASS
# include <llvm/Transforms/IPO/GlobalDCE.h>
#else
# include <llvm/IR/LegacyPassManager.h>
#endif

namespace NaCs::LLVM {

using namespace llvm;
@@ -123,6 +129,41 @@ GlobalRenamePass::run(Module &M, ModuleAnalysisManager &AM)
return PreservedAnalyses::allInSet<CFGAnalyses>();
return PreservedAnalyses::all();
}

NACS_EXPORT() void runGlobalRenamePasses(Module &M)
{
llvm::PassBuilder PB;
LLVM::AnalysisManagers AM(PB);

llvm::ModulePassManager MPM;
# ifndef NDEBUG
MPM.addPass(llvm::VerifierPass());
# endif
MPM.addPass(llvm::GlobalDCEPass());
// Shorten all global names since we don't care what they are
// and this should slightly reduce the compiled binary size.
MPM.addPass(LLVM::GlobalRenamePass());
# ifndef NDEBUG
MPM.addPass(llvm::VerifierPass());
# endif
MPM.run(M, AM.MAM);
}
#else
NACS_EXPORT() void runGlobalRenamePasses(Module &M)
{
llvm::legacy::PassManager PM;
# ifndef NDEBUG
PM.add(llvm::createVerifierPass());
# endif
PM.add(llvm::createGlobalDCEPass());
// Shorten all global names since we don't care what they are
// and this should slightly reduce the compiled binary size.
PM.add(LLVM::createGlobalRenamePass());
# ifndef NDEBUG
PM.add(llvm::createVerifierPass());
# endif
PM.run(M);
}
#endif

}
40 changes: 39 additions & 1 deletion lib/nacs-utils/llvm/passes.cpp
Original file line number Diff line number Diff line change
@@ -20,10 +20,18 @@

#include "../utils.h"

#include <llvm/Transforms/IPO/AlwaysInliner.h>

#if NACS_ENABLE_NEW_PASS
#else
# include <llvm/IR/LegacyPassManager.h>
#endif

namespace NaCs::LLVM {

#if NACS_ENABLE_NEW_PASS
NACS_EXPORT() AnalysisManagers::AnalysisManagers(PassBuilder &PB)
: LAM(), FAM(), CGAM(), MAM()
: LAM(), FAM(), CGAM(), MAM()
{
PB.registerLoopAnalyses(LAM);
PB.registerFunctionAnalyses(FAM);
@@ -34,4 +42,34 @@ NACS_EXPORT() AnalysisManagers::AnalysisManagers(PassBuilder &PB)

NACS_EXPORT() AnalysisManagers::~AnalysisManagers() = default;

NACS_EXPORT() void runAlwaysInlinerPasses(Module &M)
{
llvm::PassBuilder PB;
LLVM::AnalysisManagers AM(PB);

llvm::ModulePassManager MPM;
# ifndef NDEBUG
MPM.addPass(llvm::VerifierPass());
# endif
MPM.addPass(llvm::AlwaysInlinerPass());
# ifndef NDEBUG
MPM.addPass(llvm::VerifierPass());
# endif
MPM.run(M, AM.MAM);
}
#else
NACS_EXPORT() void runAlwaysInlinerPasses(Module &M)
{
llvm::legacy::PassManager PM;
#ifndef NDEBUG
PM.add(llvm::createVerifierPass());
#endif
PM.add(llvm::createAlwaysInlinerLegacyPass());
#ifndef NDEBUG
PM.add(llvm::createVerifierPass());
#endif
PM.run(M);
}
#endif

}
2 changes: 2 additions & 0 deletions lib/nacs-utils/llvm/passes.h
Original file line number Diff line number Diff line change
@@ -46,6 +46,8 @@ using namespace llvm;

using resolver_cb_t = std::function<uintptr_t(const std::string&)>;
bool fixVectorABI(Function &F);
void runGlobalRenamePasses(Module &M);
void runAlwaysInlinerPasses(Module &M);

#if NACS_ENABLE_LEGACY_PASS
Pass *createElimMachOPrefixPass();

0 comments on commit d256c2a

Please sign in to comment.