[llvm] r323889 - [Hexagon] Handle BUILD_VECTOR from undef values in buildHvxVectorReg
Krzysztof Parzyszek via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 31 08:52:16 PST 2018
Author: kparzysz
Date: Wed Jan 31 08:52:15 2018
New Revision: 323889
URL: http://llvm.org/viewvc/llvm-project?rev=323889&view=rev
Log:
[Hexagon] Handle BUILD_VECTOR from undef values in buildHvxVectorReg
Added:
llvm/trunk/test/CodeGen/Hexagon/autohvx/isel-build-undef.ll
Modified:
llvm/trunk/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp
Modified: llvm/trunk/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp?rev=323889&r1=323888&r2=323889&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp Wed Jan 31 08:52:15 2018
@@ -168,16 +168,19 @@ HexagonTargetLowering::buildHvxVectorReg
}
unsigned NumWords = Words.size();
- bool IsSplat = true;
+ bool IsSplat = true, IsUndef = true;
SDValue SplatV;
for (unsigned i = 0; i != NumWords && IsSplat; ++i) {
if (isUndef(Words[i]))
continue;
+ IsUndef = false;
if (!SplatV.getNode())
SplatV = Words[i];
else if (SplatV != Words[i])
IsSplat = false;
}
+ if (IsUndef)
+ return DAG.getUNDEF(VecTy);
if (IsSplat) {
assert(SplatV.getNode());
auto *IdxN = dyn_cast<ConstantSDNode>(SplatV.getNode());
Added: llvm/trunk/test/CodeGen/Hexagon/autohvx/isel-build-undef.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/autohvx/isel-build-undef.ll?rev=323889&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/autohvx/isel-build-undef.ll (added)
+++ llvm/trunk/test/CodeGen/Hexagon/autohvx/isel-build-undef.ll Wed Jan 31 08:52:15 2018
@@ -0,0 +1,39 @@
+; RUN: llc -march=hexagon < %s | FileCheck %s
+
+; During lowering, a BUILD_VECTOR of undef values was created. This was
+; not properly handled by buildHvxVectorReg, which tried to generate a
+; splat, but had no source value.
+;
+; Check that this compiles successfully.
+; CHECK: vxor
+
+target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048"
+target triple = "hexagon"
+
+define void @fred() #0 {
+b0:
+ %v1 = load i8, i8* undef, align 1
+ %v2 = insertelement <32 x i8> undef, i8 %v1, i32 31
+ %v3 = zext <32 x i8> %v2 to <32 x i16>
+ %v4 = add nuw nsw <32 x i16> %v3, zeroinitializer
+ %v5 = add nuw nsw <32 x i16> %v4, zeroinitializer
+ %v6 = add nuw nsw <32 x i16> %v5, zeroinitializer
+ %v7 = add nuw nsw <32 x i16> %v6, zeroinitializer
+ %v8 = add nuw nsw <32 x i16> %v7, zeroinitializer
+ %v9 = add nuw nsw <32 x i16> %v8, zeroinitializer
+ %v10 = add <32 x i16> %v9, zeroinitializer
+ %v11 = add <32 x i16> %v10, zeroinitializer
+ %v12 = add <32 x i16> %v11, zeroinitializer
+ %v13 = add <32 x i16> %v12, zeroinitializer
+ %v14 = add <32 x i16> %v13, zeroinitializer
+ %v15 = add <32 x i16> %v14, zeroinitializer
+ %v16 = add <32 x i16> %v15, zeroinitializer
+ %v17 = add <32 x i16> %v16, zeroinitializer
+ %v18 = add <32 x i16> %v17, zeroinitializer
+ %v19 = lshr <32 x i16> %v18, <i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4>
+ %v20 = trunc <32 x i16> %v19 to <32 x i8>
+ store <32 x i8> %v20, <32 x i8>* undef, align 1
+ unreachable
+}
+
+attributes #0 = { norecurse nounwind "target-cpu"="hexagonv60" "target-features"="+hvx-length64b,+hvxv60" }
More information about the llvm-commits
mailing list