1; RUN: llc -mtriple=amdgcn-amd-amdhsa -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,HSA %s 2; RUN: llc -mtriple=amdgcn-mesa-mesa3d -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, s6 63; MESA: v_mov_b32_e32 v1, s7 64; MESA: buffer_load_dword v0, v[0:1], s[8:11], 0 addr64 65; HSA: v_mov_b32_e32 v0, s6 66; HSA: v_mov_b32_e32 v1, s7 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, s6 80; MESA: v_mov_b32_e32 v1, s7 81; MESA: buffer_load_dword v0, v[0:1], s[8:11], 0 addr64 82; HSA: v_mov_b32_e32 v0, s6 83; HSA: v_mov_b32_e32 v1, s7 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: s_mov_b64 s[6:7], s[4:5] 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: s_mov_b64 s[6:7], s[4:5] 110; GCN: s_swappc_b64 111define amdgpu_kernel void @opencl_kernel_call_implicitarg_ptr_func_empty() #1 { 112 call void @func_implicitarg_ptr() 113 ret void 114} 115 116; GCN-LABEL: {{^}}kernel_call_implicitarg_ptr_func: 117; GCN: enable_sgpr_kernarg_segment_ptr = 1 118; HSA: kernarg_segment_byte_size = 112 119; MESA: kernarg_segment_byte_size = 128 120 121; HSA: s_add_u32 s6, s4, 0x70 122; MESA: s_add_u32 s6, s4, 0x70 123 124; GCN: s_addc_u32 s7, s5, 0{{$}} 125; GCN: s_swappc_b64 126define amdgpu_kernel void @kernel_call_implicitarg_ptr_func([112 x i8]) #0 { 127 call void @func_implicitarg_ptr() 128 ret void 129} 130 131; GCN-LABEL: {{^}}opencl_kernel_call_implicitarg_ptr_func: 132; GCN: enable_sgpr_kernarg_segment_ptr = 1 133; HSA: kernarg_segment_byte_size = 160 134; MESA: kernarg_segment_byte_size = 128 135 136; GCN: s_add_u32 s6, s4, 0x70 137 138; GCN: s_addc_u32 s7, s5, 0{{$}} 139; GCN: s_swappc_b64 140define amdgpu_kernel void @opencl_kernel_call_implicitarg_ptr_func([112 x i8]) #1 { 141 call void @func_implicitarg_ptr() 142 ret void 143} 144 145; GCN-LABEL: {{^}}func_call_implicitarg_ptr_func: 146; GCN-NOT: s6 147; GCN-NOT: s7 148; GCN-NOT: s[6:7] 149define void @func_call_implicitarg_ptr_func() #0 { 150 call void @func_implicitarg_ptr() 151 ret void 152} 153 154; GCN-LABEL: {{^}}opencl_func_call_implicitarg_ptr_func: 155; GCN-NOT: s6 156; GCN-NOT: s7 157; GCN-NOT: s[6:7] 158define void @opencl_func_call_implicitarg_ptr_func() #0 { 159 call void @func_implicitarg_ptr() 160 ret void 161} 162 163; GCN-LABEL: {{^}}func_kernarg_implicitarg_ptr: 164; GCN: s_waitcnt 165; MESA: v_mov_b32_e32 v0, s6 166; MESA: v_mov_b32_e32 v1, s7 167; MESA: v_mov_b32_e32 v2, s8 168; MESA: v_mov_b32_e32 v3, s9 169; MESA: buffer_load_dword v0, v[0:1], s[8:11], 0 addr64 170; HSA: v_mov_b32_e32 v0, s6 171; HSA: v_mov_b32_e32 v1, s7 172; HSA: flat_load_dword v0, v[0:1] 173; MESA: buffer_load_dword v0, v[2:3], s[8:11], 0 addr64 174; HSA: v_mov_b32_e32 v0, s8 175; HSA: v_mov_b32_e32 v1, s9 176; HSA: flat_load_dword v0, v[0:1] 177 178; GCN: s_waitcnt vmcnt(0) 179define void @func_kernarg_implicitarg_ptr() #0 { 180 %kernarg.segment.ptr = call i8 addrspace(4)* @llvm.amdgcn.kernarg.segment.ptr() 181 %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 182 %cast.kernarg.segment.ptr = bitcast i8 addrspace(4)* %kernarg.segment.ptr to i32 addrspace(4)* 183 %cast.implicitarg = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)* 184 %load0 = load volatile i32, i32 addrspace(4)* %cast.kernarg.segment.ptr 185 %load1 = load volatile i32, i32 addrspace(4)* %cast.implicitarg 186 ret void 187} 188 189; GCN-LABEL: {{^}}opencl_func_kernarg_implicitarg_ptr: 190; GCN: s_waitcnt 191; MESA: v_mov_b32_e32 v0, s6 192; MESA: v_mov_b32_e32 v1, s7 193; MESA: v_mov_b32_e32 v2, s8 194; MESA: v_mov_b32_e32 v3, s9 195; MESA: buffer_load_dword v0, v[0:1], s[8:11], 0 addr64 196; HSA: v_mov_b32_e32 v0, s6 197; HSA: v_mov_b32_e32 v1, s7 198; HSA: flat_load_dword v0, v[0:1] 199; MESA: buffer_load_dword v0, v[2:3], s[8:11], 0 addr64 200; HSA: v_mov_b32_e32 v0, s8 201; HSA: v_mov_b32_e32 v1, s9 202; HSA: flat_load_dword v0, v[0:1] 203 204; GCN: s_waitcnt vmcnt(0) 205define void @opencl_func_kernarg_implicitarg_ptr() #0 { 206 %kernarg.segment.ptr = call i8 addrspace(4)* @llvm.amdgcn.kernarg.segment.ptr() 207 %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 208 %cast.kernarg.segment.ptr = bitcast i8 addrspace(4)* %kernarg.segment.ptr to i32 addrspace(4)* 209 %cast.implicitarg = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)* 210 %load0 = load volatile i32, i32 addrspace(4)* %cast.kernarg.segment.ptr 211 %load1 = load volatile i32, i32 addrspace(4)* %cast.implicitarg 212 ret void 213} 214 215; GCN-LABEL: {{^}}kernel_call_kernarg_implicitarg_ptr_func: 216; GCN: s_mov_b64 s[6:7], s[4:5] 217; GCN: s_add_u32 s8, s6, 0x70 218; GCN: s_addc_u32 s9, s7, 0 219; GCN: s_swappc_b64 220define amdgpu_kernel void @kernel_call_kernarg_implicitarg_ptr_func([112 x i8]) #0 { 221 call void @func_kernarg_implicitarg_ptr() 222 ret void 223} 224 225; GCN-LABEL: {{^}}kernel_implicitarg_no_struct_align_padding: 226; HSA: kernarg_segment_byte_size = 120 227; MESA: kernarg_segment_byte_size = 84 228; GCN: kernarg_segment_alignment = 6 229define amdgpu_kernel void @kernel_implicitarg_no_struct_align_padding(<16 x i32>, i32) #1 { 230 %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 231 %cast = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)* 232 %load = load volatile i32, i32 addrspace(4)* %cast 233 ret void 234} 235 236declare i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() #2 237declare i8 addrspace(4)* @llvm.amdgcn.kernarg.segment.ptr() #2 238 239attributes #0 = { nounwind noinline } 240attributes #1 = { nounwind noinline "amdgpu-implicitarg-num-bytes"="48" } 241attributes #2 = { nounwind readnone speculatable } 242