[X86] getTargetConstantBitsFromNode - ensure constant data is from a vector type (#213360)

Fixes #213251
This commit is contained in:
Simon Pilgrim 2026-07-31 23:17:07 +01:00 committed by GitHub
parent 1cf3b70dab
commit d0d8c85410
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 75 additions and 17 deletions

View file

@ -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;
};

View file

@ -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>