111 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --scrub-attributes --check-globals all --version 52; REQUIRES: amdgpu-registered-target3; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=hipstdpar-select-accelerator-code \4; RUN: %s | FileCheck %s5 6%class.anon = type { i64, ptr, %struct.anon.1 }7%struct.anon.1 = type { ptr, ptr }8%struct.A = type { i32, i32, i32, i32, i32, double, [205 x double], [2000 x i32], [52000 x i32], [156000 x double], [14823 x double] }9 10@do_not_indirect = protected addrspace(4) externally_initialized constant [4 x double] [double 1.000000e+00, double 1.000000e+00, double 2.000000e+00, double 6.000000e+00], align 1611@a = external hidden local_unnamed_addr addrspace(1) global %struct.A, align 812@b = external hidden local_unnamed_addr addrspace(1) global ptr, align 813@c = internal addrspace(1) global { i32 } zeroinitializer, align 414@d = external hidden local_unnamed_addr addrspace(1) global ptr addrspace(1), align 815@__hipstdpar_symbol_indirection_table = weak_odr protected addrspace(4) externally_initialized constant %class.anon zeroinitializer, align 816 17declare i64 @fn(i64 %x, i32 %y, i64 %z, i64 %w)18 19;.20; CHECK: @do_not_indirect = protected addrspace(4) externally_initialized constant [4 x double] [double 1.000000e+00, double 1.000000e+00, double 2.000000e+00, double 6.000000e+00], align 1621; CHECK: @[[GLOB0:[0-9]+]] = private addrspace(1) constant [2 x i8] c"a\00"22; CHECK: @[[GLOB1:[0-9]+]] = private addrspace(1) externally_initialized constant ptr addrspace(1) poison23; CHECK: @[[GLOB2:[0-9]+]] = private addrspace(1) constant [2 x i8] c"b\00"24; CHECK: @[[GLOB3:[0-9]+]] = private addrspace(1) externally_initialized constant ptr addrspace(1) poison25; CHECK: @[[GLOB4:[0-9]+]] = private addrspace(1) constant [2 x i8] c"c\00"26; CHECK: @[[GLOB5:[0-9]+]] = private addrspace(1) externally_initialized constant ptr addrspace(1) poison27; CHECK: @[[GLOB6:[0-9]+]] = private addrspace(1) constant [2 x i8] c"d\00"28; CHECK: @[[GLOB7:[0-9]+]] = private addrspace(1) externally_initialized constant ptr addrspace(1) poison29; CHECK: @[[GLOB8:[0-9]+]] = private addrspace(1) constant [4 x %struct.anon.1] [%struct.anon.1 { ptr addrspacecast (ptr addrspace(1) @[[GLOB0]] to ptr), ptr addrspacecast (ptr addrspace(1) @[[GLOB1]] to ptr) }, %struct.anon.1 { ptr addrspacecast (ptr addrspace(1) @[[GLOB2]] to ptr), ptr addrspacecast (ptr addrspace(1) @[[GLOB3]] to ptr) }, %struct.anon.1 { ptr addrspacecast (ptr addrspace(1) @[[GLOB4]] to ptr), ptr addrspacecast (ptr addrspace(1) @[[GLOB5]] to ptr) }, %struct.anon.1 { ptr addrspacecast (ptr addrspace(1) @[[GLOB6]] to ptr), ptr addrspacecast (ptr addrspace(1) @[[GLOB7]] to ptr) }]30; CHECK: @__hipstdpar_symbol_indirection_table = weak_odr protected addrspace(4) externally_initialized constant %class.anon { i64 4, ptr addrspacecast (ptr addrspace(1) @[[GLOB8]] to ptr), %struct.anon.1 poison }, align 831;.32define double @gep(i64 %idx) {33; CHECK-LABEL: define double @gep(34; CHECK-SAME: i64 [[IDX:%.*]]) {35; CHECK-NEXT: [[ENTRY:.*:]]36; CHECK-NEXT: [[TMP0:%.*]] = load ptr addrspace(1), ptr addrspace(1) @[[GLOB1]], align 837; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(1) [[TMP0]], i64 21767238; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [156000 x double], ptr addrspace(1) [[TMP1]], i64 0, i64 [[IDX]]39; CHECK-NEXT: [[R:%.*]] = load double, ptr addrspace(1) [[ARRAYIDX]], align 840; CHECK-NEXT: ret double [[R]]41;42entry:43 %arrayidx = getelementptr inbounds [156000 x double], ptr addrspace(1) getelementptr inbounds nuw (i8, ptr addrspace(1) @a, i64 217672), i64 0, i64 %idx44 %r = load double, ptr addrspace(1) %arrayidx, align 845 ret double %r46}47 48define void @store(ptr %p) {49; CHECK-LABEL: define void @store(50; CHECK-SAME: ptr [[P:%.*]]) {51; CHECK-NEXT: [[ENTRY:.*:]]52; CHECK-NEXT: [[TMP0:%.*]] = load ptr addrspace(1), ptr addrspace(1) @[[GLOB3]], align 853; CHECK-NEXT: store ptr [[P]], ptr addrspace(1) [[TMP0]], align 854; CHECK-NEXT: ret void55;56entry:57 store ptr %p, ptr addrspace(1) @b, align 858 ret void59}60 61define i64 @chain(i64 %x, i32 %y, i64 %z) {62; CHECK-LABEL: define i64 @chain(63; CHECK-SAME: i64 [[X:%.*]], i32 [[Y:%.*]], i64 [[Z:%.*]]) {64; CHECK-NEXT: [[ENTRY:.*:]]65; CHECK-NEXT: [[TMP0:%.*]] = load ptr addrspace(1), ptr addrspace(1) @[[GLOB5]], align 866; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr addrspace(1) [[TMP0]] to ptr67; CHECK-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[TMP1]] to i6468; CHECK-NEXT: [[TMP3:%.*]] = call i64 @fn(i64 [[X]], i32 [[Y]], i64 [[TMP2]], i64 [[Z]])69; CHECK-NEXT: ret i64 [[TMP3]]70;71entry:72 %0 = call i64 @fn(i64 %x, i32 %y, i64 ptrtoint (ptr addrspacecast (ptr addrspace(1) @c to ptr) to i64), i64 %z)73 ret i64 %074}75 76define void @direct(ptr %p, i64 %n) {77; CHECK-LABEL: define void @direct(78; CHECK-SAME: ptr [[P:%.*]], i64 [[N:%.*]]) {79; CHECK-NEXT: [[ENTRY:.*:]]80; CHECK-NEXT: [[TMP0:%.*]] = load ptr addrspace(1), ptr addrspace(1) @[[GLOB7]], align 881; CHECK-NEXT: [[TMP1:%.*]] = load ptr addrspace(1), ptr addrspace(1) [[TMP0]], align 882; CHECK-NEXT: tail call void @llvm.memcpy.p0.p1.i64(ptr align 4 [[P]], ptr addrspace(1) align 4 [[TMP1]], i64 [[N]], i1 false)83; CHECK-NEXT: ret void84;85entry:86 %0 = load ptr addrspace(1), ptr addrspace(1) @d, align 887 tail call void @llvm.memcpy.p0.p1.i64(ptr align 4 %p, ptr addrspace(1) align 4 %0, i64 %n, i1 false)88 ret void89}90 91define amdgpu_kernel void @ensure_reachable(ptr %p, i64 %idx, i64 %x, i32 %y, i64 %z) {92; CHECK-LABEL: define amdgpu_kernel void @ensure_reachable(93; CHECK-SAME: ptr [[P:%.*]], i64 [[IDX:%.*]], i64 [[X:%.*]], i32 [[Y:%.*]], i64 [[Z:%.*]]) {94; CHECK-NEXT: [[ENTRY:.*:]]95; CHECK-NEXT: call void @store(ptr [[P]])96; CHECK-NEXT: [[TMP0:%.*]] = call double @gep(i64 [[IDX]])97; CHECK-NEXT: [[TMP1:%.*]] = call i64 @chain(i64 [[X]], i32 [[Y]], i64 [[Z]])98; CHECK-NEXT: call void @direct(ptr [[P]], i64 [[X]])99; CHECK-NEXT: ret void100;101entry:102 call void @store(ptr %p)103 %0 = call double @gep(i64 %idx)104 %1 = call i64 @chain(i64 %x, i32 %y, i64 %z)105 call void @direct(ptr %p, i64 %x)106 ret void107}108;.109; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }110;.111