1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -verify-machineinstrs -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -run-pass=regallocfast -o - %s | FileCheck -check-prefix=GCN %s
3
4---
5name: self_loop_single_def_use
6tracksRegLiveness: true
7machineFunctionInfo:
8  isEntryFunction: true
9  scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3'
10  stackPtrOffsetReg: '$sgpr32'
11body:             |
12  ; GCN-LABEL: name: self_loop_single_def_use
13  ; GCN: bb.0:
14  ; GCN:   successors: %bb.1(0x80000000)
15  ; GCN:   liveins: $vgpr0_vgpr1
16  ; GCN:   SI_SPILL_V64_SAVE killed $vgpr0_vgpr1, %stack.0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, implicit $exec :: (store 8 into %stack.0, align 4, addrspace 5)
17  ; GCN: bb.1:
18  ; GCN:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
19  ; GCN:   $vgpr0_vgpr1 = SI_SPILL_V64_RESTORE %stack.0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, implicit $exec :: (load 8 from %stack.0, align 4, addrspace 5)
20  ; GCN:   renamable $vgpr2 = GLOBAL_LOAD_DWORD renamable $vgpr0_vgpr1, 0, 0, 0, 0, implicit $exec
21  ; GCN:   GLOBAL_STORE_DWORD killed renamable $vgpr0_vgpr1, killed renamable $vgpr2, 0, 0, 0, 0, implicit $exec
22  ; GCN:   S_CBRANCH_EXECZ %bb.1, implicit $exec
23  ; GCN: bb.2:
24  ; GCN:   S_ENDPGM 0
25  bb.0:
26    liveins: $vgpr0_vgpr1
27    %0:vreg_64 = COPY $vgpr0_vgpr1
28
29  bb.1:
30    %1:vgpr_32 = GLOBAL_LOAD_DWORD %0, 0, 0, 0, 0, implicit $exec
31    GLOBAL_STORE_DWORD %0, %1, 0, 0, 0, 0, implicit $exec
32    S_CBRANCH_EXECZ %bb.1, implicit $exec
33
34  bb.2:
35    S_ENDPGM 0
36
37...
38
39---
40name: self_loop_multi_def
41tracksRegLiveness: true
42machineFunctionInfo:
43  isEntryFunction: true
44  scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3'
45  stackPtrOffsetReg: '$sgpr32'
46body:             |
47  ; GCN-LABEL: name: self_loop_multi_def
48  ; GCN: bb.0:
49  ; GCN:   successors: %bb.1(0x80000000)
50  ; GCN:   liveins: $vgpr0_vgpr1
51  ; GCN:   SI_SPILL_V64_SAVE killed $vgpr0_vgpr1, %stack.0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, implicit $exec :: (store 8 into %stack.0, align 4, addrspace 5)
52  ; GCN: bb.1:
53  ; GCN:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
54  ; GCN:   $vgpr0_vgpr1 = SI_SPILL_V64_RESTORE %stack.0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, implicit $exec :: (load 8 from %stack.0, align 4, addrspace 5)
55  ; GCN:   renamable $vgpr2 = GLOBAL_LOAD_DWORD renamable $vgpr0_vgpr1, 0, 0, 0, 0, implicit $exec
56  ; GCN:   GLOBAL_STORE_DWORD renamable $vgpr0_vgpr1, killed renamable $vgpr2, 0, 0, 0, 0, implicit $exec
57  ; GCN:   renamable $vgpr2 = GLOBAL_LOAD_DWORD renamable $vgpr0_vgpr1, 0, 0, 0, 0, implicit $exec
58  ; GCN:   GLOBAL_STORE_DWORD killed renamable $vgpr0_vgpr1, killed renamable $vgpr2, 0, 0, 0, 0, implicit $exec
59  ; GCN:   S_CBRANCH_EXECZ %bb.1, implicit $exec
60  ; GCN: bb.2:
61  ; GCN:   S_ENDPGM 0
62  bb.0:
63    liveins: $vgpr0_vgpr1
64    %0:vreg_64 = COPY $vgpr0_vgpr1
65
66  bb.1:
67    %1:vgpr_32 = GLOBAL_LOAD_DWORD %0, 0, 0, 0, 0, implicit $exec
68    GLOBAL_STORE_DWORD %0, %1, 0, 0, 0, 0, implicit $exec
69    %1:vgpr_32 = GLOBAL_LOAD_DWORD %0, 0, 0, 0, 0, implicit $exec
70    GLOBAL_STORE_DWORD %0, %1, 0, 0, 0, 0, implicit $exec
71    S_CBRANCH_EXECZ %bb.1, implicit $exec
72
73  bb.2:
74    S_ENDPGM 0
75
76...
77
78# There's a single def inside the self loop, but it's also a use.
79
80---
81name: self_loop_def_use_same_inst
82tracksRegLiveness: true
83machineFunctionInfo:
84  isEntryFunction: true
85  scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3'
86  stackPtrOffsetReg: '$sgpr32'
87body:             |
88  ; GCN-LABEL: name: self_loop_def_use_same_inst
89  ; GCN: bb.0:
90  ; GCN:   successors: %bb.1(0x80000000)
91  ; GCN:   liveins: $vgpr0_vgpr1
92  ; GCN:   SI_SPILL_V64_SAVE killed $vgpr0_vgpr1, %stack.0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, implicit $exec :: (store 8 into %stack.0, align 4, addrspace 5)
93  ; GCN: bb.1:
94  ; GCN:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
95  ; GCN:   renamable $vgpr0 = V_ADD_U32_e32 1, undef $vgpr0, implicit $exec
96  ; GCN:   $vgpr1_vgpr2 = SI_SPILL_V64_RESTORE %stack.0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, implicit $exec :: (load 8 from %stack.0, align 4, addrspace 5)
97  ; GCN:   GLOBAL_STORE_DWORD killed renamable $vgpr1_vgpr2, killed renamable $vgpr0, 0, 0, 0, 0, implicit $exec
98  ; GCN:   S_CBRANCH_EXECZ %bb.1, implicit $exec
99  ; GCN: bb.2:
100  ; GCN:   S_ENDPGM 0
101  bb.0:
102    liveins: $vgpr0_vgpr1
103    %0:vreg_64 = COPY $vgpr0_vgpr1
104
105  bb.1:
106    %1:vgpr_32 = V_ADD_U32_e32 1, undef %1, implicit $exec
107    GLOBAL_STORE_DWORD %0, %1, 0, 0, 0, 0, implicit $exec
108    S_CBRANCH_EXECZ %bb.1, implicit $exec
109
110  bb.2:
111    S_ENDPGM 0
112
113...
114
115---
116name: self_loop_def_after_use
117tracksRegLiveness: true
118machineFunctionInfo:
119  isEntryFunction: true
120  scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3'
121  stackPtrOffsetReg: '$sgpr32'
122body:             |
123  ; GCN-LABEL: name: self_loop_def_after_use
124  ; GCN: bb.0:
125  ; GCN:   successors: %bb.1(0x80000000)
126  ; GCN:   liveins: $vgpr0_vgpr1
127  ; GCN:   SI_SPILL_V64_SAVE killed $vgpr0_vgpr1, %stack.0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, implicit $exec :: (store 8 into %stack.0, align 4, addrspace 5)
128  ; GCN: bb.1:
129  ; GCN:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
130  ; GCN:   $vgpr0_vgpr1 = SI_SPILL_V64_RESTORE %stack.0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, implicit $exec :: (load 8 from %stack.0, align 4, addrspace 5)
131  ; GCN:   GLOBAL_STORE_DWORD killed renamable $vgpr0_vgpr1, undef renamable $vgpr0, 0, 0, 0, 0, implicit $exec
132  ; GCN:   renamable $vgpr2 = V_ADD_U32_e64 1, 1, 0, implicit $exec
133  ; GCN:   SI_SPILL_V32_SAVE killed $vgpr2, %stack.1, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, implicit $exec :: (store 4 into %stack.1, addrspace 5)
134  ; GCN:   S_CBRANCH_EXECZ %bb.1, implicit $exec
135  ; GCN: bb.2:
136  ; GCN:   S_ENDPGM 0
137  bb.0:
138    liveins: $vgpr0_vgpr1
139    %0:vreg_64 = COPY $vgpr0_vgpr1
140
141  bb.1:
142    GLOBAL_STORE_DWORD %0, undef %1, 0, 0, 0, 0, implicit $exec
143    %1:vgpr_32 = V_ADD_U32_e64 1, 1, 0, implicit $exec
144    S_CBRANCH_EXECZ %bb.1, implicit $exec
145
146  bb.2:
147    S_ENDPGM 0
148
149...
150
151---
152name: self_loop_single_subreg_def_use
153tracksRegLiveness: true
154machineFunctionInfo:
155  isEntryFunction: true
156  scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3'
157  stackPtrOffsetReg: '$sgpr32'
158body:             |
159  ; GCN-LABEL: name: self_loop_single_subreg_def_use
160  ; GCN: bb.0:
161  ; GCN:   successors: %bb.1(0x80000000)
162  ; GCN:   liveins: $vgpr0_vgpr1
163  ; GCN:   SI_SPILL_V64_SAVE killed $vgpr0_vgpr1, %stack.0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, implicit $exec :: (store 8 into %stack.0, align 4, addrspace 5)
164  ; GCN: bb.1:
165  ; GCN:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
166  ; GCN:   $vgpr0_vgpr1 = SI_SPILL_V64_RESTORE %stack.0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, implicit $exec :: (load 8 from %stack.0, align 4, addrspace 5)
167  ; GCN:   undef renamable $vgpr3 = GLOBAL_LOAD_DWORD renamable $vgpr0_vgpr1, 0, 0, 0, 0, implicit $exec, implicit-def $vgpr2_vgpr3
168  ; GCN:   GLOBAL_STORE_DWORD killed renamable $vgpr0_vgpr1, undef renamable $vgpr3, 0, 0, 0, 0, implicit $exec
169  ; GCN:   SI_SPILL_V64_SAVE killed $vgpr2_vgpr3, %stack.1, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr32, 0, implicit $exec :: (store 8 into %stack.1, align 4, addrspace 5)
170  ; GCN:   S_CBRANCH_EXECZ %bb.1, implicit $exec
171  ; GCN: bb.2:
172  ; GCN:   S_ENDPGM 0
173  bb.0:
174    liveins: $vgpr0_vgpr1
175    %0:vreg_64 = COPY $vgpr0_vgpr1
176
177  bb.1:
178    undef %1.sub1:vreg_64 = GLOBAL_LOAD_DWORD %0, 0, 0, 0, 0, implicit $exec
179    GLOBAL_STORE_DWORD %0, undef %1.sub1, 0, 0, 0, 0, implicit $exec
180    S_CBRANCH_EXECZ %bb.1, implicit $exec
181
182  bb.2:
183    S_ENDPGM 0
184
185...
186