From 4abc80e6ee6de14b4ff41cc4c7063bcd74e66d50 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Thu, 28 Sep 2017 16:53:16 +0000 Subject: [PATCH] [X86] Use correct subvector index when combining two insert subvectors featuring zero vectors. Previously we were using one of the subvector indices twice. The included test case causes an assert without this change. Thanks to Simon Pilgrim for catching this. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@314429 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ISelLowering.cpp | 2 +- test/CodeGen/X86/avx512-insert-extract.ll | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index c6d41452e0c..4ac4db7b568 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -35801,7 +35801,7 @@ static SDValue combineInsertSubvector(SDNode *N, SelectionDAG &DAG, // just insert into the larger zero vector directly. if (SubVec.getOpcode() == ISD::INSERT_SUBVECTOR && ISD::isBuildVectorAllZeros(SubVec.getOperand(0).getNode())) { - unsigned Idx2Val = cast(Idx)->getZExtValue(); + unsigned Idx2Val = SubVec.getConstantOperandVal(2); return DAG.getNode(ISD::INSERT_SUBVECTOR, dl, OpVT, Vec, SubVec.getOperand(1), DAG.getIntPtrConstant(IdxVal + Idx2Val, dl)); diff --git a/test/CodeGen/X86/avx512-insert-extract.ll b/test/CodeGen/X86/avx512-insert-extract.ll index 4b9eb5d76b3..ce70a075285 100644 --- a/test/CodeGen/X86/avx512-insert-extract.ll +++ b/test/CodeGen/X86/avx512-insert-extract.ll @@ -2183,3 +2183,14 @@ define zeroext i8 @test_extractelement_varible_v32i1(<32 x i8> %a, <32 x i8> %b, ret i8 %res } +define <8 x i64> @insert_double_zero(<2 x i64> %a) nounwind { +; CHECK-LABEL: insert_double_zero: +; CHECK: ## BB#0: +; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1 +; CHECK-NEXT: vinsertf32x4 $2, %xmm0, %zmm1, %zmm0 +; CHECK-NEXT: retq + %b = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <4 x i32> + %d = shufflevector <4 x i64> %b, <4 x i64> undef, <8 x i32> + %e = shufflevector <8 x i64> %d, <8 x i64> zeroinitializer, <8 x i32> + ret <8 x i64> %e +} -- 2.49.0