135 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck --check-prefixes=GFX9-NO-BACKOFF %s3; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90a < %s | FileCheck --check-prefixes=GFX9-BACKOFF %s4; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx942 < %s | FileCheck --check-prefixes=GFX942-BACKOFF %s5; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90a -mattr=-back-off-barrier < %s | FileCheck --check-prefixes=GFX9-NO-BACKOFF %s6; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 < %s | FileCheck --check-prefixes=GFX10-BACKOFF %s7; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 < %s | FileCheck --check-prefixes=GFX11-BACKOFF %s8 9; Subtargets must wait for outstanding memory instructions before a barrier if10; they cannot back off of the barrier.11 12define void @back_off_barrier_no_fence(ptr %in, ptr %out) #0 {13; GFX9-NO-BACKOFF-LABEL: back_off_barrier_no_fence:14; GFX9-NO-BACKOFF: ; %bb.0:15; GFX9-NO-BACKOFF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)16; GFX9-NO-BACKOFF-NEXT: flat_load_dword v0, v[0:1]17; GFX9-NO-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)18; GFX9-NO-BACKOFF-NEXT: s_barrier19; GFX9-NO-BACKOFF-NEXT: flat_store_dword v[2:3], v020; GFX9-NO-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)21; GFX9-NO-BACKOFF-NEXT: s_setpc_b64 s[30:31]22;23; GFX9-BACKOFF-LABEL: back_off_barrier_no_fence:24; GFX9-BACKOFF: ; %bb.0:25; GFX9-BACKOFF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)26; GFX9-BACKOFF-NEXT: flat_load_dword v0, v[0:1]27; GFX9-BACKOFF-NEXT: s_barrier28; GFX9-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)29; GFX9-BACKOFF-NEXT: flat_store_dword v[2:3], v030; GFX9-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)31; GFX9-BACKOFF-NEXT: s_setpc_b64 s[30:31]32;33; GFX942-BACKOFF-LABEL: back_off_barrier_no_fence:34; GFX942-BACKOFF: ; %bb.0:35; GFX942-BACKOFF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)36; GFX942-BACKOFF-NEXT: flat_load_dword v0, v[0:1]37; GFX942-BACKOFF-NEXT: s_barrier38; GFX942-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)39; GFX942-BACKOFF-NEXT: flat_store_dword v[2:3], v040; GFX942-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)41; GFX942-BACKOFF-NEXT: s_setpc_b64 s[30:31]42;43; GFX10-BACKOFF-LABEL: back_off_barrier_no_fence:44; GFX10-BACKOFF: ; %bb.0:45; GFX10-BACKOFF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)46; GFX10-BACKOFF-NEXT: flat_load_dword v0, v[0:1]47; GFX10-BACKOFF-NEXT: s_barrier48; GFX10-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)49; GFX10-BACKOFF-NEXT: flat_store_dword v[2:3], v050; GFX10-BACKOFF-NEXT: s_waitcnt lgkmcnt(0)51; GFX10-BACKOFF-NEXT: s_setpc_b64 s[30:31]52;53; GFX11-BACKOFF-LABEL: back_off_barrier_no_fence:54; GFX11-BACKOFF: ; %bb.0:55; GFX11-BACKOFF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)56; GFX11-BACKOFF-NEXT: flat_load_b32 v0, v[0:1]57; GFX11-BACKOFF-NEXT: s_barrier58; GFX11-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)59; GFX11-BACKOFF-NEXT: flat_store_b32 v[2:3], v060; GFX11-BACKOFF-NEXT: s_waitcnt lgkmcnt(0)61; GFX11-BACKOFF-NEXT: s_setpc_b64 s[30:31]62 %load = load i32, ptr %in63 call void @llvm.amdgcn.s.barrier()64 store i32 %load, ptr %out65 ret void66}67 68define void @back_off_barrier_with_fence(ptr %in, ptr %out) #0 {69; GFX9-NO-BACKOFF-LABEL: back_off_barrier_with_fence:70; GFX9-NO-BACKOFF: ; %bb.0:71; GFX9-NO-BACKOFF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)72; GFX9-NO-BACKOFF-NEXT: flat_load_dword v0, v[0:1]73; GFX9-NO-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)74; GFX9-NO-BACKOFF-NEXT: s_barrier75; GFX9-NO-BACKOFF-NEXT: flat_store_dword v[2:3], v076; GFX9-NO-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)77; GFX9-NO-BACKOFF-NEXT: s_setpc_b64 s[30:31]78;79; GFX9-BACKOFF-LABEL: back_off_barrier_with_fence:80; GFX9-BACKOFF: ; %bb.0:81; GFX9-BACKOFF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)82; GFX9-BACKOFF-NEXT: flat_load_dword v0, v[0:1]83; GFX9-BACKOFF-NEXT: s_waitcnt lgkmcnt(0)84; GFX9-BACKOFF-NEXT: s_barrier85; GFX9-BACKOFF-NEXT: s_waitcnt vmcnt(0)86; GFX9-BACKOFF-NEXT: flat_store_dword v[2:3], v087; GFX9-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)88; GFX9-BACKOFF-NEXT: s_setpc_b64 s[30:31]89;90; GFX942-BACKOFF-LABEL: back_off_barrier_with_fence:91; GFX942-BACKOFF: ; %bb.0:92; GFX942-BACKOFF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)93; GFX942-BACKOFF-NEXT: flat_load_dword v0, v[0:1]94; GFX942-BACKOFF-NEXT: s_waitcnt lgkmcnt(0)95; GFX942-BACKOFF-NEXT: s_barrier96; GFX942-BACKOFF-NEXT: s_waitcnt vmcnt(0)97; GFX942-BACKOFF-NEXT: flat_store_dword v[2:3], v098; GFX942-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)99; GFX942-BACKOFF-NEXT: s_setpc_b64 s[30:31]100;101; GFX10-BACKOFF-LABEL: back_off_barrier_with_fence:102; GFX10-BACKOFF: ; %bb.0:103; GFX10-BACKOFF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)104; GFX10-BACKOFF-NEXT: flat_load_dword v0, v[0:1]105; GFX10-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)106; GFX10-BACKOFF-NEXT: s_waitcnt_vscnt null, 0x0107; GFX10-BACKOFF-NEXT: s_barrier108; GFX10-BACKOFF-NEXT: buffer_gl0_inv109; GFX10-BACKOFF-NEXT: flat_store_dword v[2:3], v0110; GFX10-BACKOFF-NEXT: s_waitcnt lgkmcnt(0)111; GFX10-BACKOFF-NEXT: s_setpc_b64 s[30:31]112;113; GFX11-BACKOFF-LABEL: back_off_barrier_with_fence:114; GFX11-BACKOFF: ; %bb.0:115; GFX11-BACKOFF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)116; GFX11-BACKOFF-NEXT: flat_load_b32 v0, v[0:1]117; GFX11-BACKOFF-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)118; GFX11-BACKOFF-NEXT: s_waitcnt_vscnt null, 0x0119; GFX11-BACKOFF-NEXT: s_barrier120; GFX11-BACKOFF-NEXT: buffer_gl0_inv121; GFX11-BACKOFF-NEXT: flat_store_b32 v[2:3], v0122; GFX11-BACKOFF-NEXT: s_waitcnt lgkmcnt(0)123; GFX11-BACKOFF-NEXT: s_setpc_b64 s[30:31]124 %load = load i32, ptr %in125 fence syncscope("workgroup") release126 call void @llvm.amdgcn.s.barrier()127 fence syncscope("workgroup") acquire128 store i32 %load, ptr %out129 ret void130}131 132declare void @llvm.amdgcn.s.barrier()133 134attributes #0 = { nounwind }135