| ; RUN: opt -S -mtriple=amdgpu-amd-amdhsa -passes=amdgpu-lower-module-lds -amdgpu-enable-object-linking < %s | FileCheck %s | |
| ; An internal (static) device function uses an internal LDS variable. | |
| ; The per-function struct must get a module-unique hash suffix to avoid | |
| ; cross-TU name collisions (two TUs can both have "static void helper()"). | |
| @lds_priv = internal addrspace(3) global [32 x i32] poison, align 16 | |
| declare void @extern_func() | |
| ; Struct name includes the function name AND a module-unique hash. | |
| ; CHECK: @[[STRUCT:__amdgpu_lds\.helper\.[a-f0-9]+]] = external {{(dso_local )?}}addrspace(3) global %[[STRUCT]].t, align 16 | |
| ; Original variable should be removed. | |
| ; CHECK-NOT: @lds_priv | |
| ; CHECK-LABEL: define internal void @helper() | |
| ; CHECK: getelementptr {{.*}} ptr addrspace(3) @[[STRUCT]] | |
| ; CHECK-LABEL: define amdgpu_kernel void @kernel() | |
| ; CHECK: call void @helper() | |
| ; CHECK: !amdgpu.lds.uses = !{{{![0-9]+}}} | |
| ; CHECK-DAG: !{ptr @helper, ptr addrspace(3) @[[STRUCT]]} | |
| define internal void @helper() { | |
| %gep = getelementptr [32 x i32], ptr addrspace(3) @lds_priv, i32 0, i32 0 | |
| store i32 1, ptr addrspace(3) %gep | |
| call void @extern_func() | |
| ret void | |
| } | |
| define amdgpu_kernel void @kernel() { | |
| call void @helper() | |
| ret void | |
| } |