diff options
| author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2018-02-06 20:18:58 +0000 |
|---|---|---|
| committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2018-02-06 20:18:58 +0000 |
| commit | 97a5095db68b392a1a68943781e68de1ad99b407 (patch) | |
| tree | 9c117a921edc6a22be132365da01c82c6f81fa36 /llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp | |
| parent | 5eb6a284b1c70d68e2a63e58c76042444f1e388e (diff) | |
| download | bcm5719-llvm-97a5095db68b392a1a68943781e68de1ad99b407.tar.gz bcm5719-llvm-97a5095db68b392a1a68943781e68de1ad99b407.zip | |
[Hexagon] Lower concat of more than 2 vectors into build_vector
llvm-svn: 324391
Diffstat (limited to 'llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp')
| -rw-r--r-- | llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp b/llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp index 291e3858012..7e9ef9dc85b 100644 --- a/llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp +++ b/llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp @@ -791,15 +791,24 @@ HexagonTargetLowering::LowerHvxBuildVector(SDValue Op, SelectionDAG &DAG) SDValue HexagonTargetLowering::LowerHvxConcatVectors(SDValue Op, SelectionDAG &DAG) const { - // This should only be called for vectors of i1. The "scalar" vector - // concatenation does not need special lowering (assuming that only - // two vectors are concatenated at a time). + // Vector concatenation of two integer (non-bool) vectors does not need + // special lowering. Custom-lower concats of bool vectors and expand + // concats of more than 2 vectors. MVT VecTy = ty(Op); - assert(VecTy.getVectorElementType() == MVT::i1); - const SDLoc &dl(Op); - unsigned HwLen = Subtarget.getVectorLength(); unsigned NumOp = Op.getNumOperands(); + if (VecTy.getVectorElementType() != MVT::i1) { + if (NumOp == 2) + return Op; + // Expand the other cases into a build-vector. + SmallVector<SDValue,8> Elems; + for (SDValue V : Op.getNode()->ops()) + DAG.ExtractVectorElements(V, Elems); + return DAG.getBuildVector(VecTy, dl, Elems); + } + + assert(VecTy.getVectorElementType() == MVT::i1); + unsigned HwLen = Subtarget.getVectorLength(); assert(isPowerOf2_32(NumOp) && HwLen % NumOp == 0); SDValue Op0 = Op.getOperand(0); |

