[llvm] r343596 - [Hexagon] Fix extracting subvectors of non-HVX vNi1
Krzysztof Parzyszek via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 2 08:05:44 PDT 2018
Author: kparzysz
Date: Tue Oct 2 08:05:43 2018
New Revision: 343596
URL: http://llvm.org/viewvc/llvm-project?rev=343596&view=rev
Log:
[Hexagon] Fix extracting subvectors of non-HVX vNi1
Patch by Brendon Cahoon.
Added:
llvm/trunk/test/CodeGen/Hexagon/vect/extract-v4i1.ll
Modified:
llvm/trunk/lib/Target/Hexagon/HexagonISelLowering.cpp
Modified: llvm/trunk/lib/Target/Hexagon/HexagonISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonISelLowering.cpp?rev=343596&r1=343595&r2=343596&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonISelLowering.cpp Tue Oct 2 08:05:43 2018
@@ -2362,8 +2362,9 @@ HexagonTargetLowering::extractVector(SDV
// Generate (p2d VecV) >> 8*Idx to move the interesting bytes to
// position 0.
assert(ty(IdxV) == MVT::i32);
+ unsigned VecRep = 8 / VecWidth;
SDValue S0 = DAG.getNode(ISD::MUL, dl, MVT::i32, IdxV,
- DAG.getConstant(8*Scale, dl, MVT::i32));
+ DAG.getConstant(8*VecRep, dl, MVT::i32));
SDValue T0 = DAG.getNode(HexagonISD::P2D, dl, MVT::i64, VecV);
SDValue T1 = DAG.getNode(ISD::SRL, dl, MVT::i64, T0, S0);
while (Scale > 1) {
Added: llvm/trunk/test/CodeGen/Hexagon/vect/extract-v4i1.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/vect/extract-v4i1.ll?rev=343596&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/vect/extract-v4i1.ll (added)
+++ llvm/trunk/test/CodeGen/Hexagon/vect/extract-v4i1.ll Tue Oct 2 08:05:43 2018
@@ -0,0 +1,28 @@
+; RUN: llc -march=hexagon < %s | FileCheck %s
+
+; Test that the compiler generates the correct code when sign-extending a
+; predicate register when it is converted from one vector predicate type
+; to another. In this case, the compiler generates two v4i1 EXTRACT_SUBVECT
+; from a v8i1, for the lower and upper parts.
+
+; CHECK: r[[REGH:([0-9]+)]]:[[REGL:([0-9]+)]] = mask(p{{[0-3]}})
+; CHECK-DAG: = vsxtbh(r[[REGH]])
+; CHECK-DAG: = vsxtbh(r[[REGL]])
+
+target triple = "hexagon"
+
+define void @f0(i16* %a0, <8 x i16>* %a1) #0 {
+b0:
+ %v0 = load i16, i16* %a0, align 2
+ %v1 = sext i16 %v0 to i32
+ %v2 = insertelement <8 x i32> undef, i32 %v1, i32 0
+ %v3 = shufflevector <8 x i32> %v2, <8 x i32> undef, <8 x i32> zeroinitializer
+ %v4 = shl <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
+ %v5 = and <8 x i32> %v4, %v3
+ %v6 = icmp ne <8 x i32> %v5, zeroinitializer
+ %v7 = zext <8 x i1> %v6 to <8 x i16>
+ store <8 x i16> %v7, <8 x i16>* %a1, align 8
+ ret void
+}
+
+attributes #0 = { nounwind optsize "target-cpu"="hexagonv65" "target-features"="+hvx-length64b,+hvxv65,-long-calls" }
More information about the llvm-commits
mailing list