xref: /llvm-project/llvm/test/CodeGen/AMDGPU/lower-indirect-lds-references.ll (revision ff55c9bc63ddd1bbe13376c25ae1fc327e3d5da2)
1*ff55c9bcSKareem Ergawy; RUN: opt -S -mtriple=amdgcn-- -passes=amdgpu-lower-module-lds < %s | FileCheck %s
2*ff55c9bcSKareem Ergawy
3*ff55c9bcSKareem Ergawy; Tests that the LDS lowering pass handles indirect references to LDS GVs; i.e.
4*ff55c9bcSKareem Ergawy; that it lowers to accesses into the generated LDS struct if these references
5*ff55c9bcSKareem Ergawy; are deep in the call graph starting at the kernel.
6*ff55c9bcSKareem Ergawy
7*ff55c9bcSKareem Ergawy@lds_item_to_indirectly_load = internal addrspace(3) global ptr poison, align 8
8*ff55c9bcSKareem Ergawy
9*ff55c9bcSKareem Ergawy%store_type = type { i32, ptr }
10*ff55c9bcSKareem Ergawy@place_to_store_indirect_caller = internal addrspace(3) global %store_type poison, align 8
11*ff55c9bcSKareem Ergawy
12*ff55c9bcSKareem Ergawydefine amdgpu_kernel void @offloading_kernel() {
13*ff55c9bcSKareem Ergawy  store ptr @indirectly_load_lds, ptr addrspace(3) getelementptr inbounds nuw (i8, ptr addrspace(3) @place_to_store_indirect_caller, i32 0), align 8
14*ff55c9bcSKareem Ergawy  call void @call_unknown()
15*ff55c9bcSKareem Ergawy  ret void
16*ff55c9bcSKareem Ergawy}
17*ff55c9bcSKareem Ergawy
18*ff55c9bcSKareem Ergawydefine void @call_unknown() {
19*ff55c9bcSKareem Ergawy  %1 = alloca ptr, align 8
20*ff55c9bcSKareem Ergawy  %2 = call i32 %1()
21*ff55c9bcSKareem Ergawy  ret void
22*ff55c9bcSKareem Ergawy}
23*ff55c9bcSKareem Ergawy
24*ff55c9bcSKareem Ergawydefine void @indirectly_load_lds() {
25*ff55c9bcSKareem Ergawy  call void @directly_load_lds()
26*ff55c9bcSKareem Ergawy  ret void
27*ff55c9bcSKareem Ergawy}
28*ff55c9bcSKareem Ergawy
29*ff55c9bcSKareem Ergawydefine void @directly_load_lds() {
30*ff55c9bcSKareem Ergawy  %2 = load ptr, ptr addrspace(3) @lds_item_to_indirectly_load, align 8
31*ff55c9bcSKareem Ergawy  ret void
32*ff55c9bcSKareem Ergawy}
33*ff55c9bcSKareem Ergawy
34*ff55c9bcSKareem Ergawy; CHECK: %[[LDS_STRUCT_TY:.*]] = type { %store_type, ptr }
35*ff55c9bcSKareem Ergawy; CHECK: @[[LDS_STRUCT:.*]] = {{.*}} %[[LDS_STRUCT_TY]] {{.*}} !absolute_symbol
36*ff55c9bcSKareem Ergawy
37*ff55c9bcSKareem Ergawy; CHECK: define amdgpu_kernel void @offloading_kernel() {{.*}} {
38*ff55c9bcSKareem Ergawy; CHECK:   store ptr @indirectly_load_lds, {{.*}} @[[LDS_STRUCT]]
39*ff55c9bcSKareem Ergawy; CHECK:   call void @call_unknown()
40*ff55c9bcSKareem Ergawy; CHECK: }
41*ff55c9bcSKareem Ergawy
42*ff55c9bcSKareem Ergawy; CHECK: define void @directly_load_lds() {
43*ff55c9bcSKareem Ergawy; CHECK:   load ptr, {{.*}} (%[[LDS_STRUCT_TY]], {{.*}} @[[LDS_STRUCT]], i32 0, i32 1)
44*ff55c9bcSKareem Ergawy; CHECK: }
45