summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp
diff options
context:
space:
mode:
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>2018-02-06 20:18:58 +0000
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>2018-02-06 20:18:58 +0000
commit97a5095db68b392a1a68943781e68de1ad99b407 (patch)
tree9c117a921edc6a22be132365da01c82c6f81fa36 /llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp
parent5eb6a284b1c70d68e2a63e58c76042444f1e388e (diff)
downloadbcm5719-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.cpp21
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);
OpenPOWER on IntegriCloud