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