[llvm] AMDGPU: Generalize instruction shrinking code (PR #93810)
Jay Foad via llvm-commits
llvm-commits at lists.llvm.org
Thu May 30 06:11:01 PDT 2024
================
@@ -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)
----------------
jayfoad wrote:
What cases does `OPERAND_IMMEDIATE` cover? Does this mean we don't copy any immediate operands, and if so why not?
https://github.com/llvm/llvm-project/pull/93810
More information about the llvm-commits
mailing list