1; RUN: opt -O0 -S -mtriple=amdgcn-unknown-amdhsa -amdgpu-internalize-symbols < %s | FileCheck -check-prefix=ALL -check-prefix=OPTNONE %s
2; RUN: opt -passes='default<O0>' -S -mtriple=amdgcn-unknown-amdhsa -amdgpu-internalize-symbols < %s | FileCheck -check-prefix=ALL -check-prefix=OPTNONE %s
3; RUN: opt -O1 -S -mtriple=amdgcn-unknown-amdhsa -amdgpu-internalize-symbols < %s | FileCheck -check-prefix=ALL -check-prefix=OPT %s
4; RUN: opt -passes='default<O1>' -S -mtriple=amdgcn-unknown-amdhsa -amdgpu-internalize-symbols < %s | FileCheck -check-prefix=ALL -check-prefix=OPT %s
5
6; OPT-NOT: gvar_unused
7; OPTNONE: gvar_unused
8@gvar_unused = addrspace(1) global i32 undef, align 4
9
10; ALL: gvar_used
11@gvar_used = addrspace(1) global i32 undef, align 4
12
13; OPT: define internal fastcc void @func_used_noinline(
14; OPT-NONE: define fastcc void @func_used_noinline(
15define fastcc void @func_used_noinline(i32 addrspace(1)* %out, i32 %tid) #1 {
16entry:
17  store volatile i32 %tid, i32 addrspace(1)* %out
18  ret void
19}
20
21; OPTNONE: define fastcc void @func_used_alwaysinline(
22; OPT-NOT: @func_used_alwaysinline
23define fastcc void @func_used_alwaysinline(i32 addrspace(1)* %out, i32 %tid) #2 {
24entry:
25  store volatile i32 %tid, i32 addrspace(1)* %out
26  ret void
27}
28
29; OPTNONE: define void @func_unused(
30; OPT-NOT: @func_unused
31define void @func_unused(i32 addrspace(1)* %out, i32 %tid) #1 {
32entry:
33  store volatile i32 %tid, i32 addrspace(1)* %out
34  ret void
35}
36
37; ALL: define amdgpu_kernel void @kernel_unused(
38define amdgpu_kernel void @kernel_unused(i32 addrspace(1)* %out) #1 {
39entry:
40  store volatile i32 1, i32 addrspace(1)* %out
41  ret void
42}
43
44; ALL: define amdgpu_kernel void @main_kernel()
45; ALL: tail call i32 @llvm.amdgcn.workitem.id.x
46; ALL: tail call fastcc void @func_used_noinline
47; ALL: store volatile
48; ALL: ret void
49define amdgpu_kernel void @main_kernel() {
50entry:
51  %tid = tail call i32 @llvm.amdgcn.workitem.id.x()
52  tail call fastcc void @func_used_noinline(i32 addrspace(1)* @gvar_used, i32 %tid)
53  tail call fastcc void @func_used_alwaysinline(i32 addrspace(1)* @gvar_used, i32 %tid)
54  ret void
55}
56
57declare i32 @llvm.amdgcn.workitem.id.x() #0
58
59attributes #0 = { nounwind readnone }
60attributes #1 = { noinline nounwind }
61attributes #2 = { alwaysinline nounwind }
62