1; RUN: llc -mtriple=amdgcn-amd-amdhsa --amdhsa-code-object-version=2 -mcpu=kaveri -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,HSA %s 2; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=tahiti -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,MESA %s 3 4; GCN-LABEL: {{^}}kernel_implicitarg_ptr_empty: 5; HSA: enable_sgpr_kernarg_segment_ptr = 0 6; HSA: kernarg_segment_byte_size = 0 7 8; MESA: enable_sgpr_kernarg_segment_ptr = 1 9; MESA: kernarg_segment_byte_size = 16 10 11; HSA: s_mov_b64 [[NULL:s\[[0-9]+:[0-9]+\]]], 0{{$}} 12; HSA: s_load_dword s0, [[NULL]], 0x0 13 14; MESA: s_load_dword s0, s[4:5], 0x0 15define amdgpu_kernel void @kernel_implicitarg_ptr_empty() #0 { 16 %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 17 %cast = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)* 18 %load = load volatile i32, i32 addrspace(4)* %cast 19 ret void 20} 21 22; GCN-LABEL: {{^}}opencl_kernel_implicitarg_ptr_empty: 23; GCN: enable_sgpr_kernarg_segment_ptr = 1 24 25; HSA: kernarg_segment_byte_size = 48 26; MESA: kernarg_segment_byte_size = 16 27 28; HSA: s_load_dword s0, s[4:5], 0x0 29define amdgpu_kernel void @opencl_kernel_implicitarg_ptr_empty() #1 { 30 %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 31 %cast = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)* 32 %load = load volatile i32, i32 addrspace(4)* %cast 33 ret void 34} 35 36; GCN-LABEL: {{^}}kernel_implicitarg_ptr: 37; GCN: enable_sgpr_kernarg_segment_ptr = 1 38 39; HSA: kernarg_segment_byte_size = 112 40; MESA: kernarg_segment_byte_size = 128 41 42; HSA: s_load_dword s0, s[4:5], 0x1c 43define amdgpu_kernel void @kernel_implicitarg_ptr([112 x i8]) #0 { 44 %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 45 %cast = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)* 46 %load = load volatile i32, i32 addrspace(4)* %cast 47 ret void 48} 49 50; GCN-LABEL: {{^}}opencl_kernel_implicitarg_ptr: 51; GCN: enable_sgpr_kernarg_segment_ptr = 1 52 53; HSA: kernarg_segment_byte_size = 160 54; MESA: kernarg_segment_byte_size = 128 55 56; HSA: s_load_dword s0, s[4:5], 0x1c 57define amdgpu_kernel void @opencl_kernel_implicitarg_ptr([112 x i8]) #1 { 58 %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 59 %cast = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)* 60 %load = load volatile i32, i32 addrspace(4)* %cast 61 ret void 62} 63 64; GCN-LABEL: {{^}}func_implicitarg_ptr: 65; GCN: s_waitcnt 66; GCN: s_load_dword s{{[0-9]+}}, s[4:5], 0x0 67; GCN-NEXT: s_waitcnt 68; GCN-NEXT: s_setpc_b64 69define void @func_implicitarg_ptr() #0 { 70 %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 71 %cast = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)* 72 %load = load volatile i32, i32 addrspace(4)* %cast 73 ret void 74} 75 76; GCN-LABEL: {{^}}opencl_func_implicitarg_ptr: 77; GCN: s_waitcnt 78; GCN: s_load_dword s{{[0-9]+}}, s[4:5], 0x0 79; GCN-NEXT: s_waitcnt 80; GCN-NEXT: s_setpc_b64 81define void @opencl_func_implicitarg_ptr() #0 { 82 %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 83 %cast = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)* 84 %load = load volatile i32, i32 addrspace(4)* %cast 85 ret void 86} 87 88; GCN-LABEL: {{^}}kernel_call_implicitarg_ptr_func_empty: 89; HSA: enable_sgpr_kernarg_segment_ptr = 0 90; HSA: kernarg_segment_byte_size = 0 91 92; MESA: enable_sgpr_kernarg_segment_ptr = 1 93; MESA: kernarg_segment_byte_size = 16 94 95; HSA: s_mov_b64 s[4:5], 0{{$}} 96; MESA-NOT: s[4:5] 97; MESA-NOT: s4 98; MESA-NOT: s5 99; GCN: s_swappc_b64 100define amdgpu_kernel void @kernel_call_implicitarg_ptr_func_empty() #0 { 101 call void @func_implicitarg_ptr() 102 ret void 103} 104 105; GCN-LABEL: {{^}}opencl_kernel_call_implicitarg_ptr_func_empty: 106; GCN: enable_sgpr_kernarg_segment_ptr = 1 107; HSA: kernarg_segment_byte_size = 48 108; MESA: kernarg_segment_byte_size = 16 109; GCN-NOT: s[4:5] 110; GCN-NOT: s4 111; GCN-NOT: s5 112; GCN: s_swappc_b64 113define amdgpu_kernel void @opencl_kernel_call_implicitarg_ptr_func_empty() #1 { 114 call void @func_implicitarg_ptr() 115 ret void 116} 117 118; GCN-LABEL: {{^}}kernel_call_implicitarg_ptr_func: 119; GCN: enable_sgpr_kernarg_segment_ptr = 1 120; HSA: kernarg_segment_byte_size = 112 121; MESA: kernarg_segment_byte_size = 128 122 123; HSA: s_add_u32 s4, s4, 0x70 124; MESA: s_add_u32 s4, s4, 0x70 125 126; GCN: s_addc_u32 s5, s5, 0{{$}} 127; GCN: s_swappc_b64 128define amdgpu_kernel void @kernel_call_implicitarg_ptr_func([112 x i8]) #0 { 129 call void @func_implicitarg_ptr() 130 ret void 131} 132 133; GCN-LABEL: {{^}}opencl_kernel_call_implicitarg_ptr_func: 134; GCN: enable_sgpr_kernarg_segment_ptr = 1 135; HSA: kernarg_segment_byte_size = 160 136; MESA: kernarg_segment_byte_size = 128 137 138; GCN: s_add_u32 s4, s4, 0x70 139; GCN: s_addc_u32 s5, s5, 0{{$}} 140; GCN: s_swappc_b64 141define amdgpu_kernel void @opencl_kernel_call_implicitarg_ptr_func([112 x i8]) #1 { 142 call void @func_implicitarg_ptr() 143 ret void 144} 145 146; GCN-LABEL: {{^}}func_call_implicitarg_ptr_func: 147; GCN-NOT: s4 148; GCN-NOT: s5 149; GCN-NOT: s[4:5] 150define void @func_call_implicitarg_ptr_func() #0 { 151 call void @func_implicitarg_ptr() 152 ret void 153} 154 155; GCN-LABEL: {{^}}opencl_func_call_implicitarg_ptr_func: 156; GCN-NOT: s4 157; GCN-NOT: s5 158; GCN-NOT: s[4:5] 159define void @opencl_func_call_implicitarg_ptr_func() #0 { 160 call void @func_implicitarg_ptr() 161 ret void 162} 163 164; GCN-LABEL: {{^}}func_kernarg_implicitarg_ptr: 165; GCN: s_waitcnt 166; GCN-DAG: s_mov_b64 [[NULL:s\[[0-9]+:[0-9]+\]]], 0 167; GCN-DAG: s_load_dword s{{[0-9]+}}, [[NULL]], 0x0 168; GCN: s_load_dword s{{[0-9]+}}, s[4:5], 0x0 169; GCN: s_waitcnt lgkmcnt(0) 170define void @func_kernarg_implicitarg_ptr() #0 { 171 %kernarg.segment.ptr = call i8 addrspace(4)* @llvm.amdgcn.kernarg.segment.ptr() 172 %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 173 %cast.kernarg.segment.ptr = bitcast i8 addrspace(4)* %kernarg.segment.ptr to i32 addrspace(4)* 174 %cast.implicitarg = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)* 175 %load0 = load volatile i32, i32 addrspace(4)* %cast.kernarg.segment.ptr 176 %load1 = load volatile i32, i32 addrspace(4)* %cast.implicitarg 177 ret void 178} 179 180; GCN-LABEL: {{^}}opencl_func_kernarg_implicitarg_ptr: 181; GCN: s_waitcnt 182; GCN-DAG: s_mov_b64 [[NULL:s\[[0-9]+:[0-9]+\]]], 0 183; GCN-DAG: s_load_dword s{{[0-9]+}}, [[NULL]], 0x0 184; GCN: s_load_dword s{{[0-9]+}}, s[4:5], 0x0 185; GCN: s_waitcnt lgkmcnt(0) 186define void @opencl_func_kernarg_implicitarg_ptr() #0 { 187 %kernarg.segment.ptr = call i8 addrspace(4)* @llvm.amdgcn.kernarg.segment.ptr() 188 %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 189 %cast.kernarg.segment.ptr = bitcast i8 addrspace(4)* %kernarg.segment.ptr to i32 addrspace(4)* 190 %cast.implicitarg = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)* 191 %load0 = load volatile i32, i32 addrspace(4)* %cast.kernarg.segment.ptr 192 %load1 = load volatile i32, i32 addrspace(4)* %cast.implicitarg 193 ret void 194} 195 196; GCN-LABEL: {{^}}kernel_call_kernarg_implicitarg_ptr_func: 197; GCN: s_add_u32 s4, s4, 0x70 198; GCN: s_addc_u32 s5, s5, 0 199; GCN: s_swappc_b64 200define amdgpu_kernel void @kernel_call_kernarg_implicitarg_ptr_func([112 x i8]) #0 { 201 call void @func_kernarg_implicitarg_ptr() 202 ret void 203} 204 205; GCN-LABEL: {{^}}kernel_implicitarg_no_struct_align_padding: 206; HSA: kernarg_segment_byte_size = 120 207; MESA: kernarg_segment_byte_size = 84 208; GCN: kernarg_segment_alignment = 6 209define amdgpu_kernel void @kernel_implicitarg_no_struct_align_padding(<16 x i32>, i32) #1 { 210 %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 211 %cast = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)* 212 %load = load volatile i32, i32 addrspace(4)* %cast 213 ret void 214} 215 216declare i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() #2 217declare i8 addrspace(4)* @llvm.amdgcn.kernarg.segment.ptr() #2 218 219attributes #0 = { nounwind noinline } 220attributes #1 = { nounwind noinline "amdgpu-implicitarg-num-bytes"="48" } 221attributes #2 = { nounwind readnone speculatable } 222