diff options
Diffstat (limited to 'llvm/lib/Target/AMDGPU/SIPeepholeSDWA.cpp')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/SIPeepholeSDWA.cpp | 76 |
1 files changed, 28 insertions, 48 deletions
diff --git a/llvm/lib/Target/AMDGPU/SIPeepholeSDWA.cpp b/llvm/lib/Target/AMDGPU/SIPeepholeSDWA.cpp index 9a1855c3458b..7d7a753bb333 100644 --- a/llvm/lib/Target/AMDGPU/SIPeepholeSDWA.cpp +++ b/llvm/lib/Target/AMDGPU/SIPeepholeSDWA.cpp @@ -10,47 +10,21 @@ /// /// E.g. original: /// V_LSHRREV_B32_e32 %0, 16, %1 -/// V_ADD_I32_e32 %2, %0, %3 +/// V_ADD_CO_U32_e32 %2, %0, %3 /// V_LSHLREV_B32_e32 %4, 16, %2 /// /// Replace: -/// V_ADD_I32_sdwa %4, %1, %3 +/// V_ADD_CO_U32_sdwa %4, %1, %3 /// dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD /// //===----------------------------------------------------------------------===// #include "AMDGPU.h" -#include "AMDGPUSubtarget.h" -#include "SIDefines.h" -#include "SIInstrInfo.h" -#include "SIRegisterInfo.h" +#include "GCNSubtarget.h" #include "MCTargetDesc/AMDGPUMCTargetDesc.h" -#include "Utils/AMDGPUBaseInfo.h" #include "llvm/ADT/MapVector.h" -#include "llvm/ADT/None.h" -#include "llvm/ADT/Optional.h" -#include "llvm/ADT/STLExtras.h" -#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/Statistic.h" -#include "llvm/CodeGen/MachineBasicBlock.h" -#include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineFunctionPass.h" -#include "llvm/CodeGen/MachineInstr.h" -#include "llvm/CodeGen/MachineInstrBuilder.h" -#include "llvm/CodeGen/MachineOperand.h" -#include "llvm/CodeGen/MachineRegisterInfo.h" -#include "llvm/CodeGen/TargetRegisterInfo.h" -#include "llvm/Config/llvm-config.h" -#include "llvm/MC/LaneBitmask.h" -#include "llvm/MC/MCInstrDesc.h" -#include "llvm/Pass.h" -#include "llvm/Support/Debug.h" -#include "llvm/Support/raw_ostream.h" -#include <algorithm> -#include <cassert> -#include <cstdint> -#include <memory> -#include <unordered_map> using namespace llvm; @@ -570,8 +544,7 @@ SIPeepholeSDWA::matchSDWAOperand(MachineInstr &MI) { MachineOperand *Src1 = TII->getNamedOperand(MI, AMDGPU::OpName::src1); MachineOperand *Dst = TII->getNamedOperand(MI, AMDGPU::OpName::vdst); - if (Register::isPhysicalRegister(Src1->getReg()) || - Register::isPhysicalRegister(Dst->getReg())) + if (Src1->getReg().isPhysical() || Dst->getReg().isPhysical()) break; if (Opcode == AMDGPU::V_LSHLREV_B32_e32 || @@ -609,8 +582,7 @@ SIPeepholeSDWA::matchSDWAOperand(MachineInstr &MI) { MachineOperand *Src1 = TII->getNamedOperand(MI, AMDGPU::OpName::src1); MachineOperand *Dst = TII->getNamedOperand(MI, AMDGPU::OpName::vdst); - if (Register::isPhysicalRegister(Src1->getReg()) || - Register::isPhysicalRegister(Dst->getReg())) + if (Src1->getReg().isPhysical() || Dst->getReg().isPhysical()) break; if (Opcode == AMDGPU::V_LSHLREV_B16_e32 || @@ -625,8 +597,8 @@ SIPeepholeSDWA::matchSDWAOperand(MachineInstr &MI) { break; } - case AMDGPU::V_BFE_I32: - case AMDGPU::V_BFE_U32: { + case AMDGPU::V_BFE_I32_e64: + case AMDGPU::V_BFE_U32_e64: { // e.g.: // from: v_bfe_u32 v1, v0, 8, 8 // to SDWA src:v0 src_sel:BYTE_1 @@ -673,12 +645,11 @@ SIPeepholeSDWA::matchSDWAOperand(MachineInstr &MI) { MachineOperand *Src0 = TII->getNamedOperand(MI, AMDGPU::OpName::src0); MachineOperand *Dst = TII->getNamedOperand(MI, AMDGPU::OpName::vdst); - if (Register::isPhysicalRegister(Src0->getReg()) || - Register::isPhysicalRegister(Dst->getReg())) + if (Src0->getReg().isPhysical() || Dst->getReg().isPhysical()) break; return std::make_unique<SDWASrcOperand>( - Src0, Dst, SrcSel, false, false, Opcode != AMDGPU::V_BFE_U32); + Src0, Dst, SrcSel, false, false, Opcode != AMDGPU::V_BFE_U32_e64); } case AMDGPU::V_AND_B32_e32: @@ -702,8 +673,7 @@ SIPeepholeSDWA::matchSDWAOperand(MachineInstr &MI) { MachineOperand *Dst = TII->getNamedOperand(MI, AMDGPU::OpName::vdst); - if (Register::isPhysicalRegister(ValSrc->getReg()) || - Register::isPhysicalRegister(Dst->getReg())) + if (ValSrc->getReg().isPhysical() || Dst->getReg().isPhysical()) break; return std::make_unique<SDWASrcOperand>( @@ -863,19 +833,19 @@ void SIPeepholeSDWA::matchSDWAOperands(MachineBasicBlock &MBB) { } // Convert the V_ADDC_U32_e64 into V_ADDC_U32_e32, and -// V_ADD_I32_e64 into V_ADD_I32_e32. This allows isConvertibleToSDWA -// to perform its transformation on V_ADD_I32_e32 into V_ADD_I32_sdwa. +// V_ADD_CO_U32_e64 into V_ADD_CO_U32_e32. This allows isConvertibleToSDWA +// to perform its transformation on V_ADD_CO_U32_e32 into V_ADD_CO_U32_sdwa. // // We are transforming from a VOP3 into a VOP2 form of the instruction. // %19:vgpr_32 = V_AND_B32_e32 255, // killed %16:vgpr_32, implicit $exec -// %47:vgpr_32, %49:sreg_64_xexec = V_ADD_I32_e64 +// %47:vgpr_32, %49:sreg_64_xexec = V_ADD_CO_U32_e64 // %26.sub0:vreg_64, %19:vgpr_32, implicit $exec // %48:vgpr_32, dead %50:sreg_64_xexec = V_ADDC_U32_e64 // %26.sub1:vreg_64, %54:vgpr_32, killed %49:sreg_64_xexec, implicit $exec // // becomes -// %47:vgpr_32 = V_ADD_I32_sdwa +// %47:vgpr_32 = V_ADD_CO_U32_sdwa // 0, %26.sub0:vreg_64, 0, killed %16:vgpr_32, 0, 6, 0, 6, 0, // implicit-def $vcc, implicit $exec // %48:vgpr_32 = V_ADDC_U32_e32 @@ -883,8 +853,8 @@ void SIPeepholeSDWA::matchSDWAOperands(MachineBasicBlock &MBB) { void SIPeepholeSDWA::pseudoOpConvertToVOP2(MachineInstr &MI, const GCNSubtarget &ST) const { int Opc = MI.getOpcode(); - assert((Opc == AMDGPU::V_ADD_I32_e64 || Opc == AMDGPU::V_SUB_I32_e64) && - "Currently only handles V_ADD_I32_e64 or V_SUB_I32_e64"); + assert((Opc == AMDGPU::V_ADD_CO_U32_e64 || Opc == AMDGPU::V_SUB_CO_U32_e64) && + "Currently only handles V_ADD_CO_U32_e64 or V_SUB_CO_U32_e64"); // Can the candidate MI be shrunk? if (!TII->canShrink(MI, *MRI)) @@ -992,6 +962,16 @@ bool SIPeepholeSDWA::isConvertibleToSDWA(MachineInstr &MI, if (Opc == AMDGPU::V_CNDMASK_B32_e32) return false; + if (MachineOperand *Src0 = TII->getNamedOperand(MI, AMDGPU::OpName::src0)) { + if (!Src0->isReg() && !Src0->isImm()) + return false; + } + + if (MachineOperand *Src1 = TII->getNamedOperand(MI, AMDGPU::OpName::src1)) { + if (!Src1->isReg() && !Src1->isImm()) + return false; + } + return true; } @@ -1235,8 +1215,8 @@ bool SIPeepholeSDWA::runOnMachineFunction(MachineFunction &MF) { const auto &Operand = OperandPair.second; MachineInstr *PotentialMI = Operand->potentialToConvert(TII); if (PotentialMI && - (PotentialMI->getOpcode() == AMDGPU::V_ADD_I32_e64 || - PotentialMI->getOpcode() == AMDGPU::V_SUB_I32_e64)) + (PotentialMI->getOpcode() == AMDGPU::V_ADD_CO_U32_e64 || + PotentialMI->getOpcode() == AMDGPU::V_SUB_CO_U32_e64)) pseudoOpConvertToVOP2(*PotentialMI, ST); } SDWAOperands.clear(); |
