blob: 212631676f29088968201498e0c97dde0bcb40c7 [file]
; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=amdgpu-lower-module-lds -amdgpu-enable-object-linking < %s | FileCheck %s
source_filename = "source_a.hip"
; Internal-linkage LDS variables used by multiple kernels must be packed into a
; per-module struct with a module-unique name, rather than promoted individually
; to external linkage, to avoid cross-TU name collisions.
@a = internal addrspace(3) global [32 x i32] poison, align 16
@b = internal addrspace(3) global [16 x float] poison, align 4
; Per-module struct containing both internal multi-user variables.
; CHECK: @[[INTERN:__amdgpu_lds.__internal\.[a-f0-9]+]] = external {{(dso_local )?}}addrspace(3) global %[[INTERN]].t, align 16
; Original internal-linkage variables should be removed.
; CHECK-NOT: @a =
; CHECK-NOT: @b =
; Both kernels reference the struct.
; CHECK-LABEL: define amdgpu_kernel void @kernel1()
; CHECK: @[[INTERN]]
; CHECK: @[[INTERN]]
; CHECK-LABEL: define amdgpu_kernel void @kernel2()
; CHECK: @[[INTERN]]
; CHECK: @[[INTERN]]
; Metadata: struct entries for both kernels.
; CHECK: !amdgpu.lds.uses = !{{{![0-9]+, ![0-9]+}}}
; CHECK-DAG: !{ptr @kernel1, ptr addrspace(3) @[[INTERN]]}
; CHECK-DAG: !{ptr @kernel2, ptr addrspace(3) @[[INTERN]]}
; Module should be marked with the link-time LDS module flag.
; CHECK: !{i32 1, !"amdgpu-link-time-lds", i32 1}
define amdgpu_kernel void @kernel1() {
%gep_a = getelementptr [32 x i32], ptr addrspace(3) @a, i32 0, i32 0
store i32 1, ptr addrspace(3) %gep_a
%gep_b = getelementptr [16 x float], ptr addrspace(3) @b, i32 0, i32 0
store float 2.0, ptr addrspace(3) %gep_b
ret void
}
define amdgpu_kernel void @kernel2() {
%gep_a = getelementptr [32 x i32], ptr addrspace(3) @a, i32 0, i32 0
store i32 3, ptr addrspace(3) %gep_a
%gep_b = getelementptr [16 x float], ptr addrspace(3) @b, i32 0, i32 0
store float 4.0, ptr addrspace(3) %gep_b
ret void
}