| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: opt -S -mtriple=amdgpu12.00 -passes=amdgpu-lower-buffer-fat-pointers < %s | FileCheck --check-prefix=NOSPREFETCH %s | |
| ; RUN: opt -S -mtriple=amdgpu12.00 -mattr=+safe-smem-prefetch -passes=amdgpu-lower-buffer-fat-pointers < %s | FileCheck --check-prefix=SPREFETCH %s | |
| ; A data prefetch at a constant offset becomes s_buffer_prefetch_data where a | |
| ; scalar prefetch is safe. Other buffer prefetches, including the s_prefetch | |
| ; intrinsics, are dropped. | |
| define void @prefetch_const_offset(ptr addrspace(8) %rsrc) { | |
| ; NOSPREFETCH-LABEL: define void @prefetch_const_offset( | |
| ; NOSPREFETCH-SAME: ptr addrspace(8) [[RSRC:%.*]]) { | |
| ; NOSPREFETCH-NEXT: ret void | |
| ; | |
| ; SPREFETCH-LABEL: define void @prefetch_const_offset( | |
| ; SPREFETCH-SAME: ptr addrspace(8) [[RSRC:%.*]]) #[[ATTR0:[0-9]+]] { | |
| ; SPREFETCH-NEXT: call void @llvm.amdgcn.s.buffer.prefetch.data(ptr addrspace(8) [[RSRC]], i32 128, i32 0) | |
| ; SPREFETCH-NEXT: ret void | |
| ; | |
| %p = addrspacecast ptr addrspace(8) %rsrc to ptr addrspace(7) | |
| %q = getelementptr i8, ptr addrspace(7) %p, i32 128 | |
| call void @llvm.prefetch.p7(ptr addrspace(7) %q, i32 0, i32 3, i32 1) | |
| ret void | |
| } | |
| define void @prefetch_max_offset(ptr addrspace(8) %rsrc) { | |
| ; NOSPREFETCH-LABEL: define void @prefetch_max_offset( | |
| ; NOSPREFETCH-SAME: ptr addrspace(8) [[RSRC:%.*]]) { | |
| ; NOSPREFETCH-NEXT: ret void | |
| ; | |
| ; SPREFETCH-LABEL: define void @prefetch_max_offset( | |
| ; SPREFETCH-SAME: ptr addrspace(8) [[RSRC:%.*]]) #[[ATTR0]] { | |
| ; SPREFETCH-NEXT: call void @llvm.amdgcn.s.buffer.prefetch.data(ptr addrspace(8) [[RSRC]], i32 8388607, i32 0) | |
| ; SPREFETCH-NEXT: ret void | |
| ; | |
| %p = addrspacecast ptr addrspace(8) %rsrc to ptr addrspace(7) | |
| %q = getelementptr i8, ptr addrspace(7) %p, i32 8388607 | |
| call void @llvm.prefetch.p7(ptr addrspace(7) %q, i32 0, i32 3, i32 1) | |
| ret void | |
| } | |
| define void @prefetch_too_large_offset(ptr addrspace(8) %rsrc) { | |
| ; NOSPREFETCH-LABEL: define void @prefetch_too_large_offset( | |
| ; NOSPREFETCH-SAME: ptr addrspace(8) [[RSRC:%.*]]) { | |
| ; NOSPREFETCH-NEXT: ret void | |
| ; | |
| ; SPREFETCH-LABEL: define void @prefetch_too_large_offset( | |
| ; SPREFETCH-SAME: ptr addrspace(8) [[RSRC:%.*]]) #[[ATTR0]] { | |
| ; SPREFETCH-NEXT: ret void | |
| ; | |
| %p = addrspacecast ptr addrspace(8) %rsrc to ptr addrspace(7) | |
| %q = getelementptr i8, ptr addrspace(7) %p, i32 8388608 | |
| call void @llvm.prefetch.p7(ptr addrspace(7) %q, i32 0, i32 3, i32 1) | |
| ret void | |
| } | |
| define void @prefetch_negative_offset(ptr addrspace(8) %rsrc) { | |
| ; NOSPREFETCH-LABEL: define void @prefetch_negative_offset( | |
| ; NOSPREFETCH-SAME: ptr addrspace(8) [[RSRC:%.*]]) { | |
| ; NOSPREFETCH-NEXT: ret void | |
| ; | |
| ; SPREFETCH-LABEL: define void @prefetch_negative_offset( | |
| ; SPREFETCH-SAME: ptr addrspace(8) [[RSRC:%.*]]) #[[ATTR0]] { | |
| ; SPREFETCH-NEXT: ret void | |
| ; | |
| %p = addrspacecast ptr addrspace(8) %rsrc to ptr addrspace(7) | |
| %q = getelementptr i8, ptr addrspace(7) %p, i32 -4 | |
| call void @llvm.prefetch.p7(ptr addrspace(7) %q, i32 0, i32 3, i32 1) | |
| ret void | |
| } | |
| define void @prefetch_variable_offset(ptr addrspace(8) %rsrc, i32 %off) { | |
| ; NOSPREFETCH-LABEL: define void @prefetch_variable_offset( | |
| ; NOSPREFETCH-SAME: ptr addrspace(8) [[RSRC:%.*]], i32 [[Q:%.*]]) { | |
| ; NOSPREFETCH-NEXT: ret void | |
| ; | |
| ; SPREFETCH-LABEL: define void @prefetch_variable_offset( | |
| ; SPREFETCH-SAME: ptr addrspace(8) [[RSRC:%.*]], i32 [[Q:%.*]]) #[[ATTR0]] { | |
| ; SPREFETCH-NEXT: ret void | |
| ; | |
| %p = addrspacecast ptr addrspace(8) %rsrc to ptr addrspace(7) | |
| %q = getelementptr i8, ptr addrspace(7) %p, i32 %off | |
| call void @llvm.prefetch.p7(ptr addrspace(7) %q, i32 0, i32 3, i32 1) | |
| ret void | |
| } | |
| define void @prefetch_inst_const_offset(ptr addrspace(8) %rsrc) { | |
| ; NOSPREFETCH-LABEL: define void @prefetch_inst_const_offset( | |
| ; NOSPREFETCH-SAME: ptr addrspace(8) [[RSRC:%.*]]) { | |
| ; NOSPREFETCH-NEXT: ret void | |
| ; | |
| ; SPREFETCH-LABEL: define void @prefetch_inst_const_offset( | |
| ; SPREFETCH-SAME: ptr addrspace(8) [[RSRC:%.*]]) #[[ATTR0]] { | |
| ; SPREFETCH-NEXT: ret void | |
| ; | |
| %p = addrspacecast ptr addrspace(8) %rsrc to ptr addrspace(7) | |
| %q = getelementptr i8, ptr addrspace(7) %p, i32 128 | |
| call void @llvm.prefetch.p7(ptr addrspace(7) %q, i32 0, i32 3, i32 0) | |
| ret void | |
| } | |
| define void @s_prefetch_inst(ptr addrspace(8) %rsrc) { | |
| ; NOSPREFETCH-LABEL: define void @s_prefetch_inst( | |
| ; NOSPREFETCH-SAME: ptr addrspace(8) [[RSRC:%.*]]) { | |
| ; NOSPREFETCH-NEXT: ret void | |
| ; | |
| ; SPREFETCH-LABEL: define void @s_prefetch_inst( | |
| ; SPREFETCH-SAME: ptr addrspace(8) [[RSRC:%.*]]) #[[ATTR0]] { | |
| ; SPREFETCH-NEXT: ret void | |
| ; | |
| %p = addrspacecast ptr addrspace(8) %rsrc to ptr addrspace(7) | |
| %q = getelementptr i8, ptr addrspace(7) %p, i32 128 | |
| call void @llvm.amdgcn.s.prefetch.inst.p7(ptr addrspace(7) %q, i32 0) | |
| ret void | |
| } | |
| declare void @llvm.prefetch.p7(ptr addrspace(7) nocapture readonly, i32 immarg, i32 immarg, i32 immarg) | |
| declare void @llvm.amdgcn.s.prefetch.inst.p7(ptr addrspace(7), i32) |