Run all LLVM passes in LLVMJIT.cpp
Passes for optimizations and other transforms are subject to change
between LLVM versions, and thus belong in the LLVMJIT.cpp source file.
LLVMReactor.cpp is for IR code generation.
Bug: b/148561024
Change-Id: I02b37a22ce7299d36370102f818ec3f29728286e
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/65149
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Reactor/LLVMJIT.cpp b/src/Reactor/LLVMJIT.cpp
index a217b92..9590820 100644
--- a/src/Reactor/LLVMJIT.cpp
+++ b/src/Reactor/LLVMJIT.cpp
@@ -31,6 +31,7 @@
#include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h"
#include "llvm/ExecutionEngine/SectionMemoryManager.h"
#include "llvm/IR/DiagnosticInfo.h"
+#include "llvm/IR/Verifier.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Host.h"
#include "llvm/Support/TargetSelect.h"
@@ -52,7 +53,9 @@
# include "llvm/Transforms/Scalar/SimplifyCFG.h"
#else // Legacy pass manager
# include "llvm/IR/LegacyPassManager.h"
-# include "llvm/Transforms/Scalar.h"
+# include "llvm/Pass.h"
+# include "llvm/Transforms/Coroutines.h"
+# include "llvm/Transforms/IPO.h"
#endif
#ifdef _MSC_VER
@@ -854,8 +857,46 @@
}
}
-void JITBuilder::optimize(const rr::Config &cfg)
+void JITBuilder::runPasses(const rr::Config &cfg)
{
+ if(coroutine.id) // Run manadory coroutine transforms.
+ {
+#if LLVM_VERSION_MAJOR >= 13 // New pass manager
+ llvm::PassBuilder pb;
+ llvm::LoopAnalysisManager lam;
+ llvm::FunctionAnalysisManager fam;
+ llvm::CGSCCAnalysisManager cgam;
+ llvm::ModuleAnalysisManager mam;
+
+ pb.registerModuleAnalyses(mam);
+ pb.registerCGSCCAnalyses(cgam);
+ pb.registerFunctionAnalyses(fam);
+ pb.registerLoopAnalyses(lam);
+ pb.crossRegisterProxies(lam, fam, cgam, mam);
+
+ llvm::ModulePassManager mpm =
+ pb.buildO0DefaultPipeline(llvm::OptimizationLevel::O0);
+ mpm.run(*module, mam);
+#else // Legacy pass manager
+ llvm::legacy::PassManager pm;
+
+ pm.add(llvm::createCoroEarlyLegacyPass());
+ pm.add(llvm::createCoroSplitLegacyPass());
+ pm.add(llvm::createCoroElideLegacyPass());
+ pm.add(llvm::createBarrierNoopPass());
+ pm.add(llvm::createCoroCleanupLegacyPass());
+
+ pm.run(*module);
+#endif
+ }
+
+#if defined(ENABLE_RR_LLVM_IR_VERIFICATION) || !defined(NDEBUG)
+ if(llvm::verifyModule(*module, &llvm::errs()))
+ {
+ llvm::report_fatal_error("Invalid LLVM module");
+ }
+#endif
+
#ifdef ENABLE_RR_DEBUG_INFO
if(debugInfo != nullptr)
{
@@ -892,8 +933,9 @@
{
case rr::Optimization::Pass::Disabled: break;
case rr::Optimization::Pass::CFGSimplification: fpm.addPass(llvm::SimplifyCFGPass()); break;
- case rr::Optimization::Pass::LICM: fpm.addPass(llvm::createFunctionToLoopPassAdaptor(
- llvm::LICMPass(llvm::SetLicmMssaOptCap, llvm::SetLicmMssaNoAccForPromotionCap, true)));
+ case rr::Optimization::Pass::LICM:
+ fpm.addPass(llvm::createFunctionToLoopPassAdaptor(
+ llvm::LICMPass(llvm::SetLicmMssaOptCap, llvm::SetLicmMssaNoAccForPromotionCap, true)));
break;
case rr::Optimization::Pass::AggressiveDCE: fpm.addPass(llvm::ADCEPass()); break;
case rr::Optimization::Pass::GVN: fpm.addPass(llvm::GVNPass()); break;
diff --git a/src/Reactor/LLVMReactor.cpp b/src/Reactor/LLVMReactor.cpp
index 33904af..c958c8b 100644
--- a/src/Reactor/LLVMReactor.cpp
+++ b/src/Reactor/LLVMReactor.cpp
@@ -23,23 +23,9 @@
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/IntrinsicsX86.h"
-#include "llvm/IR/Verifier.h"
-#include "llvm/Pass.h"
#include "llvm/Support/Alignment.h"
+#include "llvm/Support/Error.h"
#include "llvm/Support/ManagedStatic.h"
-#include "llvm/Transforms/Coroutines.h"
-#include "llvm/Transforms/IPO.h"
-#include "llvm/Transforms/Scalar.h"
-
-#if LLVM_VERSION_MAJOR >= 13 // New pass manager
-# include "llvm/Passes/PassBuilder.h"
-#else // Legacy pass manager
-# include "llvm/IR/LegacyPassManager.h"
-# include "llvm/Pass.h"
-# include "llvm/Transforms/Coroutines.h"
-# include "llvm/Transforms/IPO.h"
-# include "llvm/Transforms/Scalar.h"
-#endif
#include <fstream>
#include <iostream>
@@ -622,14 +608,7 @@
jit->module->print(file, 0);
}
-#if defined(ENABLE_RR_LLVM_IR_VERIFICATION) || !defined(NDEBUG)
- if(llvm::verifyModule(*jit->module, &llvm::errs()))
- {
- llvm::report_fatal_error("Invalid LLVM module");
- }
-#endif // defined(ENABLE_RR_LLVM_IR_VERIFICATION) || !defined(NDEBUG)
-
- jit->optimize(cfg);
+ jit->runPasses(cfg);
if(false)
{
@@ -4364,8 +4343,7 @@
std::shared_ptr<Routine> Nucleus::acquireCoroutine(const char *name, const Config::Edit *cfgEdit /* = nullptr */)
{
- bool isCoroutine = jit->coroutine.id != nullptr;
- if(isCoroutine)
+ if(jit->coroutine.id)
{
jit->builder->CreateBr(jit->coroutine.endBlock);
}
@@ -4397,51 +4375,12 @@
jit->module->print(file, 0);
}
- if(isCoroutine)
- {
-#if LLVM_VERSION_MAJOR >= 13 // New pass manager
- llvm::PassBuilder pb;
- llvm::LoopAnalysisManager lam;
- llvm::FunctionAnalysisManager fam;
- llvm::CGSCCAnalysisManager cgam;
- llvm::ModuleAnalysisManager mam;
-
- pb.registerModuleAnalyses(mam);
- pb.registerCGSCCAnalyses(cgam);
- pb.registerFunctionAnalyses(fam);
- pb.registerLoopAnalyses(lam);
- pb.crossRegisterProxies(lam, fam, cgam, mam);
-
- llvm::ModulePassManager mpm =
- pb.buildO0DefaultPipeline(llvm::OptimizationLevel::O0);
- mpm.run(*jit->module, mam);
-#else
- // Run manadory coroutine transforms.
- llvm::legacy::PassManager pm;
-
- pm.add(llvm::createCoroEarlyLegacyPass());
- pm.add(llvm::createCoroSplitLegacyPass());
- pm.add(llvm::createCoroElideLegacyPass());
- pm.add(llvm::createBarrierNoopPass());
- pm.add(llvm::createCoroCleanupLegacyPass());
-
- pm.run(*jit->module);
-#endif
- }
-
-#if defined(ENABLE_RR_LLVM_IR_VERIFICATION) || !defined(NDEBUG)
- if(llvm::verifyModule(*jit->module, &llvm::errs()))
- {
- llvm::report_fatal_error("Invalid LLVM module");
- }
-#endif // defined(ENABLE_RR_LLVM_IR_VERIFICATION) || !defined(NDEBUG)
-
Config cfg = jit->config;
if(cfgEdit)
{
cfg = cfgEdit->apply(jit->config);
}
- jit->optimize(cfg);
+ jit->runPasses(cfg);
if(false)
{
diff --git a/src/Reactor/LLVMReactor.hpp b/src/Reactor/LLVMReactor.hpp
index 54a44c3..dad54a7 100644
--- a/src/Reactor/LLVMReactor.hpp
+++ b/src/Reactor/LLVMReactor.hpp
@@ -90,7 +90,7 @@
public:
JITBuilder(const rr::Config &config);
- void optimize(const rr::Config &cfg);
+ void runPasses(const rr::Config &cfg);
std::shared_ptr<rr::Routine> acquireRoutine(const char *name, llvm::Function **funcs, size_t count, const rr::Config &cfg);