| ; RUN: opt -O1 -S -mtriple=amdgcn-unknown-amdhsa -amdgpu-internalize-symbols < %s | FileCheck -check-prefix=ALL -check-prefix=OPT %s | |
| ; RUN: opt -O0 -S -mtriple=amdgcn-unknown-amdhsa -amdgpu-internalize-symbols < %s | FileCheck -check-prefix=ALL -check-prefix=OPTNONE %s | |
| ; OPT-NOT: gvar_unused | |
| ; OPTNONE: gvar_unused | |
| @gvar_unused = addrspace(1) global i32 undef, align 4 | |
| ; ALL: gvar_used | |
| @gvar_used = addrspace(1) global i32 undef, align 4 | |
| ; ALL: define internal fastcc void @func_used_noinline( | |
| define fastcc void @func_used_noinline(i32 addrspace(1)* %out, i32 %tid) #1 { | |
| entry: | |
| store volatile i32 %tid, i32 addrspace(1)* %out | |
| ret void | |
| } | |
| ; OPTNONE: define internal fastcc void @func_used_alwaysinline( | |
| ; OPT-NOT: @func_used_alwaysinline | |
| define fastcc void @func_used_alwaysinline(i32 addrspace(1)* %out, i32 %tid) #2 { | |
| entry: | |
| store volatile i32 %tid, i32 addrspace(1)* %out | |
| ret void | |
| } | |
| ; OPTNONE: define internal void @func_unused( | |
| ; OPT-NOT: @func_unused | |
| define void @func_unused(i32 addrspace(1)* %out, i32 %tid) #1 { | |
| entry: | |
| store volatile i32 %tid, i32 addrspace(1)* %out | |
| ret void | |
| } | |
| ; ALL: define amdgpu_kernel void @kernel_unused( | |
| define amdgpu_kernel void @kernel_unused(i32 addrspace(1)* %out) #1 { | |
| entry: | |
| store volatile i32 1, i32 addrspace(1)* %out | |
| ret void | |
| } | |
| ; ALL: define amdgpu_kernel void @main_kernel() | |
| ; ALL: tail call i32 @llvm.amdgcn.workitem.id.x | |
| ; ALL: tail call fastcc void @func_used_noinline | |
| ; ALL: store volatile | |
| ; ALL: ret void | |
| define amdgpu_kernel void @main_kernel() { | |
| entry: | |
| %tid = tail call i32 @llvm.amdgcn.workitem.id.x() | |
| tail call fastcc void @func_used_noinline(i32 addrspace(1)* @gvar_used, i32 %tid) | |
| tail call fastcc void @func_used_alwaysinline(i32 addrspace(1)* @gvar_used, i32 %tid) | |
| ret void | |
| } | |
| declare i32 @llvm.amdgcn.workitem.id.x() #0 | |
| attributes #0 = { nounwind readnone } | |
| attributes #1 = { noinline nounwind } | |
| attributes #2 = { alwaysinline nounwind } |