Skip to content

Commit

Permalink
[AMDGPU] Allow register tuples to set asm names
Browse files Browse the repository at this point in the history
This change reverts most of the previous register name generation.
The real problem is that RegisterTuple does not generate asm names.
Added optional operand to RegisterTuple. This way we can simplify
register name access and dramatically reduce the size of static
tables for the backend.

Differential Revision: https://reviews.llvm.org/D64967

llvm-svn: 366598
  • Loading branch information
rampitec committed Jul 19, 2019
1 parent 7df225d commit 01fcf92
Show file tree
Hide file tree
Showing 6 changed files with 119 additions and 143 deletions.
9 changes: 8 additions & 1 deletion llvm/include/llvm/Target/Target.td
Expand Up @@ -351,7 +351,11 @@ def interleave;
// RegisterTuples instances can be used in other set operations to form
// register classes and so on. This is the only way of using the generated
// registers.
class RegisterTuples<list<SubRegIndex> Indices, list<dag> Regs> {
//
// RegNames may be specified to supply asm names for the generated tuples.
// If used must have the same size as the list of produced registers.
class RegisterTuples<list<SubRegIndex> Indices, list<dag> Regs,
list<string> RegNames = []> {
// SubRegs - N lists of registers to be zipped up. Super-registers are
// synthesized from the first element of each SubRegs list, the second
// element and so on.
Expand All @@ -360,6 +364,9 @@ class RegisterTuples<list<SubRegIndex> Indices, list<dag> Regs> {
// SubRegIndices - N SubRegIndex instances. This provides the names of the
// sub-registers in the synthesized super-registers.
list<SubRegIndex> SubRegIndices = Indices;

// List of asm names for the generated tuple registers.
list<string> RegAsmNames = RegNames;
}


Expand Down
30 changes: 1 addition & 29 deletions llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUInstPrinter.cpp
Expand Up @@ -292,35 +292,7 @@ void AMDGPUInstPrinter::printRegOperand(unsigned RegNo, raw_ostream &O,
}
#endif

unsigned AltName = AMDGPU::NoRegAltName;

if (MRI.getRegClass(AMDGPU::VReg_64RegClassID).contains(RegNo) ||
MRI.getRegClass(AMDGPU::SGPR_64RegClassID).contains(RegNo) ||
MRI.getRegClass(AMDGPU::AReg_64RegClassID).contains(RegNo))
AltName = AMDGPU::Reg64;
else if (MRI.getRegClass(AMDGPU::VReg_128RegClassID).contains(RegNo) ||
MRI.getRegClass(AMDGPU::SGPR_128RegClassID).contains(RegNo) ||
MRI.getRegClass(AMDGPU::AReg_128RegClassID).contains(RegNo))
AltName = AMDGPU::Reg128;
else if (MRI.getRegClass(AMDGPU::VReg_96RegClassID).contains(RegNo) ||
MRI.getRegClass(AMDGPU::SReg_96RegClassID).contains(RegNo))
AltName = AMDGPU::Reg96;
else if (MRI.getRegClass(AMDGPU::VReg_160RegClassID).contains(RegNo) ||
MRI.getRegClass(AMDGPU::SReg_160RegClassID).contains(RegNo))
AltName = AMDGPU::Reg160;
else if (MRI.getRegClass(AMDGPU::VReg_256RegClassID).contains(RegNo) ||
MRI.getRegClass(AMDGPU::SGPR_256RegClassID).contains(RegNo))
AltName = AMDGPU::Reg256;
else if (MRI.getRegClass(AMDGPU::VReg_512RegClassID).contains(RegNo) ||
MRI.getRegClass(AMDGPU::SGPR_512RegClassID).contains(RegNo) ||
MRI.getRegClass(AMDGPU::AReg_512RegClassID).contains(RegNo))
AltName = AMDGPU::Reg512;
else if (MRI.getRegClass(AMDGPU::VReg_1024RegClassID).contains(RegNo) ||
MRI.getRegClass(AMDGPU::SReg_1024RegClassID).contains(RegNo) ||
MRI.getRegClass(AMDGPU::AReg_1024RegClassID).contains(RegNo))
AltName = AMDGPU::Reg1024;

O << getRegisterName(RegNo, AltName);
O << getRegisterName(RegNo);
}

void AMDGPUInstPrinter::printVOPDst(const MCInst *MI, unsigned OpNo,
Expand Down
4 changes: 1 addition & 3 deletions llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUInstPrinter.h
Expand Up @@ -12,7 +12,6 @@
#ifndef LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUINSTPRINTER_H
#define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUINSTPRINTER_H

#include "AMDGPUMCTargetDesc.h"
#include "llvm/MC/MCInstPrinter.h"

namespace llvm {
Expand All @@ -26,8 +25,7 @@ class AMDGPUInstPrinter : public MCInstPrinter {
//Autogenerated by tblgen
void printInstruction(const MCInst *MI, const MCSubtargetInfo &STI,
raw_ostream &O);
static const char *getRegisterName(unsigned RegNo,
unsigned AltIdx = AMDGPU::NoRegAltName);
static const char *getRegisterName(unsigned RegNo);

void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot,
const MCSubtargetInfo &STI) override;
Expand Down
15 changes: 1 addition & 14 deletions llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp
Expand Up @@ -1347,20 +1347,7 @@ void SIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI,
}

StringRef SIRegisterInfo::getRegAsmName(unsigned Reg) const {
const TargetRegisterClass *RC = getMinimalPhysRegClass(Reg);
unsigned Size = getRegSizeInBits(*RC);
unsigned AltName = AMDGPU::NoRegAltName;

switch (Size) {
case 64: AltName = AMDGPU::Reg64; break;
case 96: AltName = AMDGPU::Reg96; break;
case 128: AltName = AMDGPU::Reg128; break;
case 160: AltName = AMDGPU::Reg160; break;
case 256: AltName = AMDGPU::Reg256; break;
case 512: AltName = AMDGPU::Reg512; break;
case 1024: AltName = AMDGPU::Reg1024; break;
}
return AMDGPUInstPrinter::getRegisterName(Reg, AltName);
return AMDGPUInstPrinter::getRegisterName(Reg);
}

// FIXME: This is very slow. It might be worth creating a map from physreg to
Expand Down

0 comments on commit 01fcf92

Please sign in to comment.