544 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck %s --check-prefixes=GFX9003; RUN: llc -mtriple=amdgcn -mcpu=gfx90a < %s | FileCheck %s --check-prefixes=GFX90A4; RUN: llc -mtriple=amdgcn -mcpu=gfx90a -mattr=+tgsplit < %s | FileCheck %s --check-prefixes=GFX90A-TGSPLIT5; RUN: llc -mtriple=amdgcn -mcpu=gfx942 < %s | FileCheck %s --check-prefixes=GFX9426; RUN: llc -mtriple=amdgcn -mcpu=gfx942 -mattr=+tgsplit < %s | FileCheck %s --check-prefixes=GFX942-TGSPLIT7; RUN: llc -mtriple=amdgcn -mcpu=gfx1010 < %s | FileCheck %s -check-prefixes=GFX10WGP8; RUN: llc -mtriple=amdgcn -mcpu=gfx1010 -mattr=+cumode < %s | FileCheck %s -check-prefixes=GFX10CU9 10; In each of these tests, an LDS DMA operation is followed by a release pattern11; at workgroup scope. The fence in such a release (implicit or explicit) should12; wait for the store component in the LDS DMA. The additional noalias metadata13; is just meant to ensure that the wait counts are not generated due to some14; unintended aliasing.15 16declare void @llvm.amdgcn.raw.buffer.load.lds(<4 x i32> %rsrc, ptr addrspace(3) nocapture, i32 %size, i32 %voffset, i32 %soffset, i32 %offset, i32 %aux)17 18define amdgpu_kernel void @barrier_release(<4 x i32> inreg %rsrc,19; GFX900-LABEL: barrier_release:20; GFX900: ; %bb.0: ; %main_body21; GFX900-NEXT: s_load_dwordx8 s[8:15], s[4:5], 0x2422; GFX900-NEXT: v_mov_b32_e32 v0, 0x80023; GFX900-NEXT: v_mov_b32_e32 v1, 024; GFX900-NEXT: s_waitcnt lgkmcnt(0)25; GFX900-NEXT: s_mov_b32 m0, s1226; GFX900-NEXT: s_nop 027; GFX900-NEXT: buffer_load_dword v0, s[8:11], 0 offen lds28; GFX900-NEXT: v_mov_b32_e32 v0, s1329; GFX900-NEXT: s_waitcnt vmcnt(0)30; GFX900-NEXT: s_barrier31; GFX900-NEXT: ds_read_b32 v0, v032; GFX900-NEXT: s_waitcnt lgkmcnt(0)33; GFX900-NEXT: global_store_dword v1, v0, s[14:15]34; GFX900-NEXT: s_endpgm35;36; GFX90A-LABEL: barrier_release:37; GFX90A: ; %bb.1:38; GFX90A-NEXT: s_load_dwordx4 s[8:11], s[4:5], 0x039; GFX90A-NEXT: s_load_dwordx2 s[12:13], s[4:5], 0x1040; GFX90A-NEXT: s_waitcnt lgkmcnt(0)41; GFX90A-NEXT: s_branch .LBB0_042; GFX90A-NEXT: .p2align 843; GFX90A-NEXT: ; %bb.2:44; GFX90A-NEXT: .LBB0_0: ; %main_body45; GFX90A-NEXT: s_mov_b32 m0, s1246; GFX90A-NEXT: v_mov_b32_e32 v0, 0x80047; GFX90A-NEXT: buffer_load_dword v0, s[8:11], 0 offen lds48; GFX90A-NEXT: v_mov_b32_e32 v0, s1349; GFX90A-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x3c50; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)51; GFX90A-NEXT: s_barrier52; GFX90A-NEXT: ds_read_b32 v1, v053; GFX90A-NEXT: v_mov_b32_e32 v0, 054; GFX90A-NEXT: s_waitcnt lgkmcnt(0)55; GFX90A-NEXT: global_store_dword v0, v1, s[0:1]56; GFX90A-NEXT: s_endpgm57;58; GFX90A-TGSPLIT-LABEL: barrier_release:59; GFX90A-TGSPLIT: ; %bb.1:60; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[8:11], s[4:5], 0x061; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[12:13], s[4:5], 0x1062; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)63; GFX90A-TGSPLIT-NEXT: s_branch .LBB0_064; GFX90A-TGSPLIT-NEXT: .p2align 865; GFX90A-TGSPLIT-NEXT: ; %bb.2:66; GFX90A-TGSPLIT-NEXT: .LBB0_0: ; %main_body67; GFX90A-TGSPLIT-NEXT: s_mov_b32 m0, s1268; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, 0x80069; GFX90A-TGSPLIT-NEXT: buffer_load_dword v0, s[8:11], 0 offen lds70; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1371; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x3c72; GFX90A-TGSPLIT-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)73; GFX90A-TGSPLIT-NEXT: s_barrier74; GFX90A-TGSPLIT-NEXT: buffer_wbinvl1_vol75; GFX90A-TGSPLIT-NEXT: ds_read_b32 v1, v076; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, 077; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)78; GFX90A-TGSPLIT-NEXT: global_store_dword v0, v1, s[0:1]79; GFX90A-TGSPLIT-NEXT: s_endpgm80;81; GFX942-LABEL: barrier_release:82; GFX942: ; %bb.1:83; GFX942-NEXT: s_load_dwordx4 s[8:11], s[4:5], 0x084; GFX942-NEXT: s_load_dwordx2 s[12:13], s[4:5], 0x1085; GFX942-NEXT: s_waitcnt lgkmcnt(0)86; GFX942-NEXT: s_branch .LBB0_087; GFX942-NEXT: .p2align 888; GFX942-NEXT: ; %bb.2:89; GFX942-NEXT: .LBB0_0: ; %main_body90; GFX942-NEXT: s_mov_b32 m0, s1291; GFX942-NEXT: v_mov_b32_e32 v0, 0x80092; GFX942-NEXT: buffer_load_dword v0, s[8:11], 0 offen lds93; GFX942-NEXT: v_mov_b32_e32 v0, s1394; GFX942-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x3c95; GFX942-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)96; GFX942-NEXT: s_barrier97; GFX942-NEXT: ds_read_b32 v1, v098; GFX942-NEXT: v_mov_b32_e32 v0, 099; GFX942-NEXT: s_waitcnt lgkmcnt(0)100; GFX942-NEXT: global_store_dword v0, v1, s[0:1]101; GFX942-NEXT: s_endpgm102;103; GFX942-TGSPLIT-LABEL: barrier_release:104; GFX942-TGSPLIT: ; %bb.1:105; GFX942-TGSPLIT-NEXT: s_load_dwordx4 s[8:11], s[4:5], 0x0106; GFX942-TGSPLIT-NEXT: s_load_dwordx2 s[12:13], s[4:5], 0x10107; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)108; GFX942-TGSPLIT-NEXT: s_branch .LBB0_0109; GFX942-TGSPLIT-NEXT: .p2align 8110; GFX942-TGSPLIT-NEXT: ; %bb.2:111; GFX942-TGSPLIT-NEXT: .LBB0_0: ; %main_body112; GFX942-TGSPLIT-NEXT: s_mov_b32 m0, s12113; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, 0x800114; GFX942-TGSPLIT-NEXT: buffer_load_dword v0, s[8:11], 0 offen lds115; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s13116; GFX942-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x3c117; GFX942-TGSPLIT-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)118; GFX942-TGSPLIT-NEXT: s_barrier119; GFX942-TGSPLIT-NEXT: buffer_inv sc0120; GFX942-TGSPLIT-NEXT: ds_read_b32 v1, v0121; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, 0122; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)123; GFX942-TGSPLIT-NEXT: global_store_dword v0, v1, s[0:1]124; GFX942-TGSPLIT-NEXT: s_endpgm125;126; GFX10WGP-LABEL: barrier_release:127; GFX10WGP: ; %bb.0: ; %main_body128; GFX10WGP-NEXT: s_load_dwordx8 s[8:15], s[4:5], 0x24129; GFX10WGP-NEXT: v_mov_b32_e32 v0, 0x800130; GFX10WGP-NEXT: v_mov_b32_e32 v1, 0131; GFX10WGP-NEXT: s_waitcnt lgkmcnt(0)132; GFX10WGP-NEXT: s_mov_b32 m0, s12133; GFX10WGP-NEXT: buffer_load_dword v0, s[8:11], 0 offen lds134; GFX10WGP-NEXT: v_mov_b32_e32 v0, s13135; GFX10WGP-NEXT: s_waitcnt vmcnt(0)136; GFX10WGP-NEXT: s_barrier137; GFX10WGP-NEXT: buffer_gl0_inv138; GFX10WGP-NEXT: ds_read_b32 v0, v0139; GFX10WGP-NEXT: s_waitcnt lgkmcnt(0)140; GFX10WGP-NEXT: global_store_dword v1, v0, s[14:15]141; GFX10WGP-NEXT: s_endpgm142;143; GFX10CU-LABEL: barrier_release:144; GFX10CU: ; %bb.0: ; %main_body145; GFX10CU-NEXT: s_load_dwordx8 s[8:15], s[4:5], 0x24146; GFX10CU-NEXT: v_mov_b32_e32 v0, 0x800147; GFX10CU-NEXT: v_mov_b32_e32 v1, 0148; GFX10CU-NEXT: s_waitcnt lgkmcnt(0)149; GFX10CU-NEXT: s_mov_b32 m0, s12150; GFX10CU-NEXT: buffer_load_dword v0, s[8:11], 0 offen lds151; GFX10CU-NEXT: v_mov_b32_e32 v0, s13152; GFX10CU-NEXT: s_waitcnt vmcnt(0)153; GFX10CU-NEXT: s_barrier154; GFX10CU-NEXT: ds_read_b32 v0, v0155; GFX10CU-NEXT: s_waitcnt lgkmcnt(0)156; GFX10CU-NEXT: global_store_dword v1, v0, s[14:15]157; GFX10CU-NEXT: s_endpgm158 ptr addrspace(3) inreg %lds1,159 ptr addrspace(3) inreg %lds2,160 ptr addrspace(1) %dummy2) {161main_body:162 call void @llvm.amdgcn.raw.buffer.load.lds(<4 x i32> %rsrc, ptr addrspace(3) %lds1, i32 4, i32 2048, i32 0, i32 0, i32 0), !alias.scope !102163 fence syncscope("workgroup") release164 tail call void @llvm.amdgcn.s.barrier()165 fence syncscope("workgroup") acquire166 %load = load i32, ptr addrspace(3) %lds2, align 4, !noalias !105167 store i32 %load, ptr addrspace(1) %dummy2, align 4, !noalias !105168 ret void169}170 171define amdgpu_kernel void @fence_fence(<4 x i32> inreg %rsrc,172; GFX900-LABEL: fence_fence:173; GFX900: ; %bb.0: ; %main_body174; GFX900-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34175; GFX900-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24176; GFX900-NEXT: s_load_dwordx4 s[8:11], s[4:5], 0x3c177; GFX900-NEXT: v_mov_b32_e32 v1, 0x800178; GFX900-NEXT: v_mov_b32_e32 v0, 0179; GFX900-NEXT: s_waitcnt lgkmcnt(0)180; GFX900-NEXT: s_mov_b32 m0, s6181; GFX900-NEXT: s_nop 0182; GFX900-NEXT: buffer_load_dword v1, s[0:3], 0 offen lds183; GFX900-NEXT: v_mov_b32_e32 v1, 1184; GFX900-NEXT: s_waitcnt vmcnt(0)185; GFX900-NEXT: global_store_dword v0, v1, s[8:9]186; GFX900-NEXT: global_load_dword v1, v0, s[8:9]187; GFX900-NEXT: s_waitcnt vmcnt(0)188; GFX900-NEXT: v_mov_b32_e32 v1, s7189; GFX900-NEXT: ds_read_b32 v1, v1190; GFX900-NEXT: s_waitcnt lgkmcnt(0)191; GFX900-NEXT: global_store_dword v0, v1, s[10:11]192; GFX900-NEXT: s_endpgm193;194; GFX90A-LABEL: fence_fence:195; GFX90A: ; %bb.1:196; GFX90A-NEXT: s_load_dwordx4 s[8:11], s[4:5], 0x0197; GFX90A-NEXT: s_load_dwordx2 s[12:13], s[4:5], 0x10198; GFX90A-NEXT: s_waitcnt lgkmcnt(0)199; GFX90A-NEXT: s_branch .LBB1_0200; GFX90A-NEXT: .p2align 8201; GFX90A-NEXT: ; %bb.2:202; GFX90A-NEXT: .LBB1_0: ; %main_body203; GFX90A-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x3c204; GFX90A-NEXT: s_mov_b32 m0, s12205; GFX90A-NEXT: v_mov_b32_e32 v1, 0x800206; GFX90A-NEXT: v_mov_b32_e32 v0, 0207; GFX90A-NEXT: buffer_load_dword v1, s[8:11], 0 offen lds208; GFX90A-NEXT: v_mov_b32_e32 v1, 1209; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)210; GFX90A-NEXT: global_store_dword v0, v1, s[0:1]211; GFX90A-NEXT: global_load_dword v1, v0, s[0:1]212; GFX90A-NEXT: s_waitcnt vmcnt(0)213; GFX90A-NEXT: v_mov_b32_e32 v1, s13214; GFX90A-NEXT: ds_read_b32 v1, v1215; GFX90A-NEXT: s_waitcnt lgkmcnt(0)216; GFX90A-NEXT: global_store_dword v0, v1, s[2:3]217; GFX90A-NEXT: s_endpgm218;219; GFX90A-TGSPLIT-LABEL: fence_fence:220; GFX90A-TGSPLIT: ; %bb.1:221; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[8:11], s[4:5], 0x0222; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[12:13], s[4:5], 0x10223; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)224; GFX90A-TGSPLIT-NEXT: s_branch .LBB1_0225; GFX90A-TGSPLIT-NEXT: .p2align 8226; GFX90A-TGSPLIT-NEXT: ; %bb.2:227; GFX90A-TGSPLIT-NEXT: .LBB1_0: ; %main_body228; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x3c229; GFX90A-TGSPLIT-NEXT: s_mov_b32 m0, s12230; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, 0x800231; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, 0232; GFX90A-TGSPLIT-NEXT: buffer_load_dword v1, s[8:11], 0 offen lds233; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, 1234; GFX90A-TGSPLIT-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)235; GFX90A-TGSPLIT-NEXT: global_store_dword v0, v1, s[0:1]236; GFX90A-TGSPLIT-NEXT: global_load_dword v1, v0, s[0:1] glc237; GFX90A-TGSPLIT-NEXT: s_waitcnt vmcnt(0)238; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s13239; GFX90A-TGSPLIT-NEXT: buffer_wbinvl1_vol240; GFX90A-TGSPLIT-NEXT: ds_read_b32 v1, v1241; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)242; GFX90A-TGSPLIT-NEXT: global_store_dword v0, v1, s[2:3]243; GFX90A-TGSPLIT-NEXT: s_endpgm244;245; GFX942-LABEL: fence_fence:246; GFX942: ; %bb.1:247; GFX942-NEXT: s_load_dwordx4 s[8:11], s[4:5], 0x0248; GFX942-NEXT: s_load_dwordx2 s[12:13], s[4:5], 0x10249; GFX942-NEXT: s_waitcnt lgkmcnt(0)250; GFX942-NEXT: s_branch .LBB1_0251; GFX942-NEXT: .p2align 8252; GFX942-NEXT: ; %bb.2:253; GFX942-NEXT: .LBB1_0: ; %main_body254; GFX942-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x3c255; GFX942-NEXT: s_mov_b32 m0, s12256; GFX942-NEXT: v_mov_b32_e32 v1, 0x800257; GFX942-NEXT: v_mov_b32_e32 v0, 0258; GFX942-NEXT: buffer_load_dword v1, s[8:11], 0 offen lds259; GFX942-NEXT: v_mov_b32_e32 v1, 1260; GFX942-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)261; GFX942-NEXT: global_store_dword v0, v1, s[0:1] sc0262; GFX942-NEXT: global_load_dword v1, v0, s[0:1] sc0263; GFX942-NEXT: s_waitcnt vmcnt(0)264; GFX942-NEXT: v_mov_b32_e32 v1, s13265; GFX942-NEXT: ds_read_b32 v1, v1266; GFX942-NEXT: s_waitcnt lgkmcnt(0)267; GFX942-NEXT: global_store_dword v0, v1, s[2:3]268; GFX942-NEXT: s_endpgm269;270; GFX942-TGSPLIT-LABEL: fence_fence:271; GFX942-TGSPLIT: ; %bb.1:272; GFX942-TGSPLIT-NEXT: s_load_dwordx4 s[8:11], s[4:5], 0x0273; GFX942-TGSPLIT-NEXT: s_load_dwordx2 s[12:13], s[4:5], 0x10274; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)275; GFX942-TGSPLIT-NEXT: s_branch .LBB1_0276; GFX942-TGSPLIT-NEXT: .p2align 8277; GFX942-TGSPLIT-NEXT: ; %bb.2:278; GFX942-TGSPLIT-NEXT: .LBB1_0: ; %main_body279; GFX942-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x3c280; GFX942-TGSPLIT-NEXT: s_mov_b32 m0, s12281; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, 0x800282; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, 0283; GFX942-TGSPLIT-NEXT: buffer_load_dword v1, s[8:11], 0 offen lds284; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, 1285; GFX942-TGSPLIT-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)286; GFX942-TGSPLIT-NEXT: global_store_dword v0, v1, s[0:1] sc0287; GFX942-TGSPLIT-NEXT: global_load_dword v1, v0, s[0:1] sc0288; GFX942-TGSPLIT-NEXT: s_waitcnt vmcnt(0)289; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s13290; GFX942-TGSPLIT-NEXT: buffer_inv sc0291; GFX942-TGSPLIT-NEXT: ds_read_b32 v1, v1292; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)293; GFX942-TGSPLIT-NEXT: global_store_dword v0, v1, s[2:3]294; GFX942-TGSPLIT-NEXT: s_endpgm295;296; GFX10WGP-LABEL: fence_fence:297; GFX10WGP: ; %bb.0: ; %main_body298; GFX10WGP-NEXT: s_clause 0x2299; GFX10WGP-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34300; GFX10WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24301; GFX10WGP-NEXT: s_load_dwordx4 s[8:11], s[4:5], 0x3c302; GFX10WGP-NEXT: v_mov_b32_e32 v0, 0x800303; GFX10WGP-NEXT: v_mov_b32_e32 v1, 0304; GFX10WGP-NEXT: v_mov_b32_e32 v2, 1305; GFX10WGP-NEXT: s_waitcnt lgkmcnt(0)306; GFX10WGP-NEXT: s_mov_b32 m0, s6307; GFX10WGP-NEXT: buffer_load_dword v0, s[0:3], 0 offen lds308; GFX10WGP-NEXT: s_waitcnt vmcnt(0)309; GFX10WGP-NEXT: global_store_dword v1, v2, s[8:9]310; GFX10WGP-NEXT: global_load_dword v0, v1, s[8:9] glc311; GFX10WGP-NEXT: s_waitcnt vmcnt(0)312; GFX10WGP-NEXT: v_mov_b32_e32 v0, s7313; GFX10WGP-NEXT: s_waitcnt_vscnt null, 0x0314; GFX10WGP-NEXT: buffer_gl0_inv315; GFX10WGP-NEXT: ds_read_b32 v0, v0316; GFX10WGP-NEXT: s_waitcnt lgkmcnt(0)317; GFX10WGP-NEXT: global_store_dword v1, v0, s[10:11]318; GFX10WGP-NEXT: s_endpgm319;320; GFX10CU-LABEL: fence_fence:321; GFX10CU: ; %bb.0: ; %main_body322; GFX10CU-NEXT: s_clause 0x2323; GFX10CU-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34324; GFX10CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24325; GFX10CU-NEXT: s_load_dwordx4 s[8:11], s[4:5], 0x3c326; GFX10CU-NEXT: v_mov_b32_e32 v0, 0x800327; GFX10CU-NEXT: v_mov_b32_e32 v1, 0328; GFX10CU-NEXT: v_mov_b32_e32 v2, 1329; GFX10CU-NEXT: s_waitcnt lgkmcnt(0)330; GFX10CU-NEXT: s_mov_b32 m0, s6331; GFX10CU-NEXT: buffer_load_dword v0, s[0:3], 0 offen lds332; GFX10CU-NEXT: s_waitcnt vmcnt(0)333; GFX10CU-NEXT: global_store_dword v1, v2, s[8:9]334; GFX10CU-NEXT: global_load_dword v0, v1, s[8:9]335; GFX10CU-NEXT: s_waitcnt vmcnt(0)336; GFX10CU-NEXT: v_mov_b32_e32 v0, s7337; GFX10CU-NEXT: ds_read_b32 v0, v0338; GFX10CU-NEXT: s_waitcnt lgkmcnt(0)339; GFX10CU-NEXT: global_store_dword v1, v0, s[10:11]340; GFX10CU-NEXT: s_endpgm341 ptr addrspace(3) inreg %lds1,342 ptr addrspace(3) inreg %lds2,343 ptr addrspace(1) %flag,344 ptr addrspace(1) %dummy2) {345main_body:346 call void @llvm.amdgcn.raw.buffer.load.lds(<4 x i32> %rsrc, ptr addrspace(3) %lds1, i32 4, i32 2048, i32 0, i32 0, i32 0), !alias.scope !102347 fence syncscope("workgroup") release348 store atomic i32 1, ptr addrspace(1) %flag syncscope("workgroup") monotonic, align 4, !noalias !105349 %unused_flag = load atomic i32, ptr addrspace(1) %flag syncscope("workgroup") monotonic, align 4, !noalias !105350 fence syncscope("workgroup") acquire351 %load = load i32, ptr addrspace(3) %lds2, align 4, !noalias !105352 store i32 %load, ptr addrspace(1) %dummy2, align 4, !noalias !105353 ret void354}355 356define amdgpu_kernel void @release_acquire(<4 x i32> inreg %rsrc,357; GFX900-LABEL: release_acquire:358; GFX900: ; %bb.0: ; %main_body359; GFX900-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34360; GFX900-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24361; GFX900-NEXT: s_load_dwordx4 s[8:11], s[4:5], 0x3c362; GFX900-NEXT: v_mov_b32_e32 v1, 0x800363; GFX900-NEXT: v_mov_b32_e32 v0, 0364; GFX900-NEXT: s_waitcnt lgkmcnt(0)365; GFX900-NEXT: s_mov_b32 m0, s6366; GFX900-NEXT: s_nop 0367; GFX900-NEXT: buffer_load_dword v1, s[0:3], 0 offen lds368; GFX900-NEXT: v_mov_b32_e32 v1, 1369; GFX900-NEXT: s_waitcnt vmcnt(0)370; GFX900-NEXT: global_store_dword v0, v1, s[8:9]371; GFX900-NEXT: global_load_dword v1, v0, s[8:9]372; GFX900-NEXT: s_waitcnt vmcnt(0)373; GFX900-NEXT: v_mov_b32_e32 v1, s7374; GFX900-NEXT: ds_read_b32 v1, v1375; GFX900-NEXT: s_waitcnt lgkmcnt(0)376; GFX900-NEXT: global_store_dword v0, v1, s[10:11]377; GFX900-NEXT: s_endpgm378;379; GFX90A-LABEL: release_acquire:380; GFX90A: ; %bb.1:381; GFX90A-NEXT: s_load_dwordx4 s[8:11], s[4:5], 0x0382; GFX90A-NEXT: s_load_dwordx2 s[12:13], s[4:5], 0x10383; GFX90A-NEXT: s_waitcnt lgkmcnt(0)384; GFX90A-NEXT: s_branch .LBB2_0385; GFX90A-NEXT: .p2align 8386; GFX90A-NEXT: ; %bb.2:387; GFX90A-NEXT: .LBB2_0: ; %main_body388; GFX90A-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x3c389; GFX90A-NEXT: s_mov_b32 m0, s12390; GFX90A-NEXT: v_mov_b32_e32 v1, 0x800391; GFX90A-NEXT: v_mov_b32_e32 v0, 0392; GFX90A-NEXT: buffer_load_dword v1, s[8:11], 0 offen lds393; GFX90A-NEXT: v_mov_b32_e32 v1, 1394; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)395; GFX90A-NEXT: global_store_dword v0, v1, s[0:1]396; GFX90A-NEXT: global_load_dword v1, v0, s[0:1]397; GFX90A-NEXT: s_waitcnt vmcnt(0)398; GFX90A-NEXT: v_mov_b32_e32 v1, s13399; GFX90A-NEXT: ds_read_b32 v1, v1400; GFX90A-NEXT: s_waitcnt lgkmcnt(0)401; GFX90A-NEXT: global_store_dword v0, v1, s[2:3]402; GFX90A-NEXT: s_endpgm403;404; GFX90A-TGSPLIT-LABEL: release_acquire:405; GFX90A-TGSPLIT: ; %bb.1:406; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[8:11], s[4:5], 0x0407; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[12:13], s[4:5], 0x10408; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)409; GFX90A-TGSPLIT-NEXT: s_branch .LBB2_0410; GFX90A-TGSPLIT-NEXT: .p2align 8411; GFX90A-TGSPLIT-NEXT: ; %bb.2:412; GFX90A-TGSPLIT-NEXT: .LBB2_0: ; %main_body413; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x3c414; GFX90A-TGSPLIT-NEXT: s_mov_b32 m0, s12415; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, 0x800416; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, 0417; GFX90A-TGSPLIT-NEXT: buffer_load_dword v1, s[8:11], 0 offen lds418; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, 1419; GFX90A-TGSPLIT-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)420; GFX90A-TGSPLIT-NEXT: global_store_dword v0, v1, s[0:1]421; GFX90A-TGSPLIT-NEXT: global_load_dword v1, v0, s[0:1] glc422; GFX90A-TGSPLIT-NEXT: s_waitcnt vmcnt(0)423; GFX90A-TGSPLIT-NEXT: buffer_wbinvl1_vol424; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s13425; GFX90A-TGSPLIT-NEXT: ds_read_b32 v1, v1426; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)427; GFX90A-TGSPLIT-NEXT: global_store_dword v0, v1, s[2:3]428; GFX90A-TGSPLIT-NEXT: s_endpgm429;430; GFX942-LABEL: release_acquire:431; GFX942: ; %bb.1:432; GFX942-NEXT: s_load_dwordx4 s[8:11], s[4:5], 0x0433; GFX942-NEXT: s_load_dwordx2 s[12:13], s[4:5], 0x10434; GFX942-NEXT: s_waitcnt lgkmcnt(0)435; GFX942-NEXT: s_branch .LBB2_0436; GFX942-NEXT: .p2align 8437; GFX942-NEXT: ; %bb.2:438; GFX942-NEXT: .LBB2_0: ; %main_body439; GFX942-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x3c440; GFX942-NEXT: s_mov_b32 m0, s12441; GFX942-NEXT: v_mov_b32_e32 v1, 0x800442; GFX942-NEXT: v_mov_b32_e32 v0, 0443; GFX942-NEXT: buffer_load_dword v1, s[8:11], 0 offen lds444; GFX942-NEXT: v_mov_b32_e32 v1, 1445; GFX942-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)446; GFX942-NEXT: global_store_dword v0, v1, s[0:1] sc0447; GFX942-NEXT: global_load_dword v1, v0, s[0:1] sc0448; GFX942-NEXT: s_waitcnt vmcnt(0)449; GFX942-NEXT: v_mov_b32_e32 v1, s13450; GFX942-NEXT: ds_read_b32 v1, v1451; GFX942-NEXT: s_waitcnt lgkmcnt(0)452; GFX942-NEXT: global_store_dword v0, v1, s[2:3]453; GFX942-NEXT: s_endpgm454;455; GFX942-TGSPLIT-LABEL: release_acquire:456; GFX942-TGSPLIT: ; %bb.1:457; GFX942-TGSPLIT-NEXT: s_load_dwordx4 s[8:11], s[4:5], 0x0458; GFX942-TGSPLIT-NEXT: s_load_dwordx2 s[12:13], s[4:5], 0x10459; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)460; GFX942-TGSPLIT-NEXT: s_branch .LBB2_0461; GFX942-TGSPLIT-NEXT: .p2align 8462; GFX942-TGSPLIT-NEXT: ; %bb.2:463; GFX942-TGSPLIT-NEXT: .LBB2_0: ; %main_body464; GFX942-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x3c465; GFX942-TGSPLIT-NEXT: s_mov_b32 m0, s12466; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, 0x800467; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, 0468; GFX942-TGSPLIT-NEXT: buffer_load_dword v1, s[8:11], 0 offen lds469; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, 1470; GFX942-TGSPLIT-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)471; GFX942-TGSPLIT-NEXT: global_store_dword v0, v1, s[0:1] sc0472; GFX942-TGSPLIT-NEXT: global_load_dword v1, v0, s[0:1] sc0473; GFX942-TGSPLIT-NEXT: s_waitcnt vmcnt(0)474; GFX942-TGSPLIT-NEXT: buffer_inv sc0475; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s13476; GFX942-TGSPLIT-NEXT: ds_read_b32 v1, v1477; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)478; GFX942-TGSPLIT-NEXT: global_store_dword v0, v1, s[2:3]479; GFX942-TGSPLIT-NEXT: s_endpgm480;481; GFX10WGP-LABEL: release_acquire:482; GFX10WGP: ; %bb.0: ; %main_body483; GFX10WGP-NEXT: s_clause 0x2484; GFX10WGP-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34485; GFX10WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24486; GFX10WGP-NEXT: s_load_dwordx4 s[8:11], s[4:5], 0x3c487; GFX10WGP-NEXT: v_mov_b32_e32 v0, 0488; GFX10WGP-NEXT: v_mov_b32_e32 v1, 0x800489; GFX10WGP-NEXT: v_mov_b32_e32 v2, 1490; GFX10WGP-NEXT: s_waitcnt lgkmcnt(0)491; GFX10WGP-NEXT: s_mov_b32 m0, s6492; GFX10WGP-NEXT: buffer_load_dword v1, s[0:3], 0 offen lds493; GFX10WGP-NEXT: s_waitcnt vmcnt(0)494; GFX10WGP-NEXT: global_store_dword v0, v2, s[8:9]495; GFX10WGP-NEXT: global_load_dword v1, v0, s[8:9] glc496; GFX10WGP-NEXT: s_waitcnt vmcnt(0)497; GFX10WGP-NEXT: buffer_gl0_inv498; GFX10WGP-NEXT: v_mov_b32_e32 v1, s7499; GFX10WGP-NEXT: ds_read_b32 v1, v1500; GFX10WGP-NEXT: s_waitcnt lgkmcnt(0)501; GFX10WGP-NEXT: global_store_dword v0, v1, s[10:11]502; GFX10WGP-NEXT: s_endpgm503;504; GFX10CU-LABEL: release_acquire:505; GFX10CU: ; %bb.0: ; %main_body506; GFX10CU-NEXT: s_clause 0x2507; GFX10CU-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34508; GFX10CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24509; GFX10CU-NEXT: s_load_dwordx4 s[8:11], s[4:5], 0x3c510; GFX10CU-NEXT: v_mov_b32_e32 v0, 0511; GFX10CU-NEXT: v_mov_b32_e32 v1, 0x800512; GFX10CU-NEXT: v_mov_b32_e32 v2, 1513; GFX10CU-NEXT: s_waitcnt lgkmcnt(0)514; GFX10CU-NEXT: s_mov_b32 m0, s6515; GFX10CU-NEXT: buffer_load_dword v1, s[0:3], 0 offen lds516; GFX10CU-NEXT: s_waitcnt vmcnt(0)517; GFX10CU-NEXT: global_store_dword v0, v2, s[8:9]518; GFX10CU-NEXT: global_load_dword v1, v0, s[8:9]519; GFX10CU-NEXT: s_waitcnt vmcnt(0)520; GFX10CU-NEXT: v_mov_b32_e32 v1, s7521; GFX10CU-NEXT: ds_read_b32 v1, v1522; GFX10CU-NEXT: s_waitcnt lgkmcnt(0)523; GFX10CU-NEXT: global_store_dword v0, v1, s[10:11]524; GFX10CU-NEXT: s_endpgm525 ptr addrspace(3) inreg %lds1,526 ptr addrspace(3) inreg %lds2,527 ptr addrspace(1) %flag,528 ptr addrspace(1) %dummy2) {529main_body:530 call void @llvm.amdgcn.raw.buffer.load.lds(<4 x i32> %rsrc, ptr addrspace(3) %lds1, i32 4, i32 2048, i32 0, i32 0, i32 0), !alias.scope !102531 store atomic i32 1, ptr addrspace(1) %flag syncscope("workgroup") release, align 4, !noalias !105532 %unused_flag = load atomic i32, ptr addrspace(1) %flag syncscope("workgroup") acquire, align 4, !noalias !105533 %load = load i32, ptr addrspace(3) %lds2, align 4, !noalias !105534 store i32 %load, ptr addrspace(1) %dummy2, align 4, !noalias !105535 ret void536}537 538!100 = !{!100}539!101 = !{!101, !100}540!102 = !{!101}541!103 = !{!103, !100}542!104 = !{!103}543!105 = !{!101, !103}544