Reactor: Rework optimization flags.
Replace the old 'runOptimizations' flag on Nucleus::acquireRoutine() and Nucleus::acquireCoroutine() with a new OptimizationLevel enumerator.
runOptimizations was always true, and there is already the rr::optimization extern to control the optimization passes performed.
All Function and Coroutines are now passed the new vk::ReactorOptimizationLevel. This will be changed to a non-Default value in another CL.
Bug: b/135609394
Change-Id: I1154da05d413b18a471a3818fbb03f356a3d0e6c
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/33482
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Ben Clayton <bclayton@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Reactor/LLVMReactor.cpp b/src/Reactor/LLVMReactor.cpp
index d6f530d..af049c6 100644
--- a/src/Reactor/LLVMReactor.cpp
+++ b/src/Reactor/LLVMReactor.cpp
@@ -219,7 +219,11 @@
using ObjLayer = llvm::orc::RTDyldObjectLinkingLayer;
using CompileLayer = llvm::orc::IRCompileLayer<ObjLayer, llvm::orc::SimpleCompiler>;
public:
- JITRoutine(std::unique_ptr<llvm::Module> module, llvm::Function **funcs, size_t count) :
+ JITRoutine(
+ std::unique_ptr<llvm::Module> module,
+ llvm::Function **funcs,
+ size_t count,
+ rr::OptimizationLevel optLevel) :
resolver(createLegacyLookupResolver(
session,
[&](const std::string &name) {
@@ -241,6 +245,8 @@
targetMachine(llvm::EngineBuilder()
#ifdef ENABLE_RR_DEBUG_INFO
.setOptLevel(llvm::CodeGenOpt::None)
+#else
+ .setOptLevel(toLLVM(optLevel))
#endif // ENABLE_RR_DEBUG_INFO
.setMArch(JITGlobals::get()->arch)
.setMAttrs(JITGlobals::get()->mattrs)
@@ -306,6 +312,19 @@
}
private:
+ static ::llvm::CodeGenOpt::Level toLLVM(rr::OptimizationLevel level)
+ {
+ switch (level)
+ {
+ case rr::OptimizationLevel::None: return ::llvm::CodeGenOpt::None;
+ case rr::OptimizationLevel::Less: return ::llvm::CodeGenOpt::Less;
+ case rr::OptimizationLevel::Default: return ::llvm::CodeGenOpt::Default;
+ case rr::OptimizationLevel::Aggressive: return ::llvm::CodeGenOpt::Aggressive;
+ default: UNREACHABLE("Unknown OptimizationLevel %d", int(level));
+ }
+ return ::llvm::CodeGenOpt::Default;
+ }
+
std::shared_ptr<llvm::orc::SymbolResolver> resolver;
std::unique_ptr<llvm::TargetMachine> targetMachine;
llvm::orc::ExecutionSession session;
@@ -361,10 +380,10 @@
passManager->run(*module);
}
- rr::Routine *acquireRoutine(llvm::Function **funcs, size_t count)
+ rr::Routine *acquireRoutine(llvm::Function **funcs, size_t count, rr::OptimizationLevel optLevel)
{
ASSERT(module);
- return new JITRoutine(std::move(module), funcs, count);
+ return new JITRoutine(std::move(module), funcs, count, optLevel);
}
llvm::LLVMContext context;
@@ -1118,7 +1137,7 @@
::codegenMutex.unlock();
}
- Routine *Nucleus::acquireRoutine(const char *name, bool runOptimizations)
+ Routine *Nucleus::acquireRoutine(const char *name, OptimizationLevel optimizationLevel)
{
if(jit->builder->GetInsertBlock()->empty() || !jit->builder->GetInsertBlock()->back().isTerminator())
{
@@ -1156,10 +1175,7 @@
}
#endif // defined(ENABLE_RR_LLVM_IR_VERIFICATION) || !defined(NDEBUG)
- if(runOptimizations)
- {
- optimize();
- }
+ optimize();
if(false)
{
@@ -1168,7 +1184,7 @@
jit->module->print(file, 0);
}
- auto routine = jit->acquireRoutine(&jit->function, 1);
+ auto routine = jit->acquireRoutine(&jit->function, 1, optimizationLevel);
jit.reset();
return routine;
@@ -4656,7 +4672,7 @@
jit->builder->SetInsertPoint(resumeBlock);
}
-Routine* Nucleus::acquireCoroutine(const char *name, bool runOptimizations)
+Routine* Nucleus::acquireCoroutine(const char *name, OptimizationLevel optimizationLevel)
{
ASSERT_MSG(jit->coroutine.id != nullptr, "acquireCoroutine() called without a call to createCoroutine()");
@@ -4685,10 +4701,7 @@
pm.add(llvm::createCoroCleanupPass());
pm.run(*jit->module);
- if(runOptimizations)
- {
- optimize();
- }
+ optimize();
if(false)
{
@@ -4701,7 +4714,7 @@
funcs[Nucleus::CoroutineEntryBegin] = jit->function;
funcs[Nucleus::CoroutineEntryAwait] = jit->coroutine.await;
funcs[Nucleus::CoroutineEntryDestroy] = jit->coroutine.destroy;
- Routine *routine = jit->acquireRoutine(funcs, Nucleus::CoroutineEntryCount);
+ auto routine = jit->acquireRoutine(funcs, Nucleus::CoroutineEntryCount, optimizationLevel);
jit.reset();
return routine;