From: Simon Pilgrim Date: Sun, 3 Mar 2019 14:11:05 +0000 (+0000) Subject: [X86] getShuffleScalarElt - peek through insert/extract subvector nodes. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1ab32adbf4178f138b715615bd2c2baf53442eb1;p=llvm [X86] getShuffleScalarElt - peek through insert/extract subvector nodes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355288 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 7aff9ab9b87..bf7037f58ea 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -6884,6 +6884,29 @@ static SDValue getShuffleScalarElt(SDNode *N, unsigned Index, SelectionDAG &DAG, Depth+1); } + // Recurse into insert_subvector base/sub vector to find scalars. + if (Opcode == ISD::INSERT_SUBVECTOR && + isa(N->getOperand(2))) { + SDValue Vec = N->getOperand(0); + SDValue Sub = N->getOperand(1); + EVT SubVT = Sub.getValueType(); + unsigned NumSubElts = SubVT.getVectorNumElements(); + uint64_t SubIdx = N->getConstantOperandVal(2); + + if (SubIdx <= Index && Index < (SubIdx + NumSubElts)) + return getShuffleScalarElt(Sub.getNode(), Index - SubIdx, DAG, Depth + 1); + return getShuffleScalarElt(Vec.getNode(), Index, DAG, Depth + 1); + } + + // Recurse into extract_subvector src vector to find scalars. + if (Opcode == ISD::EXTRACT_SUBVECTOR && + isa(N->getOperand(1))) { + SDValue Src = N->getOperand(0); + EVT SrcVT = Src.getValueType(); + uint64_t SrcIdx = N->getConstantOperandVal(1); + return getShuffleScalarElt(Src.getNode(), Index + SrcIdx, DAG, Depth + 1); + } + // Actual nodes that may contain scalar elements if (Opcode == ISD::BITCAST) { V = V.getOperand(0); diff --git a/test/CodeGen/X86/avx-load-store.ll b/test/CodeGen/X86/avx-load-store.ll index f4d0921ae49..eabe82de444 100644 --- a/test/CodeGen/X86/avx-load-store.ll +++ b/test/CodeGen/X86/avx-load-store.ll @@ -85,11 +85,6 @@ define <8 x float> @mov00(<8 x float> %v, float * %ptr) nounwind { ; CHECK_O0-LABEL: mov00: ; CHECK_O0: # %bb.0: ; CHECK_O0-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero -; CHECK_O0-NEXT: # implicit-def: $ymm1 -; CHECK_O0-NEXT: vmovaps %xmm0, %xmm1 -; CHECK_O0-NEXT: vmovaps %xmm1, %xmm0 -; CHECK_O0-NEXT: vxorps %xmm2, %xmm2, %xmm2 -; CHECK_O0-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3] ; CHECK_O0-NEXT: # kill: def $ymm0 killed $xmm0 ; CHECK_O0-NEXT: retq %val = load float, float* %ptr @@ -106,11 +101,6 @@ define <4 x double> @mov01(<4 x double> %v, double * %ptr) nounwind { ; CHECK_O0-LABEL: mov01: ; CHECK_O0: # %bb.0: ; CHECK_O0-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero -; CHECK_O0-NEXT: # implicit-def: $ymm1 -; CHECK_O0-NEXT: vmovaps %xmm0, %xmm1 -; CHECK_O0-NEXT: vmovaps %xmm1, %xmm0 -; CHECK_O0-NEXT: vxorps %xmm2, %xmm2, %xmm2 -; CHECK_O0-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm2[1] ; CHECK_O0-NEXT: # kill: def $ymm0 killed $xmm0 ; CHECK_O0-NEXT: retq %val = load double, double* %ptr