[llvm] AMDGPU: Use helper function for use/def chain walk (PR #129052)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 27 05:22:23 PST 2025
https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/129052
PeepholeOpt has a nicer version of this which handles more
cases.
>From d3d300522d58d8f376cb059327bfeec9e1abd17f Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Thu, 27 Feb 2025 14:22:34 +0700
Subject: [PATCH] AMDGPU: Use helper function for use/def chain walk
PeepholeOpt has a nicer version of this which handles more
cases.
---
llvm/lib/Target/AMDGPU/SIFoldOperands.cpp | 55 +++++++++++++++--------
1 file changed, 37 insertions(+), 18 deletions(-)
diff --git a/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp b/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp
index f1ba199fbae3f..6cb6863068b5f 100644
--- a/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp
+++ b/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp
@@ -781,6 +781,27 @@ bool SIFoldOperandsImpl::isUseSafeToFold(const MachineInstr &MI,
return !TII->isSDWA(MI);
}
+static MachineOperand *lookUpCopyChain(const SIInstrInfo &TII,
+ const MachineRegisterInfo &MRI,
+ Register SrcReg) {
+ MachineOperand *Sub = nullptr;
+ for (MachineInstr *SubDef = MRI.getVRegDef(SrcReg);
+ SubDef && TII.isFoldableCopy(*SubDef);
+ SubDef = MRI.getVRegDef(Sub->getReg())) {
+ MachineOperand &SrcOp = SubDef->getOperand(1);
+ if (SrcOp.isImm())
+ return &SrcOp;
+ if (!SrcOp.isReg() || SrcOp.getReg().isPhysical())
+ break;
+ Sub = &SrcOp;
+ // TODO: Support compose
+ if (SrcOp.getSubReg())
+ break;
+ }
+
+ return Sub;
+}
+
// Find a def of the UseReg, check if it is a reg_sequence and find initializers
// for each subreg, tracking it to foldable inline immediate if possible.
// Returns true on success.
@@ -791,26 +812,24 @@ bool SIFoldOperandsImpl::getRegSeqInit(
if (!Def || !Def->isRegSequence())
return false;
- for (unsigned I = 1, E = Def->getNumExplicitOperands(); I < E; I += 2) {
- MachineOperand *Sub = &Def->getOperand(I);
- assert(Sub->isReg());
-
- for (MachineInstr *SubDef = MRI->getVRegDef(Sub->getReg());
- SubDef && Sub->isReg() && Sub->getReg().isVirtual() &&
- !Sub->getSubReg() && TII->isFoldableCopy(*SubDef);
- SubDef = MRI->getVRegDef(Sub->getReg())) {
- MachineOperand *Op = &SubDef->getOperand(1);
- if (Op->isImm()) {
- if (TII->isInlineConstant(*Op, OpTy))
- Sub = Op;
- break;
- }
- if (!Op->isReg() || Op->getReg().isPhysical())
- break;
- Sub = Op;
+ for (unsigned I = 1, E = Def->getNumExplicitOperands(); I != E; I += 2) {
+ MachineOperand &SrcOp = Def->getOperand(I);
+ unsigned SubRegIdx = Def->getOperand(I + 1).getImm();
+
+ if (SrcOp.getSubReg()) {
+ // TODO: Handle subregister compose
+ Defs.emplace_back(&SrcOp, SubRegIdx);
+ continue;
+ }
+
+ MachineOperand *DefSrc = lookUpCopyChain(*TII, *MRI, SrcOp.getReg());
+ if (DefSrc && (DefSrc->isReg() ||
+ (DefSrc->isImm() && TII->isInlineConstant(*DefSrc, OpTy)))) {
+ Defs.emplace_back(DefSrc, SubRegIdx);
+ continue;
}
- Defs.emplace_back(Sub, Def->getOperand(I + 1).getImm());
+ Defs.emplace_back(&SrcOp, SubRegIdx);
}
return true;
More information about the llvm-commits
mailing list