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