forked from OSchip/llvm-project
[AVX-512][InstCombine] Teach InstCombine to optimize 512-bit packss/packus intrinsics like it does 128/256-bit.
llvm-svn: 295294
This commit is contained in:
parent
e55fb7f6f1
commit
3731f4d173
|
@ -2630,7 +2630,8 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
|||
case Intrinsic::x86_sse2_packsswb_128:
|
||||
case Intrinsic::x86_avx2_packssdw:
|
||||
case Intrinsic::x86_avx2_packsswb:
|
||||
// TODO Add support for Intrinsic::x86_avx512_mask_packss*
|
||||
case Intrinsic::x86_avx512_packssdw_512:
|
||||
case Intrinsic::x86_avx512_packsswb_512:
|
||||
if (Value *V = simplifyX86pack(*II, *this, *Builder, true))
|
||||
return replaceInstUsesWith(*II, V);
|
||||
break;
|
||||
|
@ -2639,7 +2640,8 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
|||
case Intrinsic::x86_sse41_packusdw:
|
||||
case Intrinsic::x86_avx2_packusdw:
|
||||
case Intrinsic::x86_avx2_packuswb:
|
||||
// TODO Add support for Intrinsic::x86_avx512_mask_packus*
|
||||
case Intrinsic::x86_avx512_packusdw_512:
|
||||
case Intrinsic::x86_avx512_packuswb_512:
|
||||
if (Value *V = simplifyX86pack(*II, *this, *Builder, false))
|
||||
return replaceInstUsesWith(*II, V);
|
||||
break;
|
||||
|
|
|
@ -1482,8 +1482,11 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,
|
|||
case Intrinsic::x86_avx2_packssdw:
|
||||
case Intrinsic::x86_avx2_packsswb:
|
||||
case Intrinsic::x86_avx2_packusdw:
|
||||
case Intrinsic::x86_avx2_packuswb: {
|
||||
// TODO Add support for Intrinsic::x86_avx512_mask_pack*
|
||||
case Intrinsic::x86_avx2_packuswb:
|
||||
case Intrinsic::x86_avx512_packssdw_512:
|
||||
case Intrinsic::x86_avx512_packsswb_512:
|
||||
case Intrinsic::x86_avx512_packusdw_512:
|
||||
case Intrinsic::x86_avx512_packuswb_512: {
|
||||
auto *Ty0 = II->getArgOperand(0)->getType();
|
||||
unsigned InnerVWidth = Ty0->getVectorNumElements();
|
||||
assert(VWidth == (InnerVWidth * 2) && "Unexpected input size");
|
||||
|
|
|
@ -69,6 +69,38 @@ define <32 x i8> @undef_packuswb_256() {
|
|||
ret <32 x i8> %1
|
||||
}
|
||||
|
||||
define <32 x i16> @undef_packssdw_512() {
|
||||
; CHECK-LABEL: @undef_packssdw_512(
|
||||
; CHECK-NEXT: ret <32 x i16> undef
|
||||
;
|
||||
%1 = call <32 x i16> @llvm.x86.avx512.packssdw.512(<16 x i32> undef, <16 x i32> undef)
|
||||
ret <32 x i16> %1
|
||||
}
|
||||
|
||||
define <32 x i16> @undef_packusdw_512() {
|
||||
; CHECK-LABEL: @undef_packusdw_512(
|
||||
; CHECK-NEXT: ret <32 x i16> undef
|
||||
;
|
||||
%1 = call <32 x i16> @llvm.x86.avx512.packusdw.512(<16 x i32> undef, <16 x i32> undef)
|
||||
ret <32 x i16> %1
|
||||
}
|
||||
|
||||
define <64 x i8> @undef_packsswb_512() {
|
||||
; CHECK-LABEL: @undef_packsswb_512(
|
||||
; CHECK-NEXT: ret <64 x i8> undef
|
||||
;
|
||||
%1 = call <64 x i8> @llvm.x86.avx512.packsswb.512(<32 x i16> undef, <32 x i16> undef)
|
||||
ret <64 x i8> %1
|
||||
}
|
||||
|
||||
define <64 x i8> @undef_packuswb_512() {
|
||||
; CHECK-LABEL: @undef_packuswb_512(
|
||||
; CHECK-NEXT: ret <64 x i8> undef
|
||||
;
|
||||
%1 = call <64 x i8> @llvm.x86.avx512.packuswb.512(<32 x i16> undef, <32 x i16> undef)
|
||||
ret <64 x i8> %1
|
||||
}
|
||||
|
||||
;
|
||||
; Constant Folding
|
||||
;
|
||||
|
@ -137,13 +169,45 @@ define <32 x i8> @fold_packuswb_256() {
|
|||
ret <32 x i8> %1
|
||||
}
|
||||
|
||||
define <32 x i16> @fold_packssdw_512() {
|
||||
; CHECK-LABEL: @fold_packssdw_512(
|
||||
; CHECK-NEXT: ret <32 x i16> <i16 0, i16 512, i16 32767, i16 -32768, i16 undef, i16 undef, i16 undef, i16 undef, i16 -127, i16 -32768, i16 -32767, i16 32767, i16 undef, i16 undef, i16 undef, i16 undef, i16 0, i16 512, i16 32767, i16 -32768, i16 undef, i16 undef, i16 undef, i16 undef, i16 -127, i16 -32768, i16 -32767, i16 32767, i16 undef, i16 undef, i16 undef, i16 undef>
|
||||
;
|
||||
%1 = call <32 x i16> @llvm.x86.avx512.packssdw.512(<16 x i32> <i32 0, i32 512, i32 65535, i32 -65536, i32 -127, i32 -32768, i32 -32767, i32 32767, i32 0, i32 512, i32 65535, i32 -65536, i32 -127, i32 -32768, i32 -32767, i32 32767>, <16 x i32> undef)
|
||||
ret <32 x i16> %1
|
||||
}
|
||||
|
||||
define <32 x i16> @fold_packusdw_512() {
|
||||
; CHECK-LABEL: @fold_packusdw_512(
|
||||
; CHECK-NEXT: ret <32 x i16> <i16 0, i16 0, i16 0, i16 -1, i16 0, i16 512, i16 -1, i16 0, i16 127, i16 -32768, i16 32767, i16 0, i16 0, i16 0, i16 0, i16 32767, i16 0, i16 0, i16 0, i16 -1, i16 0, i16 512, i16 -1, i16 0, i16 127, i16 -32768, i16 32767, i16 0, i16 0, i16 0, i16 0, i16 32767>
|
||||
;
|
||||
%1 = call <32 x i16> @llvm.x86.avx512.packusdw.512(<16 x i32> <i32 0, i32 -512, i32 -65535, i32 65536, i32 127, i32 32768, i32 32767, i32 -32767, i32 0, i32 -512, i32 -65535, i32 65536, i32 127, i32 32768, i32 32767, i32 -32767>, <16 x i32> <i32 0, i32 512, i32 65535, i32 -65536, i32 -127, i32 -32768, i32 -32767, i32 32767, i32 0, i32 512, i32 65535, i32 -65536, i32 -127, i32 -32768, i32 -32767, i32 32767>)
|
||||
ret <32 x i16> %1
|
||||
}
|
||||
|
||||
define <64 x i8> @fold_packsswb_512() {
|
||||
; CHECK-LABEL: @fold_packsswb_512(
|
||||
; CHECK-NEXT: ret <64 x i8> <i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>
|
||||
;
|
||||
%1 = call <64 x i8> @llvm.x86.avx512.packsswb.512(<32 x i16> undef, <32 x i16> zeroinitializer)
|
||||
ret <64 x i8> %1
|
||||
}
|
||||
|
||||
define <64 x i8> @fold_packuswb_512() {
|
||||
; CHECK-LABEL: @fold_packuswb_512(
|
||||
; CHECK-NEXT: ret <64 x i8> <i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 -1, i8 -1, i8 -1, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 -1, i8 -1, i8 -1, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64>
|
||||
;
|
||||
%1 = call <64 x i8> @llvm.x86.avx512.packuswb.512(<32 x i16> zeroinitializer, <32 x i16> <i16 0, i16 -127, i16 -128, i16 -32768, i16 65536, i16 255, i16 512, i16 512, i16 -1, i16 1, i16 2, i16 4, i16 8, i16 16, i16 32, i16 64, i16 0, i16 -127, i16 -128, i16 -32768, i16 65536, i16 255, i16 512, i16 512, i16 -1, i16 1, i16 2, i16 4, i16 8, i16 16, i16 32, i16 64>)
|
||||
ret <64 x i8> %1
|
||||
}
|
||||
|
||||
;
|
||||
; Demanded Elts
|
||||
;
|
||||
|
||||
define <8 x i16> @elts_packssdw_128(<4 x i32> %a0, <4 x i32> %a1) {
|
||||
; CHECK-LABEL: @elts_packssdw_128(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = call <8 x i16> @llvm.x86.sse2.packssdw.128(<4 x i32> %a0, <4 x i32> undef)
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = call <8 x i16> @llvm.x86.sse2.packssdw.128(<4 x i32> [[A0:%.*]], <4 x i32> undef)
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <8 x i16> [[TMP1]], <8 x i16> undef, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 undef, i32 undef, i32 undef, i32 undef>
|
||||
; CHECK-NEXT: ret <8 x i16> [[TMP2]]
|
||||
;
|
||||
|
@ -156,7 +220,7 @@ define <8 x i16> @elts_packssdw_128(<4 x i32> %a0, <4 x i32> %a1) {
|
|||
|
||||
define <8 x i16> @elts_packusdw_128(<4 x i32> %a0, <4 x i32> %a1) {
|
||||
; CHECK-LABEL: @elts_packusdw_128(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = call <8 x i16> @llvm.x86.sse41.packusdw(<4 x i32> %a0, <4 x i32> %a1)
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = call <8 x i16> @llvm.x86.sse41.packusdw(<4 x i32> [[A0:%.*]], <4 x i32> [[A1:%.*]])
|
||||
; CHECK-NEXT: ret <8 x i16> [[TMP1]]
|
||||
;
|
||||
%1 = insertelement <4 x i32> %a0, i32 0, i32 0
|
||||
|
@ -190,7 +254,7 @@ define <16 x i8> @elts_packuswb_128(<8 x i16> %a0, <8 x i16> %a1) {
|
|||
|
||||
define <16 x i16> @elts_packssdw_256(<8 x i32> %a0, <8 x i32> %a1) {
|
||||
; CHECK-LABEL: @elts_packssdw_256(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = call <16 x i16> @llvm.x86.avx2.packssdw(<8 x i32> %a0, <8 x i32> undef)
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = call <16 x i16> @llvm.x86.avx2.packssdw(<8 x i32> [[A0:%.*]], <8 x i32> undef)
|
||||
; CHECK-NEXT: ret <16 x i16> [[TMP1]]
|
||||
;
|
||||
%1 = shufflevector <8 x i32> %a0, <8 x i32> undef, <8 x i32> <i32 1, i32 0, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
|
||||
|
@ -202,7 +266,7 @@ define <16 x i16> @elts_packssdw_256(<8 x i32> %a0, <8 x i32> %a1) {
|
|||
|
||||
define <16 x i16> @elts_packusdw_256(<8 x i32> %a0, <8 x i32> %a1) {
|
||||
; CHECK-LABEL: @elts_packusdw_256(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> %a1, <8 x i32> undef, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[A1:%.*]], <8 x i32> undef, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = call <16 x i16> @llvm.x86.avx2.packusdw(<8 x i32> undef, <8 x i32> [[TMP1]])
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <16 x i16> [[TMP2]], <16 x i16> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef>
|
||||
; CHECK-NEXT: ret <16 x i16> [[TMP3]]
|
||||
|
@ -236,6 +300,56 @@ define <32 x i8> @elts_packuswb_256(<16 x i16> %a0, <16 x i16> %a1) {
|
|||
ret <32 x i8> %4
|
||||
}
|
||||
|
||||
define <32 x i16> @elts_packssdw_512(<16 x i32> %a0, <16 x i32> %a1) {
|
||||
; CHECK-LABEL: @elts_packssdw_512(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = call <32 x i16> @llvm.x86.avx512.packssdw.512(<16 x i32> [[A0:%.*]], <16 x i32> undef)
|
||||
; CHECK-NEXT: ret <32 x i16> [[TMP1]]
|
||||
;
|
||||
%1 = shufflevector <16 x i32> %a0, <16 x i32> undef, <16 x i32> <i32 1, i32 0, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 9, i32 8, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
|
||||
%2 = shufflevector <16 x i32> %a1, <16 x i32> undef, <16 x i32> <i32 undef, i32 2, i32 1, i32 undef, i32 undef, i32 6, i32 5, i32 undef, i32 undef, i32 10, i32 9, i32 undef, i32 undef, i32 14, i32 13, i32 undef>
|
||||
%3 = call <32 x i16> @llvm.x86.avx512.packssdw.512(<16 x i32> %1, <16 x i32> %2)
|
||||
%4 = shufflevector <32 x i16> %3, <32 x i16> undef, <32 x i32> <i32 undef, i32 undef, i32 2, i32 3, i32 4, i32 undef, i32 undef, i32 7, i32 8, i32 undef, i32 undef, i32 11, i32 12, i32 undef, i32 undef, i32 15, i32 undef, i32 undef, i32 18, i32 19, i32 20, i32 undef, i32 undef, i32 23, i32 24, i32 undef, i32 undef, i32 27, i32 28, i32 undef, i32 undef, i32 31>
|
||||
ret <32 x i16> %4
|
||||
}
|
||||
|
||||
define <32 x i16> @elts_packusdw_512(<16 x i32> %a0, <16 x i32> %a1) {
|
||||
; CHECK-LABEL: @elts_packusdw_512(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i32> [[A1:%.*]], <16 x i32> undef, <16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8>
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = call <32 x i16> @llvm.x86.avx512.packusdw.512(<16 x i32> undef, <16 x i32> [[TMP1]])
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <32 x i16> [[TMP2]], <32 x i16> undef, <32 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 20, i32 21, i32 22, i32 23, i32 undef, i32 undef, i32 undef, i32 undef, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef>
|
||||
; CHECK-NEXT: ret <32 x i16> [[TMP3]]
|
||||
;
|
||||
%1 = shufflevector <16 x i32> %a0, <16 x i32> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
|
||||
%2 = shufflevector <16 x i32> %a1, <16 x i32> undef, <16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8>
|
||||
%3 = call <32 x i16> @llvm.x86.avx512.packusdw.512(<16 x i32> %1, <16 x i32> %2)
|
||||
%4 = shufflevector <32 x i16> %3, <32 x i16> undef, <32 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 20, i32 21, i32 22, i32 23, i32 undef, i32 undef, i32 undef, i32 undef, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef>
|
||||
ret <32 x i16> %4
|
||||
}
|
||||
|
||||
define <64 x i8> @elts_packsswb_512(<32 x i16> %a0, <32 x i16> %a1) {
|
||||
; CHECK-LABEL: @elts_packsswb_512(
|
||||
; CHECK-NEXT: ret <64 x i8> zeroinitializer
|
||||
;
|
||||
%1 = insertelement <32 x i16> %a0, i16 0, i32 0
|
||||
%2 = insertelement <32 x i16> %a1, i16 0, i32 8
|
||||
%3 = insertelement <32 x i16> %1, i16 0, i32 16
|
||||
%4 = insertelement <32 x i16> %2, i16 0, i32 24
|
||||
%5 = call <64 x i8> @llvm.x86.avx512.packsswb.512(<32 x i16> %3, <32 x i16> %4)
|
||||
%6 = shufflevector <64 x i8> %5, <64 x i8> undef, <64 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 56, i32 56, i32 56, i32 56, i32 56, i32 56, i32 56, i32 56, i32 56, i32 56, i32 56, i32 56, i32 56, i32 56, i32 56, i32 56>
|
||||
ret <64 x i8> %6
|
||||
}
|
||||
|
||||
define <64 x i8> @elts_packuswb_512(<32 x i16> %a0, <32 x i16> %a1) {
|
||||
; CHECK-LABEL: @elts_packuswb_512(
|
||||
; CHECK-NEXT: ret <64 x i8> undef
|
||||
;
|
||||
%1 = insertelement <32 x i16> undef, i16 0, i32 1
|
||||
%2 = insertelement <32 x i16> undef, i16 0, i32 0
|
||||
%3 = call <64 x i8> @llvm.x86.avx512.packuswb.512(<32 x i16> %1, <32 x i16> %2)
|
||||
%4 = shufflevector <64 x i8> %3, <64 x i8> undef, <64 x i32> zeroinitializer
|
||||
ret <64 x i8> %4
|
||||
}
|
||||
|
||||
declare <8 x i16> @llvm.x86.sse2.packssdw.128(<4 x i32>, <4 x i32>) nounwind readnone
|
||||
declare <16 x i8> @llvm.x86.sse2.packsswb.128(<8 x i16>, <8 x i16>) nounwind readnone
|
||||
declare <16 x i8> @llvm.x86.sse2.packuswb.128(<8 x i16>, <8 x i16>) nounwind readnone
|
||||
|
@ -245,3 +359,8 @@ declare <16 x i16> @llvm.x86.avx2.packssdw(<8 x i32>, <8 x i32>) nounwind readno
|
|||
declare <16 x i16> @llvm.x86.avx2.packusdw(<8 x i32>, <8 x i32>) nounwind readnone
|
||||
declare <32 x i8> @llvm.x86.avx2.packsswb(<16 x i16>, <16 x i16>) nounwind readnone
|
||||
declare <32 x i8> @llvm.x86.avx2.packuswb(<16 x i16>, <16 x i16>) nounwind readnone
|
||||
|
||||
declare <32 x i16> @llvm.x86.avx512.packssdw.512(<16 x i32>, <16 x i32>) nounwind readnone
|
||||
declare <32 x i16> @llvm.x86.avx512.packusdw.512(<16 x i32>, <16 x i32>) nounwind readnone
|
||||
declare <64 x i8> @llvm.x86.avx512.packsswb.512(<32 x i16>, <32 x i16>) nounwind readnone
|
||||
declare <64 x i8> @llvm.x86.avx512.packuswb.512(<32 x i16>, <32 x i16>) nounwind readnone
|
||||
|
|
Loading…
Reference in New Issue