[X86] getTargetConstantBitsFromNode - ensure constant data is from a vector type (#213360)
Fixes #213251
This commit is contained in:
parent
1cf3b70dab
commit
d0d8c85410
2 changed files with 75 additions and 17 deletions
|
|
@ -5497,21 +5497,23 @@ static bool getTargetConstantBitsFromNode(SDValue Op, unsigned EltSizeInBits,
|
|||
}
|
||||
if (auto *CDS = dyn_cast<ConstantDataSequential>(Cst)) {
|
||||
Type *Ty = CDS->getType();
|
||||
Mask = APInt::getZero(Ty->getPrimitiveSizeInBits());
|
||||
Type *EltTy = CDS->getElementType();
|
||||
bool IsInteger = EltTy->isIntegerTy();
|
||||
bool IsFP =
|
||||
EltTy->isHalfTy() || EltTy->isFloatTy() || EltTy->isDoubleTy();
|
||||
if (!IsInteger && !IsFP)
|
||||
return false;
|
||||
unsigned EltBits = EltTy->getPrimitiveSizeInBits();
|
||||
for (unsigned I = 0, E = CDS->getNumElements(); I != E; ++I)
|
||||
if (IsInteger)
|
||||
Mask.insertBits(CDS->getElementAsAPInt(I), I * EltBits);
|
||||
else
|
||||
Mask.insertBits(CDS->getElementAsAPFloat(I).bitcastToAPInt(),
|
||||
I * EltBits);
|
||||
return true;
|
||||
if (Ty->isVectorTy()) {
|
||||
Mask = APInt::getZero(Ty->getPrimitiveSizeInBits());
|
||||
Type *EltTy = CDS->getElementType();
|
||||
bool IsInteger = EltTy->isIntegerTy();
|
||||
bool IsFP =
|
||||
EltTy->isHalfTy() || EltTy->isFloatTy() || EltTy->isDoubleTy();
|
||||
if (!IsInteger && !IsFP)
|
||||
return false;
|
||||
unsigned EltBits = EltTy->getPrimitiveSizeInBits();
|
||||
for (unsigned I = 0, E = CDS->getNumElements(); I != E; ++I)
|
||||
if (IsInteger)
|
||||
Mask.insertBits(CDS->getElementAsAPInt(I), I * EltBits);
|
||||
else
|
||||
Mask.insertBits(CDS->getElementAsAPFloat(I).bitcastToAPInt(),
|
||||
I * EltBits);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -3621,6 +3621,62 @@ define <2 x i1> @PR179112(<2 x i32> %load) {
|
|||
ret <2 x i1> %reverse.2
|
||||
}
|
||||
|
||||
define <8 x float> @PR213251() {
|
||||
; SSE2-LABEL: PR213251:
|
||||
; SSE2: # %bb.0:
|
||||
; SSE2-NEXT: movl $1, (%rax)
|
||||
; SSE2-NEXT: movd {{.*#+}} xmm0 = [NaN,0.0E+0,0.0E+0,0.0E+0]
|
||||
; SSE2-NEXT: movq {{.*#+}} xmm0 = xmm0[0],zero
|
||||
; SSE2-NEXT: xorps %xmm1, %xmm1
|
||||
; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
|
||||
; SSE2-NEXT: retq
|
||||
;
|
||||
; SSSE3-LABEL: PR213251:
|
||||
; SSSE3: # %bb.0:
|
||||
; SSSE3-NEXT: movl $1, (%rax)
|
||||
; SSSE3-NEXT: movd {{.*#+}} xmm0 = [NaN,0.0E+0,0.0E+0,0.0E+0]
|
||||
; SSSE3-NEXT: movq {{.*#+}} xmm0 = xmm0[0],zero
|
||||
; SSSE3-NEXT: xorps %xmm1, %xmm1
|
||||
; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
|
||||
; SSSE3-NEXT: retq
|
||||
;
|
||||
; SSE41-LABEL: PR213251:
|
||||
; SSE41: # %bb.0:
|
||||
; SSE41-NEXT: movl $1, (%rax)
|
||||
; SSE41-NEXT: insertps {{.*#+}} xmm0 = zero,mem[0],zero,zero
|
||||
; SSE41-NEXT: xorps %xmm1, %xmm1
|
||||
; SSE41-NEXT: retq
|
||||
;
|
||||
; AVX1-LABEL: PR213251:
|
||||
; AVX1: # %bb.0:
|
||||
; AVX1-NEXT: movl $1, (%rax)
|
||||
; AVX1-NEXT: vbroadcastss {{.*#+}} xmm0 = [NaN,NaN,NaN,NaN]
|
||||
; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
|
||||
; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2,3,4,5,6,7]
|
||||
; AVX1-NEXT: retq
|
||||
;
|
||||
; AVX2-SLOW-LABEL: PR213251:
|
||||
; AVX2-SLOW: # %bb.0:
|
||||
; AVX2-SLOW-NEXT: movl $1, (%rax)
|
||||
; AVX2-SLOW-NEXT: vbroadcastss {{.*#+}} xmm0 = [NaN,NaN,NaN,NaN]
|
||||
; AVX2-SLOW-NEXT: vxorps %xmm1, %xmm1, %xmm1
|
||||
; AVX2-SLOW-NEXT: vblendps {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2,3,4,5,6,7]
|
||||
; AVX2-SLOW-NEXT: retq
|
||||
;
|
||||
; AVX2-FAST-LABEL: PR213251:
|
||||
; AVX2-FAST: # %bb.0:
|
||||
; AVX2-FAST-NEXT: movl $1, (%rax)
|
||||
; AVX2-FAST-NEXT: vmovd {{.*#+}} xmm0 = [NaN,0.0E+0,0.0E+0,0.0E+0]
|
||||
; AVX2-FAST-NEXT: vpshufb {{.*#+}} ymm0 = zero,zero,zero,zero,ymm0[0,1,2,3],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
|
||||
; AVX2-FAST-NEXT: retq
|
||||
store i32 1, ptr poison, align 4
|
||||
%f.promoted = load i32, ptr poison, align 4
|
||||
%tobool.not12 = icmp eq i32 %f.promoted, 0
|
||||
%cond13 = select i1 %tobool.not12, float 1.000000e+00, float +qnan
|
||||
%vecins14 = insertelement <8 x float> zeroinitializer, float %cond13, i64 1
|
||||
ret <8 x float> %vecins14
|
||||
}
|
||||
|
||||
; Test case reported on D105827
|
||||
define void @SpinningCube() {
|
||||
; SSE2-LABEL: SpinningCube:
|
||||
|
|
@ -3722,9 +3778,9 @@ define void @autogen_SD25931() {
|
|||
; CHECK-LABEL: autogen_SD25931:
|
||||
; CHECK: # %bb.0: # %BB
|
||||
; CHECK-NEXT: .p2align 4
|
||||
; CHECK-NEXT: .LBB144_1: # %CF242
|
||||
; CHECK-NEXT: .LBB145_1: # %CF242
|
||||
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
|
||||
; CHECK-NEXT: jmp .LBB144_1
|
||||
; CHECK-NEXT: jmp .LBB145_1
|
||||
BB:
|
||||
%Cmp16 = icmp uge <2 x i1> zeroinitializer, zeroinitializer
|
||||
%Shuff19 = shufflevector <2 x i1> zeroinitializer, <2 x i1> %Cmp16, <2 x i32> <i32 3, i32 1>
|
||||
|
|
|
|||
Loading…
Reference in a new issue