-
Notifications
You must be signed in to change notification settings - Fork 14.3k
AMDGPU: Generalize instruction shrinking code #93810
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
Conversation
Try to avoid referring to specific operand names, except in the special case. The special case for hasNamedOperand(Op32, sdst) seems to have been dead code.
@llvm/pr-subscribers-backend-amdgpu Author: Matt Arsenault (arsenm) ChangesTry to avoid referring to specific operand names, except in the special case. The special case for hasNamedOperand(Op32, sdst) seems to have been dead code. Full diff: https://github.com/llvm/llvm-project/pull/93810.diff 1 Files Affected:
diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
index bb5f166e47925..29c1c310cdc3b 100644
--- a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
+++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
@@ -4486,46 +4486,47 @@ static void copyFlagsToImplicitVCC(MachineInstr &MI,
MachineInstr *SIInstrInfo::buildShrunkInst(MachineInstr &MI,
unsigned Op32) const {
MachineBasicBlock *MBB = MI.getParent();
+
+ const MCInstrDesc &Op32Desc = get(Op32);
MachineInstrBuilder Inst32 =
- BuildMI(*MBB, MI, MI.getDebugLoc(), get(Op32))
+ BuildMI(*MBB, MI, MI.getDebugLoc(), Op32Desc)
.setMIFlags(MI.getFlags());
// Add the dst operand if the 32-bit encoding also has an explicit $vdst.
// For VOPC instructions, this is replaced by an implicit def of vcc.
- if (AMDGPU::hasNamedOperand(Op32, AMDGPU::OpName::vdst)) {
- // dst
- Inst32.add(MI.getOperand(0));
- } else if (AMDGPU::hasNamedOperand(Op32, AMDGPU::OpName::sdst)) {
- // VOPCX instructions won't be writing to an explicit dst, so this should
- // not fail for these instructions.
- assert(((MI.getOperand(0).getReg() == AMDGPU::VCC) ||
- (MI.getOperand(0).getReg() == AMDGPU::VCC_LO)) &&
- "Unexpected case");
- }
-
- Inst32.add(*getNamedOperand(MI, AMDGPU::OpName::src0));
- const MachineOperand *Src1 = getNamedOperand(MI, AMDGPU::OpName::src1);
- if (Src1)
- Inst32.add(*Src1);
+ // We assume the defs of the shrunk opcode are in the same order, and the
+ // shrunk opcode loses the last def (SGPR def, in the VOP3->VOPC case).
+ for (int I = 0, E = Op32Desc.getNumDefs(); I != E; ++I)
+ Inst32.add(MI.getOperand(I));
const MachineOperand *Src2 = getNamedOperand(MI, AMDGPU::OpName::src2);
- if (Src2) {
- int Op32Src2Idx = AMDGPU::getNamedOperandIdx(Op32, AMDGPU::OpName::src2);
- if (Op32Src2Idx != -1) {
- Inst32.add(*Src2);
- } else {
- // In the case of V_CNDMASK_B32_e32, the explicit operand src2 is
- // replaced with an implicit read of vcc or vcc_lo. The implicit read
- // of vcc was already added during the initial BuildMI, but we
- // 1) may need to change vcc to vcc_lo to preserve the original register
- // 2) have to preserve the original flags.
- fixImplicitOperands(*Inst32);
- copyFlagsToImplicitVCC(*Inst32, *Src2);
+ int Idx = MI.getNumExplicitDefs();
+ for (const MachineOperand &Use : MI.explicit_uses()) {
+ int OpTy = MI.getDesc().operands()[Idx++].OperandType;
+ if (OpTy == AMDGPU::OPERAND_INPUT_MODS || OpTy == MCOI::OPERAND_IMMEDIATE)
+ continue;
+
+ if (&Use == Src2) {
+ int Op32Src2Idx = AMDGPU::getNamedOperandIdx(Op32, AMDGPU::OpName::src2);
+ if (Op32Src2Idx == -1) {
+ // In the case of V_CNDMASK_B32_e32, the explicit operand src2 is
+ // replaced with an implicit read of vcc or vcc_lo. The implicit read
+ // of vcc was already added during the initial BuildMI, but we
+ // 1) may need to change vcc to vcc_lo to preserve the original register
+ // 2) have to preserve the original flags.
+ fixImplicitOperands(*Inst32);
+ copyFlagsToImplicitVCC(*Inst32, *Src2);
+ continue;
+ }
}
+
+ Inst32.add(Use);
}
+ // FIXME: Losing implicit operands
+
return Inst32;
}
|
You can test this locally with the following command:git-clang-format --diff 49ef21d7674fa8267d674879e21b69d9ca4e6203 7abaeb6dc98913602e52896c12e4f8a3609ed71a -- llvm/lib/Target/AMDGPU/SIInstrInfo.cpp View the diff from clang-format here.diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
index 779f4c8533..90473a8355 100644
--- a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
+++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
@@ -4489,8 +4489,7 @@ MachineInstr *SIInstrInfo::buildShrunkInst(MachineInstr &MI,
const MCInstrDesc &Op32Desc = get(Op32);
MachineInstrBuilder Inst32 =
- BuildMI(*MBB, MI, MI.getDebugLoc(), Op32Desc)
- .setMIFlags(MI.getFlags());
+ BuildMI(*MBB, MI, MI.getDebugLoc(), Op32Desc).setMIFlags(MI.getFlags());
// Add the dst operand if the 32-bit encoding also has an explicit $vdst.
// For VOPC instructions, this is replaced by an implicit def of vcc.
|
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.
Seems fine if it works, just a couple of nits inline.
int Idx = MI.getNumExplicitDefs(); | ||
for (const MachineOperand &Use : MI.explicit_uses()) { | ||
int OpTy = MI.getDesc().operands()[Idx++].OperandType; | ||
if (OpTy == AMDGPU::OPERAND_INPUT_MODS || OpTy == MCOI::OPERAND_IMMEDIATE) |
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.
What cases does OPERAND_IMMEDIATE
cover? Does this mean we don't copy any immediate operands, and if so why not?
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's the default case for custom operands. The most common cases are clamp and omod
Try to avoid referring to specific operand names, except in the special case. The special case for hasNamedOperand(Op32, sdst) seems to have been dead code.