diff options
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp')
-rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp | 36 |
1 files changed, 12 insertions, 24 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp b/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp index 19fce064783..5eb2324c79c 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp @@ -145,10 +145,8 @@ private: bool SelectSMRD(SDValue Addr, SDValue &SBase, SDValue &Offset, bool &Imm) const; bool SelectSMRDImm(SDValue Addr, SDValue &SBase, SDValue &Offset) const; - bool SelectSMRDImm32(SDValue Addr, SDValue &SBase, SDValue &Offset) const; bool SelectSMRDSgpr(SDValue Addr, SDValue &SBase, SDValue &Offset) const; bool SelectSMRDBufferImm(SDValue Addr, SDValue &Offset) const; - bool SelectSMRDBufferImm32(SDValue Addr, SDValue &Offset) const; bool SelectSMRDBufferSgpr(SDValue Addr, SDValue &Offset) const; bool SelectMOVRELOffset(SDValue Index, SDValue &Base, SDValue &Offset) const; @@ -1330,7 +1328,6 @@ bool AMDGPUDAGToDAGISel::SelectSMRDOffset(SDValue ByteOffsetNode, return false; SDLoc SL(ByteOffsetNode); - AMDGPUSubtarget::Generation Gen = Subtarget->getGeneration(); int64_t ByteOffset = C->getSExtValue(); int64_t EncodedOffset = AMDGPU::getSMRDEncodedOffset(*Subtarget, ByteOffset); @@ -1343,8 +1340,8 @@ bool AMDGPUDAGToDAGISel::SelectSMRDOffset(SDValue ByteOffsetNode, if (!isUInt<32>(EncodedOffset) || !isUInt<32>(ByteOffset)) return false; - if (Gen == AMDGPUSubtarget::SEA_ISLANDS && isUInt<32>(EncodedOffset)) { - // 32-bit Immediates are supported on Sea Islands. + if (Subtarget->has32BitLiteralSMRDOffset() && + ByteOffset % 4 == 0 && isUInt<32>(EncodedOffset)) { Offset = CurDAG->getTargetConstant(EncodedOffset, SL, MVT::i32); } else { SDValue C32Bit = CurDAG->getTargetConstant(ByteOffset, SL, MVT::i32); @@ -1376,20 +1373,15 @@ bool AMDGPUDAGToDAGISel::SelectSMRD(SDValue Addr, SDValue &SBase, bool AMDGPUDAGToDAGISel::SelectSMRDImm(SDValue Addr, SDValue &SBase, SDValue &Offset) const { bool Imm; - return SelectSMRD(Addr, SBase, Offset, Imm) && Imm; -} - -bool AMDGPUDAGToDAGISel::SelectSMRDImm32(SDValue Addr, SDValue &SBase, - SDValue &Offset) const { - - if (Subtarget->getGeneration() != AMDGPUSubtarget::SEA_ISLANDS) - return false; - bool Imm; if (!SelectSMRD(Addr, SBase, Offset, Imm)) return false; - return !Imm && isa<ConstantSDNode>(Offset); + if (Subtarget->has32BitLiteralSMRDOffset() && + isa<ConstantSDNode>(Offset)) + return true; + + return Imm; } bool AMDGPUDAGToDAGISel::SelectSMRDSgpr(SDValue Addr, SDValue &SBase, @@ -1402,19 +1394,15 @@ bool AMDGPUDAGToDAGISel::SelectSMRDSgpr(SDValue Addr, SDValue &SBase, bool AMDGPUDAGToDAGISel::SelectSMRDBufferImm(SDValue Addr, SDValue &Offset) const { bool Imm; - return SelectSMRDOffset(Addr, Offset, Imm) && Imm; -} - -bool AMDGPUDAGToDAGISel::SelectSMRDBufferImm32(SDValue Addr, - SDValue &Offset) const { - if (Subtarget->getGeneration() != AMDGPUSubtarget::SEA_ISLANDS) - return false; - bool Imm; if (!SelectSMRDOffset(Addr, Offset, Imm)) return false; - return !Imm && isa<ConstantSDNode>(Offset); + if (Subtarget->has32BitLiteralSMRDOffset() && + isa<ConstantSDNode>(Offset)) + return true; + + return Imm; } bool AMDGPUDAGToDAGISel::SelectSMRDBufferSgpr(SDValue Addr, |