202 lines · plain
1; RUN: opt -S -dxil-finalize-linkage -mtriple=dxil-unknown-shadermodel6.5-library %s | FileCheck %s2; RUN: llc %s --filetype=asm -o - | FileCheck %s3 4target triple = "dxilv1.5-pc-shadermodel6.5-compute"5 6; Confirm that DXILFinalizeLinkage will remove functions that have compatible7; linkage and are not called from anywhere. This should be any function that8; is marked hidden or internal.9 10; Is hidden, and uncalled, this should be removed.11; CHECK-NOT: define {{.*}}doNothingUncalled12define hidden void @"?doNothingUncalled@@YAXXZ"() #2 {13entry:14 ret void15}16 17; Alwaysinline, hidden and uncalled, this should be removed.18; CHECK-NOT: define {{.*}}doAlwaysInlineUncalled19define hidden void @"?doAlwaysInlineUncalled@@YAXXZ"() #0 {20entry:21 ret void22}23 24; Noinline, hidden and uncalled, this should be removed.25; CHECK-NOT: define {{.*}}doNoinlineUncalled26define hidden void @"?doNoinlineUncalled@@YAXXZ"() #4 {27entry:28 ret void29}30 31; No inlining attribute, internal, and uncalled; this should be removed.32; CHECK-NOT: define {{.*}}doInternalUncalled33define internal void @"?doInternalUncalled@@YAXXZ"() #2 {34entry:35 ret void36}37 38; Alwaysinline, internal, and uncalled; this should be removed.39; CHECK-NOT: define {{.*}}doAlwaysInlineInternalUncalled40define internal void @"?doAlwaysInlineInternalUncalled@@YAXXZ"() #0 {41entry:42 ret void43}44 45; Noinline, internal, and uncalled; this should be removed.46; CHECK-NOT: define {{.*}}doNoinlineInternalUncalled47define internal void @"?doNoinlineInternalUncalled@@YAXXZ"() #4 {48entry:49 ret void50}51 52; Marked external, hidden and uncalled, this should become internal and be removed.53; CHECK-NOT: define {{.*}}doExternalUncalled54define external hidden void @"?doExternalUncalled@@YAXXZ"() #2 {55entry:56 ret void57}58 59; Alwaysinline, external, hidden and uncalled, this should become internal and be removed.60; CHECK-NOT: define {{.*}}doAlwaysInlineExternalUncalled61define external hidden void @"?doAlwaysInlineExternalUncalled@@YAXXZ"() #0 {62entry:63 ret void64}65 66; Noinline, external, hidden and uncalled, this should become internal and be removed.67; CHECK-NOT: define {{.*}}doNoinlineExternalUncalled68define external hidden void @"?doNoinlineExternalUncalled@@YAXXZ"() #4 {69entry:70 ret void71}72 73; No inlining attribute, hidden and called, this should stay.74; CHECK: define {{.*}}doNothingCalled75define hidden void @"?doNothingCalled@@YAXXZ"() #2 {76entry:77 ret void78}79 80; Alwaysinline, hidden and called, this should stay.81; CHECK: define {{.*}}doAlwaysInlineCalled82define hidden void @"?doAlwaysInlineCalled@@YAXXZ"() #0 {83entry:84 ret void85}86 87; Noinline, hidden and called, this should stay.88; CHECK: define {{.*}}doNoinlineCalled89define hidden void @"?doNoinlineCalled@@YAXXZ"() #4 {90entry:91 ret void92}93 94; No inlining attribute, internal, and called; this should stay.95; CHECK: define {{.*}}doInternalCalled96define internal void @"?doInternalCalled@@YAXXZ"() #2 {97entry:98 ret void99}100 101; Alwaysinline, internal, and called; this should stay.102; CHECK: define {{.*}}doAlwaysInlineInternalCalled103define internal void @"?doAlwaysInlineInternalCalled@@YAXXZ"() #0 {104entry:105 ret void106}107 108; Noinline, internal, and called; this should stay.109; CHECK: define {{.*}}doNoinlineInternalCalled110define internal void @"?doNoinlineInternalCalled@@YAXXZ"() #4 {111entry:112 ret void113}114 115; Marked external, hidden and called, this should become internal and stay.116; CHECK: define {{.*}}doExternalCalled117define external hidden void @"?doExternalCalled@@YAXXZ"() #2 {118entry:119 ret void120}121 122; Always inlined, external, hidden and called, this should become internal and stay.123; CHECK: define {{.*}}doAlwaysInlineExternalCalled124define external hidden void @"?doAlwaysInlineExternalCalled@@YAXXZ"() #0 {125entry:126 ret void127}128 129; Noinline, external, hidden and called, this should become internal and stay.130; CHECK: define {{.*}}doNoinlineExternalCalled131define external hidden void @"?doNoinlineExternalCalled@@YAXXZ"() #4 {132entry:133 ret void134}135 136; No inlining attribute and exported, this should stay.137; CHECK: define {{.*}}doNothingExported138define void @"?doNothingExported@@YAXXZ"() #3 {139entry:140 ret void141}142 143; Alwaysinline and exported, this should stay.144; CHECK: define {{.*}}doAlwaysInlineExported145define void @"?doAlwaysInlineExported@@YAXXZ"() #1 {146entry:147 ret void148}149 150; Noinline attribute and exported, this should stay.151; CHECK: define {{.*}}doNoinlineExported152define void @"?doNoinlineExported@@YAXXZ"() #5 {153entry:154 ret void155}156 157; Marked external and exported, this should stay.158; CHECK: define {{.*}}doExternalExported159define external void @"?doExternalExported@@YAXXZ"() #3 {160entry:161 ret void162}163 164; Alwaysinline, external and exported, this should stay.165; CHECK: define {{.*}}doAlwaysInlineExternalExported166define external void @"?doAlwaysInlineExternalExported@@YAXXZ"() #1 {167entry:168 ret void169}170 171; Noinline, external and exported, this should stay.172; CHECK: define {{.*}}doNoinlineExternalExported173define external void @"?doNoinlineExternalExported@@YAXXZ"() #5 {174entry:175 ret void176}177 178; Entry point function, this should stay.179; CHECK: define void @main()180define void @main() #6 {181entry:182 call void @"?doNothingCalled@@YAXXZ"() #7183 call void @"?doAlwaysInlineCalled@@YAXXZ"() #7184 call void @"?doNoinlineCalled@@YAXXZ"() #7185 call void @"?doInternalCalled@@YAXXZ"() #7186 call void @"?doAlwaysInlineInternalCalled@@YAXXZ"() #7187 call void @"?doNoinlineInternalCalled@@YAXXZ"() #7188 call void @"?doExternalCalled@@YAXXZ"() #7189 call void @"?doAlwaysInlineExternalCalled@@YAXXZ"() #7190 call void @"?doNoinlineExternalCalled@@YAXXZ"() #7191 ret void192}193 194attributes #0 = { alwaysinline convergent norecurse nounwind }195attributes #1 = { alwaysinline convergent norecurse nounwind }196attributes #2 = { convergent norecurse nounwind }197attributes #3 = { convergent norecurse nounwind }198attributes #4 = { convergent noinline norecurse nounwind }199attributes #5 = { convergent noinline norecurse nounwind }200attributes #6 = { convergent noinline norecurse "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }201attributes #7 = { convergent }202