xref: /llvm-project/llvm/test/Transforms/InferAddressSpaces/AMDGPU/insert-pos-assert.ll (revision 2d69827c5c754f0eca98e497ecf0e52ed54b4fd3)
10bb25b46SAustin Kerbow; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
25651af89SMatt Arsenault; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=infer-address-spaces %s | FileCheck %s
30bb25b46SAustin Kerbow
426b14c3eSAustin Kerbow; Addrspacecasts or bitcasts must be inserted after the instructions that define their uses.
50bb25b46SAustin Kerbow
6a982f095SMatt Arsenault%struct.s0 = type { ptr, i32 }
70bb25b46SAustin Kerbow%struct.s1 = type { %struct.s0 }
80bb25b46SAustin Kerbow
90bb25b46SAustin Kerbow@global0 = protected addrspace(4) externally_initialized global %struct.s1 zeroinitializer
100bb25b46SAustin Kerbow
11a982f095SMatt Arsenaultdeclare i32 @func(ptr %arg)
120bb25b46SAustin Kerbow
1326b14c3eSAustin Kerbowdefine i32 @addrspacecast_insert_pos_assert() {
1426b14c3eSAustin Kerbow; CHECK-LABEL: @addrspacecast_insert_pos_assert(
150bb25b46SAustin Kerbow; CHECK-NEXT:    [[ALLOCA:%.*]] = alloca i32, align 4, addrspace(5)
16a982f095SMatt Arsenault; CHECK-NEXT:    [[LOAD0:%.*]] = load ptr, ptr addrspace(4) @global0, align 8
17a982f095SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = addrspacecast ptr [[LOAD0]] to ptr addrspace(1)
18a982f095SMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = addrspacecast ptr addrspace(1) [[TMP1]] to ptr
19a982f095SMatt Arsenault; CHECK-NEXT:    [[LOAD1:%.*]] = load i32, ptr addrspace(5) [[ALLOCA]], align 4
200bb25b46SAustin Kerbow; CHECK-NEXT:    [[SEXT:%.*]] = sext i32 [[LOAD1]] to i64
21a982f095SMatt Arsenault; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 [[SEXT]]
22a982f095SMatt Arsenault; CHECK-NEXT:    [[CALL:%.*]] = call i32 @func(ptr [[GEP]])
230bb25b46SAustin Kerbow; CHECK-NEXT:    ret i32 [[CALL]]
240bb25b46SAustin Kerbow;
250bb25b46SAustin Kerbow  %alloca = alloca i32, align 4, addrspace(5)
26a982f095SMatt Arsenault  %cast = addrspacecast ptr addrspace(5) %alloca to ptr
27a982f095SMatt Arsenault  %load0 = load ptr, ptr addrspace(4) @global0
28a982f095SMatt Arsenault  %load1 = load i32, ptr %cast
290bb25b46SAustin Kerbow  %sext = sext i32 %load1 to i64
30a982f095SMatt Arsenault  %gep = getelementptr inbounds i32, ptr %load0, i64 %sext
31a982f095SMatt Arsenault  %call = call i32 @func(ptr %gep)
320bb25b46SAustin Kerbow  ret i32 %call
330bb25b46SAustin Kerbow}
3426b14c3eSAustin Kerbow
3526b14c3eSAustin Kerbowdefine void @bitcast_insert_pos_assert_1() {
3626b14c3eSAustin Kerbow; CHECK-LABEL: @bitcast_insert_pos_assert_1(
3726b14c3eSAustin Kerbow; CHECK-NEXT:  bb.0:
38a982f095SMatt Arsenault; CHECK-NEXT:    [[ASC0:%.*]] = addrspacecast ptr addrspace(5) undef to ptr
39a982f095SMatt Arsenault; CHECK-NEXT:    [[PTI0:%.*]] = ptrtoint ptr [[ASC0]] to i64
4026b14c3eSAustin Kerbow; CHECK-NEXT:    br label [[BB_1:%.*]]
4126b14c3eSAustin Kerbow; CHECK:       bb.1:
4226b14c3eSAustin Kerbow; CHECK-NEXT:    br i1 undef, label [[BB_2:%.*]], label [[BB_3:%.*]]
4326b14c3eSAustin Kerbow; CHECK:       bb.2:
44a982f095SMatt Arsenault; CHECK-NEXT:    [[LOAD0:%.*]] = load ptr, ptr addrspace(5) undef, align 8
4526b14c3eSAustin Kerbow; CHECK-NEXT:    br label [[BB_3]]
4626b14c3eSAustin Kerbow; CHECK:       bb.3:
4726b14c3eSAustin Kerbow; CHECK-NEXT:    ret void
4826b14c3eSAustin Kerbow;
4926b14c3eSAustin Kerbowbb.0:
50a982f095SMatt Arsenault  %asc0 = addrspacecast ptr addrspace(5) undef to ptr
51a982f095SMatt Arsenault  %pti0 = ptrtoint ptr %asc0 to i64
5226b14c3eSAustin Kerbow  br label %bb.1
5326b14c3eSAustin Kerbow
5426b14c3eSAustin Kerbowbb.1:
5526b14c3eSAustin Kerbow  br i1 undef, label %bb.2, label %bb.3
5626b14c3eSAustin Kerbow
5726b14c3eSAustin Kerbowbb.2:
58a982f095SMatt Arsenault  %pti1 = ptrtoint ptr %asc0 to i64
59a982f095SMatt Arsenault  %itp0 = inttoptr i64 %pti1 to ptr
60a982f095SMatt Arsenault  %load0 = load ptr, ptr %itp0, align 8
6126b14c3eSAustin Kerbow  br label %bb.3
6226b14c3eSAustin Kerbow
6326b14c3eSAustin Kerbowbb.3:
6426b14c3eSAustin Kerbow  ret void
6526b14c3eSAustin Kerbow}
6626b14c3eSAustin Kerbow
6726b14c3eSAustin Kerbowdefine void @bitcast_insert_pos_assert_2() {
6826b14c3eSAustin Kerbow; CHECK-LABEL: @bitcast_insert_pos_assert_2(
6926b14c3eSAustin Kerbow; CHECK-NEXT:    [[ALLOCA0:%.*]] = alloca [[STRUCT_S1:%.*]], align 16, addrspace(5)
70a982f095SMatt Arsenault; CHECK-NEXT:    [[ASC0:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA0]] to ptr
71a982f095SMatt Arsenault; CHECK-NEXT:    [[PTI0:%.*]] = ptrtoint ptr [[ASC0]] to i64
72a982f095SMatt Arsenault; CHECK-NEXT:    [[ITP0:%.*]] = inttoptr i64 [[PTI0]] to ptr
73a982f095SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA0]] to ptr
74a982f095SMatt Arsenault; CHECK-NEXT:    [[GEP0:%.*]] = getelementptr i64, ptr [[TMP1]], i64 1
7526b14c3eSAustin Kerbow; CHECK-NEXT:    ret void
7626b14c3eSAustin Kerbow;
7726b14c3eSAustin Kerbow  %alloca0 = alloca %struct.s1, align 16, addrspace(5)
78a982f095SMatt Arsenault  %asc0 = addrspacecast ptr addrspace(5) %alloca0 to ptr
79a982f095SMatt Arsenault  %pti0 = ptrtoint ptr %asc0 to i64
80a982f095SMatt Arsenault  %itp0 = inttoptr i64 %pti0 to ptr
81a982f095SMatt Arsenault  %itp1 = ptrtoint ptr %asc0 to i64
82a982f095SMatt Arsenault  %itp2 = inttoptr i64 %itp1 to ptr
83*2d69827cSNikita Popov  %gep0 = getelementptr i64, ptr %itp2, i64 1
8426b14c3eSAustin Kerbow  ret void
8526b14c3eSAustin Kerbow}
86