Skip to content

Commit 2de1e06

Browse files
authored
[CodeGen][NewPM] Port RegUsageInfoCollector pass to NPM (#113874)
1 parent 56e56c9 commit 2de1e06

File tree

10 files changed

+87
-24
lines changed

10 files changed

+87
-24
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//===- llvm/CodeGen/RegUsageInfoCollector.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_REGUSAGEINFOCOLLECTOR_H
10+
#define LLVM_CODEGEN_REGUSAGEINFOCOLLECTOR_H
11+
12+
#include "llvm/CodeGen/MachinePassManager.h"
13+
14+
namespace llvm {
15+
16+
class RegUsageInfoCollectorPass
17+
: public AnalysisInfoMixin<RegUsageInfoCollectorPass> {
18+
public:
19+
PreservedAnalyses run(MachineFunction &MF,
20+
MachineFunctionAnalysisManager &MFAM);
21+
};
22+
23+
} // namespace llvm
24+
25+
#endif // LLVM_CODEGEN_REGUSAGEINFOCOLLECTOR_H

llvm/include/llvm/InitializePasses.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ void initializeRegAllocPriorityAdvisorAnalysisPass(PassRegistry &);
258258
void initializeRegAllocScoringPass(PassRegistry &);
259259
void initializeRegBankSelectPass(PassRegistry &);
260260
void initializeRegToMemWrapperPassPass(PassRegistry &);
261-
void initializeRegUsageInfoCollectorPass(PassRegistry &);
261+
void initializeRegUsageInfoCollectorLegacyPass(PassRegistry &);
262262
void initializeRegUsageInfoPropagationPass(PassRegistry &);
263263
void initializeRegionInfoPassPass(PassRegistry &);
264264
void initializeRegionOnlyPrinterPass(PassRegistry &);

llvm/include/llvm/Passes/CodeGenPassBuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
#include "llvm/CodeGen/PHIElimination.h"
5555
#include "llvm/CodeGen/PreISelIntrinsicLowering.h"
5656
#include "llvm/CodeGen/RegAllocFast.h"
57+
#include "llvm/CodeGen/RegUsageInfoCollector.h"
5758
#include "llvm/CodeGen/RegisterUsageInfo.h"
5859
#include "llvm/CodeGen/ReplaceWithVeclib.h"
5960
#include "llvm/CodeGen/SafeStack.h"

llvm/include/llvm/Passes/MachinePassRegistry.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ MACHINE_FUNCTION_PASS("print<machine-post-dom-tree>",
157157
MachinePostDominatorTreePrinterPass(dbgs()))
158158
MACHINE_FUNCTION_PASS("print<slot-indexes>", SlotIndexesPrinterPass(dbgs()))
159159
MACHINE_FUNCTION_PASS("print<virtregmap>", VirtRegMapPrinterPass(dbgs()))
160+
MACHINE_FUNCTION_PASS("reg-usage-collector", RegUsageInfoCollectorPass())
160161
MACHINE_FUNCTION_PASS("require-all-machine-function-properties",
161162
RequireAllMachineFunctionPropertiesPass())
162163
MACHINE_FUNCTION_PASS("stack-coloring", StackColoringPass())
@@ -251,7 +252,6 @@ DUMMY_MACHINE_FUNCTION_PASS("prologepilog-code", PrologEpilogCodeInserterPass)
251252
DUMMY_MACHINE_FUNCTION_PASS("ra-basic", RABasicPass)
252253
DUMMY_MACHINE_FUNCTION_PASS("ra-greedy", RAGreedyPass)
253254
DUMMY_MACHINE_FUNCTION_PASS("ra-pbqp", RAPBQPPass)
254-
DUMMY_MACHINE_FUNCTION_PASS("reg-usage-collector", RegUsageInfoCollectorPass)
255255
DUMMY_MACHINE_FUNCTION_PASS("reg-usage-propagation", RegUsageInfoPropagationPass)
256256
DUMMY_MACHINE_FUNCTION_PASS("regalloc", RegAllocPass)
257257
DUMMY_MACHINE_FUNCTION_PASS("regallocscoringpass", RegAllocScoringPass)

llvm/lib/CodeGen/CodeGen.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
113113
initializeRABasicPass(Registry);
114114
initializeRAGreedyPass(Registry);
115115
initializeRegAllocFastPass(Registry);
116-
initializeRegUsageInfoCollectorPass(Registry);
116+
initializeRegUsageInfoCollectorLegacyPass(Registry);
117117
initializeRegUsageInfoPropagationPass(Registry);
118118
initializeRegisterCoalescerPass(Registry);
119119
initializeRemoveLoadsIntoFakeUsesPass(Registry);

llvm/lib/CodeGen/RegUsageInfoCollector.cpp

Lines changed: 44 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@
1616
///
1717
//===----------------------------------------------------------------------===//
1818

19+
#include "llvm/CodeGen/RegUsageInfoCollector.h"
1920
#include "llvm/ADT/Statistic.h"
2021
#include "llvm/CodeGen/MachineFunctionPass.h"
2122
#include "llvm/CodeGen/MachineOperand.h"
23+
#include "llvm/CodeGen/MachinePassManager.h"
2224
#include "llvm/CodeGen/MachineRegisterInfo.h"
2325
#include "llvm/CodeGen/Passes.h"
2426
#include "llvm/CodeGen/RegisterUsageInfo.h"
@@ -36,11 +38,23 @@ STATISTIC(NumCSROpt,
3638

3739
namespace {
3840

39-
class RegUsageInfoCollector : public MachineFunctionPass {
41+
class RegUsageInfoCollector {
42+
PhysicalRegisterUsageInfo &PRUI;
43+
4044
public:
41-
RegUsageInfoCollector() : MachineFunctionPass(ID) {
42-
PassRegistry &Registry = *PassRegistry::getPassRegistry();
43-
initializeRegUsageInfoCollectorPass(Registry);
45+
RegUsageInfoCollector(PhysicalRegisterUsageInfo &PRUI) : PRUI(PRUI) {}
46+
bool run(MachineFunction &MF);
47+
48+
// Call getCalleeSaves and then also set the bits for subregs and
49+
// fully saved superregs.
50+
static void computeCalleeSavedRegs(BitVector &SavedRegs, MachineFunction &MF);
51+
};
52+
53+
class RegUsageInfoCollectorLegacy : public MachineFunctionPass {
54+
public:
55+
static char ID;
56+
RegUsageInfoCollectorLegacy() : MachineFunctionPass(ID) {
57+
initializeRegUsageInfoCollectorLegacyPass(*PassRegistry::getPassRegistry());
4458
}
4559

4660
StringRef getPassName() const override {
@@ -54,26 +68,19 @@ class RegUsageInfoCollector : public MachineFunctionPass {
5468
}
5569

5670
bool runOnMachineFunction(MachineFunction &MF) override;
57-
58-
// Call getCalleeSaves and then also set the bits for subregs and
59-
// fully saved superregs.
60-
static void computeCalleeSavedRegs(BitVector &SavedRegs, MachineFunction &MF);
61-
62-
static char ID;
6371
};
64-
6572
} // end of anonymous namespace
6673

67-
char RegUsageInfoCollector::ID = 0;
74+
char RegUsageInfoCollectorLegacy::ID = 0;
6875

69-
INITIALIZE_PASS_BEGIN(RegUsageInfoCollector, "RegUsageInfoCollector",
76+
INITIALIZE_PASS_BEGIN(RegUsageInfoCollectorLegacy, "RegUsageInfoCollector",
7077
"Register Usage Information Collector", false, false)
7178
INITIALIZE_PASS_DEPENDENCY(PhysicalRegisterUsageInfoWrapperLegacy)
72-
INITIALIZE_PASS_END(RegUsageInfoCollector, "RegUsageInfoCollector",
79+
INITIALIZE_PASS_END(RegUsageInfoCollectorLegacy, "RegUsageInfoCollector",
7380
"Register Usage Information Collector", false, false)
7481

7582
FunctionPass *llvm::createRegUsageInfoCollector() {
76-
return new RegUsageInfoCollector();
83+
return new RegUsageInfoCollectorLegacy();
7784
}
7885

7986
// TODO: Move to hook somwehere?
@@ -97,14 +104,32 @@ static bool isCallableFunction(const MachineFunction &MF) {
97104
}
98105
}
99106

100-
bool RegUsageInfoCollector::runOnMachineFunction(MachineFunction &MF) {
107+
PreservedAnalyses
108+
RegUsageInfoCollectorPass::run(MachineFunction &MF,
109+
MachineFunctionAnalysisManager &MFAM) {
110+
Module &MFA = *MF.getFunction().getParent();
111+
auto *PRUI = MFAM.getResult<ModuleAnalysisManagerMachineFunctionProxy>(MF)
112+
.getCachedResult<PhysicalRegisterUsageAnalysis>(MFA);
113+
assert(PRUI && "PhysicalRegisterUsageAnalysis not available");
114+
RegUsageInfoCollector(*PRUI).run(MF);
115+
return PreservedAnalyses::all();
116+
}
117+
118+
bool RegUsageInfoCollectorLegacy::runOnMachineFunction(MachineFunction &MF) {
119+
PhysicalRegisterUsageInfo &PRUI =
120+
getAnalysis<PhysicalRegisterUsageInfoWrapperLegacy>().getPRUI();
121+
return RegUsageInfoCollector(PRUI).run(MF);
122+
}
123+
124+
bool RegUsageInfoCollector::run(MachineFunction &MF) {
101125
MachineRegisterInfo *MRI = &MF.getRegInfo();
102126
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
103127
const TargetMachine &TM = MF.getTarget();
104128

105-
LLVM_DEBUG(dbgs() << " -------------------- " << getPassName()
106-
<< " -------------------- \nFunction Name : "
107-
<< MF.getName() << '\n');
129+
LLVM_DEBUG(
130+
dbgs()
131+
<< " -------------------- Register Usage Information Collector Pass"
132+
<< " -------------------- \nFunction Name : " << MF.getName() << '\n');
108133

109134
// Analyzing the register usage may be expensive on some targets.
110135
if (!isCallableFunction(MF)) {
@@ -129,8 +154,6 @@ bool RegUsageInfoCollector::runOnMachineFunction(MachineFunction &MF) {
129154

130155
const Function &F = MF.getFunction();
131156

132-
PhysicalRegisterUsageInfo &PRUI =
133-
getAnalysis<PhysicalRegisterUsageInfoWrapperLegacy>().getPRUI();
134157
PRUI.setTargetMachine(TM);
135158

136159
LLVM_DEBUG(dbgs() << "Clobbered Registers: ");

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@
120120
#include "llvm/CodeGen/PHIElimination.h"
121121
#include "llvm/CodeGen/PreISelIntrinsicLowering.h"
122122
#include "llvm/CodeGen/RegAllocFast.h"
123+
#include "llvm/CodeGen/RegUsageInfoCollector.h"
123124
#include "llvm/CodeGen/RegisterUsageInfo.h"
124125
#include "llvm/CodeGen/SafeStack.h"
125126
#include "llvm/CodeGen/SelectOptimize.h"

llvm/test/CodeGen/AMDGPU/ipra-regmask.ll

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
22
; RUN: llc -mtriple=amdgcn-amd-amdhsa -enable-ipra -print-regusage -o /dev/null 2>&1 < %s | FileCheck %s
3+
4+
; RUN: llc -mtriple=amdgcn-amd-amdhsa -stop-after=prologepilog -o - %s \
5+
; RUN: | llc -x=mir -mtriple=amdgcn-amd-amdhsa -passes="module(require<reg-usage>,function(machine-function(reg-usage-collector)),print<reg-usage>)" -o /dev/null 2>&1 \
6+
; RUN: | FileCheck %s
7+
38
; Make sure the expected regmask is generated for sub/superregisters.
49

510
; CHECK-DAG: csr Clobbered Registers: $vgpr0 $vgpr0_hi16 $vgpr0_lo16 $vgpr0_vgpr1 $vgpr0_vgpr1_vgpr2 $vgpr0_vgpr1_vgpr2_vgpr3 $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4 $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5 $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6 $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7 $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8 $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9 $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10 $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10_vgpr11 $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15 $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15_vgpr16_vgpr17_vgpr18_vgpr19_vgpr20_vgpr21_vgpr22_vgpr23_vgpr24_vgpr25_vgpr26_vgpr27_vgpr28_vgpr29_vgpr30_vgpr31 {{$}}

llvm/test/CodeGen/X86/ipra-inline-asm.ll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
; RUN: llc -enable-ipra -print-regusage -o /dev/null 2>&1 < %s | FileCheck %s
22

3+
; RUN: llc --stop-after=prologepilog -o - %s \
4+
; RUN: | llc -x=mir -enable-ipra -passes="module(require<reg-usage>,function(machine-function(reg-usage-collector)),print<reg-usage>)" -o /dev/null 2>&1 \
5+
; RUN: | FileCheck %s
6+
37
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
48
target triple = "x86_64-apple-macosx10.12.0"
59

llvm/test/CodeGen/X86/ipra-reg-usage.ll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
; RUN: llc -enable-ipra -print-regusage -o /dev/null 2>&1 < %s | FileCheck %s
22

3+
; RUN: llc -stop-after=prologepilog -o - %s \
4+
; RUN: | llc -x=mir -enable-ipra -passes="module(require<reg-usage>,function(machine-function(reg-usage-collector)),print<reg-usage>)" -o /dev/null 2>&1 \
5+
; RUN: | FileCheck %s
6+
37
target triple = "x86_64-unknown-unknown"
48
declare void @bar1()
59
define preserve_allcc void @foo()#0 {

0 commit comments

Comments
 (0)