Skip to content

Commit a18826d

Browse files
authored
[AMDGPU] Create local KnownBits in case DenseMap gets invalidated (#111568)
KnownBits retrieved from DenseMap may invalidate if insertion requires a (re)growth. Fixes #110930
1 parent d8d144a commit a18826d

File tree

2 files changed

+339
-2
lines changed

2 files changed

+339
-2
lines changed

llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCExpr.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -537,8 +537,12 @@ static void knownBitsMapHelper(const MCExpr *Expr, KnownBitsMap &KBM,
537537

538538
// Variable value retrieval is not for actual use but only for knownbits
539539
// analysis.
540-
knownBitsMapHelper(Sym.getVariableValue(/*SetUsed=*/false), KBM, Depth + 1);
541-
KBM[Expr] = KBM[Sym.getVariableValue(/*SetUsed=*/false)];
540+
const MCExpr *SymVal = Sym.getVariableValue(/*setUsed=*/false);
541+
knownBitsMapHelper(SymVal, KBM, Depth + 1);
542+
543+
// Explicitly copy-construct so that there exists a local KnownBits in case
544+
// KBM[SymVal] gets invalidated after a potential growth through KBM[Expr].
545+
KBM[Expr] = KnownBits(KBM[SymVal]);
542546
return;
543547
}
544548
case MCExpr::ExprKind::Unary: {
Lines changed: 333 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,333 @@
1+
; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1030 < %s | FileCheck %s
2+
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.
7+
8+
; CHECK-LABEL: I_Quit:
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()
21+
ret void
22+
}
23+
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() {
35+
ret void
36+
}
37+
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() {
49+
ret void
50+
}
51+
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() {
63+
ret void
64+
}
65+
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() {
77+
ret void
78+
}
79+
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()
93+
ret void
94+
}
95+
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() {
107+
ret void
108+
}
109+
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()
125+
ret void
126+
}
127+
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
140+
call void %fptr()
141+
ret void
142+
}
143+
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()
159+
ret void
160+
}
161+
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() {
173+
ret void
174+
}
175+
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() {
187+
ret void
188+
}
189+
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() {
201+
ret void
202+
}
203+
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() {
215+
ret void
216+
}
217+
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()
232+
ret i32 0
233+
}
234+
235+
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() {
247+
ret ptr null
248+
}
249+
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() {
261+
ret ptr null
262+
}
263+
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()
276+
unreachable
277+
}
278+
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()
291+
ret i32 0
292+
}
293+
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()
315+
ret void
316+
}
317+
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()
332+
ret void
333+
}

0 commit comments

Comments
 (0)