Skip to content

Commit 356446d

Browse files
committed
Optimization selection layer
1 parent 9ab16d2 commit 356446d

File tree

2 files changed

+55
-32
lines changed

2 files changed

+55
-32
lines changed

src/jitlayers.cpp

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,33 @@ OptimizerResultT JuliaOJIT::OptimizerT::operator()(orc::ThreadSafeModule TSM, or
516516
return Expected<orc::ThreadSafeModule>{std::move(TSM)};
517517
}
518518

519+
void JuliaOJIT::OptSelLayerT::emit(std::unique_ptr<orc::MaterializationResponsibility> R, orc::ThreadSafeModule TSM) {
520+
size_t optlevel = ~0ull;
521+
TSM.withModuleDo([&](Module &M) {
522+
if (jl_generating_output()) {
523+
optlevel = 0;
524+
}
525+
else {
526+
optlevel = std::max(static_cast<int>(jl_options.opt_level), 0);
527+
size_t optlevel_min = std::max(static_cast<int>(jl_options.opt_level_min), 0);
528+
for (auto &F : M.functions()) {
529+
if (!F.getBasicBlockList().empty()) {
530+
Attribute attr = F.getFnAttribute("julia-optimization-level");
531+
StringRef val = attr.getValueAsString();
532+
if (val != "") {
533+
size_t ol = (size_t)val[0] - '0';
534+
if (ol >= 0 && ol < optlevel)
535+
optlevel = ol;
536+
}
537+
}
538+
}
539+
optlevel = std::min(std::max(optlevel, optlevel_min), this->count);
540+
}
541+
});
542+
assert(optlevel != ~0ull && "Failed to select a valid optimization level!");
543+
this->optimizers[optlevel].emit(std::move(R), std::move(TSM));
544+
}
545+
519546
void jl_register_jit_object(const object::ObjectFile &debugObj,
520547
std::function<uint64_t(const StringRef &)> getLoadAddress,
521548
std::function<void *(void *)> lookupWriteAddress);
@@ -819,7 +846,8 @@ JuliaOJIT::JuliaOJIT(TargetMachine &TM, LLVMContext *LLVMCtx)
819846
{ES, CompileLayer1, OptimizerT(this, PM1, 1)},
820847
{ES, CompileLayer2, OptimizerT(this, PM2, 2)},
821848
{ES, CompileLayer3, OptimizerT(this, PM3, 3)},
822-
}
849+
},
850+
OptSelLayer(OptimizeLayers)
823851
{
824852
#ifdef JL_USE_JITLINK
825853
# if defined(_OS_DARWIN_) && defined(LLVM_SHLIB)
@@ -919,30 +947,8 @@ void JuliaOJIT::addModule(std::unique_ptr<Module> M)
919947
}
920948
}
921949
#endif
922-
923-
int optlevel;
924-
int optlevel_min;
925-
if (jl_generating_output()) {
926-
optlevel = 0;
927-
}
928-
else {
929-
optlevel = jl_options.opt_level;
930-
optlevel_min = jl_options.opt_level_min;
931-
for (auto &F : M->functions()) {
932-
if (!F.getBasicBlockList().empty()) {
933-
Attribute attr = F.getFnAttribute("julia-optimization-level");
934-
StringRef val = attr.getValueAsString();
935-
if (val != "") {
936-
int ol = (int)val[0] - '0';
937-
if (ol >= 0 && ol < optlevel)
938-
optlevel = ol;
939-
}
940-
}
941-
}
942-
optlevel = std::max(optlevel, optlevel_min);
943-
}
944950
// TODO: what is the performance characteristics of this?
945-
cantFail(OptimizeLayers[std::max(std::min(optlevel, 3), 0)].add(JD, orc::ThreadSafeModule(std::move(M), TSCtx)));
951+
cantFail(OptSelLayer.add(JD, orc::ThreadSafeModule(std::move(M), TSCtx)));
946952
// force eager compilation (for now), due to memory management specifics
947953
// (can't handle compilation recursion)
948954
for (auto Name : NewExports)

src/jitlayers.h

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,16 @@ using CompilerResultT = Expected<std::unique_ptr<llvm::MemoryBuffer>>;
180180
using OptimizerResultT = Expected<orc::ThreadSafeModule>;
181181

182182
class JuliaOJIT {
183+
public:
184+
#ifdef JL_USE_JITLINK
185+
typedef orc::ObjectLinkingLayer ObjLayerT;
186+
#else
187+
typedef orc::RTDyldObjectLinkingLayer ObjLayerT;
188+
#endif
189+
typedef orc::IRCompileLayer CompileLayerT;
190+
typedef orc::IRTransformLayer OptimizeLayerT;
191+
typedef object::OwningBinary<object::ObjectFile> OwningObj;
192+
private:
183193
struct OptimizerT {
184194
OptimizerT(JuliaOJIT *pjit, legacy::PassManager &PM, int optlevel) : optlevel(optlevel), PM(PM), jit(*pjit) {}
185195

@@ -193,15 +203,21 @@ class JuliaOJIT {
193203
template <typename ObjT, typename LoadResult>
194204
void registerObject(const ObjT &Obj, const LoadResult &LO);
195205

206+
struct OptSelLayerT : orc::IRLayer {
207+
208+
template<size_t N>
209+
OptSelLayerT(OptimizeLayerT (&optimizers)[N]) : orc::IRLayer(optimizers[0].getExecutionSession(), optimizers[0].getManglingOptions()), optimizers(optimizers), count(N) {
210+
static_assert(N > 0, "Expected array with at least one optimizer!");
211+
}
212+
213+
void emit(std::unique_ptr<orc::MaterializationResponsibility> R, orc::ThreadSafeModule TSM) override;
214+
215+
private:
216+
OptimizeLayerT *optimizers;
217+
size_t count;
218+
};
219+
196220
public:
197-
#ifdef JL_USE_JITLINK
198-
typedef orc::ObjectLinkingLayer ObjLayerT;
199-
#else
200-
typedef orc::RTDyldObjectLinkingLayer ObjLayerT;
201-
#endif
202-
typedef orc::IRCompileLayer CompileLayerT;
203-
typedef orc::IRTransformLayer OptimizeLayerT;
204-
typedef object::OwningBinary<object::ObjectFile> OwningObj;
205221

206222
JuliaOJIT(TargetMachine &TM, LLVMContext *Ctx);
207223

@@ -251,6 +267,7 @@ class JuliaOJIT {
251267
CompileLayerT CompileLayer2;
252268
CompileLayerT CompileLayer3;
253269
OptimizeLayerT OptimizeLayers[4];
270+
OptSelLayerT OptSelLayer;
254271

255272
DenseMap<void*, std::string> ReverseLocalSymbolTable;
256273
};

0 commit comments

Comments
 (0)