diff options
author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2018-04-19 17:11:58 +0000 |
---|---|---|
committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2018-04-19 17:11:58 +0000 |
commit | 2a9a83cd3f4b1993cf657193e28ca0f4f06489f4 (patch) | |
tree | a40243404aee71997d94652e201c5742e03dd932 /llvm/lib | |
parent | dca79d2867226785dacd66b1734ad173ed65d986 (diff) | |
download | bcm5719-llvm-2a9a83cd3f4b1993cf657193e28ca0f4f06489f4.tar.gz bcm5719-llvm-2a9a83cd3f4b1993cf657193e28ca0f4f06489f4.zip |
[Hexagon] Use legal types when lowering CONCAT_VECTORS via BUILD_VECTOR
llvm-svn: 330344
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp b/llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp index 58fd740d7a8..4aad920f2bc 100644 --- a/llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp +++ b/llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp @@ -971,6 +971,32 @@ HexagonTargetLowering::LowerHvxConcatVectors(SDValue Op, SelectionDAG &DAG) SmallVector<SDValue,8> Elems; for (SDValue V : Op.getNode()->ops()) DAG.ExtractVectorElements(V, Elems); + // A vector of i16 will be broken up into a build_vector of i16's. + // This is a problem, since at the time of operation legalization, + // all operations are expected to be type-legalized, and i16 is not + // a legal type. If any of the extracted elements is not of a valid + // type, sign-extend it to a valid one. + for (unsigned i = 0, e = Elems.size(); i != e; ++i) { + SDValue V = Elems[i]; + MVT Ty = ty(V); + if (!isTypeLegal(Ty)) { + EVT NTy = getTypeToTransformTo(*DAG.getContext(), Ty); + if (V.getOpcode() == ISD::EXTRACT_VECTOR_ELT) { + Elems[i] = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, NTy, + DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, NTy, + V.getOperand(0), V.getOperand(1)), + DAG.getValueType(Ty)); + continue; + } + // A few less complicated cases. + if (V.getOpcode() == ISD::Constant) + Elems[i] = DAG.getSExtOrTrunc(V, dl, NTy); + else if (V.isUndef()) + Elems[i] = DAG.getUNDEF(NTy); + else + llvm_unreachable("Unexpected vector element"); + } + } return DAG.getBuildVector(VecTy, dl, Elems); } |