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