Skip to content

Commit b047c56

Browse files
committed
Regression fix: store impl class as member
1 parent cf6a51d commit b047c56

File tree

2 files changed

+111
-72
lines changed

2 files changed

+111
-72
lines changed

llvm/include/llvm/CodeGen/MachineScheduler.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@
9898
#include <vector>
9999

100100
namespace llvm {
101+
namespace impl_detail {
102+
class MachineSchedulerImpl;
103+
class PostMachineSchedulerImpl;
104+
} // namespace impl_detail
101105

102106
namespace MISched {
103107
enum Direction {
@@ -1386,20 +1390,26 @@ createCopyConstrainDAGMutation(const TargetInstrInfo *TII,
13861390
const TargetRegisterInfo *TRI);
13871391

13881392
class MachineSchedulerPass : public PassInfoMixin<MachineSchedulerPass> {
1393+
std::unique_ptr<impl_detail::MachineSchedulerImpl> Impl;
13891394
const TargetMachine *TM;
13901395

13911396
public:
1392-
MachineSchedulerPass(const TargetMachine *TM) : TM(TM) {}
1397+
MachineSchedulerPass(const TargetMachine *TM);
1398+
MachineSchedulerPass(MachineSchedulerPass &&Other);
1399+
~MachineSchedulerPass();
13931400
PreservedAnalyses run(MachineFunction &MF,
13941401
MachineFunctionAnalysisManager &MFAM);
13951402
};
13961403

13971404
class PostMachineSchedulerPass
13981405
: public PassInfoMixin<PostMachineSchedulerPass> {
1406+
std::unique_ptr<impl_detail::PostMachineSchedulerImpl> Impl;
13991407
const TargetMachine *TM;
14001408

14011409
public:
1402-
PostMachineSchedulerPass(const TargetMachine *TM) : TM(TM) {}
1410+
PostMachineSchedulerPass(const TargetMachine *TM);
1411+
PostMachineSchedulerPass(PostMachineSchedulerPass &&Other);
1412+
~PostMachineSchedulerPass();
14031413
PreservedAnalyses run(MachineFunction &MF,
14041414
MachineFunctionAnalysisManager &MFAM);
14051415
};

llvm/lib/CodeGen/MachineScheduler.cpp

Lines changed: 99 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,8 @@ MachineSchedContext::~MachineSchedContext() {
214214
delete RegClassInfo;
215215
}
216216

217-
namespace {
217+
namespace llvm {
218+
namespace impl_detail {
218219

219220
/// Base class for the machine scheduler classes.
220221
class MachineSchedulerBase : public MachineSchedContext {
@@ -224,38 +225,67 @@ class MachineSchedulerBase : public MachineSchedContext {
224225

225226
/// Impl class for MachineScheduler.
226227
class MachineSchedulerImpl : public MachineSchedulerBase {
228+
// These are only for using MF.verify()
229+
// remove when verify supports passing in all analyses
227230
MachineFunctionPass *P = nullptr;
228231
MachineFunctionAnalysisManager *MFAM = nullptr;
229232

230233
public:
231-
MachineSchedulerImpl(MachineFunction &Func, MachineFunctionPass *P);
232-
MachineSchedulerImpl(MachineFunction &Func,
233-
MachineFunctionAnalysisManager &MFAM,
234-
const TargetMachine *TargetM);
235-
bool run();
234+
struct RequiredAnalyses {
235+
MachineLoopInfo &MLI;
236+
MachineDominatorTree &MDT;
237+
AAResults &AA;
238+
LiveIntervals &LIS;
239+
};
240+
241+
MachineSchedulerImpl() {}
242+
// Migration only
243+
void setLegacyPass(MachineFunctionPass *P) { this->P = P; }
244+
void setMFAM(MachineFunctionAnalysisManager *MFAM) { this->MFAM = MFAM; }
245+
246+
bool run(MachineFunction &MF, const TargetMachine &TM,
247+
const RequiredAnalyses &Analyses);
236248

237249
protected:
238250
ScheduleDAGInstrs *createMachineScheduler();
239251
};
240252

241253
/// Impl class for PostMachineScheduler.
242254
class PostMachineSchedulerImpl : public MachineSchedulerBase {
255+
// These are only for using MF.verify()
256+
// remove when verify supports passing in all analyses
243257
MachineFunctionPass *P = nullptr;
244258
MachineFunctionAnalysisManager *MFAM = nullptr;
245259

246260
public:
247-
PostMachineSchedulerImpl(MachineFunction &Func, MachineFunctionPass *P);
248-
PostMachineSchedulerImpl(MachineFunction &Func,
249-
MachineFunctionAnalysisManager &MFAM,
250-
const TargetMachine *TargetM);
251-
bool run();
261+
struct RequiredAnalyses {
262+
MachineLoopInfo &MLI;
263+
AAResults &AA;
264+
};
265+
PostMachineSchedulerImpl() {}
266+
// Migration only
267+
void setLegacyPass(MachineFunctionPass *P) { this->P = P; }
268+
void setMFAM(MachineFunctionAnalysisManager *MFAM) { this->MFAM = MFAM; }
269+
270+
bool run(MachineFunction &Func, const TargetMachine &TM,
271+
const RequiredAnalyses &Analyses);
252272

253273
protected:
254274
ScheduleDAGInstrs *createPostMachineScheduler();
255275
};
256276

277+
} // namespace impl_detail
278+
} // namespace llvm
279+
280+
using impl_detail::MachineSchedulerBase;
281+
using impl_detail::MachineSchedulerImpl;
282+
using impl_detail::PostMachineSchedulerImpl;
283+
284+
namespace {
257285
/// MachineScheduler runs after coalescing and before register allocation.
258286
class MachineSchedulerLegacy : public MachineFunctionPass {
287+
MachineSchedulerImpl Impl;
288+
259289
public:
260290
MachineSchedulerLegacy();
261291
void getAnalysisUsage(AnalysisUsage &AU) const override;
@@ -266,10 +296,12 @@ class MachineSchedulerLegacy : public MachineFunctionPass {
266296

267297
/// PostMachineScheduler runs after shortly before code emission.
268298
class PostMachineSchedulerLegacy : public MachineFunctionPass {
299+
PostMachineSchedulerImpl Impl;
300+
269301
public:
270302
PostMachineSchedulerLegacy();
271303
void getAnalysisUsage(AnalysisUsage &AU) const override;
272-
bool runOnMachineFunction(MachineFunction&) override;
304+
bool runOnMachineFunction(MachineFunction &) override;
273305

274306
static char ID; // Class identification, replacement for typeinfo
275307
};
@@ -403,31 +435,6 @@ nextIfDebug(MachineBasicBlock::iterator I,
403435
.getNonConstIterator();
404436
}
405437

406-
MachineSchedulerImpl::MachineSchedulerImpl(MachineFunction &Func,
407-
MachineFunctionPass *P)
408-
: P(P) {
409-
MF = &Func;
410-
MLI = &P->getAnalysis<MachineLoopInfoWrapperPass>().getLI();
411-
MDT = &P->getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
412-
TM = &P->getAnalysis<TargetPassConfig>().getTM<TargetMachine>();
413-
AA = &P->getAnalysis<AAResultsWrapperPass>().getAAResults();
414-
LIS = &P->getAnalysis<LiveIntervalsWrapperPass>().getLIS();
415-
}
416-
417-
MachineSchedulerImpl::MachineSchedulerImpl(MachineFunction &Func,
418-
MachineFunctionAnalysisManager &MFAM,
419-
const TargetMachine *TargetM)
420-
: MFAM(&MFAM) {
421-
MF = &Func;
422-
TM = TargetM;
423-
MLI = &MFAM.getResult<MachineLoopAnalysis>(Func);
424-
MDT = &MFAM.getResult<MachineDominatorTreeAnalysis>(Func);
425-
auto &FAM = MFAM.getResult<FunctionAnalysisManagerMachineFunctionProxy>(Func)
426-
.getManager();
427-
AA = &FAM.getResult<AAManager>(Func.getFunction());
428-
LIS = &MFAM.getResult<LiveIntervalsAnalysis>(Func);
429-
}
430-
431438
/// Instantiate a ScheduleDAGInstrs that will be owned by the caller.
432439
ScheduleDAGInstrs *MachineSchedulerImpl::createMachineScheduler() {
433440
// Select the scheduler, or set the default.
@@ -444,7 +451,15 @@ ScheduleDAGInstrs *MachineSchedulerImpl::createMachineScheduler() {
444451
return createGenericSchedLive(this);
445452
}
446453

447-
bool MachineSchedulerImpl::run() {
454+
bool MachineSchedulerImpl::run(MachineFunction &Func, const TargetMachine &TM,
455+
const RequiredAnalyses &Analyses) {
456+
MF = &Func;
457+
MLI = &Analyses.MLI;
458+
MDT = &Analyses.MDT;
459+
this->TM = &TM;
460+
AA = &Analyses.AA;
461+
LIS = &Analyses.LIS;
462+
448463
if (VerifyScheduling) {
449464
LLVM_DEBUG(LIS->dump());
450465
const char *MSchedBanner = "Before machine scheduling.";
@@ -471,27 +486,6 @@ bool MachineSchedulerImpl::run() {
471486
return true;
472487
}
473488

474-
PostMachineSchedulerImpl::PostMachineSchedulerImpl(MachineFunction &Func,
475-
MachineFunctionPass *P)
476-
: P(P) {
477-
MF = &Func;
478-
MLI = &P->getAnalysis<MachineLoopInfoWrapperPass>().getLI();
479-
TM = &P->getAnalysis<TargetPassConfig>().getTM<TargetMachine>();
480-
AA = &P->getAnalysis<AAResultsWrapperPass>().getAAResults();
481-
}
482-
483-
PostMachineSchedulerImpl::PostMachineSchedulerImpl(
484-
MachineFunction &Func, MachineFunctionAnalysisManager &MFAM,
485-
const TargetMachine *TargetM)
486-
: MFAM(&MFAM) {
487-
MF = &Func;
488-
TM = TargetM;
489-
MLI = &MFAM.getResult<MachineLoopAnalysis>(Func);
490-
auto &FAM = MFAM.getResult<FunctionAnalysisManagerMachineFunctionProxy>(Func)
491-
.getManager();
492-
AA = &FAM.getResult<AAManager>(Func.getFunction());
493-
}
494-
495489
/// Instantiate a ScheduleDAGInstrs for PostRA scheduling that will be owned by
496490
/// the caller. We don't have a command line option to override the postRA
497491
/// scheduler. The Target must configure it.
@@ -505,7 +499,14 @@ ScheduleDAGInstrs *PostMachineSchedulerImpl::createPostMachineScheduler() {
505499
return createGenericSchedPostRA(this);
506500
}
507501

508-
bool PostMachineSchedulerImpl::run() {
502+
bool PostMachineSchedulerImpl::run(MachineFunction &Func,
503+
const TargetMachine &TM,
504+
const RequiredAnalyses &Analyses) {
505+
MF = &Func;
506+
MLI = &Analyses.MLI;
507+
this->TM = &TM;
508+
AA = &Analyses.AA;
509+
509510
if (VerifyScheduling) {
510511
const char *PostMSchedBanner = "Before post machine scheduling.";
511512
if (P)
@@ -558,10 +559,27 @@ bool MachineSchedulerLegacy::runOnMachineFunction(MachineFunction &MF) {
558559

559560
LLVM_DEBUG(dbgs() << "Before MISched:\n"; MF.print(dbgs()));
560561

561-
MachineSchedulerImpl Impl(MF, this);
562-
return Impl.run();
562+
auto &MLI = getAnalysis<MachineLoopInfoWrapperPass>().getLI();
563+
auto &MDT = getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
564+
auto &TM = getAnalysis<TargetPassConfig>().getTM<TargetMachine>();
565+
auto &AA = getAnalysis<AAResultsWrapperPass>().getAAResults();
566+
auto &LIS = getAnalysis<LiveIntervalsWrapperPass>().getLIS();
567+
Impl.setLegacyPass(this);
568+
return Impl.run(MF, TM, {MLI, MDT, AA, LIS});
563569
}
564570

571+
MachineSchedulerPass::MachineSchedulerPass(const TargetMachine *TM)
572+
: Impl(std::make_unique<MachineSchedulerImpl>()), TM(TM) {}
573+
MachineSchedulerPass::~MachineSchedulerPass() = default;
574+
MachineSchedulerPass::MachineSchedulerPass(MachineSchedulerPass &&Other) =
575+
default;
576+
577+
PostMachineSchedulerPass::PostMachineSchedulerPass(const TargetMachine *TM)
578+
: Impl(std::make_unique<PostMachineSchedulerImpl>()), TM(TM) {}
579+
PostMachineSchedulerPass::PostMachineSchedulerPass(
580+
PostMachineSchedulerPass &&Other) = default;
581+
PostMachineSchedulerPass::~PostMachineSchedulerPass() = default;
582+
565583
PreservedAnalyses
566584
MachineSchedulerPass::run(MachineFunction &MF,
567585
MachineFunctionAnalysisManager &MFAM) {
@@ -573,9 +591,14 @@ MachineSchedulerPass::run(MachineFunction &MF,
573591
}
574592

575593
LLVM_DEBUG(dbgs() << "Before MISched:\n"; MF.print(dbgs()));
576-
577-
MachineSchedulerImpl Impl(MF, MFAM, TM);
578-
bool Changed = Impl.run();
594+
auto &MLI = MFAM.getResult<MachineLoopAnalysis>(MF);
595+
auto &MDT = MFAM.getResult<MachineDominatorTreeAnalysis>(MF);
596+
auto &FAM = MFAM.getResult<FunctionAnalysisManagerMachineFunctionProxy>(MF)
597+
.getManager();
598+
auto &AA = FAM.getResult<AAManager>(MF.getFunction());
599+
auto &LIS = MFAM.getResult<LiveIntervalsAnalysis>(MF);
600+
Impl->setMFAM(&MFAM);
601+
bool Changed = Impl->run(MF, *TM, {MLI, MDT, AA, LIS});
579602
if (!Changed)
580603
return PreservedAnalyses::all();
581604

@@ -598,9 +621,11 @@ bool PostMachineSchedulerLegacy::runOnMachineFunction(MachineFunction &MF) {
598621
return false;
599622
}
600623
LLVM_DEBUG(dbgs() << "Before post-MI-sched:\n"; MF.print(dbgs()));
601-
602-
PostMachineSchedulerImpl Impl(MF, this);
603-
return Impl.run();
624+
auto &MLI = getAnalysis<MachineLoopInfoWrapperPass>().getLI();
625+
auto &TM = getAnalysis<TargetPassConfig>().getTM<TargetMachine>();
626+
auto &AA = getAnalysis<AAResultsWrapperPass>().getAAResults();
627+
Impl.setLegacyPass(this);
628+
return Impl.run(MF, TM, {MLI, AA});
604629
}
605630

606631
PreservedAnalyses
@@ -614,9 +639,13 @@ PostMachineSchedulerPass::run(MachineFunction &MF,
614639
return PreservedAnalyses::all();
615640
}
616641
LLVM_DEBUG(dbgs() << "Before post-MI-sched:\n"; MF.print(dbgs()));
642+
auto &MLI = MFAM.getResult<MachineLoopAnalysis>(MF);
643+
auto &FAM = MFAM.getResult<FunctionAnalysisManagerMachineFunctionProxy>(MF)
644+
.getManager();
645+
auto &AA = FAM.getResult<AAManager>(MF.getFunction());
617646

618-
PostMachineSchedulerImpl Impl(MF, MFAM, TM);
619-
bool Changed = Impl.run();
647+
Impl->setMFAM(&MFAM);
648+
bool Changed = Impl->run(MF, *TM, {MLI, AA});
620649
if (!Changed)
621650
return PreservedAnalyses::all();
622651

0 commit comments

Comments
 (0)