1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs -run-pass=prologepilog %s -o - | FileCheck -check-prefix=CHECK %s
3
4---
5name: spill_v32
6tracksRegLiveness: true
7stack:
8  - { id: 0, type: spill-slot, size: 4, alignment: 4 }
9machineFunctionInfo:
10  scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3'
11  stackPtrOffsetReg: '$sgpr32'
12  frameOffsetReg: '$sgpr33'
13body:             |
14  bb.0:
15    liveins: $vgpr0
16
17    ; CHECK-LABEL: name: spill_v32
18    ; CHECK: liveins: $vgpr0
19    ; CHECK-NEXT: {{  $}}
20    ; CHECK-NEXT: BUFFER_STORE_DWORD_OFFSET $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, 0, 0, 0, implicit $exec :: (store (s32) into %stack.0, addrspace 5)
21    ; CHECK-NEXT: S_NOP 0, implicit $vgpr0
22    SI_SPILL_V32_SAVE $vgpr0, %stack.0, $sgpr32, 0, implicit $exec :: (store (s32) into %stack.0, addrspace 5)
23    S_NOP 0, implicit $vgpr0
24...
25
26---
27name: spill_v32_kill
28tracksRegLiveness: true
29stack:
30  - { id: 0, type: spill-slot, size: 4, alignment: 4 }
31machineFunctionInfo:
32  scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3'
33  stackPtrOffsetReg: '$sgpr32'
34  frameOffsetReg: '$sgpr33'
35body:             |
36  bb.0:
37    liveins: $vgpr0
38
39    ; CHECK-LABEL: name: spill_v32_kill
40    ; CHECK: liveins: $vgpr0
41    ; CHECK-NEXT: {{  $}}
42    ; CHECK-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, 0, 0, 0, implicit $exec :: (store (s32) into %stack.0, addrspace 5)
43    SI_SPILL_V32_SAVE killed $vgpr0, %stack.0, $sgpr32, 0, implicit $exec :: (store (s32) into %stack.0, addrspace 5)
44...
45
46---
47name: spill_v64
48tracksRegLiveness: true
49stack:
50  - { id: 0, type: spill-slot, size: 8, alignment: 4 }
51machineFunctionInfo:
52  scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3'
53  stackPtrOffsetReg: '$sgpr32'
54  frameOffsetReg: '$sgpr33'
55body:             |
56  bb.0:
57    liveins: $vgpr0_vgpr1
58
59    ; CHECK-LABEL: name: spill_v64
60    ; CHECK: liveins: $vgpr0_vgpr1
61    ; CHECK-NEXT: {{  $}}
62    ; CHECK-NEXT: BUFFER_STORE_DWORD_OFFSET $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, 0, 0, 0, implicit $exec, implicit-def $vgpr0_vgpr1, implicit $vgpr0_vgpr1 :: (store (s32) into %stack.0, addrspace 5)
63    ; CHECK-NEXT: BUFFER_STORE_DWORD_OFFSET $vgpr1, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 4, 0, 0, 0, implicit $exec, implicit $vgpr0_vgpr1 :: (store (s32) into %stack.0 + 4, addrspace 5)
64    ; CHECK-NEXT: S_NOP 0, implicit $vgpr0_vgpr1
65    SI_SPILL_V64_SAVE $vgpr0_vgpr1, %stack.0, $sgpr32, 0, implicit $exec :: (store (s64) into %stack.0, addrspace 5)
66    S_NOP 0, implicit $vgpr0_vgpr1
67...
68
69---
70name: spill_v64_kill
71tracksRegLiveness: true
72stack:
73  - { id: 0, type: spill-slot, size: 8, alignment: 4 }
74machineFunctionInfo:
75  scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3'
76  stackPtrOffsetReg: '$sgpr32'
77  frameOffsetReg: '$sgpr33'
78body:             |
79  bb.0:
80    liveins: $vgpr0_vgpr1
81
82    ; CHECK-LABEL: name: spill_v64_kill
83    ; CHECK: liveins: $vgpr0_vgpr1
84    ; CHECK-NEXT: {{  $}}
85    ; CHECK-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, 0, 0, 0, implicit $exec, implicit-def $vgpr0_vgpr1, implicit $vgpr0_vgpr1 :: (store (s32) into %stack.0, addrspace 5)
86    ; CHECK-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr1, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 4, 0, 0, 0, implicit $exec, implicit killed $vgpr0_vgpr1 :: (store (s32) into %stack.0 + 4, addrspace 5)
87    SI_SPILL_V64_SAVE killed $vgpr0_vgpr1, %stack.0, $sgpr32, 0, implicit $exec :: (store (s64) into %stack.0, addrspace 5)
88...
89
90# Make sure there's no verifier error on the undef spill component when the value is killed.
91
92---
93name: spill_v64_undef_sub1_killed
94tracksRegLiveness: true
95stack:
96  - { id: 0, type: spill-slot, size: 8, alignment: 4 }
97machineFunctionInfo:
98  scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3'
99  stackPtrOffsetReg: '$sgpr32'
100  frameOffsetReg: '$sgpr33'
101body:             |
102  bb.0:
103    liveins: $vgpr0
104
105    ; CHECK-LABEL: name: spill_v64_undef_sub1_killed
106    ; CHECK: liveins: $vgpr0
107    ; CHECK-NEXT: {{  $}}
108    ; CHECK-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, 0, 0, 0, implicit $exec, implicit-def $vgpr0_vgpr1, implicit $vgpr0_vgpr1 :: (store (s32) into %stack.0, addrspace 5)
109    ; CHECK-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr1, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 4, 0, 0, 0, implicit $exec, implicit killed $vgpr0_vgpr1 :: (store (s32) into %stack.0 + 4, addrspace 5)
110    SI_SPILL_V64_SAVE killed $vgpr0_vgpr1, %stack.0, $sgpr32, 0, implicit $exec :: (store (s64) into %stack.0, addrspace 5)
111...
112
113---
114name: spill_v64_undef_sub0_killed
115tracksRegLiveness: true
116stack:
117  - { id: 0, type: spill-slot, size: 8, alignment: 4 }
118machineFunctionInfo:
119  scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3'
120  stackPtrOffsetReg: '$sgpr32'
121  frameOffsetReg: '$sgpr33'
122body:             |
123  bb.0:
124    liveins: $vgpr1
125
126    ; CHECK-LABEL: name: spill_v64_undef_sub0_killed
127    ; CHECK: liveins: $vgpr1
128    ; CHECK-NEXT: {{  $}}
129    ; CHECK-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, 0, 0, 0, implicit $exec, implicit-def $vgpr0_vgpr1, implicit $vgpr0_vgpr1 :: (store (s32) into %stack.0, addrspace 5)
130    ; CHECK-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr1, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 4, 0, 0, 0, implicit $exec, implicit killed $vgpr0_vgpr1 :: (store (s32) into %stack.0 + 4, addrspace 5)
131    SI_SPILL_V64_SAVE killed $vgpr0_vgpr1, %stack.0, $sgpr32, 0, implicit $exec :: (store (s64) into %stack.0, addrspace 5)
132...
133
134---
135name: spill_v128_kill
136tracksRegLiveness: true
137stack:
138  - { id: 0, type: spill-slot, size: 16, alignment: 4 }
139machineFunctionInfo:
140  scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3'
141  stackPtrOffsetReg: '$sgpr32'
142  frameOffsetReg: '$sgpr33'
143body:             |
144  bb.0:
145    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
146
147    ; CHECK-LABEL: name: spill_v128_kill
148    ; CHECK: liveins: $vgpr0_vgpr1_vgpr2_vgpr3
149    ; CHECK-NEXT: {{  $}}
150    ; CHECK-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, 0, 0, 0, implicit $exec, implicit-def $vgpr0_vgpr1_vgpr2_vgpr3, implicit $vgpr0_vgpr1_vgpr2_vgpr3 :: (store (s32) into %stack.0, addrspace 5)
151    ; CHECK-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr1, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 4, 0, 0, 0, implicit $exec, implicit $vgpr0_vgpr1_vgpr2_vgpr3 :: (store (s32) into %stack.0 + 4, addrspace 5)
152    ; CHECK-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr2, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 8, 0, 0, 0, implicit $exec, implicit $vgpr0_vgpr1_vgpr2_vgpr3 :: (store (s32) into %stack.0 + 8, addrspace 5)
153    ; CHECK-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr3, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 12, 0, 0, 0, implicit $exec, implicit killed $vgpr0_vgpr1_vgpr2_vgpr3 :: (store (s32) into %stack.0 + 12, addrspace 5)
154    SI_SPILL_V128_SAVE killed $vgpr0_vgpr1_vgpr2_vgpr3, %stack.0, $sgpr32, 0, implicit $exec :: (store (s128) into %stack.0, addrspace 5)
155...
156