-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[CodeGen][NewPM] Port RegUsageInfoPropagation pass to NPM #114010
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[CodeGen][NewPM] Port RegUsageInfoPropagation pass to NPM #114010
Conversation
This stack of pull requests is managed by Graphite. Learn more about stacking. |
f84d99b
to
5f42368
Compare
@llvm/pr-subscribers-backend-aarch64 @llvm/pr-subscribers-llvm-regalloc Author: Akshat Oke (optimisan) ChangesFull diff: https://github.com/llvm/llvm-project/pull/114010.diff 8 Files Affected:
diff --git a/llvm/include/llvm/CodeGen/RegUsageInfoPropagate.h b/llvm/include/llvm/CodeGen/RegUsageInfoPropagate.h
new file mode 100644
index 00000000000000..73624015e37d9d
--- /dev/null
+++ b/llvm/include/llvm/CodeGen/RegUsageInfoPropagate.h
@@ -0,0 +1,25 @@
+//===- llvm/CodeGen/RegUsageInfoPropagate.h ---------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CODEGEN_REGUSAGEINFOPROPAGATE_H
+#define LLVM_CODEGEN_REGUSAGEINFOPROPAGATE_H
+
+#include "llvm/CodeGen/MachinePassManager.h"
+
+namespace llvm {
+
+class RegUsageInfoPropagationPass
+ : public PassInfoMixin<RegUsageInfoPropagationPass> {
+public:
+ PreservedAnalyses run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM);
+};
+
+} // namespace llvm
+
+#endif // LLVM_CODEGEN_REGUSAGEINFOPROPAGATE_H
diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h
index c881dcd57006db..a9ab739af33ad8 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -258,7 +258,7 @@ void initializeRegAllocScoringPass(PassRegistry &);
void initializeRegBankSelectPass(PassRegistry &);
void initializeRegToMemWrapperPassPass(PassRegistry &);
void initializeRegUsageInfoCollectorLegacyPass(PassRegistry &);
-void initializeRegUsageInfoPropagationPass(PassRegistry &);
+void initializeRegUsageInfoPropagationLegacyPass(PassRegistry &);
void initializeRegionInfoPassPass(PassRegistry &);
void initializeRegionOnlyPrinterPass(PassRegistry &);
void initializeRegionOnlyViewerPass(PassRegistry &);
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
index 14fcf9d79fbc23..a64ecd69e55913 100644
--- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h
+++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
@@ -54,6 +54,7 @@
#include "llvm/CodeGen/PreISelIntrinsicLowering.h"
#include "llvm/CodeGen/RegAllocFast.h"
#include "llvm/CodeGen/RegUsageInfoCollector.h"
+#include "llvm/CodeGen/RegUsageInfoPropagate.h"
#include "llvm/CodeGen/RegisterUsageInfo.h"
#include "llvm/CodeGen/ReplaceWithVeclib.h"
#include "llvm/CodeGen/SafeStack.h"
diff --git a/llvm/include/llvm/Passes/MachinePassRegistry.def b/llvm/include/llvm/Passes/MachinePassRegistry.def
index 36d17b713639c1..099b009a2b3fee 100644
--- a/llvm/include/llvm/Passes/MachinePassRegistry.def
+++ b/llvm/include/llvm/Passes/MachinePassRegistry.def
@@ -156,6 +156,7 @@ MACHINE_FUNCTION_PASS("print<machine-post-dom-tree>",
MACHINE_FUNCTION_PASS("print<slot-indexes>", SlotIndexesPrinterPass(dbgs()))
MACHINE_FUNCTION_PASS("print<virtregmap>", VirtRegMapPrinterPass(dbgs()))
MACHINE_FUNCTION_PASS("reg-usage-collector", RegUsageInfoCollectorPass())
+MACHINE_FUNCTION_PASS("reg-usage-propagation", RegUsageInfoPropagationPass())
MACHINE_FUNCTION_PASS("require-all-machine-function-properties",
RequireAllMachineFunctionPropertiesPass())
MACHINE_FUNCTION_PASS("stack-coloring", StackColoringPass())
@@ -250,7 +251,6 @@ DUMMY_MACHINE_FUNCTION_PASS("prologepilog-code", PrologEpilogCodeInserterPass)
DUMMY_MACHINE_FUNCTION_PASS("ra-basic", RABasicPass)
DUMMY_MACHINE_FUNCTION_PASS("ra-greedy", RAGreedyPass)
DUMMY_MACHINE_FUNCTION_PASS("ra-pbqp", RAPBQPPass)
-DUMMY_MACHINE_FUNCTION_PASS("reg-usage-propagation", RegUsageInfoPropagationPass)
DUMMY_MACHINE_FUNCTION_PASS("regalloc", RegAllocPass)
DUMMY_MACHINE_FUNCTION_PASS("regallocscoringpass", RegAllocScoringPass)
DUMMY_MACHINE_FUNCTION_PASS("regbankselect", RegBankSelectPass)
diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp
index 76b74ea4e6fe0b..20d1417193a864 100644
--- a/llvm/lib/CodeGen/CodeGen.cpp
+++ b/llvm/lib/CodeGen/CodeGen.cpp
@@ -114,7 +114,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
initializeRAGreedyPass(Registry);
initializeRegAllocFastPass(Registry);
initializeRegUsageInfoCollectorLegacyPass(Registry);
- initializeRegUsageInfoPropagationPass(Registry);
+ initializeRegUsageInfoPropagationLegacyPass(Registry);
initializeRegisterCoalescerPass(Registry);
initializeRemoveLoadsIntoFakeUsesPass(Registry);
initializeRemoveRedundantDebugValuesPass(Registry);
diff --git a/llvm/lib/CodeGen/RegUsageInfoPropagate.cpp b/llvm/lib/CodeGen/RegUsageInfoPropagate.cpp
index 5ffe6acc83d601..3877d1c0d62488 100644
--- a/llvm/lib/CodeGen/RegUsageInfoPropagate.cpp
+++ b/llvm/lib/CodeGen/RegUsageInfoPropagate.cpp
@@ -18,6 +18,7 @@
///
//===----------------------------------------------------------------------===//
+#include "llvm/CodeGen/RegUsageInfoPropagate.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
@@ -25,8 +26,10 @@
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/RegisterUsageInfo.h"
+#include "llvm/IR/Analysis.h"
#include "llvm/IR/Module.h"
#include "llvm/Pass.h"
+#include "llvm/Passes/CodeGenPassBuilder.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
@@ -38,26 +41,16 @@ using namespace llvm;
namespace {
-class RegUsageInfoPropagation : public MachineFunctionPass {
+class RegUsageInfoPropagation {
public:
- RegUsageInfoPropagation() : MachineFunctionPass(ID) {
- PassRegistry &Registry = *PassRegistry::getPassRegistry();
- initializeRegUsageInfoPropagationPass(Registry);
- }
+ explicit RegUsageInfoPropagation(PhysicalRegisterUsageInfo *PRUI)
+ : PRUI(PRUI) {}
- StringRef getPassName() const override { return RUIP_NAME; }
-
- bool runOnMachineFunction(MachineFunction &MF) override;
-
- void getAnalysisUsage(AnalysisUsage &AU) const override {
- AU.addRequired<PhysicalRegisterUsageInfoWrapperLegacy>();
- AU.setPreservesAll();
- MachineFunctionPass::getAnalysisUsage(AU);
- }
-
- static char ID;
+ bool run(MachineFunction &MF);
private:
+ PhysicalRegisterUsageInfo *PRUI;
+
static void setRegMask(MachineInstr &MI, ArrayRef<uint32_t> RegMask) {
assert(RegMask.size() ==
MachineOperand::getRegMaskSize(MI.getParent()->getParent()
@@ -71,15 +64,34 @@ class RegUsageInfoPropagation : public MachineFunctionPass {
}
};
+class RegUsageInfoPropagationLegacy : public MachineFunctionPass {
+public:
+ static char ID;
+ RegUsageInfoPropagationLegacy() : MachineFunctionPass(ID) {
+ PassRegistry &Registry = *PassRegistry::getPassRegistry();
+ initializeRegUsageInfoPropagationLegacyPass(Registry);
+ }
+
+ StringRef getPassName() const override { return RUIP_NAME; }
+
+ bool runOnMachineFunction(MachineFunction &MF) override;
+
+ void getAnalysisUsage(AnalysisUsage &AU) const override {
+ AU.addRequired<PhysicalRegisterUsageInfoWrapperLegacy>();
+ AU.setPreservesAll();
+ MachineFunctionPass::getAnalysisUsage(AU);
+ }
+};
+
} // end of anonymous namespace
-INITIALIZE_PASS_BEGIN(RegUsageInfoPropagation, "reg-usage-propagation",
+INITIALIZE_PASS_BEGIN(RegUsageInfoPropagationLegacy, "reg-usage-propagation",
RUIP_NAME, false, false)
INITIALIZE_PASS_DEPENDENCY(PhysicalRegisterUsageInfoWrapperLegacy)
-INITIALIZE_PASS_END(RegUsageInfoPropagation, "reg-usage-propagation",
+INITIALIZE_PASS_END(RegUsageInfoPropagationLegacy, "reg-usage-propagation",
RUIP_NAME, false, false)
-char RegUsageInfoPropagation::ID = 0;
+char RegUsageInfoPropagationLegacy::ID = 0;
// Assumes call instructions have a single reference to a function.
static const Function *findCalledFunction(const Module &M,
@@ -95,12 +107,29 @@ static const Function *findCalledFunction(const Module &M,
return nullptr;
}
-bool RegUsageInfoPropagation::runOnMachineFunction(MachineFunction &MF) {
- const Module &M = *MF.getFunction().getParent();
+bool RegUsageInfoPropagationLegacy::runOnMachineFunction(MachineFunction &MF) {
PhysicalRegisterUsageInfo *PRUI =
&getAnalysis<PhysicalRegisterUsageInfoWrapperLegacy>().getPRUI();
- LLVM_DEBUG(dbgs() << " ++++++++++++++++++++ " << getPassName()
+ RegUsageInfoPropagation RUIP(PRUI);
+ return RUIP.run(MF);
+}
+
+PreservedAnalyses
+RegUsageInfoPropagationPass::run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM) {
+ Module &MFA = *MF.getFunction().getParent();
+ auto *PRUI = MFAM.getResult<ModuleAnalysisManagerMachineFunctionProxy>(MF)
+ .getCachedResult<PhysicalRegisterUsageInfoAnalysis>(MFA);
+ assert(PRUI && "PhysicalRegisterUsageInfoAnalysis not available");
+ RegUsageInfoPropagation(PRUI).run(MF);
+ return PreservedAnalyses::all();
+}
+
+bool RegUsageInfoPropagation::run(MachineFunction &MF) {
+ const Module &M = *MF.getFunction().getParent();
+
+ LLVM_DEBUG(dbgs() << " ++++++++++++++++++++ " << RUIP_NAME
<< " ++++++++++++++++++++ \n");
LLVM_DEBUG(dbgs() << "MachineFunction : " << MF.getName() << "\n");
@@ -151,5 +180,5 @@ bool RegUsageInfoPropagation::runOnMachineFunction(MachineFunction &MF) {
}
FunctionPass *llvm::createRegUsageInfoPropPass() {
- return new RegUsageInfoPropagation();
+ return new RegUsageInfoPropagationLegacy();
}
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index a76ebb01251b72..5e129419c9f63d 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -119,6 +119,7 @@
#include "llvm/CodeGen/PreISelIntrinsicLowering.h"
#include "llvm/CodeGen/RegAllocFast.h"
#include "llvm/CodeGen/RegUsageInfoCollector.h"
+#include "llvm/CodeGen/RegUsageInfoPropagate.h"
#include "llvm/CodeGen/RegisterUsageInfo.h"
#include "llvm/CodeGen/SafeStack.h"
#include "llvm/CodeGen/SelectOptimize.h"
diff --git a/llvm/test/CodeGen/AArch64/preserve.ll b/llvm/test/CodeGen/AArch64/preserve.ll
index 5839bb5440a9b0..0e342b97a39dee 100644
--- a/llvm/test/CodeGen/AArch64/preserve.ll
+++ b/llvm/test/CodeGen/AArch64/preserve.ll
@@ -1,6 +1,10 @@
; RUN: llc -enable-ipra -print-regusage -o /dev/null 2>&1 < %s | FileCheck %s
+; RUN: llc -stop-after=irtranslator -o - %s \
+; RUN: | llc -x=mir -enable-ipra -passes="require<reg-usage-info>,function(machine-function(reg-usage-propagation,reg-usage-collector)),print<regusage>" -o /dev/null 2>&1 \
+; RUN: | FileCheck %s
+
target triple = "aarch64-unknown-unknown"
declare void @bar1()
define preserve_mostcc void @baz() #0 {
|
7656d20
to
3628633
Compare
5f42368
to
5f01016
Compare
3628633
to
5a318a8
Compare
5f01016
to
b4d5e1b
Compare
auto *PRUI = MFAM.getResult<ModuleAnalysisManagerMachineFunctionProxy>(MF) | ||
.getCachedResult<PhysicalRegisterUsageAnalysis>(MFA); | ||
assert(PRUI && "PhysicalRegisterUsageAnalysis not available"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why not just use getResult and delete the assert?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is an outer analysis so cannot run it from an inner IR
b4d5e1b
to
670c20c
Compare
Merge activity
|
97eb13a
to
50d950c
Compare
670c20c
to
931fab8
Compare
50d950c
to
e6bad87
Compare
931fab8
to
f69e911
Compare
e6bad87
to
4903ec8
Compare
f69e911
to
9b98195
Compare
4903ec8
to
cd123fe
Compare
9b98195
to
612b09c
Compare
612b09c
to
00737da
Compare
No description provided.