blob: 9de47b86f201e0ae73cf3c6389e448ed5bff8f46 [file] [edit]
; 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)