From 53ded98375044d51078013a024a460ad4b3acede Mon Sep 17 00:00:00 2001 From: Maheaha Shivamallappa Date: Sun, 26 Jan 2020 13:31:53 +0530 Subject: [PATCH] AMDGPU/GlobalISel: Clean-up code around ISel for Intrinsics. Summary: A minor code clean-up around ISel for intrinsic llvm.amdgcn.end.cf() Reviewers: arsenm, mshivama Reviewed By: arsenm Tags: #llvm Differential Revision: https://reviews.llvm.org/D73358 --- .../AMDGPU/AMDGPUInstructionSelector.cpp | 32 ++++++++++--------- lib/Target/AMDGPU/AMDGPUInstructionSelector.h | 1 + 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp b/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp index 6ca7e6cb04f..ce47e56da02 100644 --- a/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp +++ b/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp @@ -1027,6 +1027,21 @@ AMDGPUInstructionSelector::splitBufferOffsets(MachineIRBuilder &B, return std::make_tuple(BaseReg, ImmOffset, TotalConstOffset); } +bool AMDGPUInstructionSelector::selectEndCfIntrinsic(MachineInstr &MI) const { + // FIXME: Manually selecting to avoid dealiing with the SReg_1 trick + // SelectionDAG uses for wave32 vs wave64. + MachineBasicBlock *BB = MI.getParent(); + BuildMI(*BB, &MI, MI.getDebugLoc(), TII.get(AMDGPU::SI_END_CF)) + .add(MI.getOperand(1)); + + Register Reg = MI.getOperand(1).getReg(); + MI.eraseFromParent(); + + if (!MRI->getRegClassOrNull(Reg)) + MRI->setRegClass(Reg, TRI.getWaveMaskRegClass()); + return true; +} + bool AMDGPUInstructionSelector::selectStoreIntrinsic(MachineInstr &MI, bool IsFormat) const { MachineIRBuilder B(MI); @@ -1306,23 +1321,10 @@ bool AMDGPUInstructionSelector::selectDSAppendConsume(MachineInstr &MI, bool AMDGPUInstructionSelector::selectG_INTRINSIC_W_SIDE_EFFECTS( MachineInstr &I) const { - MachineBasicBlock *BB = I.getParent(); unsigned IntrinsicID = I.getIntrinsicID(); switch (IntrinsicID) { - case Intrinsic::amdgcn_end_cf: { - // FIXME: Manually selecting to avoid dealiing with the SReg_1 trick - // SelectionDAG uses for wave32 vs wave64. - BuildMI(*BB, &I, I.getDebugLoc(), - TII.get(AMDGPU::SI_END_CF)) - .add(I.getOperand(1)); - - Register Reg = I.getOperand(1).getReg(); - I.eraseFromParent(); - - if (!MRI->getRegClassOrNull(Reg)) - MRI->setRegClass(Reg, TRI.getWaveMaskRegClass()); - return true; - } + case Intrinsic::amdgcn_end_cf: + return selectEndCfIntrinsic(I); case Intrinsic::amdgcn_raw_buffer_store: return selectStoreIntrinsic(I, false); case Intrinsic::amdgcn_raw_buffer_store_format: diff --git a/lib/Target/AMDGPU/AMDGPUInstructionSelector.h b/lib/Target/AMDGPU/AMDGPUInstructionSelector.h index 8d7827bfbc5..d7dc8de3677 100644 --- a/lib/Target/AMDGPU/AMDGPUInstructionSelector.h +++ b/lib/Target/AMDGPU/AMDGPUInstructionSelector.h @@ -103,6 +103,7 @@ private: std::tuple splitBufferOffsets(MachineIRBuilder &B, Register OrigOffset) const; + bool selectEndCfIntrinsic(MachineInstr &MI) const; bool selectStoreIntrinsic(MachineInstr &MI, bool IsFormat) const; bool selectDSOrderedIntrinsic(MachineInstr &MI, Intrinsic::ID IID) const; bool selectDSGWSIntrinsic(MachineInstr &MI, Intrinsic::ID IID) const;