Skip to content

Commit fe3cd76

Browse files
committed
CodeGen][NewPM] Port PostRAScheduler to NPM.
1 parent 3963f49 commit fe3cd76

18 files changed

+109
-25
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//===- llvm/CodeGen/PostRASchedulerList.h ------------------------*- C++-*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#ifndef LLVM_CODEGEN_POSTRASCHEDULERLIST_H
10+
#define LLVM_CODEGEN_POSTRASCHEDULERLIST_H
11+
12+
#include "llvm/CodeGen/MachinePassManager.h"
13+
14+
namespace llvm {
15+
16+
class PostRASchedulerPass : public PassInfoMixin<PostRASchedulerPass> {
17+
const TargetMachine *TM;
18+
19+
public:
20+
PostRASchedulerPass(const TargetMachine *TM) : TM(TM) {}
21+
PreservedAnalyses run(MachineFunction &MF,
22+
MachineFunctionAnalysisManager &MFAM);
23+
24+
MachineFunctionProperties getRequiredProperties() const {
25+
return MachineFunctionProperties().set(
26+
MachineFunctionProperties::Property::NoVRegs);
27+
}
28+
};
29+
30+
} // namespace llvm
31+
32+
#endif // LLVM_CODEGEN_POSTRASCHEDULERLIST_H

llvm/include/llvm/InitializePasses.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ void initializePostInlineEntryExitInstrumenterPass(PassRegistry &);
241241
void initializePostMachineSchedulerLegacyPass(PassRegistry &);
242242
void initializePostRAHazardRecognizerPass(PassRegistry &);
243243
void initializePostRAMachineSinkingPass(PassRegistry &);
244-
void initializePostRASchedulerPass(PassRegistry &);
244+
void initializePostRASchedulerLegacyPass(PassRegistry &);
245245
void initializePreISelIntrinsicLoweringLegacyPassPass(PassRegistry &);
246246
void initializePrintFunctionPassWrapperPass(PassRegistry &);
247247
void initializePrintModulePassWrapperPass(PassRegistry &);

llvm/include/llvm/Passes/CodeGenPassBuilder.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
#include "llvm/CodeGen/OptimizePHIs.h"
5656
#include "llvm/CodeGen/PHIElimination.h"
5757
#include "llvm/CodeGen/PeepholeOptimizer.h"
58+
#include "llvm/CodeGen/PostRASchedulerList.h"
5859
#include "llvm/CodeGen/PreISelIntrinsicLowering.h"
5960
#include "llvm/CodeGen/RegAllocFast.h"
6061
#include "llvm/CodeGen/RegUsageInfoCollector.h"
@@ -960,7 +961,7 @@ Error CodeGenPassBuilder<Derived, TargetMachineT>::addMachinePasses(
960961
if (Opt.MISchedPostRA)
961962
addPass(PostMachineSchedulerPass(&TM));
962963
else
963-
addPass(PostRASchedulerPass());
964+
addPass(PostRASchedulerPass(&TM));
964965
}
965966

966967
// GC

