157 lines · plain
1; RUN: opt -S -dxil-finalize-linkage -mtriple=dxil-unknown-shadermodel6.5-compute %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 not an entry point.9 10; Is hidden and is uncalled, this should be removed.11; CHECK-NOT: define {{.*}}doNothingUncalled12define hidden void @"?doNothingUncalled@@YAXXZ"() #1 {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"() #3 {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"() #1 {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"() #3 {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"() #1 {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"() #3 {69entry:70 ret void71}72 73; No inlining attribute and called, this should stay.74; CHECK: define {{.*}}doNothingCalled75define hidden void @"?doNothingCalled@@YAXXZ"() #1 {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"() #3 {90entry:91 ret void92}93 94; No inlining attribute, internal, and called; this should stay.95; CHECK: define {{.*}}doInternalCalled96define internal void @"?doInternalCalled@@YAXXZ"() #1 {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"() #3 {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"() #1 {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"() #3 {132entry:133 ret void134}135 136; Entry point function, this should stay.137; CHECK: define void @main()138define void @main() #4 {139entry:140 call void @"?doNothingCalled@@YAXXZ"() #5141 call void @"?doAlwaysInlineCalled@@YAXXZ"() #5142 call void @"?doNoinlineCalled@@YAXXZ"() #5143 call void @"?doInternalCalled@@YAXXZ"() #5144 call void @"?doAlwaysInlineInternalCalled@@YAXXZ"() #5145 call void @"?doNoinlineInternalCalled@@YAXXZ"() #5146 call void @"?doExternalCalled@@YAXXZ"() #5147 call void @"?doAlwaysInlineExternalCalled@@YAXXZ"() #5148 call void @"?doNoinlineExternalCalled@@YAXXZ"() #5149 ret void150}151 152attributes #0 = { alwaysinline convergent norecurse nounwind }153attributes #1 = { convergent norecurse nounwind }154attributes #3 = { convergent noinline norecurse nounwind }155attributes #4 = { convergent noinline norecurse "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }156attributes #5 = { convergent }157