| ; 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 } |