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