diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-07-01 15:48:18 +0000 |
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-07-01 15:48:18 +0000 |
| commit | cda82f0bb6fd0577b9f2f8185f3b6be20ea96e58 (patch) | |
| tree | 98f86aa91e038573d4517bd8e4d1661ea3f9649b /llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp | |
| parent | 7cfd99ab15d088d626a5272c8b0745b7c0e30068 (diff) | |
| download | bcm5719-llvm-cda82f0bb6fd0577b9f2f8185f3b6be20ea96e58.tar.gz bcm5719-llvm-cda82f0bb6fd0577b9f2f8185f3b6be20ea96e58.zip | |
AMDGPU/GlobalISel: Select G_FRAME_INDEX
llvm-svn: 364789
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp b/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp index cc3d58ff102..5eab5cb9227 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp @@ -1014,6 +1014,22 @@ bool AMDGPUInstructionSelector::selectG_BRCOND(MachineInstr &I) const { return false; } +bool AMDGPUInstructionSelector::selectG_FRAME_INDEX(MachineInstr &I) const { + MachineBasicBlock *BB = I.getParent(); + MachineFunction *MF = BB->getParent(); + MachineRegisterInfo &MRI = MF->getRegInfo(); + + Register DstReg = I.getOperand(0).getReg(); + const RegisterBank *DstRB = RBI.getRegBank(DstReg, MRI, TRI); + const bool IsVGPR = DstRB->getID() == AMDGPU::VGPRRegBankID; + I.setDesc(TII.get(IsVGPR ? AMDGPU::V_MOV_B32_e32 : AMDGPU::S_MOV_B32)); + if (IsVGPR) + I.addOperand(*MF, MachineOperand::CreateReg(AMDGPU::EXEC, false, true)); + + return RBI.constrainGenericRegister( + DstReg, IsVGPR ? AMDGPU::VGPR_32RegClass : AMDGPU::SReg_32RegClass, MRI); +} + bool AMDGPUInstructionSelector::select(MachineInstr &I, CodeGenCoverage &CoverageInfo) const { @@ -1071,6 +1087,8 @@ bool AMDGPUInstructionSelector::select(MachineInstr &I, return false; case TargetOpcode::G_BRCOND: return selectG_BRCOND(I); + case TargetOpcode::G_FRAME_INDEX: + return selectG_FRAME_INDEX(I); } return false; } |

