blob: 7d9042e212e0fe1e3e714ec3fcc3ccb0bd46db79 [file] [edit]
; 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]]}
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
}