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, 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-DAG: v_mov_b32_e32 v0, s6 166; MESA-DAG: v_mov_b32_e32 v1, s7 167; MESA-DAG: buffer_load_dword v0, v[0:1], s[12:15], 0 addr64 168; MESA: v_mov_b32_e32 v0, s8 169; MESA: v_mov_b32_e32 v1, s9 170; MESA: buffer_load_dword v0, v[0:1], s[12:15], 0 addr64 171 172; HSA: v_mov_b32_e32 v0, s6 173; HSA: v_mov_b32_e32 v1, s7 174; HSA: flat_load_dword v0, v[0:1] 175; HSA: v_mov_b32_e32 v0, s8 176; HSA: v_mov_b32_e32 v1, s9 177; HSA: flat_load_dword v0, v[0:1] 178 179; GCN: s_waitcnt vmcnt(0) 180define void @func_kernarg_implicitarg_ptr() #0 { 181 %kernarg.segment.ptr = call i8 addrspace(4)* @llvm.amdgcn.kernarg.segment.ptr() 182 %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 183 %cast.kernarg.segment.ptr = bitcast i8 addrspace(4)* %kernarg.segment.ptr to i32 addrspace(4)* 184 %cast.implicitarg = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)* 185 %load0 = load volatile i32, i32 addrspace(4)* %cast.kernarg.segment.ptr 186 %load1 = load volatile i32, i32 addrspace(4)* %cast.implicitarg 187 ret void 188} 189 190; GCN-LABEL: {{^}}opencl_func_kernarg_implicitarg_ptr: 191; GCN: s_waitcnt 192; MESA-DAG: v_mov_b32_e32 v0, s6 193; MESA-DAG: v_mov_b32_e32 v1, s7 194; MESA: buffer_load_dword v0, v[0:1], s[12:15], 0 addr64 195; MESA-DAG: v_mov_b32_e32 v0, s8 196; MESA-DAG: v_mov_b32_e32 v1, s9 197; MESA: buffer_load_dword v0, v[0:1], s[12:15], 0 addr64 198 199 200; HSA: v_mov_b32_e32 v0, s6 201; HSA: v_mov_b32_e32 v1, s7 202; HSA: flat_load_dword v0, v[0:1] 203 204; HSA: v_mov_b32_e32 v0, s8 205; HSA: v_mov_b32_e32 v1, s9 206; HSA: flat_load_dword v0, v[0:1] 207 208; GCN: s_waitcnt vmcnt(0) 209define void @opencl_func_kernarg_implicitarg_ptr() #0 { 210 %kernarg.segment.ptr = call i8 addrspace(4)* @llvm.amdgcn.kernarg.segment.ptr() 211 %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 212 %cast.kernarg.segment.ptr = bitcast i8 addrspace(4)* %kernarg.segment.ptr to i32 addrspace(4)* 213 %cast.implicitarg = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)* 214 %load0 = load volatile i32, i32 addrspace(4)* %cast.kernarg.segment.ptr 215 %load1 = load volatile i32, i32 addrspace(4)* %cast.implicitarg 216 ret void 217} 218 219; GCN-LABEL: {{^}}kernel_call_kernarg_implicitarg_ptr_func: 220; GCN: s_mov_b64 s[6:7], s[4:5] 221; GCN: s_add_u32 s8, s6, 0x70 222; GCN: s_addc_u32 s9, s7, 0 223; GCN: s_swappc_b64 224define amdgpu_kernel void @kernel_call_kernarg_implicitarg_ptr_func([112 x i8]) #0 { 225 call void @func_kernarg_implicitarg_ptr() 226 ret void 227} 228 229; GCN-LABEL: {{^}}kernel_implicitarg_no_struct_align_padding: 230; HSA: kernarg_segment_byte_size = 120 231; MESA: kernarg_segment_byte_size = 84 232; GCN: kernarg_segment_alignment = 6 233define amdgpu_kernel void @kernel_implicitarg_no_struct_align_padding(<16 x i32>, i32) #1 { 234 %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 235 %cast = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)* 236 %load = load volatile i32, i32 addrspace(4)* %cast 237 ret void 238} 239 240declare i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() #2 241declare i8 addrspace(4)* @llvm.amdgcn.kernarg.segment.ptr() #2 242 243attributes #0 = { nounwind noinline } 244attributes #1 = { nounwind noinline "amdgpu-implicitarg-num-bytes"="48" } 245attributes #2 = { nounwind readnone speculatable } 246