1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -amdhsa-code-object-version=3 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx803 -amdgpu-fixed-function-abi=0 < %s | FileCheck -check-prefix=VARABI %s 3; RUN: llc -amdhsa-code-object-version=3 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx803 -amdgpu-fixed-function-abi=1 < %s | FileCheck -check-prefixes=FIXEDABI,FIXEDABI-SDAG %s 4; RUN: llc -global-isel -amdhsa-code-object-version=3 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx803 -amdgpu-fixed-function-abi=1 < %s | FileCheck -check-prefixes=FIXEDABI,FIXEDABI-GISEL %s 5 6; Test with gfx803 so that 7; addrspacecast/llvm.amdgcn.is.shared/llvm.amdgcn.is.private require 8; the queue ptr. Tests with code object v3 to test 9; llvm.trap/llvm.debugtrap that require the queue ptr. 10 11 12declare hidden void @requires_all_inputs() 13 14; This function incorrectly is marked with the hints that the callee 15; does not require the implicit arguments to the function. Make sure 16; we do not crash. 17define void @parent_func_missing_inputs() #0 { 18; VARABI-LABEL: parent_func_missing_inputs: 19; VARABI: ; %bb.0: 20; VARABI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 21; VARABI-NEXT: s_or_saveexec_b64 s[4:5], -1 22; VARABI-NEXT: buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill 23; VARABI-NEXT: s_mov_b64 exec, s[4:5] 24; VARABI-NEXT: v_writelane_b32 v40, s33, 2 25; VARABI-NEXT: s_mov_b32 s33, s32 26; VARABI-NEXT: s_addk_i32 s32, 0x400 27; VARABI-NEXT: v_writelane_b32 v40, s30, 0 28; VARABI-NEXT: v_writelane_b32 v40, s31, 1 29; VARABI-NEXT: s_getpc_b64 s[4:5] 30; VARABI-NEXT: s_add_u32 s4, s4, requires_all_inputs@rel32@lo+4 31; VARABI-NEXT: s_addc_u32 s5, s5, requires_all_inputs@rel32@hi+12 32; VARABI-NEXT: s_swappc_b64 s[30:31], s[4:5] 33; VARABI-NEXT: v_readlane_b32 s4, v40, 0 34; VARABI-NEXT: v_readlane_b32 s5, v40, 1 35; VARABI-NEXT: s_addk_i32 s32, 0xfc00 36; VARABI-NEXT: v_readlane_b32 s33, v40, 2 37; VARABI-NEXT: s_or_saveexec_b64 s[6:7], -1 38; VARABI-NEXT: buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload 39; VARABI-NEXT: s_mov_b64 exec, s[6:7] 40; VARABI-NEXT: s_waitcnt vmcnt(0) 41; VARABI-NEXT: s_setpc_b64 s[4:5] 42; 43; FIXEDABI-LABEL: parent_func_missing_inputs: 44; FIXEDABI: ; %bb.0: 45; FIXEDABI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 46; FIXEDABI-NEXT: s_or_saveexec_b64 s[16:17], -1 47; FIXEDABI-NEXT: buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill 48; FIXEDABI-NEXT: s_mov_b64 exec, s[16:17] 49; FIXEDABI-NEXT: v_writelane_b32 v40, s33, 2 50; FIXEDABI-NEXT: s_mov_b32 s33, s32 51; FIXEDABI-NEXT: s_addk_i32 s32, 0x400 52; FIXEDABI-NEXT: v_writelane_b32 v40, s30, 0 53; FIXEDABI-NEXT: v_writelane_b32 v40, s31, 1 54; FIXEDABI-NEXT: s_getpc_b64 s[16:17] 55; FIXEDABI-NEXT: s_add_u32 s16, s16, requires_all_inputs@rel32@lo+4 56; FIXEDABI-NEXT: s_addc_u32 s17, s17, requires_all_inputs@rel32@hi+12 57; FIXEDABI-NEXT: s_swappc_b64 s[30:31], s[16:17] 58; FIXEDABI-NEXT: v_readlane_b32 s4, v40, 0 59; FIXEDABI-NEXT: v_readlane_b32 s5, v40, 1 60; FIXEDABI-NEXT: s_addk_i32 s32, 0xfc00 61; FIXEDABI-NEXT: v_readlane_b32 s33, v40, 2 62; FIXEDABI-NEXT: s_or_saveexec_b64 s[6:7], -1 63; FIXEDABI-NEXT: buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload 64; FIXEDABI-NEXT: s_mov_b64 exec, s[6:7] 65; FIXEDABI-NEXT: s_waitcnt vmcnt(0) 66; FIXEDABI-NEXT: s_setpc_b64 s[4:5] 67 call void @requires_all_inputs() 68 ret void 69} 70 71define amdgpu_kernel void @parent_kernel_missing_inputs() #0 { 72; VARABI-LABEL: parent_kernel_missing_inputs: 73; VARABI: ; %bb.0: 74; VARABI-NEXT: s_add_i32 s4, s4, s9 75; VARABI-NEXT: s_lshr_b32 flat_scratch_hi, s4, 8 76; VARABI-NEXT: s_add_u32 s0, s0, s9 77; VARABI-NEXT: s_addc_u32 s1, s1, 0 78; VARABI-NEXT: s_mov_b32 s32, 0 79; VARABI-NEXT: s_mov_b32 flat_scratch_lo, s5 80; VARABI-NEXT: s_getpc_b64 s[4:5] 81; VARABI-NEXT: s_add_u32 s4, s4, requires_all_inputs@rel32@lo+4 82; VARABI-NEXT: s_addc_u32 s5, s5, requires_all_inputs@rel32@hi+12 83; VARABI-NEXT: s_swappc_b64 s[30:31], s[4:5] 84; VARABI-NEXT: s_endpgm 85; 86; FIXEDABI-SDAG-LABEL: parent_kernel_missing_inputs: 87; FIXEDABI-SDAG: ; %bb.0: 88; FIXEDABI-SDAG-NEXT: s_add_i32 s10, s10, s15 89; FIXEDABI-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s10, 8 90; FIXEDABI-SDAG-NEXT: v_lshlrev_b32_e32 v1, 10, v1 91; FIXEDABI-SDAG-NEXT: s_add_u32 s0, s0, s15 92; FIXEDABI-SDAG-NEXT: v_lshlrev_b32_e32 v2, 20, v2 93; FIXEDABI-SDAG-NEXT: v_or_b32_e32 v0, v0, v1 94; FIXEDABI-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s11 95; FIXEDABI-SDAG-NEXT: s_addc_u32 s1, s1, 0 96; FIXEDABI-SDAG-NEXT: s_mov_b64 s[10:11], s[8:9] 97; FIXEDABI-SDAG-NEXT: v_or_b32_e32 v31, v0, v2 98; FIXEDABI-SDAG-NEXT: s_mov_b64 s[8:9], 0 99; FIXEDABI-SDAG-NEXT: s_mov_b32 s32, 0 100; FIXEDABI-SDAG-NEXT: s_getpc_b64 s[16:17] 101; FIXEDABI-SDAG-NEXT: s_add_u32 s16, s16, requires_all_inputs@rel32@lo+4 102; FIXEDABI-SDAG-NEXT: s_addc_u32 s17, s17, requires_all_inputs@rel32@hi+12 103; FIXEDABI-SDAG-NEXT: s_swappc_b64 s[30:31], s[16:17] 104; FIXEDABI-SDAG-NEXT: s_endpgm 105; 106; FIXEDABI-GISEL-LABEL: parent_kernel_missing_inputs: 107; FIXEDABI-GISEL: ; %bb.0: 108; FIXEDABI-GISEL-NEXT: s_add_i32 s10, s10, s15 109; FIXEDABI-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s10, 8 110; FIXEDABI-GISEL-NEXT: v_lshlrev_b32_e32 v1, 10, v1 111; FIXEDABI-GISEL-NEXT: s_add_u32 s0, s0, s15 112; FIXEDABI-GISEL-NEXT: v_or_b32_e32 v0, v0, v1 113; FIXEDABI-GISEL-NEXT: v_lshlrev_b32_e32 v1, 20, v2 114; FIXEDABI-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s11 115; FIXEDABI-GISEL-NEXT: s_addc_u32 s1, s1, 0 116; FIXEDABI-GISEL-NEXT: s_mov_b64 s[10:11], s[8:9] 117; FIXEDABI-GISEL-NEXT: v_or_b32_e32 v31, v0, v1 118; FIXEDABI-GISEL-NEXT: s_mov_b64 s[8:9], 0 119; FIXEDABI-GISEL-NEXT: s_mov_b32 s32, 0 120; FIXEDABI-GISEL-NEXT: s_getpc_b64 s[16:17] 121; FIXEDABI-GISEL-NEXT: s_add_u32 s16, s16, requires_all_inputs@rel32@lo+4 122; FIXEDABI-GISEL-NEXT: s_addc_u32 s17, s17, requires_all_inputs@rel32@hi+12 123; FIXEDABI-GISEL-NEXT: s_swappc_b64 s[30:31], s[16:17] 124; FIXEDABI-GISEL-NEXT: s_endpgm 125 call void @requires_all_inputs() 126 ret void 127} 128 129; Function is marked with amdgpu-no-workitem-id-* but uses them anyway 130define void @marked_func_use_workitem_id(i32 addrspace(1)* %ptr) #0 { 131; VARABI-LABEL: marked_func_use_workitem_id: 132; VARABI: ; %bb.0: 133; VARABI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 134; VARABI-NEXT: v_and_b32_e32 v3, 0x3ff, v2 135; VARABI-NEXT: flat_store_dword v[0:1], v3 136; VARABI-NEXT: s_waitcnt vmcnt(0) 137; VARABI-NEXT: v_bfe_u32 v3, v2, 10, 10 138; VARABI-NEXT: v_bfe_u32 v2, v2, 20, 10 139; VARABI-NEXT: flat_store_dword v[0:1], v3 140; VARABI-NEXT: s_waitcnt vmcnt(0) 141; VARABI-NEXT: flat_store_dword v[0:1], v2 142; VARABI-NEXT: s_waitcnt vmcnt(0) 143; VARABI-NEXT: s_setpc_b64 s[30:31] 144; 145; FIXEDABI-SDAG-LABEL: marked_func_use_workitem_id: 146; FIXEDABI-SDAG: ; %bb.0: 147; FIXEDABI-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 148; FIXEDABI-SDAG-NEXT: v_and_b32_e32 v2, 0x3ff, v31 149; FIXEDABI-SDAG-NEXT: flat_store_dword v[0:1], v2 150; FIXEDABI-SDAG-NEXT: s_waitcnt vmcnt(0) 151; FIXEDABI-SDAG-NEXT: v_bfe_u32 v2, v31, 10, 10 152; FIXEDABI-SDAG-NEXT: flat_store_dword v[0:1], v2 153; FIXEDABI-SDAG-NEXT: s_waitcnt vmcnt(0) 154; FIXEDABI-SDAG-NEXT: v_bfe_u32 v2, v31, 20, 10 155; FIXEDABI-SDAG-NEXT: flat_store_dword v[0:1], v2 156; FIXEDABI-SDAG-NEXT: s_waitcnt vmcnt(0) 157; FIXEDABI-SDAG-NEXT: s_setpc_b64 s[30:31] 158; 159; FIXEDABI-GISEL-LABEL: marked_func_use_workitem_id: 160; FIXEDABI-GISEL: ; %bb.0: 161; FIXEDABI-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 162; FIXEDABI-GISEL-NEXT: v_and_b32_e32 v2, 0x3ff, v31 163; FIXEDABI-GISEL-NEXT: v_bfe_u32 v3, v31, 10, 10 164; FIXEDABI-GISEL-NEXT: v_bfe_u32 v4, v31, 20, 10 165; FIXEDABI-GISEL-NEXT: flat_store_dword v[0:1], v2 166; FIXEDABI-GISEL-NEXT: s_waitcnt vmcnt(0) 167; FIXEDABI-GISEL-NEXT: flat_store_dword v[0:1], v3 168; FIXEDABI-GISEL-NEXT: s_waitcnt vmcnt(0) 169; FIXEDABI-GISEL-NEXT: flat_store_dword v[0:1], v4 170; FIXEDABI-GISEL-NEXT: s_waitcnt vmcnt(0) 171; FIXEDABI-GISEL-NEXT: s_setpc_b64 s[30:31] 172 %id.x = call i32 @llvm.amdgcn.workitem.id.x() 173 %id.y = call i32 @llvm.amdgcn.workitem.id.y() 174 %id.z = call i32 @llvm.amdgcn.workitem.id.z() 175 store volatile i32 %id.x, i32 addrspace(1)* %ptr 176 store volatile i32 %id.y, i32 addrspace(1)* %ptr 177 store volatile i32 %id.z, i32 addrspace(1)* %ptr 178 ret void 179} 180 181; Function is marked with amdgpu-no-workitem-id-* but uses them anyway 182define amdgpu_kernel void @marked_kernel_use_workitem_id(i32 addrspace(1)* %ptr) #0 { 183; VARABI-LABEL: marked_kernel_use_workitem_id: 184; VARABI: ; %bb.0: 185; VARABI-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 186; VARABI-NEXT: s_waitcnt lgkmcnt(0) 187; VARABI-NEXT: v_mov_b32_e32 v4, s1 188; VARABI-NEXT: v_mov_b32_e32 v3, s0 189; VARABI-NEXT: flat_store_dword v[3:4], v0 190; VARABI-NEXT: s_waitcnt vmcnt(0) 191; VARABI-NEXT: flat_store_dword v[3:4], v1 192; VARABI-NEXT: s_waitcnt vmcnt(0) 193; VARABI-NEXT: flat_store_dword v[3:4], v2 194; VARABI-NEXT: s_waitcnt vmcnt(0) 195; VARABI-NEXT: s_endpgm 196; 197; FIXEDABI-LABEL: marked_kernel_use_workitem_id: 198; FIXEDABI: ; %bb.0: 199; FIXEDABI-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 200; FIXEDABI-NEXT: s_waitcnt lgkmcnt(0) 201; FIXEDABI-NEXT: v_mov_b32_e32 v4, s1 202; FIXEDABI-NEXT: v_mov_b32_e32 v3, s0 203; FIXEDABI-NEXT: flat_store_dword v[3:4], v0 204; FIXEDABI-NEXT: s_waitcnt vmcnt(0) 205; FIXEDABI-NEXT: flat_store_dword v[3:4], v1 206; FIXEDABI-NEXT: s_waitcnt vmcnt(0) 207; FIXEDABI-NEXT: flat_store_dword v[3:4], v2 208; FIXEDABI-NEXT: s_waitcnt vmcnt(0) 209; FIXEDABI-NEXT: s_endpgm 210 %id.x = call i32 @llvm.amdgcn.workitem.id.x() 211 %id.y = call i32 @llvm.amdgcn.workitem.id.y() 212 %id.z = call i32 @llvm.amdgcn.workitem.id.z() 213 store volatile i32 %id.x, i32 addrspace(1)* %ptr 214 store volatile i32 %id.y, i32 addrspace(1)* %ptr 215 store volatile i32 %id.z, i32 addrspace(1)* %ptr 216 ret void 217} 218 219define void @marked_func_use_workgroup_id(i32 addrspace(1)* %ptr) #0 { 220; VARABI-LABEL: marked_func_use_workgroup_id: 221; VARABI: ; %bb.0: 222; VARABI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 223; VARABI-NEXT: v_mov_b32_e32 v2, s4 224; VARABI-NEXT: flat_store_dword v[0:1], v2 225; VARABI-NEXT: s_waitcnt vmcnt(0) 226; VARABI-NEXT: v_mov_b32_e32 v2, s5 227; VARABI-NEXT: flat_store_dword v[0:1], v2 228; VARABI-NEXT: s_waitcnt vmcnt(0) 229; VARABI-NEXT: v_mov_b32_e32 v2, s6 230; VARABI-NEXT: flat_store_dword v[0:1], v2 231; VARABI-NEXT: s_waitcnt vmcnt(0) 232; VARABI-NEXT: s_setpc_b64 s[30:31] 233; 234; FIXEDABI-LABEL: marked_func_use_workgroup_id: 235; FIXEDABI: ; %bb.0: 236; FIXEDABI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 237; FIXEDABI-NEXT: v_mov_b32_e32 v2, s12 238; FIXEDABI-NEXT: flat_store_dword v[0:1], v2 239; FIXEDABI-NEXT: s_waitcnt vmcnt(0) 240; FIXEDABI-NEXT: v_mov_b32_e32 v2, s13 241; FIXEDABI-NEXT: flat_store_dword v[0:1], v2 242; FIXEDABI-NEXT: s_waitcnt vmcnt(0) 243; FIXEDABI-NEXT: v_mov_b32_e32 v2, s14 244; FIXEDABI-NEXT: flat_store_dword v[0:1], v2 245; FIXEDABI-NEXT: s_waitcnt vmcnt(0) 246; FIXEDABI-NEXT: s_setpc_b64 s[30:31] 247 %id.x = call i32 @llvm.amdgcn.workgroup.id.x() 248 %id.y = call i32 @llvm.amdgcn.workgroup.id.y() 249 %id.z = call i32 @llvm.amdgcn.workgroup.id.z() 250 store volatile i32 %id.x, i32 addrspace(1)* %ptr 251 store volatile i32 %id.y, i32 addrspace(1)* %ptr 252 store volatile i32 %id.z, i32 addrspace(1)* %ptr 253 ret void 254} 255 256define amdgpu_kernel void @marked_kernel_use_workgroup_id(i32 addrspace(1)* %ptr) #0 { 257; VARABI-LABEL: marked_kernel_use_workgroup_id: 258; VARABI: ; %bb.0: 259; VARABI-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 260; VARABI-NEXT: v_mov_b32_e32 v2, s6 261; VARABI-NEXT: s_waitcnt lgkmcnt(0) 262; VARABI-NEXT: v_mov_b32_e32 v0, s0 263; VARABI-NEXT: v_mov_b32_e32 v1, s1 264; VARABI-NEXT: flat_store_dword v[0:1], v2 265; VARABI-NEXT: s_waitcnt vmcnt(0) 266; VARABI-NEXT: v_mov_b32_e32 v2, s7 267; VARABI-NEXT: flat_store_dword v[0:1], v2 268; VARABI-NEXT: s_waitcnt vmcnt(0) 269; VARABI-NEXT: v_mov_b32_e32 v2, s8 270; VARABI-NEXT: flat_store_dword v[0:1], v2 271; VARABI-NEXT: s_waitcnt vmcnt(0) 272; VARABI-NEXT: s_endpgm 273; 274; FIXEDABI-LABEL: marked_kernel_use_workgroup_id: 275; FIXEDABI: ; %bb.0: 276; FIXEDABI-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 277; FIXEDABI-NEXT: v_mov_b32_e32 v2, s6 278; FIXEDABI-NEXT: s_waitcnt lgkmcnt(0) 279; FIXEDABI-NEXT: v_mov_b32_e32 v0, s0 280; FIXEDABI-NEXT: v_mov_b32_e32 v1, s1 281; FIXEDABI-NEXT: flat_store_dword v[0:1], v2 282; FIXEDABI-NEXT: s_waitcnt vmcnt(0) 283; FIXEDABI-NEXT: v_mov_b32_e32 v2, s7 284; FIXEDABI-NEXT: flat_store_dword v[0:1], v2 285; FIXEDABI-NEXT: s_waitcnt vmcnt(0) 286; FIXEDABI-NEXT: v_mov_b32_e32 v2, s8 287; FIXEDABI-NEXT: flat_store_dword v[0:1], v2 288; FIXEDABI-NEXT: s_waitcnt vmcnt(0) 289; FIXEDABI-NEXT: s_endpgm 290 %id.x = call i32 @llvm.amdgcn.workgroup.id.x() 291 %id.y = call i32 @llvm.amdgcn.workgroup.id.y() 292 %id.z = call i32 @llvm.amdgcn.workgroup.id.z() 293 store volatile i32 %id.x, i32 addrspace(1)* %ptr 294 store volatile i32 %id.y, i32 addrspace(1)* %ptr 295 store volatile i32 %id.z, i32 addrspace(1)* %ptr 296 ret void 297} 298 299define void @marked_func_use_other_sgpr(i64 addrspace(1)* %ptr) #0 { 300; VARABI-LABEL: marked_func_use_other_sgpr: 301; VARABI: ; %bb.0: 302; VARABI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 303; VARABI-NEXT: flat_load_ubyte v0, v[0:1] glc 304; VARABI-NEXT: s_waitcnt vmcnt(0) 305; VARABI-NEXT: flat_load_ubyte v0, v[0:1] glc 306; VARABI-NEXT: s_waitcnt vmcnt(0) 307; VARABI-NEXT: flat_load_ubyte v0, v[0:1] glc 308; VARABI-NEXT: s_waitcnt vmcnt(0) 309; VARABI-NEXT: s_setpc_b64 s[30:31] 310; 311; FIXEDABI-LABEL: marked_func_use_other_sgpr: 312; FIXEDABI: ; %bb.0: 313; FIXEDABI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 314; FIXEDABI-NEXT: v_mov_b32_e32 v2, s6 315; FIXEDABI-NEXT: v_mov_b32_e32 v3, s7 316; FIXEDABI-NEXT: flat_load_ubyte v2, v[2:3] glc 317; FIXEDABI-NEXT: s_waitcnt vmcnt(0) 318; FIXEDABI-NEXT: v_mov_b32_e32 v2, s8 319; FIXEDABI-NEXT: v_mov_b32_e32 v3, s9 320; FIXEDABI-NEXT: flat_load_ubyte v2, v[2:3] glc 321; FIXEDABI-NEXT: s_waitcnt vmcnt(0) 322; FIXEDABI-NEXT: v_mov_b32_e32 v2, s4 323; FIXEDABI-NEXT: v_mov_b32_e32 v3, s5 324; FIXEDABI-NEXT: flat_load_ubyte v2, v[2:3] glc 325; FIXEDABI-NEXT: s_waitcnt vmcnt(0) 326; FIXEDABI-NEXT: v_mov_b32_e32 v2, s10 327; FIXEDABI-NEXT: v_mov_b32_e32 v3, s11 328; FIXEDABI-NEXT: flat_store_dwordx2 v[0:1], v[2:3] 329; FIXEDABI-NEXT: s_waitcnt vmcnt(0) 330; FIXEDABI-NEXT: s_setpc_b64 s[30:31] 331 %queue.ptr = call i8 addrspace(4)* @llvm.amdgcn.queue.ptr() 332 %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 333 %dispatch.ptr = call i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr() 334 %dispatch.id = call i64 @llvm.amdgcn.dispatch.id() 335 %queue.load = load volatile i8, i8 addrspace(4)* %queue.ptr 336 %implicitarg.load = load volatile i8, i8 addrspace(4)* %implicitarg.ptr 337 %dispatch.load = load volatile i8, i8 addrspace(4)* %dispatch.ptr 338 store volatile i64 %dispatch.id, i64 addrspace(1)* %ptr 339 ret void 340} 341 342define amdgpu_kernel void @marked_kernel_use_other_sgpr(i64 addrspace(1)* %ptr) #0 { 343; VARABI-LABEL: marked_kernel_use_other_sgpr: 344; VARABI: ; %bb.0: 345; VARABI-NEXT: s_add_u32 s0, s4, 8 346; VARABI-NEXT: flat_load_ubyte v0, v[0:1] glc 347; VARABI-NEXT: s_addc_u32 s1, s5, 0 348; VARABI-NEXT: s_waitcnt vmcnt(0) 349; VARABI-NEXT: v_mov_b32_e32 v0, s0 350; VARABI-NEXT: v_mov_b32_e32 v1, s1 351; VARABI-NEXT: flat_load_ubyte v0, v[0:1] glc 352; VARABI-NEXT: s_waitcnt vmcnt(0) 353; VARABI-NEXT: flat_load_ubyte v0, v[0:1] glc 354; VARABI-NEXT: s_endpgm 355; 356; FIXEDABI-LABEL: marked_kernel_use_other_sgpr: 357; FIXEDABI: ; %bb.0: 358; FIXEDABI-NEXT: s_add_u32 s0, s4, 8 359; FIXEDABI-NEXT: flat_load_ubyte v0, v[0:1] glc 360; FIXEDABI-NEXT: s_addc_u32 s1, s5, 0 361; FIXEDABI-NEXT: s_waitcnt vmcnt(0) 362; FIXEDABI-NEXT: v_mov_b32_e32 v0, s0 363; FIXEDABI-NEXT: v_mov_b32_e32 v1, s1 364; FIXEDABI-NEXT: flat_load_ubyte v0, v[0:1] glc 365; FIXEDABI-NEXT: s_waitcnt vmcnt(0) 366; FIXEDABI-NEXT: flat_load_ubyte v0, v[0:1] glc 367; FIXEDABI-NEXT: s_endpgm 368 %queue.ptr = call i8 addrspace(4)* @llvm.amdgcn.queue.ptr() 369 %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 370 %dispatch.ptr = call i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr() 371 %dispatch.id = call i64 @llvm.amdgcn.dispatch.id() 372 %queue.load = load volatile i8, i8 addrspace(4)* %queue.ptr 373 %implicitarg.load = load volatile i8, i8 addrspace(4)* %implicitarg.ptr 374 %dispatch.load = load volatile i8, i8 addrspace(4)* %dispatch.ptr 375 store volatile i64 %dispatch.id, i64 addrspace(1)* %ptr 376 ret void 377} 378 379define amdgpu_kernel void @marked_kernel_nokernargs_implicitarg_ptr() #0 { 380; VARABI-LABEL: marked_kernel_nokernargs_implicitarg_ptr: 381; VARABI: ; %bb.0: 382; VARABI-NEXT: v_mov_b32_e32 v0, 0 383; VARABI-NEXT: v_mov_b32_e32 v1, 0 384; VARABI-NEXT: flat_load_ubyte v0, v[0:1] glc 385; VARABI-NEXT: s_endpgm 386; 387; FIXEDABI-LABEL: marked_kernel_nokernargs_implicitarg_ptr: 388; FIXEDABI: ; %bb.0: 389; FIXEDABI-NEXT: v_mov_b32_e32 v0, 0 390; FIXEDABI-NEXT: v_mov_b32_e32 v1, 0 391; FIXEDABI-NEXT: flat_load_ubyte v0, v[0:1] glc 392; FIXEDABI-NEXT: s_endpgm 393 %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 394 %implicitarg.load = load volatile i8, i8 addrspace(4)* %implicitarg.ptr 395 ret void 396} 397 398; On gfx8, the queue ptr is required for this addrspacecast. 399define void @addrspacecast_requires_queue_ptr(i32 addrspace(5)* %ptr.private, i32 addrspace(3)* %ptr.local) #0 { 400; VARABI-LABEL: addrspacecast_requires_queue_ptr: 401; VARABI: ; %bb.0: 402; VARABI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 403; VARABI-NEXT: v_cmp_ne_u32_e32 vcc, -1, v0 404; VARABI-NEXT: v_mov_b32_e32 v3, 0 405; VARABI-NEXT: v_cndmask_b32_e32 v2, 0, v0, vcc 406; VARABI-NEXT: v_cmp_ne_u32_e32 vcc, -1, v1 407; VARABI-NEXT: v_mov_b32_e32 v4, 1 408; VARABI-NEXT: v_cndmask_b32_e32 v0, 0, v1, vcc 409; VARABI-NEXT: v_mov_b32_e32 v1, v3 410; VARABI-NEXT: flat_store_dword v[2:3], v4 411; VARABI-NEXT: s_waitcnt vmcnt(0) 412; VARABI-NEXT: v_mov_b32_e32 v2, 2 413; VARABI-NEXT: flat_store_dword v[0:1], v2 414; VARABI-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 415; VARABI-NEXT: s_setpc_b64 s[30:31] 416; 417; FIXEDABI-SDAG-LABEL: addrspacecast_requires_queue_ptr: 418; FIXEDABI-SDAG: ; %bb.0: 419; FIXEDABI-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 420; FIXEDABI-SDAG-NEXT: s_load_dword s4, s[6:7], 0x40 421; FIXEDABI-SDAG-NEXT: s_load_dword s5, s[6:7], 0x44 422; FIXEDABI-SDAG-NEXT: v_cmp_ne_u32_e32 vcc, -1, v0 423; FIXEDABI-SDAG-NEXT: s_waitcnt lgkmcnt(0) 424; FIXEDABI-SDAG-NEXT: v_mov_b32_e32 v2, s5 425; FIXEDABI-SDAG-NEXT: v_cndmask_b32_e32 v3, 0, v2, vcc 426; FIXEDABI-SDAG-NEXT: v_cndmask_b32_e32 v2, 0, v0, vcc 427; FIXEDABI-SDAG-NEXT: v_mov_b32_e32 v0, s4 428; FIXEDABI-SDAG-NEXT: v_cmp_ne_u32_e32 vcc, -1, v1 429; FIXEDABI-SDAG-NEXT: v_cndmask_b32_e32 v5, 0, v0, vcc 430; FIXEDABI-SDAG-NEXT: v_mov_b32_e32 v0, 1 431; FIXEDABI-SDAG-NEXT: v_cndmask_b32_e32 v4, 0, v1, vcc 432; FIXEDABI-SDAG-NEXT: flat_store_dword v[2:3], v0 433; FIXEDABI-SDAG-NEXT: s_waitcnt vmcnt(0) 434; FIXEDABI-SDAG-NEXT: v_mov_b32_e32 v0, 2 435; FIXEDABI-SDAG-NEXT: flat_store_dword v[4:5], v0 436; FIXEDABI-SDAG-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 437; FIXEDABI-SDAG-NEXT: s_setpc_b64 s[30:31] 438; 439; FIXEDABI-GISEL-LABEL: addrspacecast_requires_queue_ptr: 440; FIXEDABI-GISEL: ; %bb.0: 441; FIXEDABI-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 442; FIXEDABI-GISEL-NEXT: s_load_dword s4, s[6:7], 0x44 443; FIXEDABI-GISEL-NEXT: s_load_dword s5, s[6:7], 0x40 444; FIXEDABI-GISEL-NEXT: v_cmp_ne_u32_e32 vcc, -1, v0 445; FIXEDABI-GISEL-NEXT: v_cndmask_b32_e32 v2, 0, v0, vcc 446; FIXEDABI-GISEL-NEXT: s_waitcnt lgkmcnt(0) 447; FIXEDABI-GISEL-NEXT: v_mov_b32_e32 v3, s4 448; FIXEDABI-GISEL-NEXT: v_cndmask_b32_e32 v3, 0, v3, vcc 449; FIXEDABI-GISEL-NEXT: v_mov_b32_e32 v4, s5 450; FIXEDABI-GISEL-NEXT: v_cmp_ne_u32_e32 vcc, -1, v1 451; FIXEDABI-GISEL-NEXT: v_cndmask_b32_e32 v0, 0, v1, vcc 452; FIXEDABI-GISEL-NEXT: v_cndmask_b32_e32 v1, 0, v4, vcc 453; FIXEDABI-GISEL-NEXT: v_mov_b32_e32 v4, 1 454; FIXEDABI-GISEL-NEXT: flat_store_dword v[2:3], v4 455; FIXEDABI-GISEL-NEXT: s_waitcnt vmcnt(0) 456; FIXEDABI-GISEL-NEXT: v_mov_b32_e32 v2, 2 457; FIXEDABI-GISEL-NEXT: flat_store_dword v[0:1], v2 458; FIXEDABI-GISEL-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 459; FIXEDABI-GISEL-NEXT: s_setpc_b64 s[30:31] 460 %flat.private = addrspacecast i32 addrspace(5)* %ptr.private to i32* 461 %flat.local = addrspacecast i32 addrspace(3)* %ptr.local to i32* 462 store volatile i32 1, i32* %flat.private 463 store volatile i32 2, i32* %flat.local 464 ret void 465} 466 467define void @is_shared_requires_queue_ptr(i8* %ptr) #0 { 468; VARABI-LABEL: is_shared_requires_queue_ptr: 469; VARABI: ; %bb.0: 470; VARABI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 471; VARABI-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5] 472; VARABI-NEXT: flat_store_dword v[0:1], v0 473; VARABI-NEXT: s_waitcnt vmcnt(0) 474; VARABI-NEXT: s_setpc_b64 s[30:31] 475; 476; FIXEDABI-LABEL: is_shared_requires_queue_ptr: 477; FIXEDABI: ; %bb.0: 478; FIXEDABI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 479; FIXEDABI-NEXT: s_load_dword s4, s[6:7], 0x40 480; FIXEDABI-NEXT: s_waitcnt lgkmcnt(0) 481; FIXEDABI-NEXT: v_cmp_eq_u32_e32 vcc, s4, v1 482; FIXEDABI-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc 483; FIXEDABI-NEXT: flat_store_dword v[0:1], v0 484; FIXEDABI-NEXT: s_waitcnt vmcnt(0) 485; FIXEDABI-NEXT: s_setpc_b64 s[30:31] 486 %is.shared = call i1 @llvm.amdgcn.is.shared(i8* %ptr) 487 %zext = zext i1 %is.shared to i32 488 store volatile i32 %zext, i32 addrspace(1)* undef 489 ret void 490} 491 492define void @is_private_requires_queue_ptr(i8* %ptr) #0 { 493; VARABI-LABEL: is_private_requires_queue_ptr: 494; VARABI: ; %bb.0: 495; VARABI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 496; VARABI-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5] 497; VARABI-NEXT: flat_store_dword v[0:1], v0 498; VARABI-NEXT: s_waitcnt vmcnt(0) 499; VARABI-NEXT: s_setpc_b64 s[30:31] 500; 501; FIXEDABI-LABEL: is_private_requires_queue_ptr: 502; FIXEDABI: ; %bb.0: 503; FIXEDABI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 504; FIXEDABI-NEXT: s_load_dword s4, s[6:7], 0x44 505; FIXEDABI-NEXT: s_waitcnt lgkmcnt(0) 506; FIXEDABI-NEXT: v_cmp_eq_u32_e32 vcc, s4, v1 507; FIXEDABI-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc 508; FIXEDABI-NEXT: flat_store_dword v[0:1], v0 509; FIXEDABI-NEXT: s_waitcnt vmcnt(0) 510; FIXEDABI-NEXT: s_setpc_b64 s[30:31] 511 %is.private = call i1 @llvm.amdgcn.is.private(i8* %ptr) 512 %zext = zext i1 %is.private to i32 513 store volatile i32 %zext, i32 addrspace(1)* undef 514 ret void 515} 516 517define void @trap_requires_queue() #0 { 518; VARABI-LABEL: trap_requires_queue: 519; VARABI: ; %bb.0: 520; VARABI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 521; VARABI-NEXT: s_mov_b64 s[0:1], 0 522; VARABI-NEXT: s_trap 2 523; 524; FIXEDABI-LABEL: trap_requires_queue: 525; FIXEDABI: ; %bb.0: 526; FIXEDABI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 527; FIXEDABI-NEXT: s_mov_b64 s[0:1], s[6:7] 528; FIXEDABI-NEXT: s_trap 2 529 call void @llvm.trap() 530 unreachable 531} 532 533define void @debugtrap_requires_queue() #0 { 534; VARABI-LABEL: debugtrap_requires_queue: 535; VARABI: ; %bb.0: 536; VARABI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 537; VARABI-NEXT: s_trap 3 538; 539; FIXEDABI-LABEL: debugtrap_requires_queue: 540; FIXEDABI: ; %bb.0: 541; FIXEDABI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 542; FIXEDABI-NEXT: s_trap 3 543 call void @llvm.debugtrap() 544 unreachable 545} 546 547declare i32 @llvm.amdgcn.workitem.id.x() 548declare i32 @llvm.amdgcn.workitem.id.y() 549declare i32 @llvm.amdgcn.workitem.id.z() 550declare i32 @llvm.amdgcn.workgroup.id.x() 551declare i32 @llvm.amdgcn.workgroup.id.y() 552declare i32 @llvm.amdgcn.workgroup.id.z() 553declare noalias i8 addrspace(4)* @llvm.amdgcn.queue.ptr() 554declare noalias i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() 555declare i64 @llvm.amdgcn.dispatch.id() 556declare noalias i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr() 557declare i1 @llvm.amdgcn.is.shared(i8*) 558declare i1 @llvm.amdgcn.is.private(i8*) 559declare void @llvm.trap() 560declare void @llvm.debugtrap() 561 562attributes #0 = { "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-queue-ptr" "amdgpu-no-work-group-id-x" "amdgpu-no-work-group-id-y" "amdgpu-no-work-group-id-z" "amdgpu-no-work-item-id-x" "amdgpu-no-work-item-id-y" "amdgpu-no-work-item-id-z" } 563