From c005469c2e5cd32338359778835e841a69bb7e8a Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Sat, 9 Dec 2017 08:19:07 +0000 Subject: [PATCH] [X86] When inserting into the upper bits of a vXi1 vector, make sure we shift enough bits if we widened the vector. We may need to widen the vector to make the shifts legal, but if we do that we need to make sure we shift left/right after accounting for the new size. If not we can't guarantee we are shifting in zeros. The test cases affected actually show cases where we should move the shifts all together, but that's another problem. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@320248 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ISelLowering.cpp | 3 ++- test/CodeGen/X86/avx512-skx-insert-subvec.ll | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index bcffa72afea..716b5edc474 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -5099,7 +5099,8 @@ static SDValue insert1BitVector(SDValue Op, SelectionDAG &DAG, // Zero upper bits of the Vec WideSubVec = DAG.getNode(X86ISD::KSHIFTL, dl, WideOpVT, WideSubVec, DAG.getConstant(IdxVal, dl, MVT::i8)); - SDValue ShiftBits = DAG.getConstant(SubVecNumElems, dl, MVT::i8); + NumElems = WideOpVT.getVectorNumElements(); + SDValue ShiftBits = DAG.getConstant(NumElems - IdxVal, dl, MVT::i8); Vec = DAG.getNode(ISD::INSERT_SUBVECTOR, dl, WideOpVT, Undef, Vec, ZeroIdx); Vec = DAG.getNode(X86ISD::KSHIFTL, dl, WideOpVT, Vec, ShiftBits); Vec = DAG.getNode(X86ISD::KSHIFTR, dl, WideOpVT, Vec, ShiftBits); diff --git a/test/CodeGen/X86/avx512-skx-insert-subvec.ll b/test/CodeGen/X86/avx512-skx-insert-subvec.ll index 4c650903e47..4421fc09673 100644 --- a/test/CodeGen/X86/avx512-skx-insert-subvec.ll +++ b/test/CodeGen/X86/avx512-skx-insert-subvec.ll @@ -79,8 +79,8 @@ define <4 x i1> @test5(<2 x i1> %a, <2 x i1>%b) { ; CHECK-NEXT: vpsllq $63, %xmm1, %xmm0 ; CHECK-NEXT: vptestmq %xmm0, %xmm0, %k1 ; CHECK-NEXT: kshiftlb $2, %k1, %k1 -; CHECK-NEXT: kshiftlb $2, %k0, %k0 -; CHECK-NEXT: kshiftrb $2, %k0, %k0 +; CHECK-NEXT: kshiftlb $6, %k0, %k0 +; CHECK-NEXT: kshiftrb $6, %k0, %k0 ; CHECK-NEXT: korb %k1, %k0, %k0 ; CHECK-NEXT: vpmovm2d %k0, %xmm0 ; CHECK-NEXT: retq @@ -97,8 +97,8 @@ define <16 x i1> @test6(<2 x i1> %a, <2 x i1>%b) { ; CHECK-NEXT: vpsllq $63, %xmm1, %xmm0 ; CHECK-NEXT: vptestmq %xmm0, %xmm0, %k1 ; CHECK-NEXT: kshiftlb $2, %k1, %k1 -; CHECK-NEXT: kshiftlb $2, %k0, %k0 -; CHECK-NEXT: kshiftrb $2, %k0, %k0 +; CHECK-NEXT: kshiftlb $6, %k0, %k0 +; CHECK-NEXT: kshiftrb $6, %k0, %k0 ; CHECK-NEXT: korb %k1, %k0, %k0 ; CHECK-NEXT: vpmovm2b %k0, %xmm0 ; CHECK-NEXT: retq -- 2.50.1