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:          .offset:         208
13; PRE-GFX9-NEXT:     .size:           8
14; PRE-GFX9-NEXT:     .value_kind:     hidden_queue_ptr
15; GFX9-NOT:          .value_kind:     hidden_queue_ptr
16; CHECK:             .name:           addrspacecast_requires_queue_ptr
17; CHECK:             .symbol:         addrspacecast_requires_queue_ptr.kd
18define amdgpu_kernel void @addrspacecast_requires_queue_ptr(i32 addrspace(5)* %ptr.private, i32 addrspace(3)* %ptr.local) {
19  %flat.private = addrspacecast i32 addrspace(5)* %ptr.private to i32*
20  %flat.local = addrspacecast i32 addrspace(3)* %ptr.local to i32*
21  store volatile i32 1, i32* %flat.private
22  store volatile i32 2, i32* %flat.local
23  ret void
24}
25
26; CHECK: - .args:
27; CHECK:             .offset:         208
28; CHECK-NEXT:        .size:           8
29; CHECK-NEXT:        .value_kind:     hidden_queue_ptr
30; CHECK:             .name:           is_shared_requires_queue_ptr
31; CHECK:             .symbol:         is_shared_requires_queue_ptr.kd
32define amdgpu_kernel void @is_shared_requires_queue_ptr(i8* %ptr) {
33  %is.shared = call i1 @llvm.amdgcn.is.shared(i8* %ptr)
34  %zext = zext i1 %is.shared to i32
35  store volatile i32 %zext, i32 addrspace(1)* undef
36  ret void
37}
38
39; CHECK: - .args:
40; CHECK:             .offset:         208
41; CHECK-NEXT:        .size:           8
42; CHECK-NEXT:        .value_kind:     hidden_queue_ptr
43; CHECK:             .name:           is_private_requires_queue_ptr
44; CHECK:             .symbol:         is_private_requires_queue_ptr.kd
45define amdgpu_kernel void @is_private_requires_queue_ptr(i8* %ptr) {
46  %is.private = call i1 @llvm.amdgcn.is.private(i8* %ptr)
47  %zext = zext i1 %is.private to i32
48  store volatile i32 %zext, i32 addrspace(1)* undef
49  ret void
50}
51
52; CHECK: - .args:
53; CHECK:             .offset:         200
54; CHECK-NEXT:        .size:           8
55; CHECK-NEXT:        .value_kind:     hidden_queue_ptr
56; CHECK:             .name:           trap_requires_queue_ptr
57; CHECK:             .symbol:         trap_requires_queue_ptr.kd
58define amdgpu_kernel void @trap_requires_queue_ptr() {
59  call void @llvm.trap()
60  unreachable
61}
62
63; CHECK: - .args:
64; CHECK:             .offset:         200
65; CHECK-NEXT:        .size:           8
66; CHECK-NEXT:        .value_kind:     hidden_queue_ptr
67; CHECK:             .name:           debugtrap_requires_queue_ptr
68; CHECK:             .symbol:         debugtrap_requires_queue_ptr.kd
69define amdgpu_kernel void @debugtrap_requires_queue_ptr() {
70  call void @llvm.debugtrap()
71  unreachable
72}
73
74; CHECK: - .args:
75; CHECK:             .offset:         208
76; CHECK-NEXT:        .size:           8
77; CHECK-NEXT:        .value_kind:     hidden_queue_ptr
78; CHECK:             .name:           amdgcn_queue_ptr_requires_queue_ptr
79; CHECK:             .symbol:         amdgcn_queue_ptr_requires_queue_ptr.kd
80define amdgpu_kernel void @amdgcn_queue_ptr_requires_queue_ptr(i64 addrspace(1)* %ptr)  {
81  %queue.ptr = call i8 addrspace(4)* @llvm.amdgcn.queue.ptr()
82  %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr()
83  %dispatch.ptr = call i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr()
84  %dispatch.id = call i64 @llvm.amdgcn.dispatch.id()
85  %queue.load = load volatile i8, i8 addrspace(4)* %queue.ptr
86  %implicitarg.load = load volatile i8, i8 addrspace(4)* %implicitarg.ptr
87  %dispatch.load = load volatile i8, i8 addrspace(4)* %dispatch.ptr
88  store volatile i64 %dispatch.id, i64 addrspace(1)* %ptr
89  ret void
90}
91
92
93declare noalias i8 addrspace(4)* @llvm.amdgcn.queue.ptr()
94declare noalias i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr()
95declare i64 @llvm.amdgcn.dispatch.id()
96declare noalias i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr()
97declare i1 @llvm.amdgcn.is.shared(i8*)
98declare i1 @llvm.amdgcn.is.private(i8*)
99declare void @llvm.trap()
100declare void @llvm.debugtrap()
101