xref: /llvm-project/llvm/test/Transforms/LICM/AMDGPU/buffer-rsrc-ptrs.ll (revision 23098bd4542e76b897696f1d542a26caa5c25020)
1faa2c678SKrzysztof Drewniak; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2faa2c678SKrzysztof Drewniak; RUN: opt < %s -aa-pipeline=basic-aa,scoped-noalias-aa -passes=licm -S | FileCheck %s
3faa2c678SKrzysztof Drewniak
4faa2c678SKrzysztof Drewniaktarget triple = "amdgcn-amd-amdhsa"
5faa2c678SKrzysztof Drewniak
6faa2c678SKrzysztof Drewniakdefine void @hoistable_noalias(ptr addrspace(8) noalias %p, ptr addrspace(8) noalias %q, i32 %bound) {
7faa2c678SKrzysztof Drewniak; CHECK-LABEL: define void @hoistable_noalias
8faa2c678SKrzysztof Drewniak; CHECK-SAME: (ptr addrspace(8) noalias [[P:%.*]], ptr addrspace(8) noalias [[Q:%.*]], i32 [[BOUND:%.*]]) {
9faa2c678SKrzysztof Drewniak; CHECK-NEXT:  entry:
10faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[HOISTABLE:%.*]] = call i32 @llvm.amdgcn.struct.ptr.buffer.load.i32(ptr addrspace(8) [[Q]], i32 0, i32 0, i32 0, i32 0)
11faa2c678SKrzysztof Drewniak; CHECK-NEXT:    br label [[LOOP:%.*]]
12faa2c678SKrzysztof Drewniak; CHECK:       loop:
13faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]
14faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[ORIG:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) [[P]], i32 [[I]], i32 0, i32 0)
15faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[INC:%.*]] = add i32 [[HOISTABLE]], [[ORIG]]
16faa2c678SKrzysztof Drewniak; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 [[INC]], ptr addrspace(8) [[P]], i32 [[I]], i32 0, i32 0)
17faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[NEXT]] = add i32 [[I]], 1
18faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[COND:%.*]] = icmp ult i32 [[NEXT]], [[BOUND]]
19faa2c678SKrzysztof Drewniak; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[TAIL:%.*]]
20faa2c678SKrzysztof Drewniak; CHECK:       tail:
21faa2c678SKrzysztof Drewniak; CHECK-NEXT:    ret void
22faa2c678SKrzysztof Drewniak;
23faa2c678SKrzysztof Drewniakentry:
24faa2c678SKrzysztof Drewniak  br label %loop
25faa2c678SKrzysztof Drewniakloop:
26faa2c678SKrzysztof Drewniak  %i = phi i32 [0, %entry], [%next, %loop]
27faa2c678SKrzysztof Drewniak
28faa2c678SKrzysztof Drewniak  %hoistable = call i32 @llvm.amdgcn.struct.ptr.buffer.load.i32(ptr addrspace(8) %q, i32 0, i32 0, i32 0, i32 0)
29faa2c678SKrzysztof Drewniak  %orig = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) %p, i32 %i, i32 0, i32 0)
30faa2c678SKrzysztof Drewniak  %inc = add i32 %hoistable, %orig
31faa2c678SKrzysztof Drewniak  call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 %inc, ptr addrspace(8) %p, i32 %i, i32 0, i32 0)
32faa2c678SKrzysztof Drewniak
33faa2c678SKrzysztof Drewniak  %next = add i32 %i, 1
34faa2c678SKrzysztof Drewniak  %cond = icmp ult i32 %next, %bound
35faa2c678SKrzysztof Drewniak  br i1 %cond, label %loop, label %tail
36faa2c678SKrzysztof Drewniaktail:
37faa2c678SKrzysztof Drewniak  ret void
38faa2c678SKrzysztof Drewniak}
39faa2c678SKrzysztof Drewniak
40faa2c678SKrzysztof Drewniakdefine void @not_hoistable_may_alias(ptr addrspace(8) %p, ptr addrspace(8) %q, i32 %bound) {
41faa2c678SKrzysztof Drewniak; CHECK-LABEL: define void @not_hoistable_may_alias
42faa2c678SKrzysztof Drewniak; CHECK-SAME: (ptr addrspace(8) [[P:%.*]], ptr addrspace(8) [[Q:%.*]], i32 [[BOUND:%.*]]) {
43faa2c678SKrzysztof Drewniak; CHECK-NEXT:  entry:
44faa2c678SKrzysztof Drewniak; CHECK-NEXT:    br label [[LOOP:%.*]]
45faa2c678SKrzysztof Drewniak; CHECK:       loop:
46faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]
47faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[NOT_HOISTABLE:%.*]] = call i32 @llvm.amdgcn.struct.ptr.buffer.load.i32(ptr addrspace(8) [[Q]], i32 0, i32 0, i32 0, i32 0)
48faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[ORIG:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) [[P]], i32 [[I]], i32 0, i32 0)
49faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[INC:%.*]] = add i32 [[NOT_HOISTABLE]], [[ORIG]]
50faa2c678SKrzysztof Drewniak; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 [[INC]], ptr addrspace(8) [[P]], i32 [[I]], i32 0, i32 0)
51faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[NEXT]] = add i32 [[I]], 1
52faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[COND:%.*]] = icmp ult i32 [[NEXT]], [[BOUND]]
53faa2c678SKrzysztof Drewniak; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[TAIL:%.*]]
54faa2c678SKrzysztof Drewniak; CHECK:       tail:
55faa2c678SKrzysztof Drewniak; CHECK-NEXT:    ret void
56faa2c678SKrzysztof Drewniak;
57faa2c678SKrzysztof Drewniakentry:
58faa2c678SKrzysztof Drewniak  br label %loop
59faa2c678SKrzysztof Drewniakloop:
60faa2c678SKrzysztof Drewniak  %i = phi i32 [0, %entry], [%next, %loop]
61faa2c678SKrzysztof Drewniak
62faa2c678SKrzysztof Drewniak  %not.hoistable = call i32 @llvm.amdgcn.struct.ptr.buffer.load.i32(ptr addrspace(8) %q, i32 0, i32 0, i32 0, i32 0)
63faa2c678SKrzysztof Drewniak  %orig = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) %p, i32 %i, i32 0, i32 0)
64faa2c678SKrzysztof Drewniak  %inc = add i32 %not.hoistable, %orig
65faa2c678SKrzysztof Drewniak  call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 %inc, ptr addrspace(8) %p, i32 %i, i32 0, i32 0)
66faa2c678SKrzysztof Drewniak
67faa2c678SKrzysztof Drewniak  %next = add i32 %i, 1
68faa2c678SKrzysztof Drewniak  %cond = icmp ult i32 %next, %bound
69faa2c678SKrzysztof Drewniak  br i1 %cond, label %loop, label %tail
70faa2c678SKrzysztof Drewniaktail:
71faa2c678SKrzysztof Drewniak  ret void
72faa2c678SKrzysztof Drewniak}
73faa2c678SKrzysztof Drewniak
74faa2c678SKrzysztof Drewniakdefine void @hoistable_alias_scope(ptr addrspace(8) %p, ptr addrspace(8) %q, i32 %bound) {
75faa2c678SKrzysztof Drewniak; CHECK-LABEL: define void @hoistable_alias_scope
76faa2c678SKrzysztof Drewniak; CHECK-SAME: (ptr addrspace(8) [[P:%.*]], ptr addrspace(8) [[Q:%.*]], i32 [[BOUND:%.*]]) {
77faa2c678SKrzysztof Drewniak; CHECK-NEXT:  entry:
78faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[HOISTABLE:%.*]] = call i32 @llvm.amdgcn.struct.ptr.buffer.load.i32(ptr addrspace(8) [[Q]], i32 0, i32 0, i32 0, i32 0), !alias.scope !0, !noalias !3
79faa2c678SKrzysztof Drewniak; CHECK-NEXT:    br label [[LOOP:%.*]]
80faa2c678SKrzysztof Drewniak; CHECK:       loop:
81faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]
82faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[ORIG:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) [[P]], i32 [[I]], i32 0, i32 0), !alias.scope !3, !noalias !0
83faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[INC:%.*]] = add i32 [[HOISTABLE]], [[ORIG]]
84faa2c678SKrzysztof Drewniak; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 [[INC]], ptr addrspace(8) [[P]], i32 [[I]], i32 0, i32 0), !alias.scope !3, !noalias !0
85faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[NEXT]] = add i32 [[I]], 1
86faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[COND:%.*]] = icmp ult i32 [[NEXT]], [[BOUND]]
87faa2c678SKrzysztof Drewniak; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[TAIL:%.*]]
88faa2c678SKrzysztof Drewniak; CHECK:       tail:
89faa2c678SKrzysztof Drewniak; CHECK-NEXT:    ret void
90faa2c678SKrzysztof Drewniak;
91faa2c678SKrzysztof Drewniakentry:
92faa2c678SKrzysztof Drewniak  br label %loop
93faa2c678SKrzysztof Drewniakloop:
94faa2c678SKrzysztof Drewniak  %i = phi i32 [0, %entry], [%next, %loop]
95faa2c678SKrzysztof Drewniak
96faa2c678SKrzysztof Drewniak  %hoistable = call i32 @llvm.amdgcn.struct.ptr.buffer.load.i32(ptr addrspace(8) %q, i32 0, i32 0, i32 0, i32 0), !alias.scope !4, !noalias !3
97faa2c678SKrzysztof Drewniak  %orig = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) %p, i32 %i, i32 0, i32 0), !alias.scope !3, !noalias !4
98faa2c678SKrzysztof Drewniak  %inc = add i32 %hoistable, %orig
99faa2c678SKrzysztof Drewniak  call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 %inc, ptr addrspace(8) %p, i32 %i, i32 0, i32 0), !alias.scope !3, !noalias !4
100faa2c678SKrzysztof Drewniak
101faa2c678SKrzysztof Drewniak  %next = add i32 %i, 1
102faa2c678SKrzysztof Drewniak  %cond = icmp ult i32 %next, %bound
103faa2c678SKrzysztof Drewniak  br i1 %cond, label %loop, label %tail
104faa2c678SKrzysztof Drewniaktail:
105faa2c678SKrzysztof Drewniak  ret void
106faa2c678SKrzysztof Drewniak}
107faa2c678SKrzysztof Drewniak!0 = !{!0, !"hoisting"}
108faa2c678SKrzysztof Drewniak!1 = !{!1, !0, !"p"}
109faa2c678SKrzysztof Drewniak!2 = !{!2, !0, !"q"}
110faa2c678SKrzysztof Drewniak
111faa2c678SKrzysztof Drewniak!3 = !{!1}
112faa2c678SKrzysztof Drewniak!4 = !{!2}
113faa2c678SKrzysztof Drewniak
114faa2c678SKrzysztof Drewniakdefine void @not_hoistable_buffer_construction(ptr addrspace(1) noalias %p.global, ptr addrspace(1) noalias %q.global, i32 %bound) {
115faa2c678SKrzysztof Drewniak; CHECK-LABEL: define void @not_hoistable_buffer_construction
116faa2c678SKrzysztof Drewniak; CHECK-SAME: (ptr addrspace(1) noalias [[P_GLOBAL:%.*]], ptr addrspace(1) noalias [[Q_GLOBAL:%.*]], i32 [[BOUND:%.*]]) {
117faa2c678SKrzysztof Drewniak; CHECK-NEXT:  entry:
118faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[P_GLOBAL_INT:%.*]] = ptrtoint ptr addrspace(1) [[P_GLOBAL]] to i64
119faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[Q_GLOBAL_INT:%.*]] = ptrtoint ptr addrspace(1) [[Q_GLOBAL]] to i64
120faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[P_TRUNC:%.*]] = trunc i64 [[P_GLOBAL_INT]] to i48
121faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[Q_TRUNC:%.*]] = trunc i64 [[Q_GLOBAL_INT]] to i48
122faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[P_EXT:%.*]] = zext i48 [[P_TRUNC]] to i128
123faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[Q_EXT:%.*]] = zext i48 [[Q_TRUNC]] to i128
124faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[P:%.*]] = inttoptr i128 [[P_EXT]] to ptr addrspace(8)
125faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[Q:%.*]] = inttoptr i128 [[Q_EXT]] to ptr addrspace(8)
126faa2c678SKrzysztof Drewniak; CHECK-NEXT:    br label [[LOOP:%.*]]
127faa2c678SKrzysztof Drewniak; CHECK:       loop:
128faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]
129faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[NOT_HOISTABLE:%.*]] = call i32 @llvm.amdgcn.struct.ptr.buffer.load.i32(ptr addrspace(8) [[Q]], i32 0, i32 0, i32 0, i32 0)
130faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[ORIG:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) [[P]], i32 [[I]], i32 0, i32 0)
131faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[INC:%.*]] = add i32 [[NOT_HOISTABLE]], [[ORIG]]
132faa2c678SKrzysztof Drewniak; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 [[INC]], ptr addrspace(8) [[P]], i32 [[I]], i32 0, i32 0)
133faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[NEXT]] = add i32 [[I]], 1
134faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[COND:%.*]] = icmp ult i32 [[NEXT]], [[BOUND]]
135faa2c678SKrzysztof Drewniak; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[TAIL:%.*]]
136faa2c678SKrzysztof Drewniak; CHECK:       tail:
137faa2c678SKrzysztof Drewniak; CHECK-NEXT:    ret void
138faa2c678SKrzysztof Drewniak;
139faa2c678SKrzysztof Drewniakentry:
140faa2c678SKrzysztof Drewniak  %p.global.int = ptrtoint ptr addrspace(1) %p.global to i64
141faa2c678SKrzysztof Drewniak  %q.global.int = ptrtoint ptr addrspace(1) %q.global to i64
142faa2c678SKrzysztof Drewniak  %p.trunc = trunc i64 %p.global.int to i48
143faa2c678SKrzysztof Drewniak  %q.trunc = trunc i64 %q.global.int to i48
144faa2c678SKrzysztof Drewniak  %p.ext = zext i48 %p.trunc to i128
145faa2c678SKrzysztof Drewniak  %q.ext = zext i48 %q.trunc to i128
146faa2c678SKrzysztof Drewniak  %p = inttoptr i128 %p.ext to ptr addrspace(8)
147faa2c678SKrzysztof Drewniak  %q = inttoptr i128 %q.ext to ptr addrspace(8)
148faa2c678SKrzysztof Drewniak  br label %loop
149faa2c678SKrzysztof Drewniakloop:
150faa2c678SKrzysztof Drewniak  %i = phi i32 [0, %entry], [%next, %loop]
151faa2c678SKrzysztof Drewniak
152faa2c678SKrzysztof Drewniak  %not.hoistable = call i32 @llvm.amdgcn.struct.ptr.buffer.load.i32(ptr addrspace(8) %q, i32 0, i32 0, i32 0, i32 0)
153faa2c678SKrzysztof Drewniak  %orig = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) %p, i32 %i, i32 0, i32 0)
154faa2c678SKrzysztof Drewniak  %inc = add i32 %not.hoistable, %orig
155faa2c678SKrzysztof Drewniak  call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 %inc, ptr addrspace(8) %p, i32 %i, i32 0, i32 0)
156faa2c678SKrzysztof Drewniak
157faa2c678SKrzysztof Drewniak  %next = add i32 %i, 1
158faa2c678SKrzysztof Drewniak  %cond = icmp ult i32 %next, %bound
159faa2c678SKrzysztof Drewniak  br i1 %cond, label %loop, label %tail
160faa2c678SKrzysztof Drewniaktail:
161faa2c678SKrzysztof Drewniak  ret void
162faa2c678SKrzysztof Drewniak}
163faa2c678SKrzysztof Drewniak
164*23098bd4SKrzysztof Drewniakdefine void @hoistable_buffer_construction_intrinsic(ptr addrspace(1) noalias %p.global, ptr addrspace(1) noalias %q.global, i32 %bound) {
165*23098bd4SKrzysztof Drewniak; CHECK-LABEL: define void @hoistable_buffer_construction_intrinsic
166*23098bd4SKrzysztof Drewniak; CHECK-SAME: (ptr addrspace(1) noalias [[P_GLOBAL:%.*]], ptr addrspace(1) noalias [[Q_GLOBAL:%.*]], i32 [[BOUND:%.*]]) {
167*23098bd4SKrzysztof Drewniak; CHECK-NEXT:  entry:
168*23098bd4SKrzysztof Drewniak; CHECK-NEXT:    [[P:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p1(ptr addrspace(1) [[P_GLOBAL]], i16 0, i32 0, i32 0)
169*23098bd4SKrzysztof Drewniak; CHECK-NEXT:    [[Q:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p1(ptr addrspace(1) [[Q_GLOBAL]], i16 0, i32 0, i32 0)
170*23098bd4SKrzysztof Drewniak; CHECK-NEXT:    [[HOISTABLE:%.*]] = call i32 @llvm.amdgcn.struct.ptr.buffer.load.i32(ptr addrspace(8) [[Q]], i32 0, i32 0, i32 0, i32 0)
171*23098bd4SKrzysztof Drewniak; CHECK-NEXT:    br label [[LOOP:%.*]]
172*23098bd4SKrzysztof Drewniak; CHECK:       loop:
173*23098bd4SKrzysztof Drewniak; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]
174*23098bd4SKrzysztof Drewniak; CHECK-NEXT:    [[ORIG:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) [[P]], i32 [[I]], i32 0, i32 0)
175*23098bd4SKrzysztof Drewniak; CHECK-NEXT:    [[INC:%.*]] = add i32 [[HOISTABLE]], [[ORIG]]
176*23098bd4SKrzysztof Drewniak; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 [[INC]], ptr addrspace(8) [[P]], i32 [[I]], i32 0, i32 0)
177*23098bd4SKrzysztof Drewniak; CHECK-NEXT:    [[NEXT]] = add i32 [[I]], 1
178*23098bd4SKrzysztof Drewniak; CHECK-NEXT:    [[COND:%.*]] = icmp ult i32 [[NEXT]], [[BOUND]]
179*23098bd4SKrzysztof Drewniak; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[TAIL:%.*]]
180*23098bd4SKrzysztof Drewniak; CHECK:       tail:
181*23098bd4SKrzysztof Drewniak; CHECK-NEXT:    ret void
182*23098bd4SKrzysztof Drewniak;
183*23098bd4SKrzysztof Drewniakentry:
184*23098bd4SKrzysztof Drewniak  %p = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p1(ptr addrspace(1) %p.global, i16 0, i32 0, i32 0)
185*23098bd4SKrzysztof Drewniak  %q = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p1(ptr addrspace(1) %q.global, i16 0, i32 0, i32 0)
186*23098bd4SKrzysztof Drewniak  br label %loop
187*23098bd4SKrzysztof Drewniakloop:
188*23098bd4SKrzysztof Drewniak  %i = phi i32 [0, %entry], [%next, %loop]
189*23098bd4SKrzysztof Drewniak
190*23098bd4SKrzysztof Drewniak  %hoistable = call i32 @llvm.amdgcn.struct.ptr.buffer.load.i32(ptr addrspace(8) %q, i32 0, i32 0, i32 0, i32 0)
191*23098bd4SKrzysztof Drewniak  %orig = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) %p, i32 %i, i32 0, i32 0)
192*23098bd4SKrzysztof Drewniak  %inc = add i32 %hoistable, %orig
193*23098bd4SKrzysztof Drewniak  call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 %inc, ptr addrspace(8) %p, i32 %i, i32 0, i32 0)
194*23098bd4SKrzysztof Drewniak
195*23098bd4SKrzysztof Drewniak  %next = add i32 %i, 1
196*23098bd4SKrzysztof Drewniak  %cond = icmp ult i32 %next, %bound
197*23098bd4SKrzysztof Drewniak  br i1 %cond, label %loop, label %tail
198*23098bd4SKrzysztof Drewniaktail:
199*23098bd4SKrzysztof Drewniak  ret void
200*23098bd4SKrzysztof Drewniak}
201*23098bd4SKrzysztof Drewniak
202*23098bd4SKrzysztof Drewniak
203faa2c678SKrzysztof Drewniakdefine void @hoistable_buffer_construction_alias_scope(ptr addrspace(1) %p.global, ptr addrspace(1) %q.global, i32 %bound) {
204faa2c678SKrzysztof Drewniak; CHECK-LABEL: define void @hoistable_buffer_construction_alias_scope
205faa2c678SKrzysztof Drewniak; CHECK-SAME: (ptr addrspace(1) [[P_GLOBAL:%.*]], ptr addrspace(1) [[Q_GLOBAL:%.*]], i32 [[BOUND:%.*]]) {
206faa2c678SKrzysztof Drewniak; CHECK-NEXT:  entry:
207faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[P_GLOBAL_INT:%.*]] = ptrtoint ptr addrspace(1) [[P_GLOBAL]] to i64
208faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[Q_GLOBAL_INT:%.*]] = ptrtoint ptr addrspace(1) [[Q_GLOBAL]] to i64
209faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[P_TRUNC:%.*]] = trunc i64 [[P_GLOBAL_INT]] to i48
210faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[Q_TRUNC:%.*]] = trunc i64 [[Q_GLOBAL_INT]] to i48
211faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[P_EXT:%.*]] = zext i48 [[P_TRUNC]] to i128
212faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[Q_EXT:%.*]] = zext i48 [[Q_TRUNC]] to i128
213faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[P:%.*]] = inttoptr i128 [[P_EXT]] to ptr addrspace(8)
214faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[Q:%.*]] = inttoptr i128 [[Q_EXT]] to ptr addrspace(8)
215faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[HOISTABLE:%.*]] = call i32 @llvm.amdgcn.struct.ptr.buffer.load.i32(ptr addrspace(8) [[Q]], i32 0, i32 0, i32 0, i32 0), !alias.scope !0, !noalias !3
216faa2c678SKrzysztof Drewniak; CHECK-NEXT:    br label [[LOOP:%.*]]
217faa2c678SKrzysztof Drewniak; CHECK:       loop:
218faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]
219faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[ORIG:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) [[P]], i32 [[I]], i32 0, i32 0), !alias.scope !3, !noalias !0
220faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[INC:%.*]] = add i32 [[HOISTABLE]], [[ORIG]]
221faa2c678SKrzysztof Drewniak; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 [[INC]], ptr addrspace(8) [[P]], i32 [[I]], i32 0, i32 0), !alias.scope !3, !noalias !0
222faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[NEXT]] = add i32 [[I]], 1
223faa2c678SKrzysztof Drewniak; CHECK-NEXT:    [[COND:%.*]] = icmp ult i32 [[NEXT]], [[BOUND]]
224faa2c678SKrzysztof Drewniak; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[TAIL:%.*]]
225faa2c678SKrzysztof Drewniak; CHECK:       tail:
226faa2c678SKrzysztof Drewniak; CHECK-NEXT:    ret void
227faa2c678SKrzysztof Drewniak;
228faa2c678SKrzysztof Drewniakentry:
229faa2c678SKrzysztof Drewniak  %p.global.int = ptrtoint ptr addrspace(1) %p.global to i64
230faa2c678SKrzysztof Drewniak  %q.global.int = ptrtoint ptr addrspace(1) %q.global to i64
231faa2c678SKrzysztof Drewniak  %p.trunc = trunc i64 %p.global.int to i48
232faa2c678SKrzysztof Drewniak  %q.trunc = trunc i64 %q.global.int to i48
233faa2c678SKrzysztof Drewniak  %p.ext = zext i48 %p.trunc to i128
234faa2c678SKrzysztof Drewniak  %q.ext = zext i48 %q.trunc to i128
235faa2c678SKrzysztof Drewniak  %p = inttoptr i128 %p.ext to ptr addrspace(8)
236faa2c678SKrzysztof Drewniak  %q = inttoptr i128 %q.ext to ptr addrspace(8)
237faa2c678SKrzysztof Drewniak  br label %loop
238faa2c678SKrzysztof Drewniakloop:
239faa2c678SKrzysztof Drewniak  %i = phi i32 [0, %entry], [%next, %loop]
240faa2c678SKrzysztof Drewniak
241faa2c678SKrzysztof Drewniak  %hoistable = call i32 @llvm.amdgcn.struct.ptr.buffer.load.i32(ptr addrspace(8) %q, i32 0, i32 0, i32 0, i32 0), !alias.scope !4, !noalias !3
242faa2c678SKrzysztof Drewniak  %orig = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) %p, i32 %i, i32 0, i32 0), !alias.scope !3, !noalias !4
243faa2c678SKrzysztof Drewniak  %inc = add i32 %hoistable, %orig
244faa2c678SKrzysztof Drewniak  call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 %inc, ptr addrspace(8) %p, i32 %i, i32 0, i32 0), !alias.scope !3, !noalias !4
245faa2c678SKrzysztof Drewniak
246faa2c678SKrzysztof Drewniak  %next = add i32 %i, 1
247faa2c678SKrzysztof Drewniak  %cond = icmp ult i32 %next, %bound
248faa2c678SKrzysztof Drewniak  br i1 %cond, label %loop, label %tail
249faa2c678SKrzysztof Drewniaktail:
250faa2c678SKrzysztof Drewniak  ret void
251faa2c678SKrzysztof Drewniak}
252faa2c678SKrzysztof Drewniak
253faa2c678SKrzysztof Drewniak; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: read)
254faa2c678SKrzysztof Drewniakdeclare i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) nocapture readonly, i32, i32, i32 immarg) #0
255faa2c678SKrzysztof Drewniak; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: read)
256faa2c678SKrzysztof Drewniakdeclare i32 @llvm.amdgcn.struct.ptr.buffer.load.i32(ptr addrspace(8) nocapture readonly, i32, i32, i32, i32 immarg) #0
257faa2c678SKrzysztof Drewniak; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: write)
258faa2c678SKrzysztof Drewniakdeclare void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32, ptr addrspace(8) nocapture writeonly, i32, i32, i32 immarg) #1
259*23098bd4SKrzysztof Drewniak; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)declare ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p1(ptr addrspace(1) nocapture readnone, i16, i32, i32) #2
260*23098bd4SKrzysztof Drewniakdeclare ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p1(ptr addrspace(1) readnone nocapture, i16, i32, i32)
261faa2c678SKrzysztof Drewniakattributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: read) }
262faa2c678SKrzysztof Drewniakattributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: write) }
263*23098bd4SKrzysztof Drewniakattributes #2 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
264