llvm/include/llvm/Passes/MachinePassRegistry.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ MACHINE_FUNCTION_PASS("opt-phis", OptimizePHIsPass())
149149
MACHINE_FUNCTION_PASS("peephole-opt", PeepholeOptimizerPass())
150150
MACHINE_FUNCTION_PASS("phi-node-elimination", PHIEliminationPass())
151151
MACHINE_FUNCTION_PASS("postmisched", PostMachineSchedulerPass(TM))
152+
MACHINE_FUNCTION_PASS("post-RA-sched", PostRASchedulerPass(TM))
152153
MACHINE_FUNCTION_PASS("print", PrintMIRPass())
153154
MACHINE_FUNCTION_PASS("print<livedebugvars>", LiveDebugVariablesPrinterPass(errs()))
154155
MACHINE_FUNCTION_PASS("print<live-intervals>", LiveIntervalsPrinterPass(errs()))
@@ -247,7 +248,6 @@ DUMMY_MACHINE_FUNCTION_PASS("machine-uniformity", MachineUniformityInfoWrapperPa
247248
DUMMY_MACHINE_FUNCTION_PASS("machineinstr-printer", MachineFunctionPrinterPass)
248249
DUMMY_MACHINE_FUNCTION_PASS("mirfs-discriminators", MIRAddFSDiscriminatorsPass)
249250
DUMMY_MACHINE_FUNCTION_PASS("patchable-function", PatchableFunctionPass)
250-
DUMMY_MACHINE_FUNCTION_PASS("post-RA-sched", PostRASchedulerPass)
251251
DUMMY_MACHINE_FUNCTION_PASS("postra-machine-sink", PostRAMachineSinkingPass)
252252
DUMMY_MACHINE_FUNCTION_PASS("postrapseudos", ExpandPostRAPseudosPass)
253253
DUMMY_MACHINE_FUNCTION_PASS("print-machine-cycles", MachineCycleInfoPrinterPass)

llvm/lib/CodeGen/CodeGen.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
108108
initializePostMachineSchedulerLegacyPass(Registry);
109109
initializePostRAHazardRecognizerPass(Registry);
110110
initializePostRAMachineSinkingPass(Registry);
111-
initializePostRASchedulerPass(Registry);
111+
initializePostRASchedulerLegacyPass(Registry);
112112
initializePreISelIntrinsicLoweringLegacyPassPass(Registry);
113113
initializeProcessImplicitDefsPass(Registry);
114114
initializeRABasicPass(Registry);

llvm/lib/CodeGen/PostRASchedulerList.cpp

Lines changed: 59 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
//
1818
//===----------------------------------------------------------------------===//
1919

20+
#include "llvm/CodeGen/PostRASchedulerList.h"
2021
#include "llvm/ADT/Statistic.h"
2122
#include "llvm/Analysis/AliasAnalysis.h"
2223
#include "llvm/CodeGen/AntiDepBreaker.h"
@@ -39,6 +40,7 @@
3940
#include "llvm/Support/Debug.h"
4041
#include "llvm/Support/ErrorHandling.h"
4142
#include "llvm/Support/raw_ostream.h"
43+
#include "llvm/Target/TargetMachine.h"
4244
using namespace llvm;
4345

4446
#define DEBUG_TYPE "post-RA-sched"
@@ -73,13 +75,24 @@ DebugMod("postra-sched-debugmod",
7375
AntiDepBreaker::~AntiDepBreaker() = default;
7476

7577
namespace {
76-
class PostRAScheduler : public MachineFunctionPass {
78+
class PostRAScheduler {
7779
const TargetInstrInfo *TII = nullptr;
80+
MachineLoopInfo *MLI = nullptr;
81+
AliasAnalysis *AA = nullptr;
82+
const TargetMachine *TM = nullptr;
7883
RegisterClassInfo RegClassInfo;
7984

85+
public:
86+
PostRAScheduler(MachineFunction &MF, MachineLoopInfo *MLI, AliasAnalysis *AA,
87+
const TargetMachine *TM)
88+
: TII(MF.getSubtarget().getInstrInfo()), MLI(MLI), AA(AA), TM(TM) {}
89+
bool run(MachineFunction &MF);
90+
};
91+
92+
class PostRASchedulerLegacy : public MachineFunctionPass {
8093
public:
8194
static char ID;
82-
PostRAScheduler() : MachineFunctionPass(ID) {}
95+
PostRASchedulerLegacy() : MachineFunctionPass(ID) {}
8396

8497
void getAnalysisUsage(AnalysisUsage &AU) const override {
8598
AU.setPreservesCFG();
@@ -99,8 +112,7 @@ class PostRAScheduler : public MachineFunctionPass {
99112

100113
bool runOnMachineFunction(MachineFunction &Fn) override;
101114
};
102-
103-
char PostRAScheduler::ID = 0;
115+
char PostRASchedulerLegacy::ID = 0;
104116

105117
class SchedulePostRATDList : public ScheduleDAGInstrs {
106118
/// AvailableQueue - The priority queue to use for the available SUnits.
@@ -188,9 +200,9 @@ class SchedulePostRATDList : public ScheduleDAGInstrs {
188200
};
189201
} // namespace
190202

191-
char &llvm::PostRASchedulerID = PostRAScheduler::ID;
203+
char &llvm::PostRASchedulerID = PostRASchedulerLegacy::ID;
192204

193-
INITIALIZE_PASS(PostRAScheduler, DEBUG_TYPE,
205+
INITIALIZE_PASS(PostRASchedulerLegacy, DEBUG_TYPE,
194206
"Post RA top-down list latency scheduler", false, false)
195207

196208
SchedulePostRATDList::SchedulePostRATDList(
@@ -263,19 +275,12 @@ static bool enablePostRAScheduler(const TargetSubtargetInfo &ST,
263275
OptLevel >= ST.getOptLevelToEnablePostRAScheduler();
264276
}
265277

266-
bool PostRAScheduler::runOnMachineFunction(MachineFunction &Fn) {
267-
if (skipFunction(Fn.getFunction()))
268-
return false;
269-
270-
const auto &Subtarget = Fn.getSubtarget();
271-
TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
278+
bool PostRAScheduler::run(MachineFunction &MF) {
279+
const auto &Subtarget = MF.getSubtarget();
272280
// Check that post-RA scheduling is enabled for this target.
273-
if (!enablePostRAScheduler(Subtarget, PassConfig->getOptLevel()))
281+
if (!enablePostRAScheduler(Subtarget, TM->getOptLevel()))
274282
return false;
275283

276-
TII = Subtarget.getInstrInfo();
277-
MachineLoopInfo &MLI = getAnalysis<MachineLoopInfoWrapperPass>().getLI();
278-
AliasAnalysis *AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
279284
TargetSubtargetInfo::AntiDepBreakMode AntiDepMode =
280285
Subtarget.getAntiDepBreakMode();
281286
if (EnableAntiDepBreaking.getPosition() > 0) {
@@ -287,22 +292,22 @@ bool PostRAScheduler::runOnMachineFunction(MachineFunction &Fn) {
287292
}
288293
SmallVector<const TargetRegisterClass *, 4> CriticalPathRCs;
289294
Subtarget.getCriticalPathRCs(CriticalPathRCs);
290-
RegClassInfo.runOnMachineFunction(Fn);
295+
RegClassInfo.runOnMachineFunction(MF);
291296

292297
LLVM_DEBUG(dbgs() << "PostRAScheduler\n");
293298

294-
SchedulePostRATDList Scheduler(Fn, MLI, AA, RegClassInfo, AntiDepMode,
299+
SchedulePostRATDList Scheduler(MF, *MLI, AA, RegClassInfo, AntiDepMode,
295300
CriticalPathRCs);
296301

297302
// Loop over all of the basic blocks
298-
for (auto &MBB : Fn) {
303+
for (auto &MBB : MF) {
299304
#ifndef NDEBUG
300305
// If DebugDiv > 0 then only schedule MBB with (ID % DebugDiv) == DebugMod
301306
if (DebugDiv > 0) {
302307
static int bbcnt = 0;
303308
if (bbcnt++ % DebugDiv != DebugMod)
304309
continue;
305-
dbgs() << "*** DEBUG scheduling " << Fn.getName() << ":"
310+
dbgs() << "*** DEBUG scheduling " << MF.getName() << ":"
306311
<< printMBBReference(MBB) << " ***\n";
307312
}
308313
#endif
@@ -320,7 +325,7 @@ bool PostRAScheduler::runOnMachineFunction(MachineFunction &Fn) {
320325
// Calls are not scheduling boundaries before register allocation, but
321326
// post-ra we don't gain anything by scheduling across calls since we
322327
// don't need to worry about register pressure.
323-
if (MI.isCall() || TII->isSchedulingBoundary(MI, &MBB, Fn)) {
328+
if (MI.isCall() || TII->isSchedulingBoundary(MI, &MBB, MF)) {
324329
Scheduler.enterRegion(&MBB, I, Current, CurrentCount - Count);
325330
Scheduler.setEndIndex(CurrentCount);
326331
Scheduler.schedule();
@@ -353,6 +358,39 @@ bool PostRAScheduler::runOnMachineFunction(MachineFunction &Fn) {
353358
return true;
354359
}
355360

361+
bool PostRASchedulerLegacy::runOnMachineFunction(MachineFunction &MF) {
362+
if (skipFunction(MF.getFunction()))
363+
return false;
364+
365+
MachineLoopInfo *MLI = &getAnalysis<MachineLoopInfoWrapperPass>().getLI();
366+
AliasAnalysis *AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
367+
const TargetMachine *TM =
368+
&getAnalysis<TargetPassConfig>().getTM<TargetMachine>();
369+
PostRAScheduler Impl(MF, MLI, AA, TM);
370+
return Impl.run(MF);
371+
}
372+
373+
PreservedAnalyses
374+
PostRASchedulerPass::run(MachineFunction &MF,
375+
MachineFunctionAnalysisManager &MFAM) {
376+
MFPropsModifier _(*this, MF);
377+
378+
MachineLoopInfo *MLI = &MFAM.getResult<MachineLoopAnalysis>(MF);
379+
auto &FAM = MFAM.getResult<FunctionAnalysisManagerMachineFunctionProxy>(MF)
380+
.getManager();
381+
AliasAnalysis *AA = &FAM.getResult<AAManager>(MF.getFunction());
382+
PostRAScheduler Impl(MF, MLI, AA, TM);
383+
bool Changed = Impl.run(MF);
384+
if (!Changed)
385+
return PreservedAnalyses::all();
386+
387+
PreservedAnalyses PA = getMachineFunctionPassPreservedAnalyses();
388+
PA.preserveSet<CFGAnalyses>();
389+
PA.preserve<MachineDominatorTreeAnalysis>();
390+
PA.preserve<MachineLoopAnalysis>();
391+
return PA;
392+
}
393+
356394
/// StartBlock - Initialize register live-range state for scheduling in
357395
/// this block.
358396
///

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@
125125
#include "llvm/CodeGen/OptimizePHIs.h"
126126
#include "llvm/CodeGen/PHIElimination.h"
127127
#include "llvm/CodeGen/PeepholeOptimizer.h"
128+
#include "llvm/CodeGen/PostRASchedulerList.h"
128129
#include "llvm/CodeGen/PreISelIntrinsicLowering.h"
129130
#include "llvm/CodeGen/RegAllocFast.h"
130131
#include "llvm/CodeGen/RegUsageInfoCollector.h"

llvm/test/CodeGen/AMDGPU/bundle-latency.mir

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
22
# RUN: llc -mtriple=amdgcn -mcpu=gfx900 -verify-machineinstrs -run-pass=post-RA-sched %s -o - | FileCheck -check-prefix=GCN %s
3+
# RUN: llc -mtriple=amdgcn -mcpu=gfx900 -passes=post-RA-sched %s -o - | FileCheck -check-prefix=GCN %s
34

45
# Check that we move consumer further from producer, even if one of them is in a bundle.
56

llvm/test/CodeGen/AMDGPU/cluster-flat-loads-postra.mir

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# RUN: llc -mtriple=amdgcn -mcpu=tonga -mattr=-xnack -run-pass post-RA-sched -verify-machineinstrs -o - %s | FileCheck -check-prefix=GCN %s
2+
# RUN: llc -mtriple=amdgcn -mcpu=tonga -mattr=-xnack -passes=post-RA-sched -o - %s | FileCheck -check-prefix=GCN %s
23

34
# GCN: FLAT_LOAD_DWORD
45
# GCN-NEXT: FLAT_LOAD_DWORD

llvm/test/CodeGen/AMDGPU/hazard-kill.mir

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# RUN: llc -mtriple=amdgcn -mcpu=gfx900 -verify-machineinstrs -run-pass post-RA-sched %s -o - | FileCheck -check-prefix=GFX90 %s
2+
# RUN: llc -mtriple=amdgcn -mcpu=gfx900 -passes=post-RA-sched %s -o - | FileCheck -check-prefix=GFX90 %s
23

34
# This tests that a KILL isn't considered as a valid instruction for a hazard
45
# slot (e.g. m0 def followed by V_INTERP for gfx9)

llvm/test/CodeGen/AMDGPU/misched-killflags.mir

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=fiji -verify-machineinstrs -run-pass=post-RA-sched -o - %s | FileCheck %s
2+
# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=fiji -passes=post-RA-sched -o - %s | FileCheck %s
23
# Make sure ScheduleDAGInstrs::fixupKills does not produce invalid kill flags.
34
---
45
name: func0

llvm/test/CodeGen/AMDGPU/movrels-bug.mir

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# RUN: llc -mtriple=amdgcn -verify-machineinstrs -run-pass post-RA-sched %s -o - | FileCheck %s
2+
# RUN: llc -mtriple=amdgcn -passes=post-RA-sched %s -o - | FileCheck %s
23

34
# This tests a situation where a sub-register of a killed super-register operand
45
# of V_MOVRELS happens to have an undef use later on. This leads to the post RA

llvm/test/CodeGen/AMDGPU/post-ra-sched-kill-bundle-use-inst.mir

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
22
# RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 -run-pass=post-RA-sched -verify-machineinstrs -o - %s | FileCheck %s
3+
# RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 -passes=post-RA-sched -o - %s | FileCheck %s
34

45
# The scheduler was not inspecting the first instruction in the bundle
56
# when adding kill flags, so it would incorrectly mark the first use

llvm/test/CodeGen/ARM/vldmia-sched.mir

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# RUN: llc -run-pass=post-RA-sched %s -o - | FileCheck %s
2+
# RUN: llc -passes=post-RA-sched %s -o - | FileCheck %s
23
# CHECK: VLDMDIA
34
--- |
45
target triple = "thumbv7-w64-windows-gnu"

llvm/test/CodeGen/Hexagon/bank-conflict-load.mir

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# RUN: llc -mtriple=hexagon -run-pass post-RA-sched %s -o - | FileCheck %s
2+
# RUN: llc -mtriple=hexagon -passes=post-RA-sched %s -o - | FileCheck %s
23

34
# The two loads from %a ($r0) can cause a bank conflict. Check that they
45
# are not scheduled next to each other.

llvm/test/CodeGen/Hexagon/bank-conflict.mir

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# RUN: llc -mtriple=hexagon -run-pass post-RA-sched %s -o - | FileCheck %s
2+
# RUN: llc -mtriple=hexagon -passes=post-RA-sched %s -o - | FileCheck %s
23

34
# Test that the Post RA scheduler does not schedule back-to-back loads
45
# when there is another instruction to schedule. The scheduler avoids

llvm/test/CodeGen/X86/post-ra-sched-with-debug.mir

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=btver2 -run-pass=post-RA-sched -o - %s | FileCheck %s
2+
# RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=btver2 -passes=post-RA-sched -o - %s | FileCheck %s
23
# RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=btver2 -run-pass=post-RA-sched -o - %s -experimental-debug-variable-locations| FileCheck %s
4+
# RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=btver2 -passes=post-RA-sched -o - %s -experimental-debug-variable-locations| FileCheck %s
35

46
# Test that multiple DBG_VALUE's and DBG_PHIs following an instruction whose
57
# register needs # to be changed during the post-RA scheduler pass are updated

llvm/test/CodeGen/X86/pr27681.mir

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# RUN: llc -mtriple=i386-unknown-linux-gnu -mcpu=slm -run-pass post-RA-sched -o - %s | FileCheck %s
2+
# RUN: llc -mtriple=i386-unknown-linux-gnu -mcpu=slm -passes=post-RA-sched -o - %s | FileCheck %s
23
#
34
# Verify that the critical antidependence breaker does not consider
45
# a high byte register as available as a replacement register

0 commit comments

Comments
 (0)