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