[llvm] r343266 - [ORC] Add definition for IRLayer::setCloneToNewContextOnEmit, use it to set the
Lang Hames via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 27 14:13:07 PDT 2018
Author: lhames
Date: Thu Sep 27 14:13:07 2018
New Revision: 343266
URL: http://llvm.org/viewvc/llvm-project?rev=343266&view=rev
Log:
[ORC] Add definition for IRLayer::setCloneToNewContextOnEmit, use it to set the
flag to true in LLJIT when running in multithreaded mode.
The IRLayer::setCloneToNewContextOnEmit method sets a flag within the IRLayer
that causes modules added to that layer to be moved to a new context (by
serializing to/from a memory buffer) when they are emitted. This allows modules
that were all loaded on the same context to be compiled in parallel.
Modified:
llvm/trunk/include/llvm/ExecutionEngine/Orc/Layer.h
llvm/trunk/lib/ExecutionEngine/Orc/LLJIT.cpp
Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/Layer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/Layer.h?rev=343266&r1=343265&r2=343266&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/Layer.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/Layer.h Thu Sep 27 14:13:07 2018
@@ -40,7 +40,9 @@ public:
/// compiling them to enable concurrent compilation.
/// Single threaded clients, or clients who load every module on a new
/// context, need not set this.
- void setCloneToNewContextOnEmit(bool CloneToNewContextOnEmit);
+ void setCloneToNewContextOnEmit(bool CloneToNewContextOnEmit) {
+ this->CloneToNewContextOnEmit = CloneToNewContextOnEmit;
+ }
/// Returns the current value of the CloneToNewContextOnEmit flag.
bool getCloneToNewContextOnEmit() const { return CloneToNewContextOnEmit; }
Modified: llvm/trunk/lib/ExecutionEngine/Orc/LLJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/LLJIT.cpp?rev=343266&r1=343265&r2=343266&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/Orc/LLJIT.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/Orc/LLJIT.cpp Thu Sep 27 14:13:07 2018
@@ -83,34 +83,38 @@ Expected<JITEvaluatedSymbol> LLJIT::look
LLJIT::LLJIT(std::unique_ptr<ExecutionSession> ES,
std::unique_ptr<TargetMachine> TM, DataLayout DL)
- : ES(std::move(ES)), Main(this->ES->getMainJITDylib()),
- DL(std::move(DL)),
+ : ES(std::move(ES)), Main(this->ES->getMainJITDylib()), DL(std::move(DL)),
ObjLinkingLayer(*this->ES,
[this](VModuleKey K) { return getMemoryManager(K); }),
- CompileLayer(*this->ES, ObjLinkingLayer, TMOwningSimpleCompiler(std::move(TM))),
+ CompileLayer(*this->ES, ObjLinkingLayer,
+ TMOwningSimpleCompiler(std::move(TM))),
CtorRunner(Main), DtorRunner(Main) {}
-LLJIT::LLJIT(std::unique_ptr<ExecutionSession> ES,
- JITTargetMachineBuilder JTMB, DataLayout DL,
- unsigned NumCompileThreads)
- : ES(std::move(ES)), Main(this->ES->getMainJITDylib()),
- DL(std::move(DL)),
+LLJIT::LLJIT(std::unique_ptr<ExecutionSession> ES, JITTargetMachineBuilder JTMB,
+ DataLayout DL, unsigned NumCompileThreads)
+ : ES(std::move(ES)), Main(this->ES->getMainJITDylib()), DL(std::move(DL)),
ObjLinkingLayer(*this->ES,
[this](VModuleKey K) { return getMemoryManager(K); }),
- CompileLayer(*this->ES, ObjLinkingLayer, MultiThreadedSimpleCompiler(std::move(JTMB))),
+ CompileLayer(*this->ES, ObjLinkingLayer,
+ MultiThreadedSimpleCompiler(std::move(JTMB))),
CtorRunner(Main), DtorRunner(Main) {
assert(NumCompileThreads != 0 &&
"Multithreaded LLJIT instance can not be created with 0 threads");
+ // Move modules to new contexts when they're emitted so that we can compile
+ // them in parallel.
+ CompileLayer.setCloneToNewContextOnEmit(true);
+
+ // Create a thread pool to compile on and set the execution session
+ // dispatcher to use the thread pool.
CompileThreads = llvm::make_unique<ThreadPool>(NumCompileThreads);
- this->ES->setDispatchMaterialization([this](JITDylib &JD, std::unique_ptr<MaterializationUnit> MU) {
- // FIXME: Switch to move capture once we have c++14.
- auto SharedMU = std::shared_ptr<MaterializationUnit>(std::move(MU));
- auto Work = [SharedMU, &JD]() {
- SharedMU->doMaterialize(JD);
- };
- CompileThreads->async(std::move(Work));
- });
+ this->ES->setDispatchMaterialization(
+ [this](JITDylib &JD, std::unique_ptr<MaterializationUnit> MU) {
+ // FIXME: Switch to move capture once we have c++14.
+ auto SharedMU = std::shared_ptr<MaterializationUnit>(std::move(MU));
+ auto Work = [SharedMU, &JD]() { SharedMU->doMaterialize(JD); };
+ CompileThreads->async(std::move(Work));
+ });
}
std::unique_ptr<RuntimeDyld::MemoryManager>
@@ -206,7 +210,9 @@ LLLazyJIT::LLLazyJIT(
: LLJIT(std::move(ES), std::move(JTMB), std::move(DL), NumCompileThreads),
LCTMgr(std::move(LCTMgr)), TransformLayer(*this->ES, CompileLayer),
CODLayer(*this->ES, TransformLayer, *this->LCTMgr,
- std::move(ISMBuilder)) {}
+ std::move(ISMBuilder)) {
+ CODLayer.setCloneToNewContextOnEmit(true);
+}
} // End namespace orc.
} // End namespace llvm.
More information about the llvm-commits
mailing list