diff options
author | Marek Olsak <marek.olsak@amd.com> | 2017-05-24 14:53:50 +0000 |
---|---|---|
committer | Marek Olsak <marek.olsak@amd.com> | 2017-05-24 14:53:50 +0000 |
commit | 8973a0a22ca6e1764bf7f0d87460420cbcc80c9e (patch) | |
tree | 26be58ce762a16e2d3d4f43091801460ee8ae682 /llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp | |
parent | edc7849b1bdd2250c0fb1ff679ef80b9aee72891 (diff) | |
download | bcm5719-llvm-8973a0a22ca6e1764bf7f0d87460420cbcc80c9e.tar.gz bcm5719-llvm-8973a0a22ca6e1764bf7f0d87460420cbcc80c9e.zip |
Revert "AMDGPU: Fold CI-specific complex SMRD patterns into existing complex patterns"
This reverts commit e065977c4b5f68ab845400b256f6a3822b1325fa.
It doesn't work. S_LOAD_DWORD_IMM_ci and friends aren't selected by any of
the patterns, so it was putting 32-bit literals into the 8-bit field.
llvm-svn: 303754
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp')
-rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp b/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp index 5eb2324c79c..19fce064783 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp @@ -145,8 +145,10 @@ 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; @@ -1328,6 +1330,7 @@ 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); @@ -1340,8 +1343,8 @@ bool AMDGPUDAGToDAGISel::SelectSMRDOffset(SDValue ByteOffsetNode, if (!isUInt<32>(EncodedOffset) || !isUInt<32>(ByteOffset)) return false; - if (Subtarget->has32BitLiteralSMRDOffset() && - ByteOffset % 4 == 0 && isUInt<32>(EncodedOffset)) { + if (Gen == AMDGPUSubtarget::SEA_ISLANDS && isUInt<32>(EncodedOffset)) { + // 32-bit Immediates are supported on Sea Islands. Offset = CurDAG->getTargetConstant(EncodedOffset, SL, MVT::i32); } else { SDValue C32Bit = CurDAG->getTargetConstant(ByteOffset, SL, MVT::i32); @@ -1373,15 +1376,20 @@ 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; +} - if (!SelectSMRD(Addr, SBase, Offset, Imm)) +bool AMDGPUDAGToDAGISel::SelectSMRDImm32(SDValue Addr, SDValue &SBase, + SDValue &Offset) const { + + if (Subtarget->getGeneration() != AMDGPUSubtarget::SEA_ISLANDS) return false; - if (Subtarget->has32BitLiteralSMRDOffset() && - isa<ConstantSDNode>(Offset)) - return true; + bool Imm; + if (!SelectSMRD(Addr, SBase, Offset, Imm)) + return false; - return Imm; + return !Imm && isa<ConstantSDNode>(Offset); } bool AMDGPUDAGToDAGISel::SelectSMRDSgpr(SDValue Addr, SDValue &SBase, @@ -1394,15 +1402,19 @@ bool AMDGPUDAGToDAGISel::SelectSMRDSgpr(SDValue Addr, SDValue &SBase, bool AMDGPUDAGToDAGISel::SelectSMRDBufferImm(SDValue Addr, SDValue &Offset) const { bool Imm; + return SelectSMRDOffset(Addr, Offset, Imm) && Imm; +} - if (!SelectSMRDOffset(Addr, Offset, Imm)) +bool AMDGPUDAGToDAGISel::SelectSMRDBufferImm32(SDValue Addr, + SDValue &Offset) const { + if (Subtarget->getGeneration() != AMDGPUSubtarget::SEA_ISLANDS) return false; - if (Subtarget->has32BitLiteralSMRDOffset() && - isa<ConstantSDNode>(Offset)) - return true; + bool Imm; + if (!SelectSMRDOffset(Addr, Offset, Imm)) + return false; - return Imm; + return !Imm && isa<ConstantSDNode>(Offset); } bool AMDGPUDAGToDAGISel::SelectSMRDBufferSgpr(SDValue Addr, |