; RUN: opt -S -mtriple=amdgcn-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 }