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