[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / spill-scavenge-offset.ll
blob1bb7d8f1a4dd5038d1da519777f6243ce22426d0
1 ; RUN: llc -march=amdgcn -mcpu=verde -enable-misched=0 -post-RA-scheduler=0 -amdgpu-spill-sgpr-to-vgpr=0 < %s | FileCheck -check-prefixes=CHECK,GFX6 %s
2 ; RUN: llc -sgpr-regalloc=basic -vgpr-regalloc=basic -march=amdgcn -mcpu=tonga -enable-misched=0 -post-RA-scheduler=0 -amdgpu-spill-sgpr-to-vgpr=0 < %s | FileCheck --check-prefix=CHECK %s
3 ; RUN: llc -march=amdgcn -mattr=-xnack -mcpu=gfx900 -enable-misched=0 -post-RA-scheduler=0 -amdgpu-spill-sgpr-to-vgpr=0 -amdgpu-enable-flat-scratch < %s | FileCheck -check-prefixes=CHECK,GFX9-FLATSCR,FLATSCR %s
4 ; RUN: llc -march=amdgcn -mcpu=gfx1030 -enable-misched=0 -post-RA-scheduler=0 -amdgpu-spill-sgpr-to-vgpr=0 -amdgpu-enable-flat-scratch < %s | FileCheck -check-prefixes=CHECK,GFX10-FLATSCR,FLATSCR %s
6 ; There is something about Tonga that causes this test to spend a lot of time
7 ; in the default register allocator.
10 ; When the offset of VGPR spills into scratch space gets too large, an additional SGPR
11 ; is used to calculate the scratch load/store address. Make sure that this
12 ; mechanism works even when many spills happen.
14 ; Just test that it compiles successfully.
15 ; CHECK-LABEL: test
17 ; GFX9-FLATSCR: s_mov_b32 [[SOFF1:s[0-9]+]], 4{{$}}
18 ; GFX9-FLATSCR: scratch_store_dwordx4 off, v[{{[0-9:]+}}], [[SOFF1]] ; 16-byte Folded Spill
19 ; GFX9-FLATSCR: ;;#ASMSTART
20 ; GFX9-FLATSCR: s_movk_i32 [[SOFF2:s[0-9]+]], 0x1{{[0-9a-f]+}}{{$}}
21 ; GFX9-FLATSCR: scratch_load_dwordx4 v[{{[0-9:]+}}], off, [[SOFF2]] ; 16-byte Folded Reload
23 ; GFX10-FLATSCR: scratch_store_dwordx4 off, v[{{[0-9:]+}}], off offset:{{[0-9]+}} ; 16-byte Folded Spill
24 ; GFX10-FLATSCR: scratch_load_dwordx4 v[{{[0-9:]+}}], off, off offset:{{[0-9]+}} ; 16-byte Folded Reload
25 define amdgpu_kernel void @test(<1280 x i32> addrspace(1)* %out, <1280 x i32> addrspace(1)* %in) {
26 entry:
27   %lo = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0)
28   %tid = call i32 @llvm.amdgcn.mbcnt.hi(i32 -1, i32 %lo)
30   %aptr = getelementptr <1280 x i32>, <1280 x i32> addrspace(1)* %in, i32 %tid
31   %a = load <1280 x i32>, <1280 x i32> addrspace(1)* %aptr
33 ; mark most VGPR registers as used to increase register pressure
34   call void asm sideeffect "", "~{v4},~{v8},~{v12},~{v16},~{v20},~{v24},~{v28},~{v32}" ()
35   call void asm sideeffect "", "~{v36},~{v40},~{v44},~{v48},~{v52},~{v56},~{v60},~{v64}" ()
36   call void asm sideeffect "", "~{v68},~{v72},~{v76},~{v80},~{v84},~{v88},~{v92},~{v96}" ()
37   call void asm sideeffect "", "~{v100},~{v104},~{v108},~{v112},~{v116},~{v120},~{v124},~{v128}" ()
38   call void asm sideeffect "", "~{v132},~{v136},~{v140},~{v144},~{v148},~{v152},~{v156},~{v160}" ()
39   call void asm sideeffect "", "~{v164},~{v168},~{v172},~{v176},~{v180},~{v184},~{v188},~{v192}" ()
40   call void asm sideeffect "", "~{v196},~{v200},~{v204},~{v208},~{v212},~{v216},~{v220},~{v224}" ()
42   %outptr = getelementptr <1280 x i32>, <1280 x i32> addrspace(1)* %out, i32 %tid
43   store <1280 x i32> %a, <1280 x i32> addrspace(1)* %outptr
45   ret void
48 ; CHECK-LABEL: test_limited_sgpr
49 ; GFX6: s_add_i32 s32, s32, 0x[[OFFSET:[0-9a-f]+]]
50 ; GFX6: s_add_i32 s32, s32, 0x[[OFFSET:[0-9a-f]+]]
51 ; GFX6: s_add_i32 s32, s32, 0x[[OFFSET:[0-9a-f]+]]
52 ; GFX6-NEXT: s_waitcnt expcnt(0)
53 ; GFX6-NEXT: buffer_load_dword v{{[0-9]+}}, off, s[{{[0-9:]+}}], s32
54 ; GFX6-NEXT: s_add_i32 s32, s32, 0x[[OFFSET:[0-9a-f]+]]
55 ; GFX6: NumSgprs: 48
56 ; GFX6: ScratchSize: 8608
58 ; FLATSCR:           s_movk_i32 [[SOFF1:s[0-9]+]], 0x
59 ; GFX9-FLATSCR-NEXT: s_waitcnt vmcnt(0)
60 ; FLATSCR-NEXT:      scratch_store_dwordx4 off, v[{{[0-9:]+}}], [[SOFF1]] ; 16-byte Folded Spill
61 ; FLATSCR:           s_movk_i32 [[SOFF2:s[0-9]+]], 0x
62 ; FLATSCR:           scratch_load_dwordx4 v[{{[0-9:]+}}], off, [[SOFF2]] ; 16-byte Folded Reload
63 define amdgpu_kernel void @test_limited_sgpr(<64 x i32> addrspace(1)* %out, <64 x i32> addrspace(1)* %in) #0 {
64 entry:
65   %lo = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0)
66   %tid = call i32 @llvm.amdgcn.mbcnt.hi(i32 -1, i32 %lo)
68 ; allocate enough scratch to go beyond 2^12 addressing
69   %scratch = alloca <1280 x i32>, align 8, addrspace(5)
71 ; load VGPR data
72   %aptr = getelementptr <64 x i32>, <64 x i32> addrspace(1)* %in, i32 %tid
73   %a = load <64 x i32>, <64 x i32> addrspace(1)* %aptr
75 ; make sure scratch is used
76   %x = extractelement <64 x i32> %a, i32 0
77   %sptr0 = getelementptr <1280 x i32>, <1280 x i32> addrspace(5)* %scratch, i32 %x, i32 0
78   store i32 1, i32 addrspace(5)* %sptr0
80 ; fill up SGPRs
81   %sgpr0 = call <8 x i32> asm sideeffect "; def $0", "=s" ()
82   %sgpr1 = call <8 x i32> asm sideeffect "; def $0", "=s" ()
83   %sgpr2 = call <8 x i32> asm sideeffect "; def $0", "=s" ()
84   %sgpr3 = call <8 x i32> asm sideeffect "; def $0", "=s" ()
85   %sgpr4 = call <4 x i32> asm sideeffect "; def $0", "=s" ()
86   %sgpr5 = call <2 x i32> asm sideeffect "; def $0", "=s" ()
87   %sgpr6 = call <2 x i32> asm sideeffect "; def $0", "=s" ()
88   %sgpr7 = call i32 asm sideeffect "; def $0", "=s" ()
90   %cmp = icmp eq i32 %x, 0
91   br i1 %cmp, label %bb0, label %ret
93 bb0:
94 ; create SGPR pressure
95   call void asm sideeffect "; use $0,$1,$2,$3,$4,$5,$6", "s,s,s,s,s,s,s,s"(<8 x i32> %sgpr0, <8 x i32> %sgpr1, <8 x i32> %sgpr2, <8 x i32> %sgpr3, <4 x i32> %sgpr4, <2 x i32> %sgpr5, <2 x i32> %sgpr6, i32 %sgpr7)
97 ; mark most VGPR registers as used to increase register pressure
98   call void asm sideeffect "", "~{v4},~{v8},~{v12},~{v16},~{v20},~{v24},~{v28},~{v32}" ()
99   call void asm sideeffect "", "~{v36},~{v40},~{v44},~{v48},~{v52},~{v56},~{v60},~{v64}" ()
100   call void asm sideeffect "", "~{v68},~{v72},~{v76},~{v80},~{v84},~{v88},~{v92},~{v96}" ()
101   call void asm sideeffect "", "~{v100},~{v104},~{v108},~{v112},~{v116},~{v120},~{v124},~{v128}" ()
102   call void asm sideeffect "", "~{v132},~{v136},~{v140},~{v144},~{v148},~{v152},~{v156},~{v160}" ()
103   call void asm sideeffect "", "~{v164},~{v168},~{v172},~{v176},~{v180},~{v184},~{v188},~{v192}" ()
104   call void asm sideeffect "", "~{v196},~{v200},~{v204},~{v208},~{v212},~{v216},~{v220},~{v224}" ()
105   br label %ret
107 ret:
108   %outptr = getelementptr <64 x i32>, <64 x i32> addrspace(1)* %out, i32 %tid
109   store <64 x i32> %a, <64 x i32> addrspace(1)* %outptr
111   ret void
114 declare i32 @llvm.amdgcn.mbcnt.lo(i32, i32) #1
115 declare i32 @llvm.amdgcn.mbcnt.hi(i32, i32) #1
117 attributes #0 = { "amdgpu-waves-per-eu"="10,10" }
118 attributes #1 = { nounwind readnone }