Skip to content

Commit a95ca2b

Browse files
committed
[x86] prevent crashing from select narrowing with AVX512
llvm-svn: 364585
1 parent 564b037 commit a95ca2b

File tree

2 files changed

+68
-0
lines changed

2 files changed

+68
-0
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43530,13 +43530,22 @@ static SDValue narrowExtractedVectorSelect(SDNode *Ext, SelectionDAG &DAG) {
4353043530
!collectConcatOps(Sel.getOperand(0).getNode(), CatOps))
4353143531
return SDValue();
4353243532

43533+
// Note: We assume simple value types because this should only be called with
43534+
// legal operations/types.
4353343535
// TODO: This can be extended to handle extraction to 256-bits.
4353443536
MVT VT = Ext->getSimpleValueType(0);
4353543537
if (!VT.is128BitVector())
4353643538
return SDValue();
4353743539

43540+
MVT SelCondVT = Sel.getOperand(0).getSimpleValueType();
43541+
if (!SelCondVT.is256BitVector() && !SelCondVT.is512BitVector())
43542+
return SDValue();
43543+
4353843544
MVT WideVT = Ext->getOperand(0).getSimpleValueType();
4353943545
MVT SelVT = Sel.getSimpleValueType();
43546+
assert((SelVT.is256BitVector() || SelVT.is512BitVector()) &&
43547+
"Unexpected vector type with legal operations");
43548+
4354043549
unsigned SelElts = SelVT.getVectorNumElements();
4354143550
unsigned CastedElts = WideVT.getVectorNumElements();
4354243551
unsigned ExtIdx = cast<ConstantSDNode>(Ext->getOperand(1))->getZExtValue();

llvm/test/CodeGen/X86/avx512-select.ll

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,3 +537,62 @@ define <64 x i8> @pr42355_v64i8(i1 %c, <64 x i8> %x, <64 x i8> %y) {
537537
ret <64 x i8> %a
538538
}
539539

540+
; This would crash because AVX512 has legal vector select
541+
; condition values that are not 256/512-bit vectors.
542+
543+
define <16 x i64> @narrowExtractedVectorSelect_crash(<16 x i64> %arg, <16 x i16> %arg1) #0 {
544+
; X86-AVX512F-LABEL: narrowExtractedVectorSelect_crash:
545+
; X86-AVX512F: # %bb.0:
546+
; X86-AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k0
547+
; X86-AVX512F-NEXT: vptestmq %zmm1, %zmm1, %k1
548+
; X86-AVX512F-NEXT: kunpckbw %k0, %k1, %k1
549+
; X86-AVX512F-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
550+
; X86-AVX512F-NEXT: vpmovdw %zmm0, %ymm0
551+
; X86-AVX512F-NEXT: vpand %ymm2, %ymm0, %ymm1
552+
; X86-AVX512F-NEXT: vpmovzxwq {{.*#+}} zmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero
553+
; X86-AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1
554+
; X86-AVX512F-NEXT: vpmovzxwq {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero
555+
; X86-AVX512F-NEXT: retl
556+
;
557+
; X64-AVX512F-LABEL: narrowExtractedVectorSelect_crash:
558+
; X64-AVX512F: # %bb.0:
559+
; X64-AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k0
560+
; X64-AVX512F-NEXT: vptestmq %zmm1, %zmm1, %k1
561+
; X64-AVX512F-NEXT: kunpckbw %k0, %k1, %k1
562+
; X64-AVX512F-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
563+
; X64-AVX512F-NEXT: vpmovdw %zmm0, %ymm0
564+
; X64-AVX512F-NEXT: vpand %ymm2, %ymm0, %ymm1
565+
; X64-AVX512F-NEXT: vpmovzxwq {{.*#+}} zmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero
566+
; X64-AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1
567+
; X64-AVX512F-NEXT: vpmovzxwq {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero
568+
; X64-AVX512F-NEXT: retq
569+
;
570+
; X86-AVX512BW-LABEL: narrowExtractedVectorSelect_crash:
571+
; X86-AVX512BW: # %bb.0:
572+
; X86-AVX512BW-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2
573+
; X86-AVX512BW-NEXT: vptestmq %zmm0, %zmm0, %k0
574+
; X86-AVX512BW-NEXT: vptestmq %zmm1, %zmm1, %k1
575+
; X86-AVX512BW-NEXT: kunpckbw %k0, %k1, %k1
576+
; X86-AVX512BW-NEXT: vmovdqu16 %zmm2, %zmm1 {%k1} {z}
577+
; X86-AVX512BW-NEXT: vpmovzxwq {{.*#+}} zmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero
578+
; X86-AVX512BW-NEXT: vextracti128 $1, %ymm1, %xmm1
579+
; X86-AVX512BW-NEXT: vpmovzxwq {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero
580+
; X86-AVX512BW-NEXT: retl
581+
;
582+
; X64-AVX512BW-LABEL: narrowExtractedVectorSelect_crash:
583+
; X64-AVX512BW: # %bb.0:
584+
; X64-AVX512BW-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2
585+
; X64-AVX512BW-NEXT: vptestmq %zmm0, %zmm0, %k0
586+
; X64-AVX512BW-NEXT: vptestmq %zmm1, %zmm1, %k1
587+
; X64-AVX512BW-NEXT: kunpckbw %k0, %k1, %k1
588+
; X64-AVX512BW-NEXT: vmovdqu16 %zmm2, %zmm1 {%k1} {z}
589+
; X64-AVX512BW-NEXT: vpmovzxwq {{.*#+}} zmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero
590+
; X64-AVX512BW-NEXT: vextracti128 $1, %ymm1, %xmm1
591+
; X64-AVX512BW-NEXT: vpmovzxwq {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero
592+
; X64-AVX512BW-NEXT: retq
593+
%tmp = icmp ne <16 x i64> %arg, zeroinitializer
594+
%tmp2 = select <16 x i1> %tmp, <16 x i16> %arg1, <16 x i16> zeroinitializer
595+
%tmp3 = zext <16 x i16> %tmp2 to <16 x i64>
596+
ret <16 x i64> %tmp3
597+
}
598+

0 commit comments

Comments
 (0)