xref: /llvm-project/llvm/test/CodeGen/DirectX/finalize-linkage-remove-dead-lib.ll (revision ab7518050183162f09724ef8682a580cc68709bc)
1; RUN: opt -S -dxil-finalize-linkage -mtriple=dxil-unknown-shadermodel6.5-library %s | FileCheck %s
2; RUN: llc %s --filetype=asm -o - | FileCheck %s
3
4target triple = "dxilv1.5-pc-shadermodel6.5-compute"
5
6; Confirm that DXILFinalizeLinkage will remove functions that have compatible
7; linkage and are not called from anywhere. This should be any function that
8; is not explicitly marked export and is not an entry point.
9
10; Has no specified inlining/linking behavior and is uncalled, this should be removed.
11; CHECK-NOT: define {{.*}}doNothingUncalled
12define void @"?doNothingUncalled@@YAXXZ"() #2 {
13entry:
14  ret void
15}
16
17; Alwaysinline and uncalled, this should be removed.
18; CHECK-NOT: define {{.*}}doAlwaysInlineUncalled
19define void @"?doAlwaysInlineUncalled@@YAXXZ"() #0 {
20entry:
21  ret void
22}
23
24; Noinline and uncalled, this should be removed.
25; CHECK-NOT: define {{.*}}doNoinlineUncalled
26define void @"?doNoinlineUncalled@@YAXXZ"() #4 {
27entry:
28  ret void
29}
30
31; No inlining attribute, internal, and uncalled; this should be removed.
32; CHECK-NOT: define {{.*}}doInternalUncalled
33define internal void @"?doInternalUncalled@@YAXXZ"() #2 {
34entry:
35  ret void
36}
37
38; Alwaysinline, internal, and uncalled; this should be removed.
39; CHECK-NOT: define {{.*}}doAlwaysInlineInternalUncalled
40define internal void @"?doAlwaysInlineInternalUncalled@@YAXXZ"() #0 {
41entry:
42  ret void
43}
44
45; Noinline, internal, and uncalled; this should be removed.
46; CHECK-NOT: define {{.*}}doNoinlineInternalUncalled
47define internal void @"?doNoinlineInternalUncalled@@YAXXZ"() #4 {
48entry:
49  ret void
50}
51
52; Marked external and uncalled, this should become internal and be removed.
53; CHECK-NOT: define {{.*}}doExternalUncalled
54define external void @"?doExternalUncalled@@YAXXZ"() #2 {
55entry:
56  ret void
57}
58
59; Alwaysinline, external and uncalled, this should become internal and be removed.
60; CHECK-NOT: define {{.*}}doAlwaysInlineExternalUncalled
61define external void @"?doAlwaysInlineExternalUncalled@@YAXXZ"() #0 {
62entry:
63  ret void
64}
65
66; Noinline, external and uncalled, this should become internal and be removed.
67; CHECK-NOT: define {{.*}}doNoinlineExternalUncalled
68define external void @"?doNoinlineExternalUncalled@@YAXXZ"() #4 {
69entry:
70  ret void
71}
72
73; No inlining attribute and called, this should stay.
74; CHECK: define {{.*}}doNothingCalled
75define void @"?doNothingCalled@@YAXXZ"() #2 {
76entry:
77  ret void
78}
79
80; Alwaysinline and called, this should stay.
81; CHECK: define {{.*}}doAlwaysInlineCalled
82define void @"?doAlwaysInlineCalled@@YAXXZ"() #0 {
83entry:
84  ret void
85}
86
87; Noinline and called, this should stay.
88; CHECK: define {{.*}}doNoinlineCalled
89define void @"?doNoinlineCalled@@YAXXZ"() #4 {
90entry:
91  ret void
92}
93
94; No inlining attribute, internal, and called; this should stay.
95; CHECK: define {{.*}}doInternalCalled
96define internal void @"?doInternalCalled@@YAXXZ"() #2 {
97entry:
98  ret void
99}
100
101; Alwaysinline, internal, and called; this should stay.
102; CHECK: define {{.*}}doAlwaysInlineInternalCalled
103define internal void @"?doAlwaysInlineInternalCalled@@YAXXZ"() #0 {
104entry:
105  ret void
106}
107
108; Noinline, internal, and called; this should stay.
109; CHECK: define {{.*}}doNoinlineInternalCalled
110define internal void @"?doNoinlineInternalCalled@@YAXXZ"() #4 {
111entry:
112  ret void
113}
114
115; Marked external and called, this should become internal and stay.
116; CHECK: define {{.*}}doExternalCalled
117define external void @"?doExternalCalled@@YAXXZ"() #2 {
118entry:
119  ret void
120}
121
122; Always inlined, external and called, this should become internal and stay.
123; CHECK: define {{.*}}doAlwaysInlineExternalCalled
124define external void @"?doAlwaysInlineExternalCalled@@YAXXZ"() #0 {
125entry:
126  ret void
127}
128
129; Noinline, external and called, this should become internal and stay.
130; CHECK: define {{.*}}doNoinlineExternalCalled
131define external void @"?doNoinlineExternalCalled@@YAXXZ"() #4 {
132entry:
133  ret void
134}
135
136; No inlining attribute and exported, this should stay.
137; CHECK: define {{.*}}doNothingExported
138define void @"?doNothingExported@@YAXXZ"() #3 {
139entry:
140  ret void
141}
142
143; Alwaysinline and exported, this should stay.
144; CHECK: define {{.*}}doAlwaysInlineExported
145define void @"?doAlwaysInlineExported@@YAXXZ"() #1 {
146entry:
147  ret void
148}
149
150; Noinline attribute and exported, this should stay.
151; CHECK: define {{.*}}doNoinlineExported
152define void @"?doNoinlineExported@@YAXXZ"() #5 {
153entry:
154  ret void
155}
156
157; No inlining attribute, internal, and exported; this should stay.
158; CHECK: define {{.*}}doInternalExported
159define internal void @"?doInternalExported@@YAXXZ"() #3 {
160entry:
161  ret void
162}
163
164; Alwaysinline, internal, and exported; this should stay.
165; CHECK: define {{.*}}doAlwaysInlineInternalExported
166define internal void @"?doAlwaysInlineInternalExported@@YAXXZ"() #1 {
167entry:
168  ret void
169}
170
171; Noinline, internal, and exported; this should stay.
172; CHECK: define {{.*}}doNoinlineInternalExported
173define internal void @"?doNoinlineInternalExported@@YAXXZ"() #5 {
174entry:
175  ret void
176}
177
178; Marked external and exported, this should stay.
179; CHECK: define {{.*}}doExternalExported
180define external void @"?doExternalExported@@YAXXZ"() #3 {
181entry:
182  ret void
183}
184
185; Alwaysinline, external and exported, this should stay.
186; CHECK: define {{.*}}doAlwaysInlineExternalExported
187define external void @"?doAlwaysInlineExternalExported@@YAXXZ"() #1 {
188entry:
189  ret void
190}
191
192; Noinline, external and exported, this should stay.
193; CHECK: define {{.*}}doNoinlineExternalExported
194define external void @"?doNoinlineExternalExported@@YAXXZ"() #5 {
195entry:
196  ret void
197}
198
199; Entry point function, this should stay.
200; CHECK: define void @main()
201define void @main() #6 {
202entry:
203  call void @"?doNothingCalled@@YAXXZ"() #7
204  call void @"?doAlwaysInlineCalled@@YAXXZ"() #7
205  call void @"?doNoinlineCalled@@YAXXZ"() #7
206  call void @"?doInternalCalled@@YAXXZ"() #7
207  call void @"?doAlwaysInlineInternalCalled@@YAXXZ"() #7
208  call void @"?doNoinlineInternalCalled@@YAXXZ"() #7
209  call void @"?doExternalCalled@@YAXXZ"() #7
210  call void @"?doAlwaysInlineExternalCalled@@YAXXZ"() #7
211  call void @"?doNoinlineExternalCalled@@YAXXZ"() #7
212  ret void
213}
214
215attributes #0 = { alwaysinline convergent norecurse nounwind }
216attributes #1 = { alwaysinline convergent norecurse nounwind "hlsl.export"}
217attributes #2 = { convergent norecurse nounwind }
218attributes #3 = { convergent norecurse nounwind "hlsl.export"}
219attributes #4 = { convergent noinline norecurse nounwind }
220attributes #5 = { convergent noinline norecurse nounwind "hlsl.export"}
221attributes #6 = { convergent noinline norecurse "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
222attributes #7 = { convergent }
223