1; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx700 --amdhsa-code-object-version=5 -filetype=obj -o - < %s | llvm-readelf --notes - | FileCheck --check-prefix=CHECK %s 2; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx803 --amdhsa-code-object-version=5 -filetype=obj -o - < %s | llvm-readelf --notes - | FileCheck --check-prefix=CHECK %s 3; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 --amdhsa-code-object-version=5 -filetype=obj -o - < %s | llvm-readelf --notes - | FileCheck --check-prefixes=CHECK,GFX9 %s 4 5; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx700 --amdhsa-code-object-version=5 < %s | FileCheck --check-prefix=CHECK %s 6; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx803 --amdhsa-code-object-version=5 < %s | FileCheck --check-prefix=CHECK %s 7; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 --amdhsa-code-object-version=5 < %s | FileCheck --check-prefixes=CHECK,GFX9 %s 8 9 10; On gfx8, the queue ptr is required for this addrspacecast. 11; CHECK: - .args: 12; PRE-GFX9: hidden_queue_ptr 13; GFX9-NOT: hidden_queue_ptr 14; CHECK-LABEL: .name: addrspacecast_requires_queue_ptr 15define amdgpu_kernel void @addrspacecast_requires_queue_ptr(i32 addrspace(5)* %ptr.private, i32 addrspace(3)* %ptr.local) { 16 %flat.private = addrspacecast i32 addrspace(5)* %ptr.private to i32* 17 %flat.local = addrspacecast i32 addrspace(3)* %ptr.local to i32* 18 store volatile i32 1, i32* %flat.private 19 store volatile i32 2, i32* %flat.local 20 ret void 21} 22 23; CHECK: - .args: 24; PRE-GFX9: hidden_shared_base 25; GFX9-NOT: hidden_shared_base 26; CHECK-LABEL: .name: is_shared_requires_queue_ptr 27define amdgpu_kernel void @is_shared_requires_queue_ptr(i8* %ptr) { 28 %is.shared = call i1 @llvm.amdgcn.is.shared(i8* %ptr) 29 %zext = zext i1 %is.shared to i32 30 store volatile i32 %zext, i32 addrspace(1)* undef 31 ret void 32} 33 34; CHECK: - .args: 35; PRE-GFX9: hidden_private_base 36; GFX9-NOT: hidden_private_base 37; CHECK-LABEL: .name: is_private_requires_queue_ptr 38define amdgpu_kernel void @is_private_requires_queue_ptr(i8* %ptr) { 39 %is.private = call i1 @llvm.amdgcn.is.private(i8* %ptr) 40 %zext = zext i1 %is.private to i32 41 store volatile i32 %zext, i32 addrspace(1)* undef 42 ret void 43} 44 45; CHECK: - .args: 46 47; PRE-GFX9: hidden_queue_ptr 48; GFX9-NOT: hidden_queue_ptr 49; CHECK-LABEL: .name: trap_requires_queue_ptr 50define amdgpu_kernel void @trap_requires_queue_ptr() { 51 call void @llvm.trap() 52 unreachable 53} 54 55; CHECK: - .args: 56; CHECK: hidden_queue_ptr 57; CHECK-LABEL: .name: amdgcn_queue_ptr_requires_queue_ptr 58define amdgpu_kernel void @amdgcn_queue_ptr_requires_queue_ptr(i64 addrspace(1)* %ptr) { 59 %queue.ptr = call i8 addrspace(4)* @llvm.amdgcn.queue.ptr() 60 %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 61 %dispatch.ptr = call i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr() 62 %dispatch.id = call i64 @llvm.amdgcn.dispatch.id() 63 %queue.load = load volatile i8, i8 addrspace(4)* %queue.ptr 64 %implicitarg.load = load volatile i8, i8 addrspace(4)* %implicitarg.ptr 65 %dispatch.load = load volatile i8, i8 addrspace(4)* %dispatch.ptr 66 store volatile i64 %dispatch.id, i64 addrspace(1)* %ptr 67 ret void 68} 69 70 71declare noalias i8 addrspace(4)* @llvm.amdgcn.queue.ptr() 72declare noalias i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 73declare i64 @llvm.amdgcn.dispatch.id() 74declare noalias i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr() 75declare i1 @llvm.amdgcn.is.shared(i8*) 76declare i1 @llvm.amdgcn.is.private(i8*) 77declare void @llvm.trap() 78declare void @llvm.debugtrap() 79