blob: 3b96f2cfe7a2dba8fe9ac484881eeb7f26134f84 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --check-globals all --version 6
; RUN: opt -mtriple=amdgpu8.03-unknown-amdhsa -S -passes=amdgpu-attributor < %s | FileCheck -check-prefix=GFX8 %s
; RUN: opt -mtriple=amdgpu9.00-unknown-amdhsa -S -passes=amdgpu-attributor < %s | FileCheck -check-prefix=GFX9 %s
; A group-to-flat addrspacecast needs the aperture, which on gfx8
; requires the implicit argument pointer. gfx9 does not need to load
; the aperture, so can infer "amdgpu-no-implicitarg-ptr"
declare ptr addrspace(4) @llvm.amdgcn.queue.ptr() #0
define void @use_queue_ptr() #0 {
; GFX8: Function Attrs: nounwind
; GFX8-LABEL: define void @use_queue_ptr(
; GFX8-SAME: ) #[[ATTR1:[0-9]+]] {
; GFX8-NEXT: [[QUEUE_PTR:%.*]] = call ptr addrspace(4) @llvm.amdgcn.queue.ptr()
; GFX8-NEXT: store volatile ptr addrspace(4) [[QUEUE_PTR]], ptr addrspace(1) poison, align 8
; GFX8-NEXT: ret void
;
; GFX9: Function Attrs: nounwind
; GFX9-LABEL: define void @use_queue_ptr(
; GFX9-SAME: ) #[[ATTR1:[0-9]+]] {
; GFX9-NEXT: [[QUEUE_PTR:%.*]] = call ptr addrspace(4) @llvm.amdgcn.queue.ptr()
; GFX9-NEXT: store volatile ptr addrspace(4) [[QUEUE_PTR]], ptr addrspace(1) poison, align 8
; GFX9-NEXT: ret void
;
%queue.ptr = call ptr addrspace(4) @llvm.amdgcn.queue.ptr()
store volatile ptr addrspace(4) %queue.ptr, ptr addrspace(1) poison
ret void
}
define void @func_indirect_use_queue_ptr() #0 {
; GFX8: Function Attrs: nounwind
; GFX8-LABEL: define void @func_indirect_use_queue_ptr(
; GFX8-SAME: ) #[[ATTR1]] {
; GFX8-NEXT: call void @use_queue_ptr()
; GFX8-NEXT: ret void
;
; GFX9: Function Attrs: nounwind
; GFX9-LABEL: define void @func_indirect_use_queue_ptr(
; GFX9-SAME: ) #[[ATTR1]] {
; GFX9-NEXT: call void @use_queue_ptr()
; GFX9-NEXT: ret void
;
call void @use_queue_ptr()
ret void
}
define void @use_group_to_flat_addrspacecast(ptr addrspace(3) %ptr) #0 {
; GFX8: Function Attrs: nounwind
; GFX8-LABEL: define void @use_group_to_flat_addrspacecast(
; GFX8-SAME: ptr addrspace(3) [[PTR:%.*]]) #[[ATTR2:[0-9]+]] {
; GFX8-NEXT: [[STOF:%.*]] = addrspacecast ptr addrspace(3) [[PTR]] to ptr addrspace(4)
; GFX8-NEXT: store volatile i32 0, ptr addrspace(4) [[STOF]], align 4
; GFX8-NEXT: ret void
;
; GFX9: Function Attrs: nounwind
; GFX9-LABEL: define void @use_group_to_flat_addrspacecast(
; GFX9-SAME: ptr addrspace(3) [[PTR:%.*]]) #[[ATTR2:[0-9]+]] {
; GFX9-NEXT: [[STOF:%.*]] = addrspacecast ptr addrspace(3) [[PTR]] to ptr addrspace(4)
; GFX9-NEXT: store volatile i32 0, ptr addrspace(4) [[STOF]], align 4
; GFX9-NEXT: ret void
;
%stof = addrspacecast ptr addrspace(3) %ptr to ptr addrspace(4)
store volatile i32 0, ptr addrspace(4) %stof
ret void
}
define void @use_group_to_flat_addrspacecast_queue_ptr(ptr addrspace(3) %ptr) #0 {
; GFX8: Function Attrs: nounwind
; GFX8-LABEL: define void @use_group_to_flat_addrspacecast_queue_ptr(
; GFX8-SAME: ptr addrspace(3) [[PTR:%.*]]) #[[ATTR1]] {
; GFX8-NEXT: [[STOF:%.*]] = addrspacecast ptr addrspace(3) [[PTR]] to ptr addrspace(4)
; GFX8-NEXT: store volatile i32 0, ptr addrspace(4) [[STOF]], align 4
; GFX8-NEXT: call void @func_indirect_use_queue_ptr()
; GFX8-NEXT: ret void
;
; GFX9: Function Attrs: nounwind
; GFX9-LABEL: define void @use_group_to_flat_addrspacecast_queue_ptr(
; GFX9-SAME: ptr addrspace(3) [[PTR:%.*]]) #[[ATTR1]] {
; GFX9-NEXT: [[STOF:%.*]] = addrspacecast ptr addrspace(3) [[PTR]] to ptr addrspace(4)
; GFX9-NEXT: store volatile i32 0, ptr addrspace(4) [[STOF]], align 4
; GFX9-NEXT: call void @func_indirect_use_queue_ptr()
; GFX9-NEXT: ret void
;
%stof = addrspacecast ptr addrspace(3) %ptr to ptr addrspace(4)
store volatile i32 0, ptr addrspace(4) %stof
call void @func_indirect_use_queue_ptr()
ret void
}
define void @indirect_use_group_to_flat_addrspacecast() #0 {
; GFX8: Function Attrs: nounwind
; GFX8-LABEL: define void @indirect_use_group_to_flat_addrspacecast(
; GFX8-SAME: ) #[[ATTR2]] {
; GFX8-NEXT: call void @use_group_to_flat_addrspacecast(ptr addrspace(3) null)
; GFX8-NEXT: ret void
;
; GFX9: Function Attrs: nounwind
; GFX9-LABEL: define void @indirect_use_group_to_flat_addrspacecast(
; GFX9-SAME: ) #[[ATTR2]] {
; GFX9-NEXT: call void @use_group_to_flat_addrspacecast(ptr addrspace(3) null)
; GFX9-NEXT: ret void
;
call void @use_group_to_flat_addrspacecast(ptr addrspace(3) zeroinitializer)
ret void
}
define void @indirect_use_group_to_flat_addrspacecast_queue_ptr() #0 {
; GFX8: Function Attrs: nounwind
; GFX8-LABEL: define void @indirect_use_group_to_flat_addrspacecast_queue_ptr(
; GFX8-SAME: ) #[[ATTR1]] {
; GFX8-NEXT: call void @use_group_to_flat_addrspacecast_queue_ptr(ptr addrspace(3) null)
; GFX8-NEXT: ret void
;
; GFX9: Function Attrs: nounwind
; GFX9-LABEL: define void @indirect_use_group_to_flat_addrspacecast_queue_ptr(
; GFX9-SAME: ) #[[ATTR1]] {
; GFX9-NEXT: call void @use_group_to_flat_addrspacecast_queue_ptr(ptr addrspace(3) null)
; GFX9-NEXT: ret void
;
call void @use_group_to_flat_addrspacecast_queue_ptr(ptr addrspace(3) zeroinitializer)
ret void
}
attributes #0 = { nounwind }
;.
; GFX8: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
; GFX8: attributes #[[ATTR1]] = { nounwind "amdgpu-no-cluster-id-x" "amdgpu-no-cluster-id-y" "amdgpu-no-cluster-id-z" "amdgpu-no-completion-action" "amdgpu-no-default-queue" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-flat-scratch-init" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-lds-kernel-id" "amdgpu-no-multigrid-sync-arg" "amdgpu-no-workgroup-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" "amdgpu-no-wwm" }
; GFX8: attributes #[[ATTR2]] = { nounwind "amdgpu-no-cluster-id-x" "amdgpu-no-cluster-id-y" "amdgpu-no-cluster-id-z" "amdgpu-no-completion-action" "amdgpu-no-default-queue" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-flat-scratch-init" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-lds-kernel-id" "amdgpu-no-multigrid-sync-arg" "amdgpu-no-queue-ptr" "amdgpu-no-workgroup-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" "amdgpu-no-wwm" }
;.
; GFX9: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
; GFX9: attributes #[[ATTR1]] = { nounwind "amdgpu-no-cluster-id-x" "amdgpu-no-cluster-id-y" "amdgpu-no-cluster-id-z" "amdgpu-no-completion-action" "amdgpu-no-default-queue" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-flat-scratch-init" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-lds-kernel-id" "amdgpu-no-multigrid-sync-arg" "amdgpu-no-workgroup-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" "amdgpu-no-wwm" }
; GFX9: attributes #[[ATTR2]] = { nounwind "amdgpu-no-cluster-id-x" "amdgpu-no-cluster-id-y" "amdgpu-no-cluster-id-z" "amdgpu-no-completion-action" "amdgpu-no-default-queue" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-flat-scratch-init" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-lds-kernel-id" "amdgpu-no-multigrid-sync-arg" "amdgpu-no-queue-ptr" "amdgpu-no-workgroup-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" "amdgpu-no-wwm" }
;.