https://github.com/optimisan updated https://github.com/llvm/llvm-project/pull/125192
>From 584e9d0006edbd0719341d7d69ca9a10e2d9c787 Mon Sep 17 00:00:00 2001 From: Akshat Oke <akshat....@amd.com> Date: Fri, 31 Jan 2025 04:57:41 +0000 Subject: [PATCH] [CodeGen][NewPM] Port RenameIndependentSubregs to NPM --- .../llvm/CodeGen/RenameIndependentSubregs.h | 25 +++++++ llvm/include/llvm/InitializePasses.h | 2 +- llvm/include/llvm/Passes/CodeGenPassBuilder.h | 1 + .../llvm/Passes/MachinePassRegistry.def | 2 +- llvm/lib/CodeGen/CodeGen.cpp | 2 +- llvm/lib/CodeGen/RenameIndependentSubregs.cpp | 69 ++++++++++++------- llvm/lib/Passes/PassBuilder.cpp | 1 + .../coalescing-with-subregs-in-loop-bug.mir | 1 + ...ename-independent-subregs-mac-operands.mir | 1 + 9 files changed, 78 insertions(+), 26 deletions(-) create mode 100644 llvm/include/llvm/CodeGen/RenameIndependentSubregs.h diff --git a/llvm/include/llvm/CodeGen/RenameIndependentSubregs.h b/llvm/include/llvm/CodeGen/RenameIndependentSubregs.h new file mode 100644 index 00000000000000..2f6afe6bea6209 --- /dev/null +++ b/llvm/include/llvm/CodeGen/RenameIndependentSubregs.h @@ -0,0 +1,25 @@ +//===- llvm/CodeGen/RenameIndependentSubregs.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_RENAME_INDEPENDENT_SUBREGS_H +#define LLVM_CODEGEN_RENAME_INDEPENDENT_SUBREGS_H + +#include "llvm/CodeGen/MachinePassManager.h" + +namespace llvm { + +class RenameIndependentSubregsPass + : public PassInfoMixin<RenameIndependentSubregsPass> { +public: + PreservedAnalyses run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM); +}; + +} // namespace llvm + +#endif // LLVM_CODEGEN_RENAME_INDEPENDENT_SUBREGS_H diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h index 46fcd17347f4e0..8beacde0151868 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h @@ -269,7 +269,7 @@ void initializeRegionViewerPass(PassRegistry &); void initializeRegisterCoalescerLegacyPass(PassRegistry &); void initializeRemoveLoadsIntoFakeUsesPass(PassRegistry &); void initializeRemoveRedundantDebugValuesPass(PassRegistry &); -void initializeRenameIndependentSubregsPass(PassRegistry &); +void initializeRenameIndependentSubregsLegacyPass(PassRegistry &); void initializeReplaceWithVeclibLegacyPass(PassRegistry &); void initializeResetMachineFunctionPass(PassRegistry &); void initializeSCEVAAWrapperPassPass(PassRegistry &); diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h b/llvm/include/llvm/Passes/CodeGenPassBuilder.h index 9681368249a0f9..a3149e3d2f12bf 100644 --- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h +++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h @@ -59,6 +59,7 @@ #include "llvm/CodeGen/RegUsageInfoPropagate.h" #include "llvm/CodeGen/RegisterCoalescerPass.h" #include "llvm/CodeGen/RegisterUsageInfo.h" +#include "llvm/CodeGen/RenameIndependentSubregs.h" #include "llvm/CodeGen/ReplaceWithVeclib.h" #include "llvm/CodeGen/SafeStack.h" #include "llvm/CodeGen/SelectOptimize.h" diff --git a/llvm/include/llvm/Passes/MachinePassRegistry.def b/llvm/include/llvm/Passes/MachinePassRegistry.def index 1d978f2ea31228..66e218c3a9f35e 100644 --- a/llvm/include/llvm/Passes/MachinePassRegistry.def +++ b/llvm/include/llvm/Passes/MachinePassRegistry.def @@ -165,6 +165,7 @@ MACHINE_FUNCTION_PASS("print<virtregmap>", VirtRegMapPrinterPass(errs())) MACHINE_FUNCTION_PASS("reg-usage-collector", RegUsageInfoCollectorPass()) MACHINE_FUNCTION_PASS("reg-usage-propagation", RegUsageInfoPropagationPass()) MACHINE_FUNCTION_PASS("register-coalescer", RegisterCoalescerPass()) +MACHINE_FUNCTION_PASS("rename-independent-subregs", RenameIndependentSubregsPass()) MACHINE_FUNCTION_PASS("require-all-machine-function-properties", RequireAllMachineFunctionPropertiesPass()) MACHINE_FUNCTION_PASS("stack-coloring", StackColoringPass()) @@ -263,7 +264,6 @@ DUMMY_MACHINE_FUNCTION_PASS("regallocscoringpass", RegAllocScoringPass) DUMMY_MACHINE_FUNCTION_PASS("regbankselect", RegBankSelectPass) DUMMY_MACHINE_FUNCTION_PASS("remove-loads-into-fake-uses", RemoveLoadsIntoFakeUsesPass) DUMMY_MACHINE_FUNCTION_PASS("removeredundantdebugvalues", RemoveRedundantDebugValuesPass) -DUMMY_MACHINE_FUNCTION_PASS("rename-independent-subregs", RenameIndependentSubregsPass) DUMMY_MACHINE_FUNCTION_PASS("reset-machine-function", ResetMachineFunctionPass) DUMMY_MACHINE_FUNCTION_PASS("shrink-wrap", ShrinkWrapPass) DUMMY_MACHINE_FUNCTION_PASS("stack-frame-layout", StackFrameLayoutAnalysisPass) diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp index 5f0c7ec9c8d018..d0194c03b41ad3 100644 --- a/llvm/lib/CodeGen/CodeGen.cpp +++ b/llvm/lib/CodeGen/CodeGen.cpp @@ -119,7 +119,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) { initializeRegisterCoalescerLegacyPass(Registry); initializeRemoveLoadsIntoFakeUsesPass(Registry); initializeRemoveRedundantDebugValuesPass(Registry); - initializeRenameIndependentSubregsPass(Registry); + initializeRenameIndependentSubregsLegacyPass(Registry); initializeSafeStackLegacyPassPass(Registry); initializeSelectOptimizePass(Registry); initializeShadowStackGCLoweringPass(Registry); diff --git a/llvm/lib/CodeGen/RenameIndependentSubregs.cpp b/llvm/lib/CodeGen/RenameIndependentSubregs.cpp index 0128f87748a77f..58f212e1ba5218 100644 --- a/llvm/lib/CodeGen/RenameIndependentSubregs.cpp +++ b/llvm/lib/CodeGen/RenameIndependentSubregs.cpp @@ -26,6 +26,7 @@ // //===----------------------------------------------------------------------===// +#include "llvm/CodeGen/RenameIndependentSubregs.h" #include "LiveRangeUtils.h" #include "PHIEliminationUtils.h" #include "llvm/CodeGen/LiveInterval.h" @@ -43,25 +44,11 @@ using namespace llvm; namespace { -class RenameIndependentSubregs : public MachineFunctionPass { +class RenameIndependentSubregs { public: - static char ID; - RenameIndependentSubregs() : MachineFunctionPass(ID) {} - - StringRef getPassName() const override { - return "Rename Disconnected Subregister Components"; - } - - void getAnalysisUsage(AnalysisUsage &AU) const override { - AU.setPreservesCFG(); - AU.addRequired<LiveIntervalsWrapperPass>(); - AU.addPreserved<LiveIntervalsWrapperPass>(); - AU.addRequired<SlotIndexesWrapperPass>(); - AU.addPreserved<SlotIndexesWrapperPass>(); - MachineFunctionPass::getAnalysisUsage(AU); - } + RenameIndependentSubregs(LiveIntervals *LIS) : LIS(LIS) {} - bool runOnMachineFunction(MachineFunction &MF) override; + bool run(MachineFunction &MF); private: struct SubRangeInfo { @@ -106,17 +93,36 @@ class RenameIndependentSubregs : public MachineFunctionPass { const TargetInstrInfo *TII = nullptr; }; +class RenameIndependentSubregsLegacy : public MachineFunctionPass { +public: + static char ID; + RenameIndependentSubregsLegacy() : MachineFunctionPass(ID) {} + bool runOnMachineFunction(MachineFunction &MF) override; + StringRef getPassName() const override { + return "Rename Disconnected Subregister Components"; + } + + void getAnalysisUsage(AnalysisUsage &AU) const override { + AU.setPreservesCFG(); + AU.addRequired<LiveIntervalsWrapperPass>(); + AU.addPreserved<LiveIntervalsWrapperPass>(); + AU.addRequired<SlotIndexesWrapperPass>(); + AU.addPreserved<SlotIndexesWrapperPass>(); + MachineFunctionPass::getAnalysisUsage(AU); + } +}; + } // end anonymous namespace -char RenameIndependentSubregs::ID; +char RenameIndependentSubregsLegacy::ID; -char &llvm::RenameIndependentSubregsID = RenameIndependentSubregs::ID; +char &llvm::RenameIndependentSubregsID = RenameIndependentSubregsLegacy::ID; -INITIALIZE_PASS_BEGIN(RenameIndependentSubregs, DEBUG_TYPE, +INITIALIZE_PASS_BEGIN(RenameIndependentSubregsLegacy, DEBUG_TYPE, "Rename Independent Subregisters", false, false) INITIALIZE_PASS_DEPENDENCY(SlotIndexesWrapperPass) INITIALIZE_PASS_DEPENDENCY(LiveIntervalsWrapperPass) -INITIALIZE_PASS_END(RenameIndependentSubregs, DEBUG_TYPE, +INITIALIZE_PASS_END(RenameIndependentSubregsLegacy, DEBUG_TYPE, "Rename Independent Subregisters", false, false) bool RenameIndependentSubregs::renameComponents(LiveInterval &LI) const { @@ -381,7 +387,25 @@ void RenameIndependentSubregs::computeMainRangesFixFlags( } } -bool RenameIndependentSubregs::runOnMachineFunction(MachineFunction &MF) { +PreservedAnalyses +RenameIndependentSubregsPass::run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM) { + auto &LIS = MFAM.getResult<LiveIntervalsAnalysis>(MF); + if (!RenameIndependentSubregs(&LIS).run(MF)) + return PreservedAnalyses::all(); + auto PA = getMachineFunctionPassPreservedAnalyses(); + PA.preserveSet<CFGAnalyses>(); + PA.preserve<LiveIntervalsAnalysis>(); + PA.preserve<SlotIndexesAnalysis>(); + return PA; +} + +bool RenameIndependentSubregsLegacy::runOnMachineFunction(MachineFunction &MF) { + auto &LIS = getAnalysis<LiveIntervalsWrapperPass>().getLIS(); + return RenameIndependentSubregs(&LIS).run(MF); +} + +bool RenameIndependentSubregs::run(MachineFunction &MF) { // Skip renaming if liveness of subregister is not tracked. MRI = &MF.getRegInfo(); if (!MRI->subRegLivenessEnabled()) @@ -390,7 +414,6 @@ bool RenameIndependentSubregs::runOnMachineFunction(MachineFunction &MF) { LLVM_DEBUG(dbgs() << "Renaming independent subregister live ranges in " << MF.getName() << '\n'); - LIS = &getAnalysis<LiveIntervalsWrapperPass>().getLIS(); TII = MF.getSubtarget().getInstrInfo(); // Iterate over all vregs. Note that we query getNumVirtRegs() the newly diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index d9096edd3ba075..ce1f5d5a1fb575 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -129,6 +129,7 @@ #include "llvm/CodeGen/RegUsageInfoPropagate.h" #include "llvm/CodeGen/RegisterCoalescerPass.h" #include "llvm/CodeGen/RegisterUsageInfo.h" +#include "llvm/CodeGen/RenameIndependentSubregs.h" #include "llvm/CodeGen/SafeStack.h" #include "llvm/CodeGen/SelectOptimize.h" #include "llvm/CodeGen/ShadowStackGCLowering.h" diff --git a/llvm/test/CodeGen/AMDGPU/coalescing-with-subregs-in-loop-bug.mir b/llvm/test/CodeGen/AMDGPU/coalescing-with-subregs-in-loop-bug.mir index e066a48d9a3c26..dcc5d9dff33da5 100644 --- a/llvm/test/CodeGen/AMDGPU/coalescing-with-subregs-in-loop-bug.mir +++ b/llvm/test/CodeGen/AMDGPU/coalescing-with-subregs-in-loop-bug.mir @@ -1,4 +1,5 @@ # RUN: llc -mtriple=amdgcn--amdpal -mcpu=gfx803 -run-pass=register-coalescer,rename-independent-subregs %s -o - | FileCheck -check-prefix=GCN %s +# RUN: llc -mtriple=amdgcn--amdpal -mcpu=gfx803 -passes=register-coalescer,rename-independent-subregs %s -o - | FileCheck -check-prefix=GCN %s # This test is for a bug where the following happens: # diff --git a/llvm/test/CodeGen/AMDGPU/rename-independent-subregs-mac-operands.mir b/llvm/test/CodeGen/AMDGPU/rename-independent-subregs-mac-operands.mir index bb86f65f850dbf..97e970e4e573b8 100644 --- a/llvm/test/CodeGen/AMDGPU/rename-independent-subregs-mac-operands.mir +++ b/llvm/test/CodeGen/AMDGPU/rename-independent-subregs-mac-operands.mir @@ -1,4 +1,5 @@ # RUN: llc -mtriple=amdgcn -verify-machineinstrs -run-pass=register-coalescer,rename-independent-subregs -o - %s | FileCheck -check-prefix=GCN %s +# RUN: llc -mtriple=amdgcn -verify-machineinstrs -passes=register-coalescer,rename-independent-subregs -o - %s | FileCheck -check-prefix=GCN %s --- # GCN-LABEL: name: mac_invalid_operands _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits