diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2018-06-15 15:15:46 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2018-06-15 15:15:46 +0000 |
commit | 02dc7e19e2910b2b3a963105684af0f830885360 (patch) | |
tree | 4fb36d460658188a9eaac6e5b0d1abe8502a39db /llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp | |
parent | fa5597b24da47d5ecec4560f3f76f4bb08b405bc (diff) | |
download | bcm5719-llvm-02dc7e19e2910b2b3a963105684af0f830885360.tar.gz bcm5719-llvm-02dc7e19e2910b2b3a963105684af0f830885360.zip |
AMDGPU: Make v4i16/v4f16 legal
Some image loads return these, and it's awkward working
around them not being legal.
llvm-svn: 334835
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp')
-rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp b/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp index 19106a5ae8d..8685de871de 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp @@ -73,7 +73,9 @@ static bool allocateSGPRTuple(unsigned ValNo, MVT ValVT, MVT LocVT, case MVT::i64: case MVT::f64: case MVT::v2i32: - case MVT::v2f32: { + case MVT::v2f32: + case MVT::v4i16: + case MVT::v4f16: { // Up to SGPR0-SGPR39 return allocateCCRegs(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State, &AMDGPU::SGPR_64RegClass, 20); @@ -94,7 +96,9 @@ static bool allocateVGPRTuple(unsigned ValNo, MVT ValVT, MVT LocVT, case MVT::i64: case MVT::f64: case MVT::v2i32: - case MVT::v2f32: { + case MVT::v2f32: + case MVT::v4i16: + case MVT::v4f16: { return allocateCCRegs(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State, &AMDGPU::VReg_64RegClass, 31); } @@ -1234,6 +1238,16 @@ SDValue AMDGPUTargetLowering::LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const { SmallVector<SDValue, 8> Args; + EVT VT = Op.getValueType(); + if (VT == MVT::v4i16 || VT == MVT::v4f16) { + SDLoc SL(Op); + SDValue Lo = DAG.getNode(ISD::BITCAST, SL, MVT::i32, Op.getOperand(0)); + SDValue Hi = DAG.getNode(ISD::BITCAST, SL, MVT::i32, Op.getOperand(1)); + + SDValue BV = DAG.getBuildVector(MVT::v2i32, SL, { Lo, Hi }); + return DAG.getNode(ISD::BITCAST, SL, VT, BV); + } + for (const SDUse &U : Op->ops()) DAG.ExtractVectorElements(U.get(), Args); |