mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 12:19:53 +00:00
[AVX-512][InstCombine] Teach InstCombine to optimize 512-bit packss/packus intrinsics like it does 128/256-bit.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295294 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
fdf5214704
commit
4c2f2e48dc
@ -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
Block a user