forked from OSchip/llvm-project
[X86] getShuffleScalarElt - peek through insert/extract subvector nodes.
llvm-svn: 355288
This commit is contained in:
parent
11149ea433
commit
d8e91a54c0
|
@ -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<ConstantSDNode>(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<ConstantSDNode>(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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue