1 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1030 < %s | FileCheck %s
3 ; Previously, this would hit an assertion on incompatible comparison between
4 ; APInts due to BitWidth differences. This was due to assignment of DenseMap
5 ; value using another value within that same DenseMap which results in a
6 ; use-after-free if the assignment operator invokes a DenseMap growth.
9 ; CHECK: .set I_Quit.num_vgpr, max(41, amdgpu.max_num_vgpr)
10 ; CHECK: .set I_Quit.num_agpr, max(0, amdgpu.max_num_agpr)
11 ; CHECK: .set I_Quit.numbered_sgpr, max(48, amdgpu.max_num_sgpr)
12 ; CHECK: .set I_Quit.private_seg_size, 16
13 ; CHECK: .set I_Quit.uses_vcc, 1
14 ; CHECK: .set I_Quit.uses_flat_scratch, 1
15 ; CHECK: .set I_Quit.has_dyn_sized_stack, 1
16 ; CHECK: .set I_Quit.has_recursion, 1
17 ; CHECK: .set I_Quit.has_indirect_call, 1
18 define void @I_Quit() {
19 %fptr = load ptr, ptr null, align 8
20 tail call void %fptr()
24 ; CHECK-LABEL: P_RemoveMobj:
25 ; CHECK: .set P_RemoveMobj.num_vgpr, 0
26 ; CHECK: .set P_RemoveMobj.num_agpr, 0
27 ; CHECK: .set P_RemoveMobj.numbered_sgpr, 32
28 ; CHECK: .set P_RemoveMobj.private_seg_size, 0
29 ; CHECK: .set P_RemoveMobj.uses_vcc, 0
30 ; CHECK: .set P_RemoveMobj.uses_flat_scratch, 0
31 ; CHECK: .set P_RemoveMobj.has_dyn_sized_stack, 0
32 ; CHECK: .set P_RemoveMobj.has_recursion, 0
33 ; CHECK: .set P_RemoveMobj.has_indirect_call, 0
34 define void @P_RemoveMobj() {
38 ; CHECK-LABEL: P_SpawnMobj:
39 ; CHECK: .set P_SpawnMobj.num_vgpr, 0
40 ; CHECK: .set P_SpawnMobj.num_agpr, 0
41 ; CHECK: .set P_SpawnMobj.numbered_sgpr, 32
42 ; CHECK: .set P_SpawnMobj.private_seg_size, 0
43 ; CHECK: .set P_SpawnMobj.uses_vcc, 0
44 ; CHECK: .set P_SpawnMobj.uses_flat_scratch, 0
45 ; CHECK: .set P_SpawnMobj.has_dyn_sized_stack, 0
46 ; CHECK: .set P_SpawnMobj.has_recursion, 0
47 ; CHECK: .set P_SpawnMobj.has_indirect_call, 0
48 define void @P_SpawnMobj() {
52 ; CHECK-LABEL: G_PlayerReborn:
53 ; CHECK: .set G_PlayerReborn.num_vgpr, 0
54 ; CHECK: .set G_PlayerReborn.num_agpr, 0
55 ; CHECK: .set G_PlayerReborn.numbered_sgpr, 32
56 ; CHECK: .set G_PlayerReborn.private_seg_size, 0
57 ; CHECK: .set G_PlayerReborn.uses_vcc, 0
58 ; CHECK: .set G_PlayerReborn.uses_flat_scratch, 0
59 ; CHECK: .set G_PlayerReborn.has_dyn_sized_stack, 0
60 ; CHECK: .set G_PlayerReborn.has_recursion, 0
61 ; CHECK: .set G_PlayerReborn.has_indirect_call, 0
62 define void @G_PlayerReborn() {
66 ; CHECK-LABEL: P_SetThingPosition:
67 ; CHECK: .set P_SetThingPosition.num_vgpr, 0
68 ; CHECK: .set P_SetThingPosition.num_agpr, 0
69 ; CHECK: .set P_SetThingPosition.numbered_sgpr, 32
70 ; CHECK: .set P_SetThingPosition.private_seg_size, 0
71 ; CHECK: .set P_SetThingPosition.uses_vcc, 0
72 ; CHECK: .set P_SetThingPosition.uses_flat_scratch, 0
73 ; CHECK: .set P_SetThingPosition.has_dyn_sized_stack, 0
74 ; CHECK: .set P_SetThingPosition.has_recursion, 0
75 ; CHECK: .set P_SetThingPosition.has_indirect_call, 0
76 define void @P_SetThingPosition() {
80 ; CHECK-LABEL: P_SetupPsprites:
81 ; CHECK: .set P_SetupPsprites.num_vgpr, max(41, amdgpu.max_num_vgpr)
82 ; CHECK: .set P_SetupPsprites.num_agpr, max(0, amdgpu.max_num_agpr)
83 ; CHECK: .set P_SetupPsprites.numbered_sgpr, max(48, amdgpu.max_num_sgpr)
84 ; CHECK: .set P_SetupPsprites.private_seg_size, 16
85 ; CHECK: .set P_SetupPsprites.uses_vcc, 1
86 ; CHECK: .set P_SetupPsprites.uses_flat_scratch, 1
87 ; CHECK: .set P_SetupPsprites.has_dyn_sized_stack, 1
88 ; CHECK: .set P_SetupPsprites.has_recursion, 1
89 ; CHECK: .set P_SetupPsprites.has_indirect_call, 1
90 define void @P_SetupPsprites(ptr addrspace(1) %i) {
91 %fptr = load ptr, ptr addrspace(1) %i, align 8
92 tail call void %fptr()
96 ; CHECK-LABEL: HU_Start:
97 ; CHECK: .set HU_Start.num_vgpr, 0
98 ; CHECK: .set HU_Start.num_agpr, 0
99 ; CHECK: .set HU_Start.numbered_sgpr, 32
100 ; CHECK: .set HU_Start.private_seg_size, 0
101 ; CHECK: .set HU_Start.uses_vcc, 0
102 ; CHECK: .set HU_Start.uses_flat_scratch, 0
103 ; CHECK: .set HU_Start.has_dyn_sized_stack, 0
104 ; CHECK: .set HU_Start.has_recursion, 0
105 ; CHECK: .set HU_Start.has_indirect_call, 0
106 define void @HU_Start() {
110 ; CHECK-LABEL: P_SpawnPlayer:
111 ; CHECK: .set P_SpawnPlayer.num_vgpr, max(43, G_PlayerReborn.num_vgpr, P_SetThingPosition.num_vgpr, P_SetupPsprites.num_vgpr, HU_Start.num_vgpr)
112 ; CHECK: .set P_SpawnPlayer.num_agpr, max(0, G_PlayerReborn.num_agpr, P_SetThingPosition.num_agpr, P_SetupPsprites.num_agpr, HU_Start.num_agpr)
113 ; CHECK: .set P_SpawnPlayer.numbered_sgpr, max(60, G_PlayerReborn.numbered_sgpr, P_SetThingPosition.numbered_sgpr, P_SetupPsprites.numbered_sgpr, HU_Start.numbered_sgpr)
114 ; CHECK: .set P_SpawnPlayer.private_seg_size, 16+(max(G_PlayerReborn.private_seg_size, P_SetThingPosition.private_seg_size, P_SetupPsprites.private_seg_size, HU_Start.private_seg_size))
115 ; CHECK: .set P_SpawnPlayer.uses_vcc, or(1, G_PlayerReborn.uses_vcc, P_SetThingPosition.uses_vcc, P_SetupPsprites.uses_vcc, HU_Start.uses_vcc)
116 ; CHECK: .set P_SpawnPlayer.uses_flat_scratch, or(0, G_PlayerReborn.uses_flat_scratch, P_SetThingPosition.uses_flat_scratch, P_SetupPsprites.uses_flat_scratch, HU_Start.uses_flat_scratch)
117 ; CHECK: .set P_SpawnPlayer.has_dyn_sized_stack, or(0, G_PlayerReborn.has_dyn_sized_stack, P_SetThingPosition.has_dyn_sized_stack, P_SetupPsprites.has_dyn_sized_stack, HU_Start.has_dyn_sized_stack)
118 ; CHECK: .set P_SpawnPlayer.has_recursion, or(1, G_PlayerReborn.has_recursion, P_SetThingPosition.has_recursion, P_SetupPsprites.has_recursion, HU_Start.has_recursion)
119 ; CHECK: .set P_SpawnPlayer.has_indirect_call, or(0, G_PlayerReborn.has_indirect_call, P_SetThingPosition.has_indirect_call, P_SetupPsprites.has_indirect_call, HU_Start.has_indirect_call)
120 define void @P_SpawnPlayer() {
121 call void @G_PlayerReborn()
122 call void @P_SetThingPosition()
123 call void @P_SetupPsprites(ptr addrspace(1) null)
124 tail call void @HU_Start()
128 ; CHECK-LABEL: I_Error:
129 ; CHECK: .set I_Error.num_vgpr, max(41, amdgpu.max_num_vgpr)
130 ; CHECK: .set I_Error.num_agpr, max(0, amdgpu.max_num_agpr)
131 ; CHECK: .set I_Error.numbered_sgpr, max(48, amdgpu.max_num_sgpr)
132 ; CHECK: .set I_Error.private_seg_size, 16
133 ; CHECK: .set I_Error.uses_vcc, 1
134 ; CHECK: .set I_Error.uses_flat_scratch, 1
135 ; CHECK: .set I_Error.has_dyn_sized_stack, 1
136 ; CHECK: .set I_Error.has_recursion, 1
137 ; CHECK: .set I_Error.has_indirect_call, 1
138 define void @I_Error(...) {
139 %fptr = load ptr, ptr null, align 8
144 ; CHECK-LABEL: G_DoReborn:
145 ; CHECK: .set G_DoReborn.num_vgpr, max(44, P_RemoveMobj.num_vgpr, P_SpawnMobj.num_vgpr, P_SpawnPlayer.num_vgpr, I_Error.num_vgpr)
146 ; CHECK: .set G_DoReborn.num_agpr, max(0, P_RemoveMobj.num_agpr, P_SpawnMobj.num_agpr, P_SpawnPlayer.num_agpr, I_Error.num_agpr)
147 ; CHECK: .set G_DoReborn.numbered_sgpr, max(72, P_RemoveMobj.numbered_sgpr, P_SpawnMobj.numbered_sgpr, P_SpawnPlayer.numbered_sgpr, I_Error.numbered_sgpr)
148 ; CHECK: .set G_DoReborn.private_seg_size, 32+(max(P_RemoveMobj.private_seg_size, P_SpawnMobj.private_seg_size, P_SpawnPlayer.private_seg_size, I_Error.private_seg_size))
149 ; CHECK: .set G_DoReborn.uses_vcc, or(1, P_RemoveMobj.uses_vcc, P_SpawnMobj.uses_vcc, P_SpawnPlayer.uses_vcc, I_Error.uses_vcc)
150 ; CHECK: .set G_DoReborn.uses_flat_scratch, or(0, P_RemoveMobj.uses_flat_scratch, P_SpawnMobj.uses_flat_scratch, P_SpawnPlayer.uses_flat_scratch, I_Error.uses_flat_scratch)
151 ; CHECK: .set G_DoReborn.has_dyn_sized_stack, or(0, P_RemoveMobj.has_dyn_sized_stack, P_SpawnMobj.has_dyn_sized_stack, P_SpawnPlayer.has_dyn_sized_stack, I_Error.has_dyn_sized_stack)
152 ; CHECK: .set G_DoReborn.has_recursion, or(1, P_RemoveMobj.has_recursion, P_SpawnMobj.has_recursion, P_SpawnPlayer.has_recursion, I_Error.has_recursion)
153 ; CHECK: .set G_DoReborn.has_indirect_call, or(0, P_RemoveMobj.has_indirect_call, P_SpawnMobj.has_indirect_call, P_SpawnPlayer.has_indirect_call, I_Error.has_indirect_call)
154 define void @G_DoReborn() {
155 call void @P_RemoveMobj()
156 call void @P_SpawnMobj()
157 call void @P_SpawnPlayer()
158 call void (...) @I_Error()
162 ; CHECK-LABEL: AM_Stop:
163 ; CHECK: .set AM_Stop.num_vgpr, 0
164 ; CHECK: .set AM_Stop.num_agpr, 0
165 ; CHECK: .set AM_Stop.numbered_sgpr, 32
166 ; CHECK: .set AM_Stop.private_seg_size, 0
167 ; CHECK: .set AM_Stop.uses_vcc, 0
168 ; CHECK: .set AM_Stop.uses_flat_scratch, 0
169 ; CHECK: .set AM_Stop.has_dyn_sized_stack, 0
170 ; CHECK: .set AM_Stop.has_recursion, 0
171 ; CHECK: .set AM_Stop.has_indirect_call, 0
172 define void @AM_Stop() {
176 ; CHECK-LABEL: D_AdvanceDemo:
177 ; CHECK: .set D_AdvanceDemo.num_vgpr, 0
178 ; CHECK: .set D_AdvanceDemo.num_agpr, 0
179 ; CHECK: .set D_AdvanceDemo.numbered_sgpr, 32
180 ; CHECK: .set D_AdvanceDemo.private_seg_size, 0
181 ; CHECK: .set D_AdvanceDemo.uses_vcc, 0
182 ; CHECK: .set D_AdvanceDemo.uses_flat_scratch, 0
183 ; CHECK: .set D_AdvanceDemo.has_dyn_sized_stack, 0
184 ; CHECK: .set D_AdvanceDemo.has_recursion, 0
185 ; CHECK: .set D_AdvanceDemo.has_indirect_call, 0
186 define void @D_AdvanceDemo() {
190 ; CHECK-LABEL: F_StartFinale:
191 ; CHECK: .set F_StartFinale.num_vgpr, 0
192 ; CHECK: .set F_StartFinale.num_agpr, 0
193 ; CHECK: .set F_StartFinale.numbered_sgpr, 32
194 ; CHECK: .set F_StartFinale.private_seg_size, 0
195 ; CHECK: .set F_StartFinale.uses_vcc, 0
196 ; CHECK: .set F_StartFinale.uses_flat_scratch, 0
197 ; CHECK: .set F_StartFinale.has_dyn_sized_stack, 0
198 ; CHECK: .set F_StartFinale.has_recursion, 0
199 ; CHECK: .set F_StartFinale.has_indirect_call, 0
200 define void @F_StartFinale() {
204 ; CHECK-LABEL: F_Ticker:
205 ; CHECK: .set F_Ticker.num_vgpr, 0
206 ; CHECK: .set F_Ticker.num_agpr, 0
207 ; CHECK: .set F_Ticker.numbered_sgpr, 32
208 ; CHECK: .set F_Ticker.private_seg_size, 0
209 ; CHECK: .set F_Ticker.uses_vcc, 0
210 ; CHECK: .set F_Ticker.uses_flat_scratch, 0
211 ; CHECK: .set F_Ticker.has_dyn_sized_stack, 0
212 ; CHECK: .set F_Ticker.has_recursion, 0
213 ; CHECK: .set F_Ticker.has_indirect_call, 0
214 define void @F_Ticker() {
218 ; CHECK-LABEL: G_CheckDemoStatus:
219 ; CHECK: .set G_CheckDemoStatus.num_vgpr, max(43, I_Quit.num_vgpr, D_AdvanceDemo.num_vgpr, I_Error.num_vgpr)
220 ; CHECK: .set G_CheckDemoStatus.num_agpr, max(0, I_Quit.num_agpr, D_AdvanceDemo.num_agpr, I_Error.num_agpr)
221 ; CHECK: .set G_CheckDemoStatus.numbered_sgpr, max(60, I_Quit.numbered_sgpr, D_AdvanceDemo.numbered_sgpr, I_Error.numbered_sgpr)
222 ; CHECK: .set G_CheckDemoStatus.private_seg_size, 32+(max(I_Quit.private_seg_size, D_AdvanceDemo.private_seg_size, I_Error.private_seg_size))
223 ; CHECK: .set G_CheckDemoStatus.uses_vcc, or(1, I_Quit.uses_vcc, D_AdvanceDemo.uses_vcc, I_Error.uses_vcc)
224 ; CHECK: .set G_CheckDemoStatus.uses_flat_scratch, or(0, I_Quit.uses_flat_scratch, D_AdvanceDemo.uses_flat_scratch, I_Error.uses_flat_scratch)
225 ; CHECK: .set G_CheckDemoStatus.has_dyn_sized_stack, or(0, I_Quit.has_dyn_sized_stack, D_AdvanceDemo.has_dyn_sized_stack, I_Error.has_dyn_sized_stack)
226 ; CHECK: .set G_CheckDemoStatus.has_recursion, or(1, I_Quit.has_recursion, D_AdvanceDemo.has_recursion, I_Error.has_recursion)
227 ; CHECK: .set G_CheckDemoStatus.has_indirect_call, or(0, I_Quit.has_indirect_call, D_AdvanceDemo.has_indirect_call, I_Error.has_indirect_call)
228 define i32 @G_CheckDemoStatus() {
229 tail call void @I_Quit()
230 tail call void @D_AdvanceDemo()
231 call void (...) @I_Error()
236 ; CHECK-LABEL: P_TempSaveGameFile:
237 ; CHECK: .set P_TempSaveGameFile.num_vgpr, 2
238 ; CHECK: .set P_TempSaveGameFile.num_agpr, 0
239 ; CHECK: .set P_TempSaveGameFile.numbered_sgpr, 32
240 ; CHECK: .set P_TempSaveGameFile.private_seg_size, 0
241 ; CHECK: .set P_TempSaveGameFile.uses_vcc, 0
242 ; CHECK: .set P_TempSaveGameFile.uses_flat_scratch, 0
243 ; CHECK: .set P_TempSaveGameFile.has_dyn_sized_stack, 0
244 ; CHECK: .set P_TempSaveGameFile.has_recursion, 0
245 ; CHECK: .set P_TempSaveGameFile.has_indirect_call, 0
246 define ptr @P_TempSaveGameFile() {
250 ; CHECK-LABEL: P_SaveGameFile:
251 ; CHECK: .set P_SaveGameFile.num_vgpr, 2
252 ; CHECK: .set P_SaveGameFile.num_agpr, 0
253 ; CHECK: .set P_SaveGameFile.numbered_sgpr, 32
254 ; CHECK: .set P_SaveGameFile.private_seg_size, 0
255 ; CHECK: .set P_SaveGameFile.uses_vcc, 0
256 ; CHECK: .set P_SaveGameFile.uses_flat_scratch, 0
257 ; CHECK: .set P_SaveGameFile.has_dyn_sized_stack, 0
258 ; CHECK: .set P_SaveGameFile.has_recursion, 0
259 ; CHECK: .set P_SaveGameFile.has_indirect_call, 0
260 define ptr @P_SaveGameFile() {
264 ; CHECK-LABEL: R_FlatNumForName:
265 ; CHECK: .set R_FlatNumForName.num_vgpr, max(42, I_Error.num_vgpr)
266 ; CHECK: .set R_FlatNumForName.num_agpr, max(0, I_Error.num_agpr)
267 ; CHECK: .set R_FlatNumForName.numbered_sgpr, max(48, I_Error.numbered_sgpr)
268 ; CHECK: .set R_FlatNumForName.private_seg_size, 16+(max(I_Error.private_seg_size))
269 ; CHECK: .set R_FlatNumForName.uses_vcc, or(1, I_Error.uses_vcc)
270 ; CHECK: .set R_FlatNumForName.uses_flat_scratch, or(0, I_Error.uses_flat_scratch)
271 ; CHECK: .set R_FlatNumForName.has_dyn_sized_stack, or(0, I_Error.has_dyn_sized_stack)
272 ; CHECK: .set R_FlatNumForName.has_recursion, or(1, I_Error.has_recursion)
273 ; CHECK: .set R_FlatNumForName.has_indirect_call, or(0, I_Error.has_indirect_call)
274 define i32 @R_FlatNumForName() {
275 call void (...) @I_Error()
279 ; CHECK-LABEL: R_TextureNumForName:
280 ; CHECK: .set R_TextureNumForName.num_vgpr, max(42, R_FlatNumForName.num_vgpr)
281 ; CHECK: .set R_TextureNumForName.num_agpr, max(0, R_FlatNumForName.num_agpr)
282 ; CHECK: .set R_TextureNumForName.numbered_sgpr, max(48, R_FlatNumForName.numbered_sgpr)
283 ; CHECK: .set R_TextureNumForName.private_seg_size, 16+(max(R_FlatNumForName.private_seg_size))
284 ; CHECK: .set R_TextureNumForName.uses_vcc, or(1, R_FlatNumForName.uses_vcc)
285 ; CHECK: .set R_TextureNumForName.uses_flat_scratch, or(0, R_FlatNumForName.uses_flat_scratch)
286 ; CHECK: .set R_TextureNumForName.has_dyn_sized_stack, or(0, R_FlatNumForName.has_dyn_sized_stack)
287 ; CHECK: .set R_TextureNumForName.has_recursion, or(1, R_FlatNumForName.has_recursion)
288 ; CHECK: .set R_TextureNumForName.has_indirect_call, or(0, R_FlatNumForName.has_indirect_call)
289 define i32 @R_TextureNumForName() {
290 %ret = call i32 @R_FlatNumForName()
294 ; CHECK-LABEL: G_Ticker:
295 ; CHECK: .set G_Ticker.num_vgpr, max(46, G_DoReborn.num_vgpr, F_Ticker.num_vgpr, AM_Stop.num_vgpr, F_StartFinale.num_vgpr, D_AdvanceDemo.num_vgpr, R_FlatNumForName.num_vgpr, R_TextureNumForName.num_vgpr, P_TempSaveGameFile.num_vgpr, P_SaveGameFile.num_vgpr, I_Error.num_vgpr)
296 ; CHECK: .set G_Ticker.num_agpr, max(0, G_DoReborn.num_agpr, F_Ticker.num_agpr, AM_Stop.num_agpr, F_StartFinale.num_agpr, D_AdvanceDemo.num_agpr, R_FlatNumForName.num_agpr, R_TextureNumForName.num_agpr, P_TempSaveGameFile.num_agpr, P_SaveGameFile.num_agpr, I_Error.num_agpr)
297 ; CHECK: .set G_Ticker.numbered_sgpr, max(84, G_DoReborn.numbered_sgpr, F_Ticker.numbered_sgpr, AM_Stop.numbered_sgpr, F_StartFinale.numbered_sgpr, D_AdvanceDemo.numbered_sgpr, R_FlatNumForName.numbered_sgpr, R_TextureNumForName.numbered_sgpr, P_TempSaveGameFile.numbered_sgpr, P_SaveGameFile.numbered_sgpr, I_Error.numbered_sgpr)
298 ; CHECK: .set G_Ticker.private_seg_size, 32+(max(G_DoReborn.private_seg_size, F_Ticker.private_seg_size, AM_Stop.private_seg_size, F_StartFinale.private_seg_size, D_AdvanceDemo.private_seg_size, R_FlatNumForName.private_seg_size, R_TextureNumForName.private_seg_size, P_TempSaveGameFile.private_seg_size, P_SaveGameFile.private_seg_size, I_Error.private_seg_size))
299 ; CHECK: .set G_Ticker.uses_vcc, or(1, G_DoReborn.uses_vcc, F_Ticker.uses_vcc, AM_Stop.uses_vcc, F_StartFinale.uses_vcc, D_AdvanceDemo.uses_vcc, R_FlatNumForName.uses_vcc, R_TextureNumForName.uses_vcc, P_TempSaveGameFile.uses_vcc, P_SaveGameFile.uses_vcc, I_Error.uses_vcc)
300 ; CHECK: .set G_Ticker.uses_flat_scratch, or(0, G_DoReborn.uses_flat_scratch, F_Ticker.uses_flat_scratch, AM_Stop.uses_flat_scratch, F_StartFinale.uses_flat_scratch, D_AdvanceDemo.uses_flat_scratch, R_FlatNumForName.uses_flat_scratch, R_TextureNumForName.uses_flat_scratch, P_TempSaveGameFile.uses_flat_scratch, P_SaveGameFile.uses_flat_scratch, I_Error.uses_flat_scratch)
301 ; CHECK: .set G_Ticker.has_dyn_sized_stack, or(0, G_DoReborn.has_dyn_sized_stack, F_Ticker.has_dyn_sized_stack, AM_Stop.has_dyn_sized_stack, F_StartFinale.has_dyn_sized_stack, D_AdvanceDemo.has_dyn_sized_stack, R_FlatNumForName.has_dyn_sized_stack, R_TextureNumForName.has_dyn_sized_stack, P_TempSaveGameFile.has_dyn_sized_stack, P_SaveGameFile.has_dyn_sized_stack, I_Error.has_dyn_sized_stack)
302 ; CHECK: .set G_Ticker.has_recursion, or(1, G_DoReborn.has_recursion, F_Ticker.has_recursion, AM_Stop.has_recursion, F_StartFinale.has_recursion, D_AdvanceDemo.has_recursion, R_FlatNumForName.has_recursion, R_TextureNumForName.has_recursion, P_TempSaveGameFile.has_recursion, P_SaveGameFile.has_recursion, I_Error.has_recursion)
303 ; CHECK: .set G_Ticker.has_indirect_call, or(0, G_DoReborn.has_indirect_call, F_Ticker.has_indirect_call, AM_Stop.has_indirect_call, F_StartFinale.has_indirect_call, D_AdvanceDemo.has_indirect_call, R_FlatNumForName.has_indirect_call, R_TextureNumForName.has_indirect_call, P_TempSaveGameFile.has_indirect_call, P_SaveGameFile.has_indirect_call, I_Error.has_indirect_call)
304 define void @G_Ticker() {
305 call void @G_DoReborn()
306 tail call void @F_Ticker()
307 tail call void @AM_Stop()
308 tail call void @F_StartFinale()
309 tail call void @D_AdvanceDemo()
310 %call.i.i449 = call i32 @R_FlatNumForName()
311 %call9.i.i = call i32 @R_TextureNumForName()
312 %call.i306 = tail call ptr @P_TempSaveGameFile()
313 %call1.i307 = call ptr @P_SaveGameFile()
314 call void (...) @I_Error()
318 ; CHECK-LABEL: RunTic:
319 ; CHECK: .set RunTic.num_vgpr, max(46, G_CheckDemoStatus.num_vgpr, D_AdvanceDemo.num_vgpr, G_Ticker.num_vgpr)
320 ; CHECK: .set RunTic.num_agpr, max(0, G_CheckDemoStatus.num_agpr, D_AdvanceDemo.num_agpr, G_Ticker.num_agpr)
321 ; CHECK: .set RunTic.numbered_sgpr, max(84, G_CheckDemoStatus.numbered_sgpr, D_AdvanceDemo.numbered_sgpr, G_Ticker.numbered_sgpr)
322 ; CHECK: .set RunTic.private_seg_size, 32+(max(G_CheckDemoStatus.private_seg_size, D_AdvanceDemo.private_seg_size, G_Ticker.private_seg_size))
323 ; CHECK: .set RunTic.uses_vcc, or(1, G_CheckDemoStatus.uses_vcc, D_AdvanceDemo.uses_vcc, G_Ticker.uses_vcc)
324 ; CHECK: .set RunTic.uses_flat_scratch, or(0, G_CheckDemoStatus.uses_flat_scratch, D_AdvanceDemo.uses_flat_scratch, G_Ticker.uses_flat_scratch)
325 ; CHECK: .set RunTic.has_dyn_sized_stack, or(0, G_CheckDemoStatus.has_dyn_sized_stack, D_AdvanceDemo.has_dyn_sized_stack, G_Ticker.has_dyn_sized_stack)
326 ; CHECK: .set RunTic.has_recursion, or(1, G_CheckDemoStatus.has_recursion, D_AdvanceDemo.has_recursion, G_Ticker.has_recursion)
327 ; CHECK: .set RunTic.has_indirect_call, or(0, G_CheckDemoStatus.has_indirect_call, D_AdvanceDemo.has_indirect_call, G_Ticker.has_indirect_call)
328 define void @RunTic() {
329 %call5.i1 = call i32 @G_CheckDemoStatus()
330 tail call void @D_AdvanceDemo()
331 call void @G_Ticker()