diff options
-rw-r--r-- | llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h | 1 | ||||
-rw-r--r-- | llvm/include/llvm/Support/TargetOpcodes.def | 8 | ||||
-rw-r--r-- | llvm/include/llvm/Target/GenericOpcodes.td | 20 | ||||
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 7 | ||||
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp | 21 | ||||
-rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp | 2 | ||||
-rw-r--r-- | llvm/test/CodeGen/AMDGPU/GlobalISel/read_register.ll | 2 |
7 files changed, 59 insertions, 2 deletions
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h b/llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h index cc89a3bea63..ac7e5cbbdaa 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h @@ -240,6 +240,7 @@ public: LegalizeResult lowerSADDO_SSUBO(MachineInstr &MI); LegalizeResult lowerBswap(MachineInstr &MI); LegalizeResult lowerBitreverse(MachineInstr &MI); + LegalizeResult lowerReadRegister(MachineInstr &MI); private: MachineRegisterInfo &MRI; diff --git a/llvm/include/llvm/Support/TargetOpcodes.def b/llvm/include/llvm/Support/TargetOpcodes.def index e30c6e1bfb2..e004550059d 100644 --- a/llvm/include/llvm/Support/TargetOpcodes.def +++ b/llvm/include/llvm/Support/TargetOpcodes.def @@ -614,12 +614,16 @@ HANDLE_TARGET_OPCODE(G_JUMP_TABLE) /// Generic dynamic stack allocation. HANDLE_TARGET_OPCODE(G_DYN_STACKALLOC) -// TODO: Add more generic opcodes as we move along. +/// read_register intrinsic +HANDLE_TARGET_OPCODE(G_READ_REGISTER) + +/// write_register intrinsic +HANDLE_TARGET_OPCODE(G_WRITE_REGISTER) /// Marker for the end of the generic opcode. /// This is used to check if an opcode is in the range of the /// generic opcodes. -HANDLE_TARGET_OPCODE_MARKER(PRE_ISEL_GENERIC_OPCODE_END, G_DYN_STACKALLOC) +HANDLE_TARGET_OPCODE_MARKER(PRE_ISEL_GENERIC_OPCODE_END, G_WRITE_REGISTER) /// BUILTIN_OP_END - This must be the last enum value in this list. /// The target-specific post-isel opcode values start here. diff --git a/llvm/include/llvm/Target/GenericOpcodes.td b/llvm/include/llvm/Target/GenericOpcodes.td index e252748bd30..0ee9c3916c1 100644 --- a/llvm/include/llvm/Target/GenericOpcodes.td +++ b/llvm/include/llvm/Target/GenericOpcodes.td @@ -1012,6 +1012,26 @@ def G_BRJT : GenericInstruction { let isTerminator = 1; } +def G_READ_REGISTER : GenericInstruction { + let OutOperandList = (outs type0:$dst); + let InOperandList = (ins unknown:$register); + let hasSideEffects = 1; + + // Assume convergent. It's probably not worth the effort of somehow + // modeling convergent and nonconvergent register accesses. + let isConvergent = 1; +} + +def G_WRITE_REGISTER : GenericInstruction { + let OutOperandList = (outs); + let InOperandList = (ins unknown:$register, type0:$value); + let hasSideEffects = 1; + + // Assume convergent. It's probably not worth the effort of somehow + // modeling convergent and nonconvergent register accesses. + let isConvergent = 1; +} + //------------------------------------------------------------------------------ // Vector ops //------------------------------------------------------------------------------ diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index 216462ec16a..df6a08b840d 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -1526,6 +1526,13 @@ bool IRTranslator::translateKnownIntrinsic(const CallInst &CI, Intrinsic::ID ID, case Intrinsic::sideeffect: // Discard annotate attributes, assumptions, and artificial side-effects. return true; + case Intrinsic::read_register: { + Value *Arg = CI.getArgOperand(0); + MIRBuilder.buildInstr(TargetOpcode::G_READ_REGISTER) + .addDef(getOrCreateVReg(CI)) + .addMetadata(cast<MDNode>(cast<MetadataAsValue>(Arg)->getMetadata())); + return true; + } } return false; } diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp index 53bda81d6a5..20f89abe03b 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -2317,6 +2317,8 @@ LegalizerHelper::lower(MachineInstr &MI, unsigned TypeIdx, LLT Ty) { return lowerBswap(MI); case G_BITREVERSE: return lowerBitreverse(MI); + case G_READ_REGISTER: + return lowerReadRegister(MI); } } @@ -4469,3 +4471,22 @@ LegalizerHelper::lowerBitreverse(MachineInstr &MI) { MI.eraseFromParent(); return Legalized; } + +LegalizerHelper::LegalizeResult +LegalizerHelper::lowerReadRegister(MachineInstr &MI) { + Register Dst = MI.getOperand(0).getReg(); + const LLT Ty = MRI.getType(Dst); + const MDString *RegStr = cast<MDString>( + cast<MDNode>(MI.getOperand(1).getMetadata())->getOperand(0)); + + MachineFunction &MF = MIRBuilder.getMF(); + const TargetSubtargetInfo &STI = MF.getSubtarget(); + const TargetLowering *TLI = STI.getTargetLowering(); + Register Reg = TLI->getRegisterByName(RegStr->getString().data(), Ty, MF); + if (!Reg.isValid()) + return UnableToLegalize; + + MIRBuilder.buildCopy(Dst, Reg); + MI.eraseFromParent(); + return Legalized; +} diff --git a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp index 0b24493150a..52bff2bc25f 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp @@ -1116,6 +1116,8 @@ AMDGPULegalizerInfo::AMDGPULegalizerInfo(const GCNSubtarget &ST_, getActionDefinitionsBuilder(G_SEXT_INREG).lower(); + getActionDefinitionsBuilder({G_READ_REGISTER, G_WRITE_REGISTER}).lower(); + getActionDefinitionsBuilder(G_READCYCLECOUNTER) .legalFor({S64}); diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/read_register.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/read_register.ll new file mode 100644 index 00000000000..3bd16996f8e --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/read_register.ll @@ -0,0 +1,2 @@ +; Runs original SDAG test with -global-isel +; RUN: llc -global-isel -mtriple=amdgcn-amd-amdhsa -mcpu=bonaire -verify-machineinstrs < %S/../read_register.ll | FileCheck -enable-var-scope %S/../read_register.ll |