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