diff options
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp index 391c2b9ec256..bdd4e891f158 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp @@ -449,8 +449,13 @@ bool AMDGPURegisterBankInfo::isScalarLoadLegal(const MachineInstr &MI) const { const unsigned AS = MMO->getAddrSpace(); const bool IsConst = AS == AMDGPUAS::CONSTANT_ADDRESS || AS == AMDGPUAS::CONSTANT_ADDRESS_32BIT; + const unsigned MemSize = 8 * MMO->getSize(); + // Require 4-byte alignment. - return MMO->getAlign() >= Align(4) && + return (MMO->getAlign() >= Align(4) || + (Subtarget.hasScalarSubwordLoads() && + ((MemSize == 16 && MMO->getAlign() >= Align(2)) || + (MemSize == 8 && MMO->getAlign() >= Align(1))))) && // Can't do a scalar atomic load. !MMO->isAtomic() && // Don't use scalar loads for volatile accesses to non-constant address @@ -1074,6 +1079,13 @@ bool AMDGPURegisterBankInfo::applyMappingLoad( (MemSize == 32 || LoadTy.isVector() || !isScalarLoadLegal(MI))) return false; + if (LoadSize == 32 && + ((MemSize == 8 && MMO->getAlign() >= Align(1)) || + (MemSize == 16 && MMO->getAlign() >= Align(2))) && + isScalarLoadLegal(MI) && + Subtarget.getGeneration() >= AMDGPUSubtarget::GFX12) + return false; + Register PtrReg = MI.getOperand(1).getReg(); ApplyRegBankMapping ApplyBank(B, *this, MRI, DstBank); @@ -3062,6 +3074,7 @@ void AMDGPURegisterBankInfo::applyMappingImpl( return; } case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_FADD: + case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_FADD_BF16: case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_FMIN: case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_FMAX: { applyDefaultMapping(OpdMapper); @@ -3073,7 +3086,11 @@ void AMDGPURegisterBankInfo::applyMappingImpl( executeInWaterfallLoop(B, MI, {3, 6}); return; } - case AMDGPU::G_AMDGPU_S_BUFFER_LOAD: { + case AMDGPU::G_AMDGPU_S_BUFFER_LOAD: + case AMDGPU::G_AMDGPU_S_BUFFER_LOAD_UBYTE: + case AMDGPU::G_AMDGPU_S_BUFFER_LOAD_SBYTE: + case AMDGPU::G_AMDGPU_S_BUFFER_LOAD_USHORT: + case AMDGPU::G_AMDGPU_S_BUFFER_LOAD_SSHORT: { applyMappingSBufferLoad(B, OpdMapper); return; } @@ -3765,16 +3782,16 @@ AMDGPURegisterBankInfo::getInstrMapping(const MachineInstr &MI) const { // properly. // // TODO: There are additional exec masking dependencies to analyze. - if (MI.getOpcode() == TargetOpcode::G_PHI) { + if (auto *PHI = dyn_cast<GPhi>(&MI)) { unsigned ResultBank = AMDGPU::InvalidRegBankID; - Register DstReg = MI.getOperand(0).getReg(); + Register DstReg = PHI->getReg(0); // Sometimes the result may have already been assigned a bank. if (const RegisterBank *DstBank = getRegBank(DstReg, MRI, *TRI)) ResultBank = DstBank->getID(); - for (unsigned I = 1, E = MI.getNumOperands(); I != E; I += 2) { - Register Reg = MI.getOperand(I).getReg(); + for (unsigned I = 0; I < PHI->getNumIncomingValues(); ++I) { + Register Reg = PHI->getIncomingValue(I); const RegisterBank *Bank = getRegBank(Reg, MRI, *TRI); // FIXME: Assuming VGPR for any undetermined inputs. @@ -4346,6 +4363,7 @@ AMDGPURegisterBankInfo::getInstrMapping(const MachineInstr &MI) const { case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_INC: case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_DEC: case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_FADD: + case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_FADD_BF16: case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_FMIN: case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_FMAX: { // vdata_out @@ -4396,7 +4414,11 @@ AMDGPURegisterBankInfo::getInstrMapping(const MachineInstr &MI) const { // initialized. break; } - case AMDGPU::G_AMDGPU_S_BUFFER_LOAD: { + case AMDGPU::G_AMDGPU_S_BUFFER_LOAD: + case AMDGPU::G_AMDGPU_S_BUFFER_LOAD_UBYTE: + case AMDGPU::G_AMDGPU_S_BUFFER_LOAD_SBYTE: + case AMDGPU::G_AMDGPU_S_BUFFER_LOAD_USHORT: + case AMDGPU::G_AMDGPU_S_BUFFER_LOAD_SSHORT: { // Lie and claim everything is legal, even though some need to be // SGPRs. applyMapping will have to deal with it as a waterfall loop. OpdsMapping[1] = getSGPROpMapping(MI.getOperand(1).getReg(), MRI, *TRI); @@ -4471,6 +4493,10 @@ AMDGPURegisterBankInfo::getInstrMapping(const MachineInstr &MI) const { case Intrinsic::amdgcn_fdot2_f32_bf16: case Intrinsic::amdgcn_sudot4: case Intrinsic::amdgcn_sudot8: + case Intrinsic::amdgcn_dot4_f32_fp8_bf8: + case Intrinsic::amdgcn_dot4_f32_bf8_fp8: + case Intrinsic::amdgcn_dot4_f32_fp8_fp8: + case Intrinsic::amdgcn_dot4_f32_bf8_bf8: case Intrinsic::amdgcn_wmma_bf16_16x16x16_bf16: case Intrinsic::amdgcn_wmma_f16_16x16x16_f16: case Intrinsic::amdgcn_wmma_bf16_16x16x16_bf16_tied: @@ -4836,7 +4862,9 @@ AMDGPURegisterBankInfo::getInstrMapping(const MachineInstr &MI) const { case Intrinsic::amdgcn_flat_atomic_fmax_num: case Intrinsic::amdgcn_global_atomic_fadd_v2bf16: case Intrinsic::amdgcn_flat_atomic_fadd_v2bf16: + case Intrinsic::amdgcn_atomic_cond_sub_u32: case Intrinsic::amdgcn_global_atomic_ordered_add_b64: + case Intrinsic::amdgcn_global_load_tr: return getDefaultMappingAllVGPR(MI); case Intrinsic::amdgcn_ds_ordered_add: case Intrinsic::amdgcn_ds_ordered_swap: |
