diff options
| author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2018-09-12 20:58:48 +0000 |
|---|---|---|
| committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2018-09-12 20:58:48 +0000 |
| commit | cd95e03cf0617718b31d653813a7a655f5cfad63 (patch) | |
| tree | 732bfd89ada837fecc936c3f252c6f24c73881f6 | |
| parent | e45c1eed0c8fcc0070364802634dde5235e6c8f7 (diff) | |
| download | bcm5719-llvm-cd95e03cf0617718b31d653813a7a655f5cfad63.tar.gz bcm5719-llvm-cd95e03cf0617718b31d653813a7a655f5cfad63.zip | |
[Hexagon] Use legalized type for extracted elements in scalarizeShuffle
Scalarization of a shuffle will break up the source vectors into individual
elements, and use them to assemble the resulting vector. An element type of
a legal vector type may not necessarily be a legal scalar type, so make
sure that the extracted values are extended to a legal scalar type.
llvm-svn: 342079
| -rw-r--r-- | llvm/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp index 988ed92a047..0b4bd23041a 100644 --- a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp +++ b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp @@ -1338,9 +1338,11 @@ bool HvxSelector::scalarizeShuffle(ArrayRef<int> Mask, const SDLoc &dl, MVT SingleTy = getSingleVT(MVT::i8); SmallVector<SDValue,128> Ops; + LLVMContext &Ctx = *DAG.getContext(); + MVT LegalTy = Lower.getTypeToTransformTo(Ctx, ElemTy).getSimpleVT(); for (int I : Mask) { if (I < 0) { - Ops.push_back(ISel.selectUndef(dl, ElemTy)); + Ops.push_back(ISel.selectUndef(dl, LegalTy)); continue; } SDValue Vec; @@ -1360,7 +1362,7 @@ bool HvxSelector::scalarizeShuffle(ArrayRef<int> Mask, const SDLoc &dl, } } SDValue Idx = DAG.getConstant(M, dl, MVT::i32); - SDValue Ex = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, ElemTy, {Vec, Idx}); + SDValue Ex = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, LegalTy, {Vec, Idx}); SDValue L = Lower.LowerOperation(Ex, DAG); assert(L.getNode()); Ops.push_back(L); |

