Skip to content

Commit 70d7e1e

Browse files
authored
fix JuliaLang#35393, use multiple TargetMachines for different optimization levels (JuliaLang#35403)
1 parent 716c98e commit 70d7e1e

File tree

2 files changed

+15
-10
lines changed

2 files changed

+15
-10
lines changed

src/jitlayers.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
#include <llvm/Support/FormattedStream.h>
1818
#include <llvm/ADT/StringMap.h>
1919

20+
#include <llvm/Support/TargetRegistry.h>
21+
#include <llvm/Target/TargetMachine.h>
22+
#include <llvm/Analysis/TargetTransformInfo.h>
23+
#include <llvm/Analysis/TargetLibraryInfo.h>
24+
2025
using namespace llvm;
2126

2227
#include "julia.h"
@@ -451,13 +456,10 @@ CodeGenOpt::Level CodeGenOptLevelFor(int optlevel)
451456

452457
static void addPassesForOptLevel(legacy::PassManager &PM, TargetMachine &TM, raw_svector_ostream &ObjStream, MCContext *Ctx, int optlevel)
453458
{
454-
auto oldlevel = TM.getOptLevel();
455-
TM.setOptLevel(CodeGenOptLevelFor(optlevel));
456459
addTargetPasses(&PM, &TM);
457460
addOptimizationPasses(&PM, optlevel);
458461
if (TM.addPassesToEmitMC(PM, Ctx, ObjStream))
459462
llvm_unreachable("Target does not support MC emission.");
460-
TM.setOptLevel(oldlevel);
461463
}
462464

463465
CompilerResultT JuliaOJIT::CompilerT::operator()(Module &M)
@@ -481,8 +483,6 @@ CompilerResultT JuliaOJIT::CompilerT::operator()(Module &M)
481483
}
482484
}
483485
}
484-
auto oldlevel = jit.TM.getOptLevel();
485-
jit.TM.setOptLevel(CodeGenOptLevelFor(optlevel));
486486
if (optlevel == 0)
487487
jit.PM0.run(M);
488488
else if (optlevel == 1)
@@ -491,7 +491,6 @@ CompilerResultT JuliaOJIT::CompilerT::operator()(Module &M)
491491
jit.PM2.run(M);
492492
else if (optlevel >= 3)
493493
jit.PM3.run(M);
494-
jit.TM.setOptLevel(oldlevel);
495494

496495
std::unique_ptr<MemoryBuffer> ObjBuffer(
497496
new SmallVectorMemoryBuffer(std::move(jit.ObjBufferSV)));
@@ -542,10 +541,15 @@ JuliaOJIT::JuliaOJIT(TargetMachine &TM)
542541
CompilerT(this)
543542
)
544543
{
545-
addPassesForOptLevel(PM0, TM, ObjStream, Ctx, 0);
546-
addPassesForOptLevel(PM1, TM, ObjStream, Ctx, 1);
547-
addPassesForOptLevel(PM2, TM, ObjStream, Ctx, 2);
548-
addPassesForOptLevel(PM3, TM, ObjStream, Ctx, 3);
544+
for (int i = 0; i < 4; i++) {
545+
TMs[i] = TM.getTarget().createTargetMachine(TM.getTargetTriple().getTriple(), TM.getTargetCPU(),
546+
TM.getTargetFeatureString(), TM.Options, Reloc::Static, TM.getCodeModel(),
547+
CodeGenOptLevelFor(i), true);
548+
}
549+
addPassesForOptLevel(PM0, *TMs[0], ObjStream, Ctx, 0);
550+
addPassesForOptLevel(PM1, *TMs[1], ObjStream, Ctx, 1);
551+
addPassesForOptLevel(PM2, *TMs[2], ObjStream, Ctx, 2);
552+
addPassesForOptLevel(PM3, *TMs[3], ObjStream, Ctx, 3);
549553

550554
// Make sure SectionMemoryManager::getSymbolAddressInProcess can resolve
551555
// symbols in the program as well. The nullptr argument to the function

src/jitlayers.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ class JuliaOJIT {
216216
legacy::PassManager PM1;
217217
legacy::PassManager PM2;
218218
legacy::PassManager PM3;
219+
TargetMachine *TMs[4];
219220
MCContext *Ctx;
220221
std::shared_ptr<RTDyldMemoryManager> MemMgr;
221222
DebugObjectRegistrar registrar;

0 commit comments

Comments
 (0)