[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / pr29112.ll
blobb099e0c39940438f593d119b269e924b82b31790
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512f | FileCheck %s
4 declare <4 x float> @foo(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>)
6 ; Due to a bug in X86RegisterInfo::getLargestLegalSuperClass this test case was trying to use XMM16 and spill it without VLX support for the necessary store instruction. We briefly implemented the spill using VEXTRACTF32X4, but the bug in getLargestLegalSuperClass has now been fixed so we no longer use XMM16.
8 define <4 x float> @bar(ptr %a1p, ptr %a2p, <4 x float> %a3, <4 x float> %a4, <16 x float>%c1, <16 x float>%c2) {
9 ; CHECK-LABEL: bar:
10 ; CHECK:       # %bb.0:
11 ; CHECK-NEXT:    subq $136, %rsp
12 ; CHECK-NEXT:    .cfi_def_cfa_offset 144
13 ; CHECK-NEXT:    vmovaps %xmm1, %xmm13
14 ; CHECK-NEXT:    vmovaps {{.*#+}} xmm5 = [3,20,1,17]
15 ; CHECK-NEXT:    vpermi2ps %zmm3, %zmm2, %zmm5
16 ; CHECK-NEXT:    vunpcklps {{.*#+}} ymm0 = ymm2[0],ymm3[0],ymm2[1],ymm3[1],ymm2[4],ymm3[4],ymm2[5],ymm3[5]
17 ; CHECK-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[2,1,2,3]
18 ; CHECK-NEXT:    vmovaps {{.*#+}} ymm0 = [4,21,1,17,4,21,5,21]
19 ; CHECK-NEXT:    vpermi2ps %zmm3, %zmm2, %zmm0
20 ; CHECK-NEXT:    vmovaps %zmm0, %zmm6
21 ; CHECK-NEXT:    vmovups %zmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
22 ; CHECK-NEXT:    vmovaps {{.*#+}} xmm4 = [4,20,1,27]
23 ; CHECK-NEXT:    vpermi2ps %zmm3, %zmm2, %zmm4
24 ; CHECK-NEXT:    vmovaps {{.*#+}} ymm7 = [5,20,1,19,5,20,5,23]
25 ; CHECK-NEXT:    vpermi2ps %zmm3, %zmm2, %zmm7
26 ; CHECK-NEXT:    vmovaps {{.*#+}} ymm0 = [4,20,1,19,4,20,5,23]
27 ; CHECK-NEXT:    vpermi2ps %zmm3, %zmm2, %zmm0
28 ; CHECK-NEXT:    vmovaps {{.*#+}} xmm12 = [4,28,1,17]
29 ; CHECK-NEXT:    vpermi2ps %zmm3, %zmm2, %zmm12
30 ; CHECK-NEXT:    vmovaps {{.*#+}} ymm8 = [5,20,1,17,5,20,5,21]
31 ; CHECK-NEXT:    vpermi2ps %zmm3, %zmm2, %zmm8
32 ; CHECK-NEXT:    vmovaps {{.*#+}} xmm9 = [4,30,1,22]
33 ; CHECK-NEXT:    vpermi2ps %zmm3, %zmm2, %zmm9
34 ; CHECK-NEXT:    vmovaps {{.*#+}} ymm10 = [4,22,1,17,4,22,5,21]
35 ; CHECK-NEXT:    vpermi2ps %zmm3, %zmm2, %zmm10
36 ; CHECK-NEXT:    vmovaps {{.*#+}} ymm11 = [4,20,3,18,4,20,7,22]
37 ; CHECK-NEXT:    vpermi2ps %zmm3, %zmm2, %zmm11
38 ; CHECK-NEXT:    vaddps %xmm10, %xmm11, %xmm2
39 ; CHECK-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
40 ; CHECK-NEXT:    vaddps %xmm1, %xmm9, %xmm3
41 ; CHECK-NEXT:    vaddps %xmm12, %xmm8, %xmm9
42 ; CHECK-NEXT:    vaddps %xmm1, %xmm1, %xmm8
43 ; CHECK-NEXT:    vaddps %xmm0, %xmm10, %xmm0
44 ; CHECK-NEXT:    vaddps %xmm0, %xmm9, %xmm0
45 ; CHECK-NEXT:    vaddps %xmm0, %xmm1, %xmm0
46 ; CHECK-NEXT:    vmovaps %xmm8, {{[0-9]+}}(%rsp)
47 ; CHECK-NEXT:    vmovaps %xmm3, (%rsp)
48 ; CHECK-NEXT:    # kill: def $xmm1 killed $xmm1 killed $ymm1
49 ; CHECK-NEXT:    vmovaps %xmm13, %xmm3
50 ; CHECK-NEXT:    # kill: def $xmm4 killed $xmm4 killed $zmm4
51 ; CHECK-NEXT:    # kill: def $xmm5 killed $xmm5 killed $zmm5
52 ; CHECK-NEXT:    # kill: def $xmm6 killed $xmm6 killed $zmm6
53 ; CHECK-NEXT:    # kill: def $xmm7 killed $xmm7 killed $zmm7
54 ; CHECK-NEXT:    vzeroupper
55 ; CHECK-NEXT:    callq foo@PLT
56 ; CHECK-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm1 # 64-byte Reload
57 ; CHECK-NEXT:    vaddps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
58 ; CHECK-NEXT:    vaddps %xmm0, %xmm1, %xmm0
59 ; CHECK-NEXT:    addq $136, %rsp
60 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
61 ; CHECK-NEXT:    vzeroupper
62 ; CHECK-NEXT:    retq
63   %a1 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 4, i32 20, i32 1, i32 17>
64   %a2 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 4, i32 21, i32 1, i32 17>
65   %a5 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 4, i32 20, i32 1, i32 27>
66   %a6 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 3, i32 20, i32 1, i32 17>
67   %a7 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 4, i32 21, i32 1, i32 17>
68   %a8 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 5, i32 20, i32 1, i32 19>
69   %a9 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 4, i32 20, i32 1, i32 17>
70   %a10 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 4, i32 20, i32 1, i32 17>
71   %ax2 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 4, i32 20, i32 1, i32 19>
72   %ax5 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 4, i32 20, i32 1, i32 17>
73   %ax6 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 4, i32 22, i32 1, i32 18>
74   %ax7 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 1, i32 20, i32 1, i32 17>
75   %ax8 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 4, i32 20, i32 1, i32 19>
76   %ax9 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 4, i32 20, i32 1, i32 17>
77   %ax10 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 4, i32 20, i32 1, i32 17>
78   %ay2 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 4, i32 20, i32 1, i32 17>
79   %ay5 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 4, i32 28, i32 1, i32 17>
80   %ay6 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 5, i32 20, i32 1, i32 17>
81   %ay7 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 4, i32 30, i32 1, i32 22>
82   %ay8 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 4, i32 20, i32 1, i32 17>
83   %ay9 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 4, i32 22, i32 1, i32 17>
84   %ay10 = shufflevector <16 x float>%c1, <16 x float>%c2, <4 x i32> <i32 4, i32 20, i32 3, i32 18>
86   %r1 = fadd <4 x float> %ay10, %ay9
87   %r2 = fadd <4 x float> %ay8, %ay7
88   %r3 = fadd <4 x float> %ay6, %ay5
89   %r4 = fadd <4 x float> %ay2, %ax10
90   %r5 = fadd <4 x float> %ay9, %ax8
91   %r6 = fadd <4 x float> %r5, %r3
92   %r7 = fadd <4 x float> %a9, %r6
93   %a11 = call <4 x float> @foo(<4 x float> %r7, <4 x float> %a10, <4 x float> %r1, <4 x float> %a4, <4 x float> %a5, <4 x float> %a6, <4 x float> %a7, <4 x float> %a8, <4 x float> %r2, <4 x float> %r4)
94   %a12 = fadd <4 x float> %a2, %a1
95   %a13 = fadd <4 x float> %a12, %a11
97   ret <4 x float> %a13