212 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=infer-address-spaces %s | FileCheck %s3; Ports of most of test/CodeGen/NVPTX/access-non-generic.ll4 5@scalar = internal addrspace(3) global float 0.0, align 46@array = internal addrspace(3) global [10 x float] zeroinitializer, align 47 8define amdgpu_kernel void @load_store_lds_f32(i32 %i, float %v) #0 {9; CHECK-LABEL: define amdgpu_kernel void @load_store_lds_f32(10; CHECK-SAME: i32 [[I:%.*]], float [[V:%.*]]) #[[ATTR0:[0-9]+]] {11; CHECK-NEXT: [[BB:.*:]]12; CHECK-NEXT: [[TMP:%.*]] = load float, ptr addrspace(3) @scalar, align 413; CHECK-NEXT: call void @use(float [[TMP]])14; CHECK-NEXT: store float [[V]], ptr addrspace(3) @scalar, align 415; CHECK-NEXT: call void @llvm.amdgcn.s.barrier()16; CHECK-NEXT: [[TMP2:%.*]] = load float, ptr addrspace(3) @scalar, align 417; CHECK-NEXT: call void @use(float [[TMP2]])18; CHECK-NEXT: store float [[V]], ptr addrspace(3) @scalar, align 419; CHECK-NEXT: call void @llvm.amdgcn.s.barrier()20; CHECK-NEXT: [[TMP3:%.*]] = load float, ptr addrspace(3) getelementptr inbounds ([10 x float], ptr addrspace(3) @array, i32 0, i32 5), align 421; CHECK-NEXT: call void @use(float [[TMP3]])22; CHECK-NEXT: store float [[V]], ptr addrspace(3) getelementptr inbounds ([10 x float], ptr addrspace(3) @array, i32 0, i32 5), align 423; CHECK-NEXT: call void @llvm.amdgcn.s.barrier()24; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds [10 x float], ptr addrspace(3) @array, i32 0, i32 525; CHECK-NEXT: [[TMP5:%.*]] = load float, ptr addrspace(3) [[TMP4]], align 426; CHECK-NEXT: call void @use(float [[TMP5]])27; CHECK-NEXT: store float [[V]], ptr addrspace(3) [[TMP4]], align 428; CHECK-NEXT: call void @llvm.amdgcn.s.barrier()29; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds [10 x float], ptr addrspace(3) @array, i32 0, i32 [[I]]30; CHECK-NEXT: [[TMP8:%.*]] = load float, ptr addrspace(3) [[TMP7]], align 431; CHECK-NEXT: call void @use(float [[TMP8]])32; CHECK-NEXT: store float [[V]], ptr addrspace(3) [[TMP7]], align 433; CHECK-NEXT: call void @llvm.amdgcn.s.barrier()34; CHECK-NEXT: ret void35;36bb:37 %tmp = load float, ptr addrspacecast (ptr addrspace(3) @scalar to ptr), align 438 call void @use(float %tmp)39 store float %v, ptr addrspacecast (ptr addrspace(3) @scalar to ptr), align 440 call void @llvm.amdgcn.s.barrier()41 %tmp1 = addrspacecast ptr addrspace(3) @scalar to ptr42 %tmp2 = load float, ptr %tmp1, align 443 call void @use(float %tmp2)44 store float %v, ptr %tmp1, align 445 call void @llvm.amdgcn.s.barrier()46 %tmp3 = load float, ptr getelementptr inbounds ([10 x float], ptr addrspacecast (ptr addrspace(3) @array to ptr), i32 0, i32 5), align 447 call void @use(float %tmp3)48 store float %v, ptr getelementptr inbounds ([10 x float], ptr addrspacecast (ptr addrspace(3) @array to ptr), i32 0, i32 5), align 449 call void @llvm.amdgcn.s.barrier()50 %tmp4 = getelementptr inbounds [10 x float], ptr addrspacecast (ptr addrspace(3) @array to ptr), i32 0, i32 551 %tmp5 = load float, ptr %tmp4, align 452 call void @use(float %tmp5)53 store float %v, ptr %tmp4, align 454 call void @llvm.amdgcn.s.barrier()55 %tmp6 = addrspacecast ptr addrspace(3) @array to ptr56 %tmp7 = getelementptr inbounds [10 x float], ptr %tmp6, i32 0, i32 %i57 %tmp8 = load float, ptr %tmp7, align 458 call void @use(float %tmp8)59 store float %v, ptr %tmp7, align 460 call void @llvm.amdgcn.s.barrier()61 ret void62}63 64define i32 @constexpr_load_int_from_float_lds() #0 {65; CHECK-LABEL: define i32 @constexpr_load_int_from_float_lds(66; CHECK-SAME: ) #[[ATTR0]] {67; CHECK-NEXT: [[BB:.*:]]68; CHECK-NEXT: [[TMP:%.*]] = load i32, ptr addrspace(3) @scalar, align 469; CHECK-NEXT: ret i32 [[TMP]]70;71bb:72 %tmp = load i32, ptr addrspacecast (ptr addrspace(3) @scalar to ptr), align 473 ret i32 %tmp74}75 76define i32 @load_int_from_global_float(ptr addrspace(1) %input, i32 %i, i32 %j) #0 {77; CHECK-LABEL: define i32 @load_int_from_global_float(78; CHECK-SAME: ptr addrspace(1) [[INPUT:%.*]], i32 [[I:%.*]], i32 [[J:%.*]]) #[[ATTR0]] {79; CHECK-NEXT: [[BB:.*:]]80; CHECK-NEXT: [[TMP1:%.*]] = getelementptr float, ptr addrspace(1) [[INPUT]], i32 [[I]]81; CHECK-NEXT: [[TMP2:%.*]] = getelementptr float, ptr addrspace(1) [[TMP1]], i32 [[J]]82; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(1) [[TMP2]], align 483; CHECK-NEXT: ret i32 [[TMP4]]84;85bb:86 %tmp = addrspacecast ptr addrspace(1) %input to ptr87 %tmp1 = getelementptr float, ptr %tmp, i32 %i88 %tmp2 = getelementptr float, ptr %tmp1, i32 %j89 %tmp4 = load i32, ptr %tmp290 ret i32 %tmp491}92 93define amdgpu_kernel void @nested_const_expr() #0 {94; CHECK-LABEL: define amdgpu_kernel void @nested_const_expr(95; CHECK-SAME: ) #[[ATTR0]] {96; CHECK-NEXT: store i32 1, ptr addrspace(3) getelementptr ([10 x float], ptr addrspace(3) @array, i64 0, i64 1), align 497; CHECK-NEXT: ret void98;99 store i32 1, ptr bitcast (ptr getelementptr ([10 x float], ptr addrspacecast (ptr addrspace(3) @array to ptr), i64 0, i64 1) to ptr), align 4100 101 ret void102}103 104define amdgpu_kernel void @rauw(ptr addrspace(1) %input) #0 {105; CHECK-LABEL: define amdgpu_kernel void @rauw(106; CHECK-SAME: ptr addrspace(1) [[INPUT:%.*]]) #[[ATTR0]] {107; CHECK-NEXT: [[BB:.*:]]108; CHECK-NEXT: [[ADDR:%.*]] = getelementptr float, ptr addrspace(1) [[INPUT]], i64 10109; CHECK-NEXT: [[V:%.*]] = load float, ptr addrspace(1) [[ADDR]], align 4110; CHECK-NEXT: store float [[V]], ptr addrspace(1) [[ADDR]], align 4111; CHECK-NEXT: ret void112;113bb:114 %generic_input = addrspacecast ptr addrspace(1) %input to ptr115 %addr = getelementptr float, ptr %generic_input, i64 10116 %v = load float, ptr %addr117 store float %v, ptr %addr118 ret void119}120 121; FIXME: Should be able to eliminate the cast inside the loop122define amdgpu_kernel void @loop() #0 {123; CHECK-LABEL: define amdgpu_kernel void @loop(124; CHECK-SAME: ) #[[ATTR0]] {125; CHECK-NEXT: [[ENTRY:.*]]:126; CHECK-NEXT: [[END:%.*]] = getelementptr float, ptr addrspace(3) @array, i64 10127; CHECK-NEXT: br label %[[LOOP:.*]]128; CHECK: [[LOOP]]:129; CHECK-NEXT: [[I:%.*]] = phi ptr addrspace(3) [ @array, %[[ENTRY]] ], [ [[I2:%.*]], %[[LOOP]] ]130; CHECK-NEXT: [[V:%.*]] = load float, ptr addrspace(3) [[I]], align 4131; CHECK-NEXT: call void @use(float [[V]])132; CHECK-NEXT: [[I2]] = getelementptr float, ptr addrspace(3) [[I]], i64 1133; CHECK-NEXT: [[EXIT_COND:%.*]] = icmp eq ptr addrspace(3) [[I2]], [[END]]134; CHECK-NEXT: br i1 [[EXIT_COND]], label %[[EXIT:.*]], label %[[LOOP]]135; CHECK: [[EXIT]]:136; CHECK-NEXT: ret void137;138entry:139 %p = addrspacecast ptr addrspace(3) @array to ptr140 %end = getelementptr float, ptr %p, i64 10141 br label %loop142 143loop: ; preds = %loop, %entry144 %i = phi ptr [ %p, %entry ], [ %i2, %loop ]145 %v = load float, ptr %i146 call void @use(float %v)147 %i2 = getelementptr float, ptr %i, i64 1148 %exit_cond = icmp eq ptr %i2, %end149 br i1 %exit_cond, label %exit, label %loop150 151exit: ; preds = %loop152 ret void153}154 155@generic_end = external addrspace(1) global ptr156 157define amdgpu_kernel void @loop_with_generic_bound() #0 {158; CHECK-LABEL: define amdgpu_kernel void @loop_with_generic_bound(159; CHECK-SAME: ) #[[ATTR0]] {160; CHECK-NEXT: [[ENTRY:.*]]:161; CHECK-NEXT: [[END:%.*]] = load ptr, ptr addrspace(1) @generic_end, align 8162; CHECK-NEXT: br label %[[LOOP:.*]]163; CHECK: [[LOOP]]:164; CHECK-NEXT: [[I:%.*]] = phi ptr addrspace(3) [ @array, %[[ENTRY]] ], [ [[I2:%.*]], %[[LOOP]] ]165; CHECK-NEXT: [[V:%.*]] = load float, ptr addrspace(3) [[I]], align 4166; CHECK-NEXT: call void @use(float [[V]])167; CHECK-NEXT: [[I2]] = getelementptr float, ptr addrspace(3) [[I]], i64 1168; CHECK-NEXT: [[TMP0:%.*]] = addrspacecast ptr addrspace(3) [[I2]] to ptr169; CHECK-NEXT: [[EXIT_COND:%.*]] = icmp eq ptr [[TMP0]], [[END]]170; CHECK-NEXT: br i1 [[EXIT_COND]], label %[[EXIT:.*]], label %[[LOOP]]171; CHECK: [[EXIT]]:172; CHECK-NEXT: ret void173;174entry:175 %p = addrspacecast ptr addrspace(3) @array to ptr176 %end = load ptr, ptr addrspace(1) @generic_end177 br label %loop178 179loop: ; preds = %loop, %entry180 %i = phi ptr [ %p, %entry ], [ %i2, %loop ]181 %v = load float, ptr %i182 call void @use(float %v)183 %i2 = getelementptr float, ptr %i, i64 1184 %exit_cond = icmp eq ptr %i2, %end185 br i1 %exit_cond, label %exit, label %loop186 187exit: ; preds = %loop188 ret void189}190 191define void @select_bug() #0 {192; CHECK-LABEL: define void @select_bug(193; CHECK-SAME: ) #[[ATTR0]] {194; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr inttoptr (i64 4873 to ptr), null195; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i64 73, i64 93196; CHECK-NEXT: [[ADD_PTR157:%.*]] = getelementptr inbounds i64, ptr poison, i64 [[SEL]]197; CHECK-NEXT: [[CMP169:%.*]] = icmp uge ptr poison, [[ADD_PTR157]]198; CHECK-NEXT: unreachable199;200 %cmp = icmp ne ptr inttoptr (i64 4873 to ptr), null201 %sel = select i1 %cmp, i64 73, i64 93202 %add.ptr157 = getelementptr inbounds i64, ptr poison, i64 %sel203 %cmp169 = icmp uge ptr poison, %add.ptr157204 unreachable205}206 207declare void @llvm.amdgcn.s.barrier() #1208declare void @use(float) #0209 210attributes #0 = { nounwind }211attributes #1 = { convergent nounwind }212