17598 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn-amd-amdhsa -O0 -mcpu=gfx600 < %s | FileCheck --check-prefixes=GFX6 %s3; RUN: llc -mtriple=amdgcn-amd-amdhsa -O0 -mcpu=gfx700 < %s | FileCheck --check-prefixes=GFX7 %s4; RUN: llc -mtriple=amdgcn-amd-amdhsa -O0 -mcpu=gfx1010 < %s | FileCheck --check-prefixes=GFX10-WGP %s5; RUN: llc -mtriple=amdgcn-amd-amdhsa -O0 -mcpu=gfx1010 -mattr=+cumode < %s | FileCheck --check-prefixes=GFX10-CU %s6; RUN: llc -mtriple=amdgcn-amd-amdpal -O0 -mcpu=gfx700 -amdgcn-skip-cache-invalidations < %s | FileCheck --check-prefixes=SKIP-CACHE-INV %s7; RUN: llc -mtriple=amdgcn-amd-amdhsa -O0 -mcpu=gfx90a < %s | FileCheck -check-prefixes=GFX90A-NOTTGSPLIT %s8; RUN: llc -mtriple=amdgcn-amd-amdhsa -O0 -mcpu=gfx90a -mattr=+tgsplit < %s | FileCheck -check-prefixes=GFX90A-TGSPLIT %s9; RUN: llc -mtriple=amdgcn-amd-amdhsa -O0 -mcpu=gfx942 < %s | FileCheck -check-prefixes=GFX942-NOTTGSPLIT %s10; RUN: llc -mtriple=amdgcn-amd-amdhsa -O0 -mcpu=gfx942 -mattr=+tgsplit < %s | FileCheck -check-prefixes=GFX942-TGSPLIT %s11; RUN: llc -mtriple=amdgcn-amd-amdhsa -O0 -mcpu=gfx1100 < %s | FileCheck --check-prefixes=GFX11-WGP %s12; RUN: llc -mtriple=amdgcn-amd-amdhsa -O0 -mcpu=gfx1100 -mattr=+cumode < %s | FileCheck --check-prefixes=GFX11-CU %s13; RUN: llc -mtriple=amdgcn-amd-amdhsa -O0 -mcpu=gfx1200 < %s | FileCheck --check-prefixes=GFX12-WGP %s14; RUN: llc -mtriple=amdgcn-amd-amdhsa -O0 -mcpu=gfx1200 -mattr=+cumode < %s | FileCheck --check-prefixes=GFX12-CU %s15; RUN: llc -mtriple=amdgcn-amd-amdhsa -O0 -mcpu=gfx1250 < %s | FileCheck --check-prefixes=GFX1250 %s16 17define amdgpu_kernel void @local_singlethread_unordered_load(18; GFX6-LABEL: local_singlethread_unordered_load:19; GFX6: ; %bb.0: ; %entry20; GFX6-NEXT: s_load_dword s5, s[8:9], 0x021; GFX6-NEXT: s_load_dword s4, s[8:9], 0x122; GFX6-NEXT: ; kill: def $sgpr6 killed $sgpr423; GFX6-NEXT: ; kill: def $sgpr6 killed $sgpr524; GFX6-NEXT: s_mov_b32 m0, -125; GFX6-NEXT: s_waitcnt lgkmcnt(0)26; GFX6-NEXT: v_mov_b32_e32 v0, s527; GFX6-NEXT: ds_read_b32 v1, v028; GFX6-NEXT: s_mov_b32 m0, -129; GFX6-NEXT: v_mov_b32_e32 v0, s430; GFX6-NEXT: s_waitcnt lgkmcnt(0)31; GFX6-NEXT: ds_write_b32 v0, v132; GFX6-NEXT: s_endpgm33;34; GFX7-LABEL: local_singlethread_unordered_load:35; GFX7: ; %bb.0: ; %entry36; GFX7-NEXT: s_load_dword s5, s[8:9], 0x037; GFX7-NEXT: s_load_dword s4, s[8:9], 0x138; GFX7-NEXT: s_mov_b32 m0, -139; GFX7-NEXT: s_waitcnt lgkmcnt(0)40; GFX7-NEXT: v_mov_b32_e32 v0, s541; GFX7-NEXT: ds_read_b32 v1, v042; GFX7-NEXT: s_mov_b32 m0, -143; GFX7-NEXT: v_mov_b32_e32 v0, s444; GFX7-NEXT: s_waitcnt lgkmcnt(0)45; GFX7-NEXT: ds_write_b32 v0, v146; GFX7-NEXT: s_endpgm47;48; GFX10-WGP-LABEL: local_singlethread_unordered_load:49; GFX10-WGP: ; %bb.0: ; %entry50; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x051; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x452; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)53; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s554; GFX10-WGP-NEXT: ds_read_b32 v1, v055; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s456; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)57; GFX10-WGP-NEXT: ds_write_b32 v0, v158; GFX10-WGP-NEXT: s_endpgm59;60; GFX10-CU-LABEL: local_singlethread_unordered_load:61; GFX10-CU: ; %bb.0: ; %entry62; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x063; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x464; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)65; GFX10-CU-NEXT: v_mov_b32_e32 v0, s566; GFX10-CU-NEXT: ds_read_b32 v1, v067; GFX10-CU-NEXT: v_mov_b32_e32 v0, s468; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)69; GFX10-CU-NEXT: ds_write_b32 v0, v170; GFX10-CU-NEXT: s_endpgm71;72; SKIP-CACHE-INV-LABEL: local_singlethread_unordered_load:73; SKIP-CACHE-INV: ; %bb.0: ; %entry74; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x075; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x176; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -177; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)78; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s179; SKIP-CACHE-INV-NEXT: ds_read_b32 v1, v080; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -181; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s082; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)83; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v184; SKIP-CACHE-INV-NEXT: s_endpgm85;86; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_unordered_load:87; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry88; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x089; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x490; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)91; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s592; GFX90A-NOTTGSPLIT-NEXT: ds_read_b32 v1, v093; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s494; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)95; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v196; GFX90A-NOTTGSPLIT-NEXT: s_endpgm97;98; GFX90A-TGSPLIT-LABEL: local_singlethread_unordered_load:99; GFX90A-TGSPLIT: ; %bb.0: ; %entry100; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x0101; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x4102; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)103; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s5104; GFX90A-TGSPLIT-NEXT: ds_read_b32 v1, v0105; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s4106; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)107; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1108; GFX90A-TGSPLIT-NEXT: s_endpgm109;110; GFX942-NOTTGSPLIT-LABEL: local_singlethread_unordered_load:111; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry112; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x0113; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x4114; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)115; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1116; GFX942-NOTTGSPLIT-NEXT: ds_read_b32 v1, v0117; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0118; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)119; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1120; GFX942-NOTTGSPLIT-NEXT: s_endpgm121;122; GFX942-TGSPLIT-LABEL: local_singlethread_unordered_load:123; GFX942-TGSPLIT: ; %bb.0: ; %entry124; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x0125; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x4126; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)127; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1128; GFX942-TGSPLIT-NEXT: ds_read_b32 v1, v0129; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0130; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)131; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v1132; GFX942-TGSPLIT-NEXT: s_endpgm133;134; GFX11-WGP-LABEL: local_singlethread_unordered_load:135; GFX11-WGP: ; %bb.0: ; %entry136; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x0137; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x4138; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)139; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s1140; GFX11-WGP-NEXT: ds_load_b32 v1, v0141; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s0142; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)143; GFX11-WGP-NEXT: ds_store_b32 v0, v1144; GFX11-WGP-NEXT: s_endpgm145;146; GFX11-CU-LABEL: local_singlethread_unordered_load:147; GFX11-CU: ; %bb.0: ; %entry148; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x0149; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x4150; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)151; GFX11-CU-NEXT: v_mov_b32_e32 v0, s1152; GFX11-CU-NEXT: ds_load_b32 v1, v0153; GFX11-CU-NEXT: v_mov_b32_e32 v0, s0154; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)155; GFX11-CU-NEXT: ds_store_b32 v0, v1156; GFX11-CU-NEXT: s_endpgm157;158; GFX12-WGP-LABEL: local_singlethread_unordered_load:159; GFX12-WGP: ; %bb.0: ; %entry160; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x0161; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x4162; GFX12-WGP-NEXT: s_wait_kmcnt 0x0163; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s1164; GFX12-WGP-NEXT: ds_load_b32 v1, v0165; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s0166; GFX12-WGP-NEXT: s_wait_dscnt 0x0167; GFX12-WGP-NEXT: ds_store_b32 v0, v1168; GFX12-WGP-NEXT: s_endpgm169;170; GFX12-CU-LABEL: local_singlethread_unordered_load:171; GFX12-CU: ; %bb.0: ; %entry172; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x0173; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x4174; GFX12-CU-NEXT: s_wait_kmcnt 0x0175; GFX12-CU-NEXT: v_mov_b32_e32 v0, s1176; GFX12-CU-NEXT: ds_load_b32 v1, v0177; GFX12-CU-NEXT: v_mov_b32_e32 v0, s0178; GFX12-CU-NEXT: s_wait_dscnt 0x0179; GFX12-CU-NEXT: ds_store_b32 v0, v1180; GFX12-CU-NEXT: s_endpgm181;182; GFX1250-LABEL: local_singlethread_unordered_load:183; GFX1250: ; %bb.0: ; %entry184; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1185; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x0186; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x4187; GFX1250-NEXT: s_wait_kmcnt 0x0188; GFX1250-NEXT: v_mov_b32_e32 v0, s1189; GFX1250-NEXT: ds_load_b32 v1, v0190; GFX1250-NEXT: v_mov_b32_e32 v0, s0191; GFX1250-NEXT: s_wait_dscnt 0x0192; GFX1250-NEXT: ds_store_b32 v0, v1193; GFX1250-NEXT: s_endpgm194 ptr addrspace(3) %in, ptr addrspace(3) %out) {195entry:196 %val = load atomic i32, ptr addrspace(3) %in syncscope("singlethread") unordered, align 4197 store i32 %val, ptr addrspace(3) %out198 ret void199}200 201define amdgpu_kernel void @local_singlethread_monotonic_load(202; GFX6-LABEL: local_singlethread_monotonic_load:203; GFX6: ; %bb.0: ; %entry204; GFX6-NEXT: s_load_dword s5, s[8:9], 0x0205; GFX6-NEXT: s_load_dword s4, s[8:9], 0x1206; GFX6-NEXT: ; kill: def $sgpr6 killed $sgpr4207; GFX6-NEXT: ; kill: def $sgpr6 killed $sgpr5208; GFX6-NEXT: s_mov_b32 m0, -1209; GFX6-NEXT: s_waitcnt lgkmcnt(0)210; GFX6-NEXT: v_mov_b32_e32 v0, s5211; GFX6-NEXT: ds_read_b32 v1, v0212; GFX6-NEXT: s_mov_b32 m0, -1213; GFX6-NEXT: v_mov_b32_e32 v0, s4214; GFX6-NEXT: s_waitcnt lgkmcnt(0)215; GFX6-NEXT: ds_write_b32 v0, v1216; GFX6-NEXT: s_endpgm217;218; GFX7-LABEL: local_singlethread_monotonic_load:219; GFX7: ; %bb.0: ; %entry220; GFX7-NEXT: s_load_dword s5, s[8:9], 0x0221; GFX7-NEXT: s_load_dword s4, s[8:9], 0x1222; GFX7-NEXT: s_mov_b32 m0, -1223; GFX7-NEXT: s_waitcnt lgkmcnt(0)224; GFX7-NEXT: v_mov_b32_e32 v0, s5225; GFX7-NEXT: ds_read_b32 v1, v0226; GFX7-NEXT: s_mov_b32 m0, -1227; GFX7-NEXT: v_mov_b32_e32 v0, s4228; GFX7-NEXT: s_waitcnt lgkmcnt(0)229; GFX7-NEXT: ds_write_b32 v0, v1230; GFX7-NEXT: s_endpgm231;232; GFX10-WGP-LABEL: local_singlethread_monotonic_load:233; GFX10-WGP: ; %bb.0: ; %entry234; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x0235; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x4236; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)237; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s5238; GFX10-WGP-NEXT: ds_read_b32 v1, v0239; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s4240; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)241; GFX10-WGP-NEXT: ds_write_b32 v0, v1242; GFX10-WGP-NEXT: s_endpgm243;244; GFX10-CU-LABEL: local_singlethread_monotonic_load:245; GFX10-CU: ; %bb.0: ; %entry246; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x0247; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x4248; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)249; GFX10-CU-NEXT: v_mov_b32_e32 v0, s5250; GFX10-CU-NEXT: ds_read_b32 v1, v0251; GFX10-CU-NEXT: v_mov_b32_e32 v0, s4252; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)253; GFX10-CU-NEXT: ds_write_b32 v0, v1254; GFX10-CU-NEXT: s_endpgm255;256; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_load:257; SKIP-CACHE-INV: ; %bb.0: ; %entry258; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x0259; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x1260; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1261; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)262; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s1263; SKIP-CACHE-INV-NEXT: ds_read_b32 v1, v0264; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1265; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0266; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)267; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1268; SKIP-CACHE-INV-NEXT: s_endpgm269;270; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_load:271; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry272; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x0273; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x4274; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)275; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s5276; GFX90A-NOTTGSPLIT-NEXT: ds_read_b32 v1, v0277; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s4278; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)279; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1280; GFX90A-NOTTGSPLIT-NEXT: s_endpgm281;282; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_load:283; GFX90A-TGSPLIT: ; %bb.0: ; %entry284; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x0285; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x4286; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)287; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s5288; GFX90A-TGSPLIT-NEXT: ds_read_b32 v1, v0289; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s4290; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)291; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1292; GFX90A-TGSPLIT-NEXT: s_endpgm293;294; GFX942-NOTTGSPLIT-LABEL: local_singlethread_monotonic_load:295; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry296; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x0297; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x4298; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)299; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1300; GFX942-NOTTGSPLIT-NEXT: ds_read_b32 v1, v0301; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0302; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)303; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1304; GFX942-NOTTGSPLIT-NEXT: s_endpgm305;306; GFX942-TGSPLIT-LABEL: local_singlethread_monotonic_load:307; GFX942-TGSPLIT: ; %bb.0: ; %entry308; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x0309; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x4310; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)311; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1312; GFX942-TGSPLIT-NEXT: ds_read_b32 v1, v0313; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0314; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)315; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v1316; GFX942-TGSPLIT-NEXT: s_endpgm317;318; GFX11-WGP-LABEL: local_singlethread_monotonic_load:319; GFX11-WGP: ; %bb.0: ; %entry320; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x0321; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x4322; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)323; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s1324; GFX11-WGP-NEXT: ds_load_b32 v1, v0325; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s0326; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)327; GFX11-WGP-NEXT: ds_store_b32 v0, v1328; GFX11-WGP-NEXT: s_endpgm329;330; GFX11-CU-LABEL: local_singlethread_monotonic_load:331; GFX11-CU: ; %bb.0: ; %entry332; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x0333; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x4334; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)335; GFX11-CU-NEXT: v_mov_b32_e32 v0, s1336; GFX11-CU-NEXT: ds_load_b32 v1, v0337; GFX11-CU-NEXT: v_mov_b32_e32 v0, s0338; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)339; GFX11-CU-NEXT: ds_store_b32 v0, v1340; GFX11-CU-NEXT: s_endpgm341;342; GFX12-WGP-LABEL: local_singlethread_monotonic_load:343; GFX12-WGP: ; %bb.0: ; %entry344; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x0345; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x4346; GFX12-WGP-NEXT: s_wait_kmcnt 0x0347; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s1348; GFX12-WGP-NEXT: ds_load_b32 v1, v0349; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s0350; GFX12-WGP-NEXT: s_wait_dscnt 0x0351; GFX12-WGP-NEXT: ds_store_b32 v0, v1352; GFX12-WGP-NEXT: s_endpgm353;354; GFX12-CU-LABEL: local_singlethread_monotonic_load:355; GFX12-CU: ; %bb.0: ; %entry356; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x0357; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x4358; GFX12-CU-NEXT: s_wait_kmcnt 0x0359; GFX12-CU-NEXT: v_mov_b32_e32 v0, s1360; GFX12-CU-NEXT: ds_load_b32 v1, v0361; GFX12-CU-NEXT: v_mov_b32_e32 v0, s0362; GFX12-CU-NEXT: s_wait_dscnt 0x0363; GFX12-CU-NEXT: ds_store_b32 v0, v1364; GFX12-CU-NEXT: s_endpgm365;366; GFX1250-LABEL: local_singlethread_monotonic_load:367; GFX1250: ; %bb.0: ; %entry368; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1369; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x0370; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x4371; GFX1250-NEXT: s_wait_kmcnt 0x0372; GFX1250-NEXT: v_mov_b32_e32 v0, s1373; GFX1250-NEXT: ds_load_b32 v1, v0374; GFX1250-NEXT: v_mov_b32_e32 v0, s0375; GFX1250-NEXT: s_wait_dscnt 0x0376; GFX1250-NEXT: ds_store_b32 v0, v1377; GFX1250-NEXT: s_endpgm378 ptr addrspace(3) %in, ptr addrspace(3) %out) {379entry:380 %val = load atomic i32, ptr addrspace(3) %in syncscope("singlethread") monotonic, align 4381 store i32 %val, ptr addrspace(3) %out382 ret void383}384 385define amdgpu_kernel void @local_singlethread_acquire_load(386; GFX6-LABEL: local_singlethread_acquire_load:387; GFX6: ; %bb.0: ; %entry388; GFX6-NEXT: s_load_dword s5, s[8:9], 0x0389; GFX6-NEXT: s_load_dword s4, s[8:9], 0x1390; GFX6-NEXT: ; kill: def $sgpr6 killed $sgpr4391; GFX6-NEXT: ; kill: def $sgpr6 killed $sgpr5392; GFX6-NEXT: s_mov_b32 m0, -1393; GFX6-NEXT: s_waitcnt lgkmcnt(0)394; GFX6-NEXT: v_mov_b32_e32 v0, s5395; GFX6-NEXT: ds_read_b32 v1, v0396; GFX6-NEXT: s_mov_b32 m0, -1397; GFX6-NEXT: v_mov_b32_e32 v0, s4398; GFX6-NEXT: s_waitcnt lgkmcnt(0)399; GFX6-NEXT: ds_write_b32 v0, v1400; GFX6-NEXT: s_endpgm401;402; GFX7-LABEL: local_singlethread_acquire_load:403; GFX7: ; %bb.0: ; %entry404; GFX7-NEXT: s_load_dword s5, s[8:9], 0x0405; GFX7-NEXT: s_load_dword s4, s[8:9], 0x1406; GFX7-NEXT: s_mov_b32 m0, -1407; GFX7-NEXT: s_waitcnt lgkmcnt(0)408; GFX7-NEXT: v_mov_b32_e32 v0, s5409; GFX7-NEXT: ds_read_b32 v1, v0410; GFX7-NEXT: s_mov_b32 m0, -1411; GFX7-NEXT: v_mov_b32_e32 v0, s4412; GFX7-NEXT: s_waitcnt lgkmcnt(0)413; GFX7-NEXT: ds_write_b32 v0, v1414; GFX7-NEXT: s_endpgm415;416; GFX10-WGP-LABEL: local_singlethread_acquire_load:417; GFX10-WGP: ; %bb.0: ; %entry418; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x0419; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x4420; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)421; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s5422; GFX10-WGP-NEXT: ds_read_b32 v1, v0423; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s4424; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)425; GFX10-WGP-NEXT: ds_write_b32 v0, v1426; GFX10-WGP-NEXT: s_endpgm427;428; GFX10-CU-LABEL: local_singlethread_acquire_load:429; GFX10-CU: ; %bb.0: ; %entry430; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x0431; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x4432; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)433; GFX10-CU-NEXT: v_mov_b32_e32 v0, s5434; GFX10-CU-NEXT: ds_read_b32 v1, v0435; GFX10-CU-NEXT: v_mov_b32_e32 v0, s4436; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)437; GFX10-CU-NEXT: ds_write_b32 v0, v1438; GFX10-CU-NEXT: s_endpgm439;440; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_load:441; SKIP-CACHE-INV: ; %bb.0: ; %entry442; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x0443; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x1444; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1445; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)446; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s1447; SKIP-CACHE-INV-NEXT: ds_read_b32 v1, v0448; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1449; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0450; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)451; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1452; SKIP-CACHE-INV-NEXT: s_endpgm453;454; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_load:455; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry456; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x0457; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x4458; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)459; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s5460; GFX90A-NOTTGSPLIT-NEXT: ds_read_b32 v1, v0461; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s4462; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)463; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1464; GFX90A-NOTTGSPLIT-NEXT: s_endpgm465;466; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_load:467; GFX90A-TGSPLIT: ; %bb.0: ; %entry468; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x0469; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x4470; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)471; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s5472; GFX90A-TGSPLIT-NEXT: ds_read_b32 v1, v0473; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s4474; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)475; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1476; GFX90A-TGSPLIT-NEXT: s_endpgm477;478; GFX942-NOTTGSPLIT-LABEL: local_singlethread_acquire_load:479; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry480; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x0481; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x4482; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)483; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1484; GFX942-NOTTGSPLIT-NEXT: ds_read_b32 v1, v0485; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0486; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)487; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1488; GFX942-NOTTGSPLIT-NEXT: s_endpgm489;490; GFX942-TGSPLIT-LABEL: local_singlethread_acquire_load:491; GFX942-TGSPLIT: ; %bb.0: ; %entry492; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x0493; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x4494; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)495; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1496; GFX942-TGSPLIT-NEXT: ds_read_b32 v1, v0497; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0498; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)499; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v1500; GFX942-TGSPLIT-NEXT: s_endpgm501;502; GFX11-WGP-LABEL: local_singlethread_acquire_load:503; GFX11-WGP: ; %bb.0: ; %entry504; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x0505; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x4506; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)507; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s1508; GFX11-WGP-NEXT: ds_load_b32 v1, v0509; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s0510; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)511; GFX11-WGP-NEXT: ds_store_b32 v0, v1512; GFX11-WGP-NEXT: s_endpgm513;514; GFX11-CU-LABEL: local_singlethread_acquire_load:515; GFX11-CU: ; %bb.0: ; %entry516; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x0517; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x4518; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)519; GFX11-CU-NEXT: v_mov_b32_e32 v0, s1520; GFX11-CU-NEXT: ds_load_b32 v1, v0521; GFX11-CU-NEXT: v_mov_b32_e32 v0, s0522; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)523; GFX11-CU-NEXT: ds_store_b32 v0, v1524; GFX11-CU-NEXT: s_endpgm525;526; GFX12-WGP-LABEL: local_singlethread_acquire_load:527; GFX12-WGP: ; %bb.0: ; %entry528; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x0529; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x4530; GFX12-WGP-NEXT: s_wait_kmcnt 0x0531; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s1532; GFX12-WGP-NEXT: ds_load_b32 v1, v0533; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s0534; GFX12-WGP-NEXT: s_wait_dscnt 0x0535; GFX12-WGP-NEXT: ds_store_b32 v0, v1536; GFX12-WGP-NEXT: s_endpgm537;538; GFX12-CU-LABEL: local_singlethread_acquire_load:539; GFX12-CU: ; %bb.0: ; %entry540; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x0541; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x4542; GFX12-CU-NEXT: s_wait_kmcnt 0x0543; GFX12-CU-NEXT: v_mov_b32_e32 v0, s1544; GFX12-CU-NEXT: ds_load_b32 v1, v0545; GFX12-CU-NEXT: v_mov_b32_e32 v0, s0546; GFX12-CU-NEXT: s_wait_dscnt 0x0547; GFX12-CU-NEXT: ds_store_b32 v0, v1548; GFX12-CU-NEXT: s_endpgm549;550; GFX1250-LABEL: local_singlethread_acquire_load:551; GFX1250: ; %bb.0: ; %entry552; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1553; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x0554; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x4555; GFX1250-NEXT: s_wait_kmcnt 0x0556; GFX1250-NEXT: v_mov_b32_e32 v0, s1557; GFX1250-NEXT: ds_load_b32 v1, v0558; GFX1250-NEXT: v_mov_b32_e32 v0, s0559; GFX1250-NEXT: s_wait_dscnt 0x0560; GFX1250-NEXT: ds_store_b32 v0, v1561; GFX1250-NEXT: s_endpgm562 ptr addrspace(3) %in, ptr addrspace(3) %out) {563entry:564 %val = load atomic i32, ptr addrspace(3) %in syncscope("singlethread") acquire, align 4565 store i32 %val, ptr addrspace(3) %out566 ret void567}568 569define amdgpu_kernel void @local_singlethread_seq_cst_load(570; GFX6-LABEL: local_singlethread_seq_cst_load:571; GFX6: ; %bb.0: ; %entry572; GFX6-NEXT: s_load_dword s5, s[8:9], 0x0573; GFX6-NEXT: s_load_dword s4, s[8:9], 0x1574; GFX6-NEXT: ; kill: def $sgpr6 killed $sgpr4575; GFX6-NEXT: ; kill: def $sgpr6 killed $sgpr5576; GFX6-NEXT: s_mov_b32 m0, -1577; GFX6-NEXT: s_waitcnt lgkmcnt(0)578; GFX6-NEXT: v_mov_b32_e32 v0, s5579; GFX6-NEXT: ds_read_b32 v1, v0580; GFX6-NEXT: s_mov_b32 m0, -1581; GFX6-NEXT: v_mov_b32_e32 v0, s4582; GFX6-NEXT: s_waitcnt lgkmcnt(0)583; GFX6-NEXT: ds_write_b32 v0, v1584; GFX6-NEXT: s_endpgm585;586; GFX7-LABEL: local_singlethread_seq_cst_load:587; GFX7: ; %bb.0: ; %entry588; GFX7-NEXT: s_load_dword s5, s[8:9], 0x0589; GFX7-NEXT: s_load_dword s4, s[8:9], 0x1590; GFX7-NEXT: s_mov_b32 m0, -1591; GFX7-NEXT: s_waitcnt lgkmcnt(0)592; GFX7-NEXT: v_mov_b32_e32 v0, s5593; GFX7-NEXT: ds_read_b32 v1, v0594; GFX7-NEXT: s_mov_b32 m0, -1595; GFX7-NEXT: v_mov_b32_e32 v0, s4596; GFX7-NEXT: s_waitcnt lgkmcnt(0)597; GFX7-NEXT: ds_write_b32 v0, v1598; GFX7-NEXT: s_endpgm599;600; GFX10-WGP-LABEL: local_singlethread_seq_cst_load:601; GFX10-WGP: ; %bb.0: ; %entry602; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x0603; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x4604; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)605; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s5606; GFX10-WGP-NEXT: ds_read_b32 v1, v0607; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s4608; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)609; GFX10-WGP-NEXT: ds_write_b32 v0, v1610; GFX10-WGP-NEXT: s_endpgm611;612; GFX10-CU-LABEL: local_singlethread_seq_cst_load:613; GFX10-CU: ; %bb.0: ; %entry614; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x0615; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x4616; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)617; GFX10-CU-NEXT: v_mov_b32_e32 v0, s5618; GFX10-CU-NEXT: ds_read_b32 v1, v0619; GFX10-CU-NEXT: v_mov_b32_e32 v0, s4620; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)621; GFX10-CU-NEXT: ds_write_b32 v0, v1622; GFX10-CU-NEXT: s_endpgm623;624; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_load:625; SKIP-CACHE-INV: ; %bb.0: ; %entry626; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x0627; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x1628; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1629; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)630; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s1631; SKIP-CACHE-INV-NEXT: ds_read_b32 v1, v0632; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1633; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0634; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)635; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1636; SKIP-CACHE-INV-NEXT: s_endpgm637;638; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_load:639; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry640; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x0641; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x4642; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)643; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s5644; GFX90A-NOTTGSPLIT-NEXT: ds_read_b32 v1, v0645; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s4646; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)647; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1648; GFX90A-NOTTGSPLIT-NEXT: s_endpgm649;650; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_load:651; GFX90A-TGSPLIT: ; %bb.0: ; %entry652; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x0653; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x4654; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)655; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s5656; GFX90A-TGSPLIT-NEXT: ds_read_b32 v1, v0657; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s4658; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)659; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1660; GFX90A-TGSPLIT-NEXT: s_endpgm661;662; GFX942-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_load:663; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry664; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x0665; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x4666; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)667; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1668; GFX942-NOTTGSPLIT-NEXT: ds_read_b32 v1, v0669; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0670; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)671; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1672; GFX942-NOTTGSPLIT-NEXT: s_endpgm673;674; GFX942-TGSPLIT-LABEL: local_singlethread_seq_cst_load:675; GFX942-TGSPLIT: ; %bb.0: ; %entry676; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x0677; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x4678; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)679; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1680; GFX942-TGSPLIT-NEXT: ds_read_b32 v1, v0681; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0682; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)683; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v1684; GFX942-TGSPLIT-NEXT: s_endpgm685;686; GFX11-WGP-LABEL: local_singlethread_seq_cst_load:687; GFX11-WGP: ; %bb.0: ; %entry688; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x0689; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x4690; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)691; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s1692; GFX11-WGP-NEXT: ds_load_b32 v1, v0693; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s0694; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)695; GFX11-WGP-NEXT: ds_store_b32 v0, v1696; GFX11-WGP-NEXT: s_endpgm697;698; GFX11-CU-LABEL: local_singlethread_seq_cst_load:699; GFX11-CU: ; %bb.0: ; %entry700; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x0701; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x4702; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)703; GFX11-CU-NEXT: v_mov_b32_e32 v0, s1704; GFX11-CU-NEXT: ds_load_b32 v1, v0705; GFX11-CU-NEXT: v_mov_b32_e32 v0, s0706; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)707; GFX11-CU-NEXT: ds_store_b32 v0, v1708; GFX11-CU-NEXT: s_endpgm709;710; GFX12-WGP-LABEL: local_singlethread_seq_cst_load:711; GFX12-WGP: ; %bb.0: ; %entry712; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x0713; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x4714; GFX12-WGP-NEXT: s_wait_kmcnt 0x0715; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s1716; GFX12-WGP-NEXT: ds_load_b32 v1, v0717; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s0718; GFX12-WGP-NEXT: s_wait_dscnt 0x0719; GFX12-WGP-NEXT: ds_store_b32 v0, v1720; GFX12-WGP-NEXT: s_endpgm721;722; GFX12-CU-LABEL: local_singlethread_seq_cst_load:723; GFX12-CU: ; %bb.0: ; %entry724; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x0725; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x4726; GFX12-CU-NEXT: s_wait_kmcnt 0x0727; GFX12-CU-NEXT: v_mov_b32_e32 v0, s1728; GFX12-CU-NEXT: ds_load_b32 v1, v0729; GFX12-CU-NEXT: v_mov_b32_e32 v0, s0730; GFX12-CU-NEXT: s_wait_dscnt 0x0731; GFX12-CU-NEXT: ds_store_b32 v0, v1732; GFX12-CU-NEXT: s_endpgm733;734; GFX1250-LABEL: local_singlethread_seq_cst_load:735; GFX1250: ; %bb.0: ; %entry736; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1737; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x0738; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x4739; GFX1250-NEXT: s_wait_kmcnt 0x0740; GFX1250-NEXT: v_mov_b32_e32 v0, s1741; GFX1250-NEXT: ds_load_b32 v1, v0742; GFX1250-NEXT: v_mov_b32_e32 v0, s0743; GFX1250-NEXT: s_wait_dscnt 0x0744; GFX1250-NEXT: ds_store_b32 v0, v1745; GFX1250-NEXT: s_endpgm746 ptr addrspace(3) %in, ptr addrspace(3) %out) {747entry:748 %val = load atomic i32, ptr addrspace(3) %in syncscope("singlethread") seq_cst, align 4749 store i32 %val, ptr addrspace(3) %out750 ret void751}752 753define amdgpu_kernel void @local_singlethread_unordered_store(754; GFX6-LABEL: local_singlethread_unordered_store:755; GFX6: ; %bb.0: ; %entry756; GFX6-NEXT: s_load_dword s5, s[8:9], 0x1757; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr5758; GFX6-NEXT: s_load_dword s4, s[8:9], 0x0759; GFX6-NEXT: s_mov_b32 m0, -1760; GFX6-NEXT: s_waitcnt lgkmcnt(0)761; GFX6-NEXT: v_mov_b32_e32 v0, s5762; GFX6-NEXT: v_mov_b32_e32 v1, s4763; GFX6-NEXT: ds_write_b32 v0, v1764; GFX6-NEXT: s_endpgm765;766; GFX7-LABEL: local_singlethread_unordered_store:767; GFX7: ; %bb.0: ; %entry768; GFX7-NEXT: s_load_dword s4, s[8:9], 0x0769; GFX7-NEXT: s_load_dword s5, s[8:9], 0x1770; GFX7-NEXT: s_mov_b32 m0, -1771; GFX7-NEXT: s_waitcnt lgkmcnt(0)772; GFX7-NEXT: v_mov_b32_e32 v0, s5773; GFX7-NEXT: v_mov_b32_e32 v1, s4774; GFX7-NEXT: ds_write_b32 v0, v1775; GFX7-NEXT: s_endpgm776;777; GFX10-WGP-LABEL: local_singlethread_unordered_store:778; GFX10-WGP: ; %bb.0: ; %entry779; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x0780; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x4781; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)782; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s5783; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s4784; GFX10-WGP-NEXT: ds_write_b32 v0, v1785; GFX10-WGP-NEXT: s_endpgm786;787; GFX10-CU-LABEL: local_singlethread_unordered_store:788; GFX10-CU: ; %bb.0: ; %entry789; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x0790; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x4791; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)792; GFX10-CU-NEXT: v_mov_b32_e32 v0, s5793; GFX10-CU-NEXT: v_mov_b32_e32 v1, s4794; GFX10-CU-NEXT: ds_write_b32 v0, v1795; GFX10-CU-NEXT: s_endpgm796;797; SKIP-CACHE-INV-LABEL: local_singlethread_unordered_store:798; SKIP-CACHE-INV: ; %bb.0: ; %entry799; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x0800; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x1801; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1802; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)803; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s1804; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s0805; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1806; SKIP-CACHE-INV-NEXT: s_endpgm807;808; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_unordered_store:809; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry810; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x0811; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x4812; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)813; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s5814; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s4815; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1816; GFX90A-NOTTGSPLIT-NEXT: s_endpgm817;818; GFX90A-TGSPLIT-LABEL: local_singlethread_unordered_store:819; GFX90A-TGSPLIT: ; %bb.0: ; %entry820; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x0821; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x4822; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)823; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s5824; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s4825; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1826; GFX90A-TGSPLIT-NEXT: s_endpgm827;828; GFX942-NOTTGSPLIT-LABEL: local_singlethread_unordered_store:829; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry830; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x0831; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x4832; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)833; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1834; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s0835; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1836; GFX942-NOTTGSPLIT-NEXT: s_endpgm837;838; GFX942-TGSPLIT-LABEL: local_singlethread_unordered_store:839; GFX942-TGSPLIT: ; %bb.0: ; %entry840; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x0841; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x4842; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)843; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1844; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s0845; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v1846; GFX942-TGSPLIT-NEXT: s_endpgm847;848; GFX11-WGP-LABEL: local_singlethread_unordered_store:849; GFX11-WGP: ; %bb.0: ; %entry850; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x0851; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x4852; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)853; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s1854; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s0855; GFX11-WGP-NEXT: ds_store_b32 v0, v1856; GFX11-WGP-NEXT: s_endpgm857;858; GFX11-CU-LABEL: local_singlethread_unordered_store:859; GFX11-CU: ; %bb.0: ; %entry860; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x0861; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x4862; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)863; GFX11-CU-NEXT: v_mov_b32_e32 v0, s1864; GFX11-CU-NEXT: v_mov_b32_e32 v1, s0865; GFX11-CU-NEXT: ds_store_b32 v0, v1866; GFX11-CU-NEXT: s_endpgm867;868; GFX12-WGP-LABEL: local_singlethread_unordered_store:869; GFX12-WGP: ; %bb.0: ; %entry870; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x0871; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x4872; GFX12-WGP-NEXT: s_wait_kmcnt 0x0873; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s1874; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s0875; GFX12-WGP-NEXT: ds_store_b32 v0, v1876; GFX12-WGP-NEXT: s_endpgm877;878; GFX12-CU-LABEL: local_singlethread_unordered_store:879; GFX12-CU: ; %bb.0: ; %entry880; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x0881; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x4882; GFX12-CU-NEXT: s_wait_kmcnt 0x0883; GFX12-CU-NEXT: v_mov_b32_e32 v0, s1884; GFX12-CU-NEXT: v_mov_b32_e32 v1, s0885; GFX12-CU-NEXT: ds_store_b32 v0, v1886; GFX12-CU-NEXT: s_endpgm887;888; GFX1250-LABEL: local_singlethread_unordered_store:889; GFX1250: ; %bb.0: ; %entry890; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1891; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x0892; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x4893; GFX1250-NEXT: s_wait_kmcnt 0x0894; GFX1250-NEXT: v_mov_b32_e32 v0, s1895; GFX1250-NEXT: v_mov_b32_e32 v1, s0896; GFX1250-NEXT: ds_store_b32 v0, v1897; GFX1250-NEXT: s_endpgm898 i32 %in, ptr addrspace(3) %out) {899entry:900 store atomic i32 %in, ptr addrspace(3) %out syncscope("singlethread") unordered, align 4901 ret void902}903 904define amdgpu_kernel void @local_singlethread_monotonic_store(905; GFX6-LABEL: local_singlethread_monotonic_store:906; GFX6: ; %bb.0: ; %entry907; GFX6-NEXT: s_load_dword s5, s[8:9], 0x1908; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr5909; GFX6-NEXT: s_load_dword s4, s[8:9], 0x0910; GFX6-NEXT: s_mov_b32 m0, -1911; GFX6-NEXT: s_waitcnt lgkmcnt(0)912; GFX6-NEXT: v_mov_b32_e32 v0, s5913; GFX6-NEXT: v_mov_b32_e32 v1, s4914; GFX6-NEXT: ds_write_b32 v0, v1915; GFX6-NEXT: s_endpgm916;917; GFX7-LABEL: local_singlethread_monotonic_store:918; GFX7: ; %bb.0: ; %entry919; GFX7-NEXT: s_load_dword s4, s[8:9], 0x0920; GFX7-NEXT: s_load_dword s5, s[8:9], 0x1921; GFX7-NEXT: s_mov_b32 m0, -1922; GFX7-NEXT: s_waitcnt lgkmcnt(0)923; GFX7-NEXT: v_mov_b32_e32 v0, s5924; GFX7-NEXT: v_mov_b32_e32 v1, s4925; GFX7-NEXT: ds_write_b32 v0, v1926; GFX7-NEXT: s_endpgm927;928; GFX10-WGP-LABEL: local_singlethread_monotonic_store:929; GFX10-WGP: ; %bb.0: ; %entry930; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x0931; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x4932; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)933; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s5934; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s4935; GFX10-WGP-NEXT: ds_write_b32 v0, v1936; GFX10-WGP-NEXT: s_endpgm937;938; GFX10-CU-LABEL: local_singlethread_monotonic_store:939; GFX10-CU: ; %bb.0: ; %entry940; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x0941; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x4942; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)943; GFX10-CU-NEXT: v_mov_b32_e32 v0, s5944; GFX10-CU-NEXT: v_mov_b32_e32 v1, s4945; GFX10-CU-NEXT: ds_write_b32 v0, v1946; GFX10-CU-NEXT: s_endpgm947;948; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_store:949; SKIP-CACHE-INV: ; %bb.0: ; %entry950; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x0951; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x1952; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1953; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)954; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s1955; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s0956; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1957; SKIP-CACHE-INV-NEXT: s_endpgm958;959; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_store:960; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry961; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x0962; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x4963; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)964; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s5965; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s4966; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1967; GFX90A-NOTTGSPLIT-NEXT: s_endpgm968;969; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_store:970; GFX90A-TGSPLIT: ; %bb.0: ; %entry971; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x0972; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x4973; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)974; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s5975; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s4976; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1977; GFX90A-TGSPLIT-NEXT: s_endpgm978;979; GFX942-NOTTGSPLIT-LABEL: local_singlethread_monotonic_store:980; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry981; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x0982; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x4983; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)984; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1985; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s0986; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1987; GFX942-NOTTGSPLIT-NEXT: s_endpgm988;989; GFX942-TGSPLIT-LABEL: local_singlethread_monotonic_store:990; GFX942-TGSPLIT: ; %bb.0: ; %entry991; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x0992; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x4993; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)994; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1995; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s0996; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v1997; GFX942-TGSPLIT-NEXT: s_endpgm998;999; GFX11-WGP-LABEL: local_singlethread_monotonic_store:1000; GFX11-WGP: ; %bb.0: ; %entry1001; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x01002; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x41003; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)1004; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s11005; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s01006; GFX11-WGP-NEXT: ds_store_b32 v0, v11007; GFX11-WGP-NEXT: s_endpgm1008;1009; GFX11-CU-LABEL: local_singlethread_monotonic_store:1010; GFX11-CU: ; %bb.0: ; %entry1011; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x01012; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x41013; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)1014; GFX11-CU-NEXT: v_mov_b32_e32 v0, s11015; GFX11-CU-NEXT: v_mov_b32_e32 v1, s01016; GFX11-CU-NEXT: ds_store_b32 v0, v11017; GFX11-CU-NEXT: s_endpgm1018;1019; GFX12-WGP-LABEL: local_singlethread_monotonic_store:1020; GFX12-WGP: ; %bb.0: ; %entry1021; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x01022; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x41023; GFX12-WGP-NEXT: s_wait_kmcnt 0x01024; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s11025; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s01026; GFX12-WGP-NEXT: ds_store_b32 v0, v11027; GFX12-WGP-NEXT: s_endpgm1028;1029; GFX12-CU-LABEL: local_singlethread_monotonic_store:1030; GFX12-CU: ; %bb.0: ; %entry1031; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x01032; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x41033; GFX12-CU-NEXT: s_wait_kmcnt 0x01034; GFX12-CU-NEXT: v_mov_b32_e32 v0, s11035; GFX12-CU-NEXT: v_mov_b32_e32 v1, s01036; GFX12-CU-NEXT: ds_store_b32 v0, v11037; GFX12-CU-NEXT: s_endpgm1038;1039; GFX1250-LABEL: local_singlethread_monotonic_store:1040; GFX1250: ; %bb.0: ; %entry1041; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 11042; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x01043; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x41044; GFX1250-NEXT: s_wait_kmcnt 0x01045; GFX1250-NEXT: v_mov_b32_e32 v0, s11046; GFX1250-NEXT: v_mov_b32_e32 v1, s01047; GFX1250-NEXT: ds_store_b32 v0, v11048; GFX1250-NEXT: s_endpgm1049 i32 %in, ptr addrspace(3) %out) {1050entry:1051 store atomic i32 %in, ptr addrspace(3) %out syncscope("singlethread") monotonic, align 41052 ret void1053}1054 1055define amdgpu_kernel void @local_singlethread_release_store(1056; GFX6-LABEL: local_singlethread_release_store:1057; GFX6: ; %bb.0: ; %entry1058; GFX6-NEXT: s_load_dword s5, s[8:9], 0x11059; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr51060; GFX6-NEXT: s_load_dword s4, s[8:9], 0x01061; GFX6-NEXT: s_mov_b32 m0, -11062; GFX6-NEXT: s_waitcnt lgkmcnt(0)1063; GFX6-NEXT: v_mov_b32_e32 v0, s51064; GFX6-NEXT: v_mov_b32_e32 v1, s41065; GFX6-NEXT: ds_write_b32 v0, v11066; GFX6-NEXT: s_endpgm1067;1068; GFX7-LABEL: local_singlethread_release_store:1069; GFX7: ; %bb.0: ; %entry1070; GFX7-NEXT: s_load_dword s4, s[8:9], 0x01071; GFX7-NEXT: s_load_dword s5, s[8:9], 0x11072; GFX7-NEXT: s_mov_b32 m0, -11073; GFX7-NEXT: s_waitcnt lgkmcnt(0)1074; GFX7-NEXT: v_mov_b32_e32 v0, s51075; GFX7-NEXT: v_mov_b32_e32 v1, s41076; GFX7-NEXT: ds_write_b32 v0, v11077; GFX7-NEXT: s_endpgm1078;1079; GFX10-WGP-LABEL: local_singlethread_release_store:1080; GFX10-WGP: ; %bb.0: ; %entry1081; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x01082; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x41083; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)1084; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s51085; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s41086; GFX10-WGP-NEXT: ds_write_b32 v0, v11087; GFX10-WGP-NEXT: s_endpgm1088;1089; GFX10-CU-LABEL: local_singlethread_release_store:1090; GFX10-CU: ; %bb.0: ; %entry1091; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x01092; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x41093; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)1094; GFX10-CU-NEXT: v_mov_b32_e32 v0, s51095; GFX10-CU-NEXT: v_mov_b32_e32 v1, s41096; GFX10-CU-NEXT: ds_write_b32 v0, v11097; GFX10-CU-NEXT: s_endpgm1098;1099; SKIP-CACHE-INV-LABEL: local_singlethread_release_store:1100; SKIP-CACHE-INV: ; %bb.0: ; %entry1101; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x01102; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x11103; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -11104; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)1105; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s11106; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s01107; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v11108; SKIP-CACHE-INV-NEXT: s_endpgm1109;1110; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_store:1111; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry1112; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x01113; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x41114; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1115; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s51116; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s41117; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v11118; GFX90A-NOTTGSPLIT-NEXT: s_endpgm1119;1120; GFX90A-TGSPLIT-LABEL: local_singlethread_release_store:1121; GFX90A-TGSPLIT: ; %bb.0: ; %entry1122; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x01123; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x41124; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1125; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s51126; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s41127; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v11128; GFX90A-TGSPLIT-NEXT: s_endpgm1129;1130; GFX942-NOTTGSPLIT-LABEL: local_singlethread_release_store:1131; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry1132; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x01133; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x41134; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1135; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s11136; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s01137; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v11138; GFX942-NOTTGSPLIT-NEXT: s_endpgm1139;1140; GFX942-TGSPLIT-LABEL: local_singlethread_release_store:1141; GFX942-TGSPLIT: ; %bb.0: ; %entry1142; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x01143; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x41144; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1145; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s11146; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s01147; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v11148; GFX942-TGSPLIT-NEXT: s_endpgm1149;1150; GFX11-WGP-LABEL: local_singlethread_release_store:1151; GFX11-WGP: ; %bb.0: ; %entry1152; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x01153; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x41154; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)1155; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s11156; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s01157; GFX11-WGP-NEXT: ds_store_b32 v0, v11158; GFX11-WGP-NEXT: s_endpgm1159;1160; GFX11-CU-LABEL: local_singlethread_release_store:1161; GFX11-CU: ; %bb.0: ; %entry1162; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x01163; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x41164; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)1165; GFX11-CU-NEXT: v_mov_b32_e32 v0, s11166; GFX11-CU-NEXT: v_mov_b32_e32 v1, s01167; GFX11-CU-NEXT: ds_store_b32 v0, v11168; GFX11-CU-NEXT: s_endpgm1169;1170; GFX12-WGP-LABEL: local_singlethread_release_store:1171; GFX12-WGP: ; %bb.0: ; %entry1172; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x01173; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x41174; GFX12-WGP-NEXT: s_wait_kmcnt 0x01175; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s11176; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s01177; GFX12-WGP-NEXT: ds_store_b32 v0, v11178; GFX12-WGP-NEXT: s_endpgm1179;1180; GFX12-CU-LABEL: local_singlethread_release_store:1181; GFX12-CU: ; %bb.0: ; %entry1182; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x01183; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x41184; GFX12-CU-NEXT: s_wait_kmcnt 0x01185; GFX12-CU-NEXT: v_mov_b32_e32 v0, s11186; GFX12-CU-NEXT: v_mov_b32_e32 v1, s01187; GFX12-CU-NEXT: ds_store_b32 v0, v11188; GFX12-CU-NEXT: s_endpgm1189;1190; GFX1250-LABEL: local_singlethread_release_store:1191; GFX1250: ; %bb.0: ; %entry1192; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 11193; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x01194; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x41195; GFX1250-NEXT: s_wait_kmcnt 0x01196; GFX1250-NEXT: v_mov_b32_e32 v0, s11197; GFX1250-NEXT: v_mov_b32_e32 v1, s01198; GFX1250-NEXT: ds_store_b32 v0, v11199; GFX1250-NEXT: s_endpgm1200 i32 %in, ptr addrspace(3) %out) {1201entry:1202 store atomic i32 %in, ptr addrspace(3) %out syncscope("singlethread") release, align 41203 ret void1204}1205 1206define amdgpu_kernel void @local_singlethread_seq_cst_store(1207; GFX6-LABEL: local_singlethread_seq_cst_store:1208; GFX6: ; %bb.0: ; %entry1209; GFX6-NEXT: s_load_dword s5, s[8:9], 0x11210; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr51211; GFX6-NEXT: s_load_dword s4, s[8:9], 0x01212; GFX6-NEXT: s_mov_b32 m0, -11213; GFX6-NEXT: s_waitcnt lgkmcnt(0)1214; GFX6-NEXT: v_mov_b32_e32 v0, s51215; GFX6-NEXT: v_mov_b32_e32 v1, s41216; GFX6-NEXT: ds_write_b32 v0, v11217; GFX6-NEXT: s_endpgm1218;1219; GFX7-LABEL: local_singlethread_seq_cst_store:1220; GFX7: ; %bb.0: ; %entry1221; GFX7-NEXT: s_load_dword s4, s[8:9], 0x01222; GFX7-NEXT: s_load_dword s5, s[8:9], 0x11223; GFX7-NEXT: s_mov_b32 m0, -11224; GFX7-NEXT: s_waitcnt lgkmcnt(0)1225; GFX7-NEXT: v_mov_b32_e32 v0, s51226; GFX7-NEXT: v_mov_b32_e32 v1, s41227; GFX7-NEXT: ds_write_b32 v0, v11228; GFX7-NEXT: s_endpgm1229;1230; GFX10-WGP-LABEL: local_singlethread_seq_cst_store:1231; GFX10-WGP: ; %bb.0: ; %entry1232; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x01233; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x41234; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)1235; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s51236; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s41237; GFX10-WGP-NEXT: ds_write_b32 v0, v11238; GFX10-WGP-NEXT: s_endpgm1239;1240; GFX10-CU-LABEL: local_singlethread_seq_cst_store:1241; GFX10-CU: ; %bb.0: ; %entry1242; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x01243; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x41244; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)1245; GFX10-CU-NEXT: v_mov_b32_e32 v0, s51246; GFX10-CU-NEXT: v_mov_b32_e32 v1, s41247; GFX10-CU-NEXT: ds_write_b32 v0, v11248; GFX10-CU-NEXT: s_endpgm1249;1250; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_store:1251; SKIP-CACHE-INV: ; %bb.0: ; %entry1252; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x01253; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x11254; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -11255; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)1256; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s11257; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s01258; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v11259; SKIP-CACHE-INV-NEXT: s_endpgm1260;1261; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_store:1262; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry1263; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x01264; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x41265; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1266; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s51267; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s41268; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v11269; GFX90A-NOTTGSPLIT-NEXT: s_endpgm1270;1271; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_store:1272; GFX90A-TGSPLIT: ; %bb.0: ; %entry1273; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x01274; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x41275; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1276; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s51277; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s41278; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v11279; GFX90A-TGSPLIT-NEXT: s_endpgm1280;1281; GFX942-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_store:1282; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry1283; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x01284; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x41285; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1286; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s11287; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s01288; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v11289; GFX942-NOTTGSPLIT-NEXT: s_endpgm1290;1291; GFX942-TGSPLIT-LABEL: local_singlethread_seq_cst_store:1292; GFX942-TGSPLIT: ; %bb.0: ; %entry1293; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x01294; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x41295; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1296; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s11297; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s01298; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v11299; GFX942-TGSPLIT-NEXT: s_endpgm1300;1301; GFX11-WGP-LABEL: local_singlethread_seq_cst_store:1302; GFX11-WGP: ; %bb.0: ; %entry1303; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x01304; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x41305; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)1306; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s11307; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s01308; GFX11-WGP-NEXT: ds_store_b32 v0, v11309; GFX11-WGP-NEXT: s_endpgm1310;1311; GFX11-CU-LABEL: local_singlethread_seq_cst_store:1312; GFX11-CU: ; %bb.0: ; %entry1313; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x01314; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x41315; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)1316; GFX11-CU-NEXT: v_mov_b32_e32 v0, s11317; GFX11-CU-NEXT: v_mov_b32_e32 v1, s01318; GFX11-CU-NEXT: ds_store_b32 v0, v11319; GFX11-CU-NEXT: s_endpgm1320;1321; GFX12-WGP-LABEL: local_singlethread_seq_cst_store:1322; GFX12-WGP: ; %bb.0: ; %entry1323; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x01324; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x41325; GFX12-WGP-NEXT: s_wait_kmcnt 0x01326; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s11327; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s01328; GFX12-WGP-NEXT: ds_store_b32 v0, v11329; GFX12-WGP-NEXT: s_endpgm1330;1331; GFX12-CU-LABEL: local_singlethread_seq_cst_store:1332; GFX12-CU: ; %bb.0: ; %entry1333; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x01334; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x41335; GFX12-CU-NEXT: s_wait_kmcnt 0x01336; GFX12-CU-NEXT: v_mov_b32_e32 v0, s11337; GFX12-CU-NEXT: v_mov_b32_e32 v1, s01338; GFX12-CU-NEXT: ds_store_b32 v0, v11339; GFX12-CU-NEXT: s_endpgm1340;1341; GFX1250-LABEL: local_singlethread_seq_cst_store:1342; GFX1250: ; %bb.0: ; %entry1343; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 11344; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x01345; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x41346; GFX1250-NEXT: s_wait_kmcnt 0x01347; GFX1250-NEXT: v_mov_b32_e32 v0, s11348; GFX1250-NEXT: v_mov_b32_e32 v1, s01349; GFX1250-NEXT: ds_store_b32 v0, v11350; GFX1250-NEXT: s_endpgm1351 i32 %in, ptr addrspace(3) %out) {1352entry:1353 store atomic i32 %in, ptr addrspace(3) %out syncscope("singlethread") seq_cst, align 41354 ret void1355}1356 1357define amdgpu_kernel void @local_singlethread_monotonic_atomicrmw(1358; GFX6-LABEL: local_singlethread_monotonic_atomicrmw:1359; GFX6: ; %bb.0: ; %entry1360; GFX6-NEXT: s_load_dword s5, s[8:9], 0x01361; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr51362; GFX6-NEXT: s_load_dword s4, s[8:9], 0x11363; GFX6-NEXT: s_mov_b32 m0, -11364; GFX6-NEXT: s_waitcnt lgkmcnt(0)1365; GFX6-NEXT: v_mov_b32_e32 v0, s51366; GFX6-NEXT: v_mov_b32_e32 v1, s41367; GFX6-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11368; GFX6-NEXT: s_endpgm1369;1370; GFX7-LABEL: local_singlethread_monotonic_atomicrmw:1371; GFX7: ; %bb.0: ; %entry1372; GFX7-NEXT: s_load_dword s5, s[8:9], 0x01373; GFX7-NEXT: s_load_dword s4, s[8:9], 0x11374; GFX7-NEXT: s_mov_b32 m0, -11375; GFX7-NEXT: s_waitcnt lgkmcnt(0)1376; GFX7-NEXT: v_mov_b32_e32 v0, s51377; GFX7-NEXT: v_mov_b32_e32 v1, s41378; GFX7-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11379; GFX7-NEXT: s_endpgm1380;1381; GFX10-WGP-LABEL: local_singlethread_monotonic_atomicrmw:1382; GFX10-WGP: ; %bb.0: ; %entry1383; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x01384; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x41385; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)1386; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s51387; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s41388; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11389; GFX10-WGP-NEXT: s_endpgm1390;1391; GFX10-CU-LABEL: local_singlethread_monotonic_atomicrmw:1392; GFX10-CU: ; %bb.0: ; %entry1393; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x01394; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x41395; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)1396; GFX10-CU-NEXT: v_mov_b32_e32 v0, s51397; GFX10-CU-NEXT: v_mov_b32_e32 v1, s41398; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11399; GFX10-CU-NEXT: s_endpgm1400;1401; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_atomicrmw:1402; SKIP-CACHE-INV: ; %bb.0: ; %entry1403; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x01404; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x11405; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -11406; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)1407; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s11408; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s01409; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11410; SKIP-CACHE-INV-NEXT: s_endpgm1411;1412; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_atomicrmw:1413; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry1414; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x01415; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x41416; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1417; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s51418; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s41419; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11420; GFX90A-NOTTGSPLIT-NEXT: s_endpgm1421;1422; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_atomicrmw:1423; GFX90A-TGSPLIT: ; %bb.0: ; %entry1424; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x01425; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x41426; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1427; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s51428; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s41429; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11430; GFX90A-TGSPLIT-NEXT: s_endpgm1431;1432; GFX942-NOTTGSPLIT-LABEL: local_singlethread_monotonic_atomicrmw:1433; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry1434; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x01435; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x41436; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1437; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s11438; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s01439; GFX942-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11440; GFX942-NOTTGSPLIT-NEXT: s_endpgm1441;1442; GFX942-TGSPLIT-LABEL: local_singlethread_monotonic_atomicrmw:1443; GFX942-TGSPLIT: ; %bb.0: ; %entry1444; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x01445; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x41446; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1447; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s11448; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s01449; GFX942-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11450; GFX942-TGSPLIT-NEXT: s_endpgm1451;1452; GFX11-WGP-LABEL: local_singlethread_monotonic_atomicrmw:1453; GFX11-WGP: ; %bb.0: ; %entry1454; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x01455; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x41456; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)1457; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s11458; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s01459; GFX11-WGP-NEXT: ds_storexchg_rtn_b32 v0, v0, v11460; GFX11-WGP-NEXT: s_endpgm1461;1462; GFX11-CU-LABEL: local_singlethread_monotonic_atomicrmw:1463; GFX11-CU: ; %bb.0: ; %entry1464; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x01465; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x41466; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)1467; GFX11-CU-NEXT: v_mov_b32_e32 v0, s11468; GFX11-CU-NEXT: v_mov_b32_e32 v1, s01469; GFX11-CU-NEXT: ds_storexchg_rtn_b32 v0, v0, v11470; GFX11-CU-NEXT: s_endpgm1471;1472; GFX12-WGP-LABEL: local_singlethread_monotonic_atomicrmw:1473; GFX12-WGP: ; %bb.0: ; %entry1474; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x01475; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x41476; GFX12-WGP-NEXT: s_wait_kmcnt 0x01477; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s11478; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s01479; GFX12-WGP-NEXT: ds_storexchg_rtn_b32 v0, v0, v11480; GFX12-WGP-NEXT: s_endpgm1481;1482; GFX12-CU-LABEL: local_singlethread_monotonic_atomicrmw:1483; GFX12-CU: ; %bb.0: ; %entry1484; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x01485; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x41486; GFX12-CU-NEXT: s_wait_kmcnt 0x01487; GFX12-CU-NEXT: v_mov_b32_e32 v0, s11488; GFX12-CU-NEXT: v_mov_b32_e32 v1, s01489; GFX12-CU-NEXT: ds_storexchg_rtn_b32 v0, v0, v11490; GFX12-CU-NEXT: s_endpgm1491;1492; GFX1250-LABEL: local_singlethread_monotonic_atomicrmw:1493; GFX1250: ; %bb.0: ; %entry1494; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 11495; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x01496; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x41497; GFX1250-NEXT: s_wait_kmcnt 0x01498; GFX1250-NEXT: v_mov_b32_e32 v0, s11499; GFX1250-NEXT: v_mov_b32_e32 v1, s01500; GFX1250-NEXT: ds_storexchg_rtn_b32 v0, v0, v11501; GFX1250-NEXT: s_endpgm1502 ptr addrspace(3) %out, i32 %in) {1503entry:1504 %val = atomicrmw volatile xchg ptr addrspace(3) %out, i32 %in syncscope("singlethread") monotonic1505 ret void1506}1507 1508define amdgpu_kernel void @local_singlethread_acquire_atomicrmw(1509; GFX6-LABEL: local_singlethread_acquire_atomicrmw:1510; GFX6: ; %bb.0: ; %entry1511; GFX6-NEXT: s_load_dword s5, s[8:9], 0x01512; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr51513; GFX6-NEXT: s_load_dword s4, s[8:9], 0x11514; GFX6-NEXT: s_mov_b32 m0, -11515; GFX6-NEXT: s_waitcnt lgkmcnt(0)1516; GFX6-NEXT: v_mov_b32_e32 v0, s51517; GFX6-NEXT: v_mov_b32_e32 v1, s41518; GFX6-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11519; GFX6-NEXT: s_endpgm1520;1521; GFX7-LABEL: local_singlethread_acquire_atomicrmw:1522; GFX7: ; %bb.0: ; %entry1523; GFX7-NEXT: s_load_dword s5, s[8:9], 0x01524; GFX7-NEXT: s_load_dword s4, s[8:9], 0x11525; GFX7-NEXT: s_mov_b32 m0, -11526; GFX7-NEXT: s_waitcnt lgkmcnt(0)1527; GFX7-NEXT: v_mov_b32_e32 v0, s51528; GFX7-NEXT: v_mov_b32_e32 v1, s41529; GFX7-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11530; GFX7-NEXT: s_endpgm1531;1532; GFX10-WGP-LABEL: local_singlethread_acquire_atomicrmw:1533; GFX10-WGP: ; %bb.0: ; %entry1534; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x01535; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x41536; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)1537; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s51538; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s41539; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11540; GFX10-WGP-NEXT: s_endpgm1541;1542; GFX10-CU-LABEL: local_singlethread_acquire_atomicrmw:1543; GFX10-CU: ; %bb.0: ; %entry1544; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x01545; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x41546; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)1547; GFX10-CU-NEXT: v_mov_b32_e32 v0, s51548; GFX10-CU-NEXT: v_mov_b32_e32 v1, s41549; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11550; GFX10-CU-NEXT: s_endpgm1551;1552; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_atomicrmw:1553; SKIP-CACHE-INV: ; %bb.0: ; %entry1554; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x01555; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x11556; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -11557; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)1558; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s11559; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s01560; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11561; SKIP-CACHE-INV-NEXT: s_endpgm1562;1563; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_atomicrmw:1564; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry1565; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x01566; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x41567; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1568; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s51569; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s41570; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11571; GFX90A-NOTTGSPLIT-NEXT: s_endpgm1572;1573; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_atomicrmw:1574; GFX90A-TGSPLIT: ; %bb.0: ; %entry1575; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x01576; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x41577; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1578; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s51579; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s41580; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11581; GFX90A-TGSPLIT-NEXT: s_endpgm1582;1583; GFX942-NOTTGSPLIT-LABEL: local_singlethread_acquire_atomicrmw:1584; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry1585; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x01586; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x41587; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1588; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s11589; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s01590; GFX942-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11591; GFX942-NOTTGSPLIT-NEXT: s_endpgm1592;1593; GFX942-TGSPLIT-LABEL: local_singlethread_acquire_atomicrmw:1594; GFX942-TGSPLIT: ; %bb.0: ; %entry1595; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x01596; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x41597; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1598; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s11599; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s01600; GFX942-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11601; GFX942-TGSPLIT-NEXT: s_endpgm1602;1603; GFX11-WGP-LABEL: local_singlethread_acquire_atomicrmw:1604; GFX11-WGP: ; %bb.0: ; %entry1605; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x01606; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x41607; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)1608; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s11609; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s01610; GFX11-WGP-NEXT: ds_storexchg_rtn_b32 v0, v0, v11611; GFX11-WGP-NEXT: s_endpgm1612;1613; GFX11-CU-LABEL: local_singlethread_acquire_atomicrmw:1614; GFX11-CU: ; %bb.0: ; %entry1615; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x01616; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x41617; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)1618; GFX11-CU-NEXT: v_mov_b32_e32 v0, s11619; GFX11-CU-NEXT: v_mov_b32_e32 v1, s01620; GFX11-CU-NEXT: ds_storexchg_rtn_b32 v0, v0, v11621; GFX11-CU-NEXT: s_endpgm1622;1623; GFX12-WGP-LABEL: local_singlethread_acquire_atomicrmw:1624; GFX12-WGP: ; %bb.0: ; %entry1625; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x01626; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x41627; GFX12-WGP-NEXT: s_wait_kmcnt 0x01628; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s11629; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s01630; GFX12-WGP-NEXT: ds_storexchg_rtn_b32 v0, v0, v11631; GFX12-WGP-NEXT: s_endpgm1632;1633; GFX12-CU-LABEL: local_singlethread_acquire_atomicrmw:1634; GFX12-CU: ; %bb.0: ; %entry1635; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x01636; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x41637; GFX12-CU-NEXT: s_wait_kmcnt 0x01638; GFX12-CU-NEXT: v_mov_b32_e32 v0, s11639; GFX12-CU-NEXT: v_mov_b32_e32 v1, s01640; GFX12-CU-NEXT: ds_storexchg_rtn_b32 v0, v0, v11641; GFX12-CU-NEXT: s_endpgm1642;1643; GFX1250-LABEL: local_singlethread_acquire_atomicrmw:1644; GFX1250: ; %bb.0: ; %entry1645; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 11646; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x01647; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x41648; GFX1250-NEXT: s_wait_kmcnt 0x01649; GFX1250-NEXT: v_mov_b32_e32 v0, s11650; GFX1250-NEXT: v_mov_b32_e32 v1, s01651; GFX1250-NEXT: ds_storexchg_rtn_b32 v0, v0, v11652; GFX1250-NEXT: s_endpgm1653 ptr addrspace(3) %out, i32 %in) {1654entry:1655 %val = atomicrmw volatile xchg ptr addrspace(3) %out, i32 %in syncscope("singlethread") acquire1656 ret void1657}1658 1659define amdgpu_kernel void @local_singlethread_release_atomicrmw(1660; GFX6-LABEL: local_singlethread_release_atomicrmw:1661; GFX6: ; %bb.0: ; %entry1662; GFX6-NEXT: s_load_dword s5, s[8:9], 0x01663; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr51664; GFX6-NEXT: s_load_dword s4, s[8:9], 0x11665; GFX6-NEXT: s_mov_b32 m0, -11666; GFX6-NEXT: s_waitcnt lgkmcnt(0)1667; GFX6-NEXT: v_mov_b32_e32 v0, s51668; GFX6-NEXT: v_mov_b32_e32 v1, s41669; GFX6-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11670; GFX6-NEXT: s_endpgm1671;1672; GFX7-LABEL: local_singlethread_release_atomicrmw:1673; GFX7: ; %bb.0: ; %entry1674; GFX7-NEXT: s_load_dword s5, s[8:9], 0x01675; GFX7-NEXT: s_load_dword s4, s[8:9], 0x11676; GFX7-NEXT: s_mov_b32 m0, -11677; GFX7-NEXT: s_waitcnt lgkmcnt(0)1678; GFX7-NEXT: v_mov_b32_e32 v0, s51679; GFX7-NEXT: v_mov_b32_e32 v1, s41680; GFX7-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11681; GFX7-NEXT: s_endpgm1682;1683; GFX10-WGP-LABEL: local_singlethread_release_atomicrmw:1684; GFX10-WGP: ; %bb.0: ; %entry1685; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x01686; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x41687; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)1688; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s51689; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s41690; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11691; GFX10-WGP-NEXT: s_endpgm1692;1693; GFX10-CU-LABEL: local_singlethread_release_atomicrmw:1694; GFX10-CU: ; %bb.0: ; %entry1695; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x01696; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x41697; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)1698; GFX10-CU-NEXT: v_mov_b32_e32 v0, s51699; GFX10-CU-NEXT: v_mov_b32_e32 v1, s41700; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11701; GFX10-CU-NEXT: s_endpgm1702;1703; SKIP-CACHE-INV-LABEL: local_singlethread_release_atomicrmw:1704; SKIP-CACHE-INV: ; %bb.0: ; %entry1705; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x01706; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x11707; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -11708; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)1709; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s11710; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s01711; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11712; SKIP-CACHE-INV-NEXT: s_endpgm1713;1714; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_atomicrmw:1715; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry1716; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x01717; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x41718; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1719; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s51720; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s41721; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11722; GFX90A-NOTTGSPLIT-NEXT: s_endpgm1723;1724; GFX90A-TGSPLIT-LABEL: local_singlethread_release_atomicrmw:1725; GFX90A-TGSPLIT: ; %bb.0: ; %entry1726; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x01727; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x41728; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1729; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s51730; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s41731; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11732; GFX90A-TGSPLIT-NEXT: s_endpgm1733;1734; GFX942-NOTTGSPLIT-LABEL: local_singlethread_release_atomicrmw:1735; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry1736; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x01737; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x41738; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1739; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s11740; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s01741; GFX942-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11742; GFX942-NOTTGSPLIT-NEXT: s_endpgm1743;1744; GFX942-TGSPLIT-LABEL: local_singlethread_release_atomicrmw:1745; GFX942-TGSPLIT: ; %bb.0: ; %entry1746; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x01747; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x41748; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1749; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s11750; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s01751; GFX942-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11752; GFX942-TGSPLIT-NEXT: s_endpgm1753;1754; GFX11-WGP-LABEL: local_singlethread_release_atomicrmw:1755; GFX11-WGP: ; %bb.0: ; %entry1756; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x01757; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x41758; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)1759; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s11760; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s01761; GFX11-WGP-NEXT: ds_storexchg_rtn_b32 v0, v0, v11762; GFX11-WGP-NEXT: s_endpgm1763;1764; GFX11-CU-LABEL: local_singlethread_release_atomicrmw:1765; GFX11-CU: ; %bb.0: ; %entry1766; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x01767; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x41768; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)1769; GFX11-CU-NEXT: v_mov_b32_e32 v0, s11770; GFX11-CU-NEXT: v_mov_b32_e32 v1, s01771; GFX11-CU-NEXT: ds_storexchg_rtn_b32 v0, v0, v11772; GFX11-CU-NEXT: s_endpgm1773;1774; GFX12-WGP-LABEL: local_singlethread_release_atomicrmw:1775; GFX12-WGP: ; %bb.0: ; %entry1776; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x01777; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x41778; GFX12-WGP-NEXT: s_wait_kmcnt 0x01779; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s11780; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s01781; GFX12-WGP-NEXT: ds_storexchg_rtn_b32 v0, v0, v11782; GFX12-WGP-NEXT: s_endpgm1783;1784; GFX12-CU-LABEL: local_singlethread_release_atomicrmw:1785; GFX12-CU: ; %bb.0: ; %entry1786; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x01787; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x41788; GFX12-CU-NEXT: s_wait_kmcnt 0x01789; GFX12-CU-NEXT: v_mov_b32_e32 v0, s11790; GFX12-CU-NEXT: v_mov_b32_e32 v1, s01791; GFX12-CU-NEXT: ds_storexchg_rtn_b32 v0, v0, v11792; GFX12-CU-NEXT: s_endpgm1793;1794; GFX1250-LABEL: local_singlethread_release_atomicrmw:1795; GFX1250: ; %bb.0: ; %entry1796; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 11797; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x01798; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x41799; GFX1250-NEXT: s_wait_kmcnt 0x01800; GFX1250-NEXT: v_mov_b32_e32 v0, s11801; GFX1250-NEXT: v_mov_b32_e32 v1, s01802; GFX1250-NEXT: ds_storexchg_rtn_b32 v0, v0, v11803; GFX1250-NEXT: s_endpgm1804 ptr addrspace(3) %out, i32 %in) {1805entry:1806 %val = atomicrmw volatile xchg ptr addrspace(3) %out, i32 %in syncscope("singlethread") release1807 ret void1808}1809 1810define amdgpu_kernel void @local_singlethread_acq_rel_atomicrmw(1811; GFX6-LABEL: local_singlethread_acq_rel_atomicrmw:1812; GFX6: ; %bb.0: ; %entry1813; GFX6-NEXT: s_load_dword s5, s[8:9], 0x01814; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr51815; GFX6-NEXT: s_load_dword s4, s[8:9], 0x11816; GFX6-NEXT: s_mov_b32 m0, -11817; GFX6-NEXT: s_waitcnt lgkmcnt(0)1818; GFX6-NEXT: v_mov_b32_e32 v0, s51819; GFX6-NEXT: v_mov_b32_e32 v1, s41820; GFX6-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11821; GFX6-NEXT: s_endpgm1822;1823; GFX7-LABEL: local_singlethread_acq_rel_atomicrmw:1824; GFX7: ; %bb.0: ; %entry1825; GFX7-NEXT: s_load_dword s5, s[8:9], 0x01826; GFX7-NEXT: s_load_dword s4, s[8:9], 0x11827; GFX7-NEXT: s_mov_b32 m0, -11828; GFX7-NEXT: s_waitcnt lgkmcnt(0)1829; GFX7-NEXT: v_mov_b32_e32 v0, s51830; GFX7-NEXT: v_mov_b32_e32 v1, s41831; GFX7-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11832; GFX7-NEXT: s_endpgm1833;1834; GFX10-WGP-LABEL: local_singlethread_acq_rel_atomicrmw:1835; GFX10-WGP: ; %bb.0: ; %entry1836; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x01837; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x41838; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)1839; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s51840; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s41841; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11842; GFX10-WGP-NEXT: s_endpgm1843;1844; GFX10-CU-LABEL: local_singlethread_acq_rel_atomicrmw:1845; GFX10-CU: ; %bb.0: ; %entry1846; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x01847; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x41848; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)1849; GFX10-CU-NEXT: v_mov_b32_e32 v0, s51850; GFX10-CU-NEXT: v_mov_b32_e32 v1, s41851; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11852; GFX10-CU-NEXT: s_endpgm1853;1854; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_atomicrmw:1855; SKIP-CACHE-INV: ; %bb.0: ; %entry1856; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x01857; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x11858; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -11859; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)1860; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s11861; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s01862; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11863; SKIP-CACHE-INV-NEXT: s_endpgm1864;1865; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_atomicrmw:1866; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry1867; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x01868; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x41869; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1870; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s51871; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s41872; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11873; GFX90A-NOTTGSPLIT-NEXT: s_endpgm1874;1875; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_atomicrmw:1876; GFX90A-TGSPLIT: ; %bb.0: ; %entry1877; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x01878; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x41879; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1880; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s51881; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s41882; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11883; GFX90A-TGSPLIT-NEXT: s_endpgm1884;1885; GFX942-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_atomicrmw:1886; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry1887; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x01888; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x41889; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1890; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s11891; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s01892; GFX942-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11893; GFX942-NOTTGSPLIT-NEXT: s_endpgm1894;1895; GFX942-TGSPLIT-LABEL: local_singlethread_acq_rel_atomicrmw:1896; GFX942-TGSPLIT: ; %bb.0: ; %entry1897; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x01898; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x41899; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)1900; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s11901; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s01902; GFX942-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11903; GFX942-TGSPLIT-NEXT: s_endpgm1904;1905; GFX11-WGP-LABEL: local_singlethread_acq_rel_atomicrmw:1906; GFX11-WGP: ; %bb.0: ; %entry1907; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x01908; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x41909; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)1910; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s11911; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s01912; GFX11-WGP-NEXT: ds_storexchg_rtn_b32 v0, v0, v11913; GFX11-WGP-NEXT: s_endpgm1914;1915; GFX11-CU-LABEL: local_singlethread_acq_rel_atomicrmw:1916; GFX11-CU: ; %bb.0: ; %entry1917; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x01918; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x41919; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)1920; GFX11-CU-NEXT: v_mov_b32_e32 v0, s11921; GFX11-CU-NEXT: v_mov_b32_e32 v1, s01922; GFX11-CU-NEXT: ds_storexchg_rtn_b32 v0, v0, v11923; GFX11-CU-NEXT: s_endpgm1924;1925; GFX12-WGP-LABEL: local_singlethread_acq_rel_atomicrmw:1926; GFX12-WGP: ; %bb.0: ; %entry1927; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x01928; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x41929; GFX12-WGP-NEXT: s_wait_kmcnt 0x01930; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s11931; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s01932; GFX12-WGP-NEXT: ds_storexchg_rtn_b32 v0, v0, v11933; GFX12-WGP-NEXT: s_endpgm1934;1935; GFX12-CU-LABEL: local_singlethread_acq_rel_atomicrmw:1936; GFX12-CU: ; %bb.0: ; %entry1937; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x01938; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x41939; GFX12-CU-NEXT: s_wait_kmcnt 0x01940; GFX12-CU-NEXT: v_mov_b32_e32 v0, s11941; GFX12-CU-NEXT: v_mov_b32_e32 v1, s01942; GFX12-CU-NEXT: ds_storexchg_rtn_b32 v0, v0, v11943; GFX12-CU-NEXT: s_endpgm1944;1945; GFX1250-LABEL: local_singlethread_acq_rel_atomicrmw:1946; GFX1250: ; %bb.0: ; %entry1947; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 11948; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x01949; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x41950; GFX1250-NEXT: s_wait_kmcnt 0x01951; GFX1250-NEXT: v_mov_b32_e32 v0, s11952; GFX1250-NEXT: v_mov_b32_e32 v1, s01953; GFX1250-NEXT: ds_storexchg_rtn_b32 v0, v0, v11954; GFX1250-NEXT: s_endpgm1955 ptr addrspace(3) %out, i32 %in) {1956entry:1957 %val = atomicrmw volatile xchg ptr addrspace(3) %out, i32 %in syncscope("singlethread") acq_rel1958 ret void1959}1960 1961define amdgpu_kernel void @local_singlethread_seq_cst_atomicrmw(1962; GFX6-LABEL: local_singlethread_seq_cst_atomicrmw:1963; GFX6: ; %bb.0: ; %entry1964; GFX6-NEXT: s_load_dword s5, s[8:9], 0x01965; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr51966; GFX6-NEXT: s_load_dword s4, s[8:9], 0x11967; GFX6-NEXT: s_mov_b32 m0, -11968; GFX6-NEXT: s_waitcnt lgkmcnt(0)1969; GFX6-NEXT: v_mov_b32_e32 v0, s51970; GFX6-NEXT: v_mov_b32_e32 v1, s41971; GFX6-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11972; GFX6-NEXT: s_endpgm1973;1974; GFX7-LABEL: local_singlethread_seq_cst_atomicrmw:1975; GFX7: ; %bb.0: ; %entry1976; GFX7-NEXT: s_load_dword s5, s[8:9], 0x01977; GFX7-NEXT: s_load_dword s4, s[8:9], 0x11978; GFX7-NEXT: s_mov_b32 m0, -11979; GFX7-NEXT: s_waitcnt lgkmcnt(0)1980; GFX7-NEXT: v_mov_b32_e32 v0, s51981; GFX7-NEXT: v_mov_b32_e32 v1, s41982; GFX7-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11983; GFX7-NEXT: s_endpgm1984;1985; GFX10-WGP-LABEL: local_singlethread_seq_cst_atomicrmw:1986; GFX10-WGP: ; %bb.0: ; %entry1987; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x01988; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x41989; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)1990; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s51991; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s41992; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v0, v0, v11993; GFX10-WGP-NEXT: s_endpgm1994;1995; GFX10-CU-LABEL: local_singlethread_seq_cst_atomicrmw:1996; GFX10-CU: ; %bb.0: ; %entry1997; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x01998; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x41999; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)2000; GFX10-CU-NEXT: v_mov_b32_e32 v0, s52001; GFX10-CU-NEXT: v_mov_b32_e32 v1, s42002; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v0, v0, v12003; GFX10-CU-NEXT: s_endpgm2004;2005; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_atomicrmw:2006; SKIP-CACHE-INV: ; %bb.0: ; %entry2007; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x02008; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x12009; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -12010; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)2011; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s12012; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s02013; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v0, v0, v12014; SKIP-CACHE-INV-NEXT: s_endpgm2015;2016; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_atomicrmw:2017; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry2018; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x02019; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x42020; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2021; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s52022; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s42023; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v12024; GFX90A-NOTTGSPLIT-NEXT: s_endpgm2025;2026; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_atomicrmw:2027; GFX90A-TGSPLIT: ; %bb.0: ; %entry2028; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x02029; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x42030; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2031; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s52032; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s42033; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v12034; GFX90A-TGSPLIT-NEXT: s_endpgm2035;2036; GFX942-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_atomicrmw:2037; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry2038; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x02039; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x42040; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2041; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s12042; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s02043; GFX942-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v12044; GFX942-NOTTGSPLIT-NEXT: s_endpgm2045;2046; GFX942-TGSPLIT-LABEL: local_singlethread_seq_cst_atomicrmw:2047; GFX942-TGSPLIT: ; %bb.0: ; %entry2048; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x02049; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x42050; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2051; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s12052; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s02053; GFX942-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v12054; GFX942-TGSPLIT-NEXT: s_endpgm2055;2056; GFX11-WGP-LABEL: local_singlethread_seq_cst_atomicrmw:2057; GFX11-WGP: ; %bb.0: ; %entry2058; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x02059; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x42060; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)2061; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s12062; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s02063; GFX11-WGP-NEXT: ds_storexchg_rtn_b32 v0, v0, v12064; GFX11-WGP-NEXT: s_endpgm2065;2066; GFX11-CU-LABEL: local_singlethread_seq_cst_atomicrmw:2067; GFX11-CU: ; %bb.0: ; %entry2068; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x02069; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x42070; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)2071; GFX11-CU-NEXT: v_mov_b32_e32 v0, s12072; GFX11-CU-NEXT: v_mov_b32_e32 v1, s02073; GFX11-CU-NEXT: ds_storexchg_rtn_b32 v0, v0, v12074; GFX11-CU-NEXT: s_endpgm2075;2076; GFX12-WGP-LABEL: local_singlethread_seq_cst_atomicrmw:2077; GFX12-WGP: ; %bb.0: ; %entry2078; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x02079; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x42080; GFX12-WGP-NEXT: s_wait_kmcnt 0x02081; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s12082; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s02083; GFX12-WGP-NEXT: ds_storexchg_rtn_b32 v0, v0, v12084; GFX12-WGP-NEXT: s_endpgm2085;2086; GFX12-CU-LABEL: local_singlethread_seq_cst_atomicrmw:2087; GFX12-CU: ; %bb.0: ; %entry2088; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x02089; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x42090; GFX12-CU-NEXT: s_wait_kmcnt 0x02091; GFX12-CU-NEXT: v_mov_b32_e32 v0, s12092; GFX12-CU-NEXT: v_mov_b32_e32 v1, s02093; GFX12-CU-NEXT: ds_storexchg_rtn_b32 v0, v0, v12094; GFX12-CU-NEXT: s_endpgm2095;2096; GFX1250-LABEL: local_singlethread_seq_cst_atomicrmw:2097; GFX1250: ; %bb.0: ; %entry2098; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 12099; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x02100; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x42101; GFX1250-NEXT: s_wait_kmcnt 0x02102; GFX1250-NEXT: v_mov_b32_e32 v0, s12103; GFX1250-NEXT: v_mov_b32_e32 v1, s02104; GFX1250-NEXT: ds_storexchg_rtn_b32 v0, v0, v12105; GFX1250-NEXT: s_endpgm2106 ptr addrspace(3) %out, i32 %in) {2107entry:2108 %val = atomicrmw volatile xchg ptr addrspace(3) %out, i32 %in syncscope("singlethread") seq_cst2109 ret void2110}2111 2112define amdgpu_kernel void @local_singlethread_acquire_ret_atomicrmw(2113; GFX6-LABEL: local_singlethread_acquire_ret_atomicrmw:2114; GFX6: ; %bb.0: ; %entry2115; GFX6-NEXT: s_load_dword s4, s[8:9], 0x02116; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr42117; GFX6-NEXT: s_load_dword s5, s[8:9], 0x12118; GFX6-NEXT: s_mov_b32 m0, -12119; GFX6-NEXT: s_waitcnt lgkmcnt(0)2120; GFX6-NEXT: v_mov_b32_e32 v0, s42121; GFX6-NEXT: v_mov_b32_e32 v1, s52122; GFX6-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12123; GFX6-NEXT: s_mov_b32 m0, -12124; GFX6-NEXT: v_mov_b32_e32 v0, s42125; GFX6-NEXT: s_waitcnt lgkmcnt(0)2126; GFX6-NEXT: ds_write_b32 v0, v12127; GFX6-NEXT: s_endpgm2128;2129; GFX7-LABEL: local_singlethread_acquire_ret_atomicrmw:2130; GFX7: ; %bb.0: ; %entry2131; GFX7-NEXT: s_load_dword s4, s[8:9], 0x02132; GFX7-NEXT: s_load_dword s5, s[8:9], 0x12133; GFX7-NEXT: s_mov_b32 m0, -12134; GFX7-NEXT: s_waitcnt lgkmcnt(0)2135; GFX7-NEXT: v_mov_b32_e32 v0, s42136; GFX7-NEXT: v_mov_b32_e32 v1, s52137; GFX7-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12138; GFX7-NEXT: s_mov_b32 m0, -12139; GFX7-NEXT: v_mov_b32_e32 v0, s42140; GFX7-NEXT: s_waitcnt lgkmcnt(0)2141; GFX7-NEXT: ds_write_b32 v0, v12142; GFX7-NEXT: s_endpgm2143;2144; GFX10-WGP-LABEL: local_singlethread_acquire_ret_atomicrmw:2145; GFX10-WGP: ; %bb.0: ; %entry2146; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x02147; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x42148; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)2149; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s42150; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s52151; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12152; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s42153; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)2154; GFX10-WGP-NEXT: ds_write_b32 v0, v12155; GFX10-WGP-NEXT: s_endpgm2156;2157; GFX10-CU-LABEL: local_singlethread_acquire_ret_atomicrmw:2158; GFX10-CU: ; %bb.0: ; %entry2159; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x02160; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x42161; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)2162; GFX10-CU-NEXT: v_mov_b32_e32 v0, s42163; GFX10-CU-NEXT: v_mov_b32_e32 v1, s52164; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12165; GFX10-CU-NEXT: v_mov_b32_e32 v0, s42166; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)2167; GFX10-CU-NEXT: ds_write_b32 v0, v12168; GFX10-CU-NEXT: s_endpgm2169;2170; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_ret_atomicrmw:2171; SKIP-CACHE-INV: ; %bb.0: ; %entry2172; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x02173; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x12174; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -12175; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)2176; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s02177; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s12178; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12179; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -12180; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s02181; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)2182; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v12183; SKIP-CACHE-INV-NEXT: s_endpgm2184;2185; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_ret_atomicrmw:2186; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry2187; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x02188; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x42189; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2190; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s42191; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s52192; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12193; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s42194; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2195; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v12196; GFX90A-NOTTGSPLIT-NEXT: s_endpgm2197;2198; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_ret_atomicrmw:2199; GFX90A-TGSPLIT: ; %bb.0: ; %entry2200; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x02201; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x42202; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2203; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s42204; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s52205; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12206; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s42207; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2208; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v12209; GFX90A-TGSPLIT-NEXT: s_endpgm2210;2211; GFX942-NOTTGSPLIT-LABEL: local_singlethread_acquire_ret_atomicrmw:2212; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry2213; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x02214; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x42215; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2216; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s02217; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s12218; GFX942-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12219; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s02220; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2221; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v12222; GFX942-NOTTGSPLIT-NEXT: s_endpgm2223;2224; GFX942-TGSPLIT-LABEL: local_singlethread_acquire_ret_atomicrmw:2225; GFX942-TGSPLIT: ; %bb.0: ; %entry2226; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x02227; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x42228; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2229; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s02230; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s12231; GFX942-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12232; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s02233; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2234; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v12235; GFX942-TGSPLIT-NEXT: s_endpgm2236;2237; GFX11-WGP-LABEL: local_singlethread_acquire_ret_atomicrmw:2238; GFX11-WGP: ; %bb.0: ; %entry2239; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x02240; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x42241; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)2242; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s02243; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s12244; GFX11-WGP-NEXT: ds_storexchg_rtn_b32 v1, v0, v12245; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s02246; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)2247; GFX11-WGP-NEXT: ds_store_b32 v0, v12248; GFX11-WGP-NEXT: s_endpgm2249;2250; GFX11-CU-LABEL: local_singlethread_acquire_ret_atomicrmw:2251; GFX11-CU: ; %bb.0: ; %entry2252; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x02253; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x42254; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)2255; GFX11-CU-NEXT: v_mov_b32_e32 v0, s02256; GFX11-CU-NEXT: v_mov_b32_e32 v1, s12257; GFX11-CU-NEXT: ds_storexchg_rtn_b32 v1, v0, v12258; GFX11-CU-NEXT: v_mov_b32_e32 v0, s02259; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)2260; GFX11-CU-NEXT: ds_store_b32 v0, v12261; GFX11-CU-NEXT: s_endpgm2262;2263; GFX12-WGP-LABEL: local_singlethread_acquire_ret_atomicrmw:2264; GFX12-WGP: ; %bb.0: ; %entry2265; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x02266; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x42267; GFX12-WGP-NEXT: s_wait_kmcnt 0x02268; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s02269; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s12270; GFX12-WGP-NEXT: ds_storexchg_rtn_b32 v1, v0, v12271; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s02272; GFX12-WGP-NEXT: s_wait_dscnt 0x02273; GFX12-WGP-NEXT: ds_store_b32 v0, v12274; GFX12-WGP-NEXT: s_endpgm2275;2276; GFX12-CU-LABEL: local_singlethread_acquire_ret_atomicrmw:2277; GFX12-CU: ; %bb.0: ; %entry2278; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x02279; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x42280; GFX12-CU-NEXT: s_wait_kmcnt 0x02281; GFX12-CU-NEXT: v_mov_b32_e32 v0, s02282; GFX12-CU-NEXT: v_mov_b32_e32 v1, s12283; GFX12-CU-NEXT: ds_storexchg_rtn_b32 v1, v0, v12284; GFX12-CU-NEXT: v_mov_b32_e32 v0, s02285; GFX12-CU-NEXT: s_wait_dscnt 0x02286; GFX12-CU-NEXT: ds_store_b32 v0, v12287; GFX12-CU-NEXT: s_endpgm2288;2289; GFX1250-LABEL: local_singlethread_acquire_ret_atomicrmw:2290; GFX1250: ; %bb.0: ; %entry2291; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 12292; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x02293; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x42294; GFX1250-NEXT: s_wait_kmcnt 0x02295; GFX1250-NEXT: v_mov_b32_e32 v0, s02296; GFX1250-NEXT: v_mov_b32_e32 v1, s12297; GFX1250-NEXT: ds_storexchg_rtn_b32 v1, v0, v12298; GFX1250-NEXT: v_mov_b32_e32 v0, s02299; GFX1250-NEXT: s_wait_dscnt 0x02300; GFX1250-NEXT: ds_store_b32 v0, v12301; GFX1250-NEXT: s_endpgm2302 ptr addrspace(3) %out, i32 %in) {2303entry:2304 %val = atomicrmw volatile xchg ptr addrspace(3) %out, i32 %in syncscope("singlethread") acquire2305 store i32 %val, ptr addrspace(3) %out, align 42306 ret void2307}2308 2309define amdgpu_kernel void @local_singlethread_acq_rel_ret_atomicrmw(2310; GFX6-LABEL: local_singlethread_acq_rel_ret_atomicrmw:2311; GFX6: ; %bb.0: ; %entry2312; GFX6-NEXT: s_load_dword s4, s[8:9], 0x02313; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr42314; GFX6-NEXT: s_load_dword s5, s[8:9], 0x12315; GFX6-NEXT: s_mov_b32 m0, -12316; GFX6-NEXT: s_waitcnt lgkmcnt(0)2317; GFX6-NEXT: v_mov_b32_e32 v0, s42318; GFX6-NEXT: v_mov_b32_e32 v1, s52319; GFX6-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12320; GFX6-NEXT: s_mov_b32 m0, -12321; GFX6-NEXT: v_mov_b32_e32 v0, s42322; GFX6-NEXT: s_waitcnt lgkmcnt(0)2323; GFX6-NEXT: ds_write_b32 v0, v12324; GFX6-NEXT: s_endpgm2325;2326; GFX7-LABEL: local_singlethread_acq_rel_ret_atomicrmw:2327; GFX7: ; %bb.0: ; %entry2328; GFX7-NEXT: s_load_dword s4, s[8:9], 0x02329; GFX7-NEXT: s_load_dword s5, s[8:9], 0x12330; GFX7-NEXT: s_mov_b32 m0, -12331; GFX7-NEXT: s_waitcnt lgkmcnt(0)2332; GFX7-NEXT: v_mov_b32_e32 v0, s42333; GFX7-NEXT: v_mov_b32_e32 v1, s52334; GFX7-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12335; GFX7-NEXT: s_mov_b32 m0, -12336; GFX7-NEXT: v_mov_b32_e32 v0, s42337; GFX7-NEXT: s_waitcnt lgkmcnt(0)2338; GFX7-NEXT: ds_write_b32 v0, v12339; GFX7-NEXT: s_endpgm2340;2341; GFX10-WGP-LABEL: local_singlethread_acq_rel_ret_atomicrmw:2342; GFX10-WGP: ; %bb.0: ; %entry2343; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x02344; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x42345; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)2346; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s42347; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s52348; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12349; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s42350; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)2351; GFX10-WGP-NEXT: ds_write_b32 v0, v12352; GFX10-WGP-NEXT: s_endpgm2353;2354; GFX10-CU-LABEL: local_singlethread_acq_rel_ret_atomicrmw:2355; GFX10-CU: ; %bb.0: ; %entry2356; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x02357; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x42358; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)2359; GFX10-CU-NEXT: v_mov_b32_e32 v0, s42360; GFX10-CU-NEXT: v_mov_b32_e32 v1, s52361; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12362; GFX10-CU-NEXT: v_mov_b32_e32 v0, s42363; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)2364; GFX10-CU-NEXT: ds_write_b32 v0, v12365; GFX10-CU-NEXT: s_endpgm2366;2367; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_ret_atomicrmw:2368; SKIP-CACHE-INV: ; %bb.0: ; %entry2369; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x02370; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x12371; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -12372; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)2373; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s02374; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s12375; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12376; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -12377; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s02378; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)2379; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v12380; SKIP-CACHE-INV-NEXT: s_endpgm2381;2382; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_ret_atomicrmw:2383; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry2384; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x02385; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x42386; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2387; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s42388; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s52389; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12390; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s42391; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2392; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v12393; GFX90A-NOTTGSPLIT-NEXT: s_endpgm2394;2395; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_ret_atomicrmw:2396; GFX90A-TGSPLIT: ; %bb.0: ; %entry2397; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x02398; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x42399; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2400; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s42401; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s52402; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12403; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s42404; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2405; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v12406; GFX90A-TGSPLIT-NEXT: s_endpgm2407;2408; GFX942-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_ret_atomicrmw:2409; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry2410; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x02411; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x42412; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2413; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s02414; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s12415; GFX942-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12416; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s02417; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2418; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v12419; GFX942-NOTTGSPLIT-NEXT: s_endpgm2420;2421; GFX942-TGSPLIT-LABEL: local_singlethread_acq_rel_ret_atomicrmw:2422; GFX942-TGSPLIT: ; %bb.0: ; %entry2423; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x02424; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x42425; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2426; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s02427; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s12428; GFX942-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12429; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s02430; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2431; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v12432; GFX942-TGSPLIT-NEXT: s_endpgm2433;2434; GFX11-WGP-LABEL: local_singlethread_acq_rel_ret_atomicrmw:2435; GFX11-WGP: ; %bb.0: ; %entry2436; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x02437; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x42438; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)2439; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s02440; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s12441; GFX11-WGP-NEXT: ds_storexchg_rtn_b32 v1, v0, v12442; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s02443; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)2444; GFX11-WGP-NEXT: ds_store_b32 v0, v12445; GFX11-WGP-NEXT: s_endpgm2446;2447; GFX11-CU-LABEL: local_singlethread_acq_rel_ret_atomicrmw:2448; GFX11-CU: ; %bb.0: ; %entry2449; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x02450; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x42451; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)2452; GFX11-CU-NEXT: v_mov_b32_e32 v0, s02453; GFX11-CU-NEXT: v_mov_b32_e32 v1, s12454; GFX11-CU-NEXT: ds_storexchg_rtn_b32 v1, v0, v12455; GFX11-CU-NEXT: v_mov_b32_e32 v0, s02456; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)2457; GFX11-CU-NEXT: ds_store_b32 v0, v12458; GFX11-CU-NEXT: s_endpgm2459;2460; GFX12-WGP-LABEL: local_singlethread_acq_rel_ret_atomicrmw:2461; GFX12-WGP: ; %bb.0: ; %entry2462; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x02463; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x42464; GFX12-WGP-NEXT: s_wait_kmcnt 0x02465; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s02466; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s12467; GFX12-WGP-NEXT: ds_storexchg_rtn_b32 v1, v0, v12468; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s02469; GFX12-WGP-NEXT: s_wait_dscnt 0x02470; GFX12-WGP-NEXT: ds_store_b32 v0, v12471; GFX12-WGP-NEXT: s_endpgm2472;2473; GFX12-CU-LABEL: local_singlethread_acq_rel_ret_atomicrmw:2474; GFX12-CU: ; %bb.0: ; %entry2475; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x02476; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x42477; GFX12-CU-NEXT: s_wait_kmcnt 0x02478; GFX12-CU-NEXT: v_mov_b32_e32 v0, s02479; GFX12-CU-NEXT: v_mov_b32_e32 v1, s12480; GFX12-CU-NEXT: ds_storexchg_rtn_b32 v1, v0, v12481; GFX12-CU-NEXT: v_mov_b32_e32 v0, s02482; GFX12-CU-NEXT: s_wait_dscnt 0x02483; GFX12-CU-NEXT: ds_store_b32 v0, v12484; GFX12-CU-NEXT: s_endpgm2485;2486; GFX1250-LABEL: local_singlethread_acq_rel_ret_atomicrmw:2487; GFX1250: ; %bb.0: ; %entry2488; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 12489; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x02490; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x42491; GFX1250-NEXT: s_wait_kmcnt 0x02492; GFX1250-NEXT: v_mov_b32_e32 v0, s02493; GFX1250-NEXT: v_mov_b32_e32 v1, s12494; GFX1250-NEXT: ds_storexchg_rtn_b32 v1, v0, v12495; GFX1250-NEXT: v_mov_b32_e32 v0, s02496; GFX1250-NEXT: s_wait_dscnt 0x02497; GFX1250-NEXT: ds_store_b32 v0, v12498; GFX1250-NEXT: s_endpgm2499 ptr addrspace(3) %out, i32 %in) {2500entry:2501 %val = atomicrmw volatile xchg ptr addrspace(3) %out, i32 %in syncscope("singlethread") acq_rel2502 store i32 %val, ptr addrspace(3) %out, align 42503 ret void2504}2505 2506define amdgpu_kernel void @local_singlethread_seq_cst_ret_atomicrmw(2507; GFX6-LABEL: local_singlethread_seq_cst_ret_atomicrmw:2508; GFX6: ; %bb.0: ; %entry2509; GFX6-NEXT: s_load_dword s4, s[8:9], 0x02510; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr42511; GFX6-NEXT: s_load_dword s5, s[8:9], 0x12512; GFX6-NEXT: s_mov_b32 m0, -12513; GFX6-NEXT: s_waitcnt lgkmcnt(0)2514; GFX6-NEXT: v_mov_b32_e32 v0, s42515; GFX6-NEXT: v_mov_b32_e32 v1, s52516; GFX6-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12517; GFX6-NEXT: s_mov_b32 m0, -12518; GFX6-NEXT: v_mov_b32_e32 v0, s42519; GFX6-NEXT: s_waitcnt lgkmcnt(0)2520; GFX6-NEXT: ds_write_b32 v0, v12521; GFX6-NEXT: s_endpgm2522;2523; GFX7-LABEL: local_singlethread_seq_cst_ret_atomicrmw:2524; GFX7: ; %bb.0: ; %entry2525; GFX7-NEXT: s_load_dword s4, s[8:9], 0x02526; GFX7-NEXT: s_load_dword s5, s[8:9], 0x12527; GFX7-NEXT: s_mov_b32 m0, -12528; GFX7-NEXT: s_waitcnt lgkmcnt(0)2529; GFX7-NEXT: v_mov_b32_e32 v0, s42530; GFX7-NEXT: v_mov_b32_e32 v1, s52531; GFX7-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12532; GFX7-NEXT: s_mov_b32 m0, -12533; GFX7-NEXT: v_mov_b32_e32 v0, s42534; GFX7-NEXT: s_waitcnt lgkmcnt(0)2535; GFX7-NEXT: ds_write_b32 v0, v12536; GFX7-NEXT: s_endpgm2537;2538; GFX10-WGP-LABEL: local_singlethread_seq_cst_ret_atomicrmw:2539; GFX10-WGP: ; %bb.0: ; %entry2540; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x02541; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x42542; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)2543; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s42544; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s52545; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12546; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s42547; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)2548; GFX10-WGP-NEXT: ds_write_b32 v0, v12549; GFX10-WGP-NEXT: s_endpgm2550;2551; GFX10-CU-LABEL: local_singlethread_seq_cst_ret_atomicrmw:2552; GFX10-CU: ; %bb.0: ; %entry2553; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x02554; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x42555; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)2556; GFX10-CU-NEXT: v_mov_b32_e32 v0, s42557; GFX10-CU-NEXT: v_mov_b32_e32 v1, s52558; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12559; GFX10-CU-NEXT: v_mov_b32_e32 v0, s42560; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)2561; GFX10-CU-NEXT: ds_write_b32 v0, v12562; GFX10-CU-NEXT: s_endpgm2563;2564; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_ret_atomicrmw:2565; SKIP-CACHE-INV: ; %bb.0: ; %entry2566; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x02567; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x12568; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -12569; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)2570; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s02571; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s12572; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12573; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -12574; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s02575; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)2576; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v12577; SKIP-CACHE-INV-NEXT: s_endpgm2578;2579; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_ret_atomicrmw:2580; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry2581; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x02582; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x42583; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2584; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s42585; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s52586; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12587; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s42588; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2589; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v12590; GFX90A-NOTTGSPLIT-NEXT: s_endpgm2591;2592; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_ret_atomicrmw:2593; GFX90A-TGSPLIT: ; %bb.0: ; %entry2594; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x02595; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x42596; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2597; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s42598; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s52599; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12600; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s42601; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2602; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v12603; GFX90A-TGSPLIT-NEXT: s_endpgm2604;2605; GFX942-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_ret_atomicrmw:2606; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry2607; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x02608; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x42609; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2610; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s02611; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s12612; GFX942-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12613; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s02614; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2615; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v12616; GFX942-NOTTGSPLIT-NEXT: s_endpgm2617;2618; GFX942-TGSPLIT-LABEL: local_singlethread_seq_cst_ret_atomicrmw:2619; GFX942-TGSPLIT: ; %bb.0: ; %entry2620; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x02621; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x42622; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2623; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s02624; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s12625; GFX942-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v12626; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s02627; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2628; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v12629; GFX942-TGSPLIT-NEXT: s_endpgm2630;2631; GFX11-WGP-LABEL: local_singlethread_seq_cst_ret_atomicrmw:2632; GFX11-WGP: ; %bb.0: ; %entry2633; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x02634; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x42635; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)2636; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s02637; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s12638; GFX11-WGP-NEXT: ds_storexchg_rtn_b32 v1, v0, v12639; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s02640; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)2641; GFX11-WGP-NEXT: ds_store_b32 v0, v12642; GFX11-WGP-NEXT: s_endpgm2643;2644; GFX11-CU-LABEL: local_singlethread_seq_cst_ret_atomicrmw:2645; GFX11-CU: ; %bb.0: ; %entry2646; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x02647; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x42648; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)2649; GFX11-CU-NEXT: v_mov_b32_e32 v0, s02650; GFX11-CU-NEXT: v_mov_b32_e32 v1, s12651; GFX11-CU-NEXT: ds_storexchg_rtn_b32 v1, v0, v12652; GFX11-CU-NEXT: v_mov_b32_e32 v0, s02653; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)2654; GFX11-CU-NEXT: ds_store_b32 v0, v12655; GFX11-CU-NEXT: s_endpgm2656;2657; GFX12-WGP-LABEL: local_singlethread_seq_cst_ret_atomicrmw:2658; GFX12-WGP: ; %bb.0: ; %entry2659; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x02660; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x42661; GFX12-WGP-NEXT: s_wait_kmcnt 0x02662; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s02663; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s12664; GFX12-WGP-NEXT: ds_storexchg_rtn_b32 v1, v0, v12665; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s02666; GFX12-WGP-NEXT: s_wait_dscnt 0x02667; GFX12-WGP-NEXT: ds_store_b32 v0, v12668; GFX12-WGP-NEXT: s_endpgm2669;2670; GFX12-CU-LABEL: local_singlethread_seq_cst_ret_atomicrmw:2671; GFX12-CU: ; %bb.0: ; %entry2672; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x02673; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x42674; GFX12-CU-NEXT: s_wait_kmcnt 0x02675; GFX12-CU-NEXT: v_mov_b32_e32 v0, s02676; GFX12-CU-NEXT: v_mov_b32_e32 v1, s12677; GFX12-CU-NEXT: ds_storexchg_rtn_b32 v1, v0, v12678; GFX12-CU-NEXT: v_mov_b32_e32 v0, s02679; GFX12-CU-NEXT: s_wait_dscnt 0x02680; GFX12-CU-NEXT: ds_store_b32 v0, v12681; GFX12-CU-NEXT: s_endpgm2682;2683; GFX1250-LABEL: local_singlethread_seq_cst_ret_atomicrmw:2684; GFX1250: ; %bb.0: ; %entry2685; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 12686; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x02687; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x42688; GFX1250-NEXT: s_wait_kmcnt 0x02689; GFX1250-NEXT: v_mov_b32_e32 v0, s02690; GFX1250-NEXT: v_mov_b32_e32 v1, s12691; GFX1250-NEXT: ds_storexchg_rtn_b32 v1, v0, v12692; GFX1250-NEXT: v_mov_b32_e32 v0, s02693; GFX1250-NEXT: s_wait_dscnt 0x02694; GFX1250-NEXT: ds_store_b32 v0, v12695; GFX1250-NEXT: s_endpgm2696 ptr addrspace(3) %out, i32 %in) {2697entry:2698 %val = atomicrmw volatile xchg ptr addrspace(3) %out, i32 %in syncscope("singlethread") seq_cst2699 store i32 %val, ptr addrspace(3) %out, align 42700 ret void2701}2702 2703define amdgpu_kernel void @local_singlethread_monotonic_monotonic_cmpxchg(2704; GFX6-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:2705; GFX6: ; %bb.0: ; %entry2706; GFX6-NEXT: s_load_dword s6, s[8:9], 0x02707; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr62708; GFX6-NEXT: s_load_dword s4, s[8:9], 0x12709; GFX6-NEXT: s_load_dword s5, s[8:9], 0x22710; GFX6-NEXT: s_mov_b32 m0, -12711; GFX6-NEXT: s_waitcnt lgkmcnt(0)2712; GFX6-NEXT: v_mov_b32_e32 v0, s62713; GFX6-NEXT: v_mov_b32_e32 v1, s52714; GFX6-NEXT: v_mov_b32_e32 v2, s42715; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:162716; GFX6-NEXT: s_endpgm2717;2718; GFX7-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:2719; GFX7: ; %bb.0: ; %entry2720; GFX7-NEXT: s_load_dword s6, s[8:9], 0x02721; GFX7-NEXT: s_load_dword s4, s[8:9], 0x12722; GFX7-NEXT: s_load_dword s5, s[8:9], 0x22723; GFX7-NEXT: s_mov_b32 m0, -12724; GFX7-NEXT: s_waitcnt lgkmcnt(0)2725; GFX7-NEXT: v_mov_b32_e32 v0, s62726; GFX7-NEXT: v_mov_b32_e32 v1, s52727; GFX7-NEXT: v_mov_b32_e32 v2, s42728; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:162729; GFX7-NEXT: s_endpgm2730;2731; GFX10-WGP-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:2732; GFX10-WGP: ; %bb.0: ; %entry2733; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x02734; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x42735; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x82736; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)2737; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s62738; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s52739; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s42740; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:162741; GFX10-WGP-NEXT: s_endpgm2742;2743; GFX10-CU-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:2744; GFX10-CU: ; %bb.0: ; %entry2745; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x02746; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x42747; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x82748; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)2749; GFX10-CU-NEXT: v_mov_b32_e32 v0, s62750; GFX10-CU-NEXT: v_mov_b32_e32 v1, s52751; GFX10-CU-NEXT: v_mov_b32_e32 v2, s42752; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:162753; GFX10-CU-NEXT: s_endpgm2754;2755; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:2756; SKIP-CACHE-INV: ; %bb.0: ; %entry2757; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x02758; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x12759; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x22760; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -12761; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)2762; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s22763; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s12764; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s02765; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:162766; SKIP-CACHE-INV-NEXT: s_endpgm2767;2768; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:2769; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry2770; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x02771; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x42772; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x82773; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2774; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s62775; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s52776; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s42777; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:162778; GFX90A-NOTTGSPLIT-NEXT: s_endpgm2779;2780; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:2781; GFX90A-TGSPLIT: ; %bb.0: ; %entry2782; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x02783; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x42784; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x82785; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2786; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s62787; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s52788; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s42789; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:162790; GFX90A-TGSPLIT-NEXT: s_endpgm2791;2792; GFX942-NOTTGSPLIT-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:2793; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry2794; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x02795; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x42796; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x82797; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2798; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s22799; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s12800; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s02801; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:162802; GFX942-NOTTGSPLIT-NEXT: s_endpgm2803;2804; GFX942-TGSPLIT-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:2805; GFX942-TGSPLIT: ; %bb.0: ; %entry2806; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x02807; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x42808; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x82809; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2810; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s22811; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s12812; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s02813; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:162814; GFX942-TGSPLIT-NEXT: s_endpgm2815;2816; GFX11-WGP-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:2817; GFX11-WGP: ; %bb.0: ; %entry2818; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x02819; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x42820; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x82821; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)2822; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s22823; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s12824; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s02825; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:162826; GFX11-WGP-NEXT: s_endpgm2827;2828; GFX11-CU-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:2829; GFX11-CU: ; %bb.0: ; %entry2830; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x02831; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x42832; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x82833; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)2834; GFX11-CU-NEXT: v_mov_b32_e32 v0, s22835; GFX11-CU-NEXT: v_mov_b32_e32 v1, s12836; GFX11-CU-NEXT: v_mov_b32_e32 v2, s02837; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:162838; GFX11-CU-NEXT: s_endpgm2839;2840; GFX12-WGP-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:2841; GFX12-WGP: ; %bb.0: ; %entry2842; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x02843; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x42844; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x82845; GFX12-WGP-NEXT: s_wait_kmcnt 0x02846; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s22847; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s12848; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s02849; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:162850; GFX12-WGP-NEXT: s_endpgm2851;2852; GFX12-CU-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:2853; GFX12-CU: ; %bb.0: ; %entry2854; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x02855; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x42856; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x82857; GFX12-CU-NEXT: s_wait_kmcnt 0x02858; GFX12-CU-NEXT: v_mov_b32_e32 v0, s22859; GFX12-CU-NEXT: v_mov_b32_e32 v1, s12860; GFX12-CU-NEXT: v_mov_b32_e32 v2, s02861; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:162862; GFX12-CU-NEXT: s_endpgm2863;2864; GFX1250-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:2865; GFX1250: ; %bb.0: ; %entry2866; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 12867; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x02868; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x42869; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x82870; GFX1250-NEXT: s_wait_kmcnt 0x02871; GFX1250-NEXT: v_mov_b32_e32 v0, s22872; GFX1250-NEXT: v_mov_b32_e32 v1, s12873; GFX1250-NEXT: v_mov_b32_e32 v2, s02874; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:162875; GFX1250-NEXT: s_endpgm2876 ptr addrspace(3) %out, i32 %in, i32 %old) {2877entry:2878 %gep = getelementptr i32, ptr addrspace(3) %out, i32 42879 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") monotonic monotonic2880 ret void2881}2882 2883define amdgpu_kernel void @local_singlethread_acquire_monotonic_cmpxchg(2884; GFX6-LABEL: local_singlethread_acquire_monotonic_cmpxchg:2885; GFX6: ; %bb.0: ; %entry2886; GFX6-NEXT: s_load_dword s6, s[8:9], 0x02887; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr62888; GFX6-NEXT: s_load_dword s4, s[8:9], 0x12889; GFX6-NEXT: s_load_dword s5, s[8:9], 0x22890; GFX6-NEXT: s_mov_b32 m0, -12891; GFX6-NEXT: s_waitcnt lgkmcnt(0)2892; GFX6-NEXT: v_mov_b32_e32 v0, s62893; GFX6-NEXT: v_mov_b32_e32 v1, s52894; GFX6-NEXT: v_mov_b32_e32 v2, s42895; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:162896; GFX6-NEXT: s_endpgm2897;2898; GFX7-LABEL: local_singlethread_acquire_monotonic_cmpxchg:2899; GFX7: ; %bb.0: ; %entry2900; GFX7-NEXT: s_load_dword s6, s[8:9], 0x02901; GFX7-NEXT: s_load_dword s4, s[8:9], 0x12902; GFX7-NEXT: s_load_dword s5, s[8:9], 0x22903; GFX7-NEXT: s_mov_b32 m0, -12904; GFX7-NEXT: s_waitcnt lgkmcnt(0)2905; GFX7-NEXT: v_mov_b32_e32 v0, s62906; GFX7-NEXT: v_mov_b32_e32 v1, s52907; GFX7-NEXT: v_mov_b32_e32 v2, s42908; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:162909; GFX7-NEXT: s_endpgm2910;2911; GFX10-WGP-LABEL: local_singlethread_acquire_monotonic_cmpxchg:2912; GFX10-WGP: ; %bb.0: ; %entry2913; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x02914; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x42915; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x82916; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)2917; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s62918; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s52919; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s42920; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:162921; GFX10-WGP-NEXT: s_endpgm2922;2923; GFX10-CU-LABEL: local_singlethread_acquire_monotonic_cmpxchg:2924; GFX10-CU: ; %bb.0: ; %entry2925; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x02926; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x42927; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x82928; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)2929; GFX10-CU-NEXT: v_mov_b32_e32 v0, s62930; GFX10-CU-NEXT: v_mov_b32_e32 v1, s52931; GFX10-CU-NEXT: v_mov_b32_e32 v2, s42932; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:162933; GFX10-CU-NEXT: s_endpgm2934;2935; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_monotonic_cmpxchg:2936; SKIP-CACHE-INV: ; %bb.0: ; %entry2937; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x02938; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x12939; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x22940; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -12941; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)2942; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s22943; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s12944; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s02945; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:162946; SKIP-CACHE-INV-NEXT: s_endpgm2947;2948; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_monotonic_cmpxchg:2949; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry2950; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x02951; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x42952; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x82953; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2954; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s62955; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s52956; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s42957; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:162958; GFX90A-NOTTGSPLIT-NEXT: s_endpgm2959;2960; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_monotonic_cmpxchg:2961; GFX90A-TGSPLIT: ; %bb.0: ; %entry2962; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x02963; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x42964; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x82965; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2966; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s62967; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s52968; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s42969; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:162970; GFX90A-TGSPLIT-NEXT: s_endpgm2971;2972; GFX942-NOTTGSPLIT-LABEL: local_singlethread_acquire_monotonic_cmpxchg:2973; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry2974; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x02975; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x42976; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x82977; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2978; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s22979; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s12980; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s02981; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:162982; GFX942-NOTTGSPLIT-NEXT: s_endpgm2983;2984; GFX942-TGSPLIT-LABEL: local_singlethread_acquire_monotonic_cmpxchg:2985; GFX942-TGSPLIT: ; %bb.0: ; %entry2986; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x02987; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x42988; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x82989; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)2990; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s22991; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s12992; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s02993; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:162994; GFX942-TGSPLIT-NEXT: s_endpgm2995;2996; GFX11-WGP-LABEL: local_singlethread_acquire_monotonic_cmpxchg:2997; GFX11-WGP: ; %bb.0: ; %entry2998; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x02999; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x43000; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x83001; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)3002; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s23003; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s13004; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s03005; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163006; GFX11-WGP-NEXT: s_endpgm3007;3008; GFX11-CU-LABEL: local_singlethread_acquire_monotonic_cmpxchg:3009; GFX11-CU: ; %bb.0: ; %entry3010; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x03011; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x43012; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x83013; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)3014; GFX11-CU-NEXT: v_mov_b32_e32 v0, s23015; GFX11-CU-NEXT: v_mov_b32_e32 v1, s13016; GFX11-CU-NEXT: v_mov_b32_e32 v2, s03017; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163018; GFX11-CU-NEXT: s_endpgm3019;3020; GFX12-WGP-LABEL: local_singlethread_acquire_monotonic_cmpxchg:3021; GFX12-WGP: ; %bb.0: ; %entry3022; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x03023; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x43024; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x83025; GFX12-WGP-NEXT: s_wait_kmcnt 0x03026; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s23027; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s13028; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s03029; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163030; GFX12-WGP-NEXT: s_endpgm3031;3032; GFX12-CU-LABEL: local_singlethread_acquire_monotonic_cmpxchg:3033; GFX12-CU: ; %bb.0: ; %entry3034; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x03035; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x43036; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x83037; GFX12-CU-NEXT: s_wait_kmcnt 0x03038; GFX12-CU-NEXT: v_mov_b32_e32 v0, s23039; GFX12-CU-NEXT: v_mov_b32_e32 v1, s13040; GFX12-CU-NEXT: v_mov_b32_e32 v2, s03041; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163042; GFX12-CU-NEXT: s_endpgm3043;3044; GFX1250-LABEL: local_singlethread_acquire_monotonic_cmpxchg:3045; GFX1250: ; %bb.0: ; %entry3046; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 13047; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x03048; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x43049; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x83050; GFX1250-NEXT: s_wait_kmcnt 0x03051; GFX1250-NEXT: v_mov_b32_e32 v0, s23052; GFX1250-NEXT: v_mov_b32_e32 v1, s13053; GFX1250-NEXT: v_mov_b32_e32 v2, s03054; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163055; GFX1250-NEXT: s_endpgm3056 ptr addrspace(3) %out, i32 %in, i32 %old) {3057entry:3058 %gep = getelementptr i32, ptr addrspace(3) %out, i32 43059 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") acquire monotonic3060 ret void3061}3062 3063define amdgpu_kernel void @local_singlethread_release_monotonic_cmpxchg(3064; GFX6-LABEL: local_singlethread_release_monotonic_cmpxchg:3065; GFX6: ; %bb.0: ; %entry3066; GFX6-NEXT: s_load_dword s6, s[8:9], 0x03067; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr63068; GFX6-NEXT: s_load_dword s4, s[8:9], 0x13069; GFX6-NEXT: s_load_dword s5, s[8:9], 0x23070; GFX6-NEXT: s_mov_b32 m0, -13071; GFX6-NEXT: s_waitcnt lgkmcnt(0)3072; GFX6-NEXT: v_mov_b32_e32 v0, s63073; GFX6-NEXT: v_mov_b32_e32 v1, s53074; GFX6-NEXT: v_mov_b32_e32 v2, s43075; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163076; GFX6-NEXT: s_endpgm3077;3078; GFX7-LABEL: local_singlethread_release_monotonic_cmpxchg:3079; GFX7: ; %bb.0: ; %entry3080; GFX7-NEXT: s_load_dword s6, s[8:9], 0x03081; GFX7-NEXT: s_load_dword s4, s[8:9], 0x13082; GFX7-NEXT: s_load_dword s5, s[8:9], 0x23083; GFX7-NEXT: s_mov_b32 m0, -13084; GFX7-NEXT: s_waitcnt lgkmcnt(0)3085; GFX7-NEXT: v_mov_b32_e32 v0, s63086; GFX7-NEXT: v_mov_b32_e32 v1, s53087; GFX7-NEXT: v_mov_b32_e32 v2, s43088; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163089; GFX7-NEXT: s_endpgm3090;3091; GFX10-WGP-LABEL: local_singlethread_release_monotonic_cmpxchg:3092; GFX10-WGP: ; %bb.0: ; %entry3093; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x03094; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x43095; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x83096; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)3097; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s63098; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s53099; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s43100; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163101; GFX10-WGP-NEXT: s_endpgm3102;3103; GFX10-CU-LABEL: local_singlethread_release_monotonic_cmpxchg:3104; GFX10-CU: ; %bb.0: ; %entry3105; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x03106; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x43107; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x83108; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)3109; GFX10-CU-NEXT: v_mov_b32_e32 v0, s63110; GFX10-CU-NEXT: v_mov_b32_e32 v1, s53111; GFX10-CU-NEXT: v_mov_b32_e32 v2, s43112; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163113; GFX10-CU-NEXT: s_endpgm3114;3115; SKIP-CACHE-INV-LABEL: local_singlethread_release_monotonic_cmpxchg:3116; SKIP-CACHE-INV: ; %bb.0: ; %entry3117; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x03118; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x13119; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x23120; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -13121; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)3122; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s23123; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s13124; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s03125; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163126; SKIP-CACHE-INV-NEXT: s_endpgm3127;3128; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_monotonic_cmpxchg:3129; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry3130; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x03131; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x43132; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x83133; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)3134; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s63135; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s53136; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s43137; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163138; GFX90A-NOTTGSPLIT-NEXT: s_endpgm3139;3140; GFX90A-TGSPLIT-LABEL: local_singlethread_release_monotonic_cmpxchg:3141; GFX90A-TGSPLIT: ; %bb.0: ; %entry3142; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x03143; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x43144; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x83145; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)3146; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s63147; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s53148; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s43149; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163150; GFX90A-TGSPLIT-NEXT: s_endpgm3151;3152; GFX942-NOTTGSPLIT-LABEL: local_singlethread_release_monotonic_cmpxchg:3153; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry3154; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x03155; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x43156; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x83157; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)3158; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s23159; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s13160; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s03161; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163162; GFX942-NOTTGSPLIT-NEXT: s_endpgm3163;3164; GFX942-TGSPLIT-LABEL: local_singlethread_release_monotonic_cmpxchg:3165; GFX942-TGSPLIT: ; %bb.0: ; %entry3166; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x03167; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x43168; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x83169; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)3170; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s23171; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s13172; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s03173; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163174; GFX942-TGSPLIT-NEXT: s_endpgm3175;3176; GFX11-WGP-LABEL: local_singlethread_release_monotonic_cmpxchg:3177; GFX11-WGP: ; %bb.0: ; %entry3178; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x03179; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x43180; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x83181; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)3182; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s23183; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s13184; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s03185; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163186; GFX11-WGP-NEXT: s_endpgm3187;3188; GFX11-CU-LABEL: local_singlethread_release_monotonic_cmpxchg:3189; GFX11-CU: ; %bb.0: ; %entry3190; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x03191; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x43192; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x83193; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)3194; GFX11-CU-NEXT: v_mov_b32_e32 v0, s23195; GFX11-CU-NEXT: v_mov_b32_e32 v1, s13196; GFX11-CU-NEXT: v_mov_b32_e32 v2, s03197; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163198; GFX11-CU-NEXT: s_endpgm3199;3200; GFX12-WGP-LABEL: local_singlethread_release_monotonic_cmpxchg:3201; GFX12-WGP: ; %bb.0: ; %entry3202; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x03203; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x43204; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x83205; GFX12-WGP-NEXT: s_wait_kmcnt 0x03206; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s23207; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s13208; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s03209; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163210; GFX12-WGP-NEXT: s_endpgm3211;3212; GFX12-CU-LABEL: local_singlethread_release_monotonic_cmpxchg:3213; GFX12-CU: ; %bb.0: ; %entry3214; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x03215; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x43216; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x83217; GFX12-CU-NEXT: s_wait_kmcnt 0x03218; GFX12-CU-NEXT: v_mov_b32_e32 v0, s23219; GFX12-CU-NEXT: v_mov_b32_e32 v1, s13220; GFX12-CU-NEXT: v_mov_b32_e32 v2, s03221; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163222; GFX12-CU-NEXT: s_endpgm3223;3224; GFX1250-LABEL: local_singlethread_release_monotonic_cmpxchg:3225; GFX1250: ; %bb.0: ; %entry3226; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 13227; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x03228; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x43229; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x83230; GFX1250-NEXT: s_wait_kmcnt 0x03231; GFX1250-NEXT: v_mov_b32_e32 v0, s23232; GFX1250-NEXT: v_mov_b32_e32 v1, s13233; GFX1250-NEXT: v_mov_b32_e32 v2, s03234; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163235; GFX1250-NEXT: s_endpgm3236 ptr addrspace(3) %out, i32 %in, i32 %old) {3237entry:3238 %gep = getelementptr i32, ptr addrspace(3) %out, i32 43239 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") release monotonic3240 ret void3241}3242 3243define amdgpu_kernel void @local_singlethread_acq_rel_monotonic_cmpxchg(3244; GFX6-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:3245; GFX6: ; %bb.0: ; %entry3246; GFX6-NEXT: s_load_dword s6, s[8:9], 0x03247; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr63248; GFX6-NEXT: s_load_dword s4, s[8:9], 0x13249; GFX6-NEXT: s_load_dword s5, s[8:9], 0x23250; GFX6-NEXT: s_mov_b32 m0, -13251; GFX6-NEXT: s_waitcnt lgkmcnt(0)3252; GFX6-NEXT: v_mov_b32_e32 v0, s63253; GFX6-NEXT: v_mov_b32_e32 v1, s53254; GFX6-NEXT: v_mov_b32_e32 v2, s43255; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163256; GFX6-NEXT: s_endpgm3257;3258; GFX7-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:3259; GFX7: ; %bb.0: ; %entry3260; GFX7-NEXT: s_load_dword s6, s[8:9], 0x03261; GFX7-NEXT: s_load_dword s4, s[8:9], 0x13262; GFX7-NEXT: s_load_dword s5, s[8:9], 0x23263; GFX7-NEXT: s_mov_b32 m0, -13264; GFX7-NEXT: s_waitcnt lgkmcnt(0)3265; GFX7-NEXT: v_mov_b32_e32 v0, s63266; GFX7-NEXT: v_mov_b32_e32 v1, s53267; GFX7-NEXT: v_mov_b32_e32 v2, s43268; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163269; GFX7-NEXT: s_endpgm3270;3271; GFX10-WGP-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:3272; GFX10-WGP: ; %bb.0: ; %entry3273; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x03274; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x43275; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x83276; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)3277; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s63278; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s53279; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s43280; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163281; GFX10-WGP-NEXT: s_endpgm3282;3283; GFX10-CU-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:3284; GFX10-CU: ; %bb.0: ; %entry3285; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x03286; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x43287; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x83288; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)3289; GFX10-CU-NEXT: v_mov_b32_e32 v0, s63290; GFX10-CU-NEXT: v_mov_b32_e32 v1, s53291; GFX10-CU-NEXT: v_mov_b32_e32 v2, s43292; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163293; GFX10-CU-NEXT: s_endpgm3294;3295; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:3296; SKIP-CACHE-INV: ; %bb.0: ; %entry3297; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x03298; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x13299; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x23300; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -13301; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)3302; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s23303; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s13304; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s03305; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163306; SKIP-CACHE-INV-NEXT: s_endpgm3307;3308; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:3309; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry3310; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x03311; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x43312; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x83313; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)3314; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s63315; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s53316; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s43317; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163318; GFX90A-NOTTGSPLIT-NEXT: s_endpgm3319;3320; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:3321; GFX90A-TGSPLIT: ; %bb.0: ; %entry3322; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x03323; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x43324; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x83325; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)3326; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s63327; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s53328; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s43329; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163330; GFX90A-TGSPLIT-NEXT: s_endpgm3331;3332; GFX942-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:3333; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry3334; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x03335; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x43336; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x83337; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)3338; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s23339; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s13340; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s03341; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163342; GFX942-NOTTGSPLIT-NEXT: s_endpgm3343;3344; GFX942-TGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:3345; GFX942-TGSPLIT: ; %bb.0: ; %entry3346; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x03347; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x43348; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x83349; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)3350; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s23351; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s13352; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s03353; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163354; GFX942-TGSPLIT-NEXT: s_endpgm3355;3356; GFX11-WGP-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:3357; GFX11-WGP: ; %bb.0: ; %entry3358; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x03359; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x43360; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x83361; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)3362; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s23363; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s13364; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s03365; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163366; GFX11-WGP-NEXT: s_endpgm3367;3368; GFX11-CU-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:3369; GFX11-CU: ; %bb.0: ; %entry3370; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x03371; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x43372; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x83373; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)3374; GFX11-CU-NEXT: v_mov_b32_e32 v0, s23375; GFX11-CU-NEXT: v_mov_b32_e32 v1, s13376; GFX11-CU-NEXT: v_mov_b32_e32 v2, s03377; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163378; GFX11-CU-NEXT: s_endpgm3379;3380; GFX12-WGP-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:3381; GFX12-WGP: ; %bb.0: ; %entry3382; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x03383; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x43384; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x83385; GFX12-WGP-NEXT: s_wait_kmcnt 0x03386; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s23387; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s13388; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s03389; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163390; GFX12-WGP-NEXT: s_endpgm3391;3392; GFX12-CU-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:3393; GFX12-CU: ; %bb.0: ; %entry3394; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x03395; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x43396; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x83397; GFX12-CU-NEXT: s_wait_kmcnt 0x03398; GFX12-CU-NEXT: v_mov_b32_e32 v0, s23399; GFX12-CU-NEXT: v_mov_b32_e32 v1, s13400; GFX12-CU-NEXT: v_mov_b32_e32 v2, s03401; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163402; GFX12-CU-NEXT: s_endpgm3403;3404; GFX1250-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:3405; GFX1250: ; %bb.0: ; %entry3406; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 13407; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x03408; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x43409; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x83410; GFX1250-NEXT: s_wait_kmcnt 0x03411; GFX1250-NEXT: v_mov_b32_e32 v0, s23412; GFX1250-NEXT: v_mov_b32_e32 v1, s13413; GFX1250-NEXT: v_mov_b32_e32 v2, s03414; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163415; GFX1250-NEXT: s_endpgm3416 ptr addrspace(3) %out, i32 %in, i32 %old) {3417entry:3418 %gep = getelementptr i32, ptr addrspace(3) %out, i32 43419 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") acq_rel monotonic3420 ret void3421}3422 3423define amdgpu_kernel void @local_singlethread_seq_cst_monotonic_cmpxchg(3424; GFX6-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:3425; GFX6: ; %bb.0: ; %entry3426; GFX6-NEXT: s_load_dword s6, s[8:9], 0x03427; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr63428; GFX6-NEXT: s_load_dword s4, s[8:9], 0x13429; GFX6-NEXT: s_load_dword s5, s[8:9], 0x23430; GFX6-NEXT: s_mov_b32 m0, -13431; GFX6-NEXT: s_waitcnt lgkmcnt(0)3432; GFX6-NEXT: v_mov_b32_e32 v0, s63433; GFX6-NEXT: v_mov_b32_e32 v1, s53434; GFX6-NEXT: v_mov_b32_e32 v2, s43435; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163436; GFX6-NEXT: s_endpgm3437;3438; GFX7-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:3439; GFX7: ; %bb.0: ; %entry3440; GFX7-NEXT: s_load_dword s6, s[8:9], 0x03441; GFX7-NEXT: s_load_dword s4, s[8:9], 0x13442; GFX7-NEXT: s_load_dword s5, s[8:9], 0x23443; GFX7-NEXT: s_mov_b32 m0, -13444; GFX7-NEXT: s_waitcnt lgkmcnt(0)3445; GFX7-NEXT: v_mov_b32_e32 v0, s63446; GFX7-NEXT: v_mov_b32_e32 v1, s53447; GFX7-NEXT: v_mov_b32_e32 v2, s43448; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163449; GFX7-NEXT: s_endpgm3450;3451; GFX10-WGP-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:3452; GFX10-WGP: ; %bb.0: ; %entry3453; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x03454; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x43455; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x83456; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)3457; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s63458; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s53459; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s43460; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163461; GFX10-WGP-NEXT: s_endpgm3462;3463; GFX10-CU-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:3464; GFX10-CU: ; %bb.0: ; %entry3465; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x03466; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x43467; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x83468; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)3469; GFX10-CU-NEXT: v_mov_b32_e32 v0, s63470; GFX10-CU-NEXT: v_mov_b32_e32 v1, s53471; GFX10-CU-NEXT: v_mov_b32_e32 v2, s43472; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163473; GFX10-CU-NEXT: s_endpgm3474;3475; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:3476; SKIP-CACHE-INV: ; %bb.0: ; %entry3477; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x03478; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x13479; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x23480; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -13481; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)3482; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s23483; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s13484; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s03485; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163486; SKIP-CACHE-INV-NEXT: s_endpgm3487;3488; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:3489; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry3490; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x03491; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x43492; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x83493; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)3494; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s63495; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s53496; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s43497; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163498; GFX90A-NOTTGSPLIT-NEXT: s_endpgm3499;3500; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:3501; GFX90A-TGSPLIT: ; %bb.0: ; %entry3502; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x03503; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x43504; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x83505; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)3506; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s63507; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s53508; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s43509; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163510; GFX90A-TGSPLIT-NEXT: s_endpgm3511;3512; GFX942-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:3513; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry3514; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x03515; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x43516; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x83517; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)3518; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s23519; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s13520; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s03521; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163522; GFX942-NOTTGSPLIT-NEXT: s_endpgm3523;3524; GFX942-TGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:3525; GFX942-TGSPLIT: ; %bb.0: ; %entry3526; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x03527; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x43528; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x83529; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)3530; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s23531; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s13532; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s03533; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163534; GFX942-TGSPLIT-NEXT: s_endpgm3535;3536; GFX11-WGP-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:3537; GFX11-WGP: ; %bb.0: ; %entry3538; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x03539; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x43540; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x83541; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)3542; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s23543; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s13544; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s03545; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163546; GFX11-WGP-NEXT: s_endpgm3547;3548; GFX11-CU-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:3549; GFX11-CU: ; %bb.0: ; %entry3550; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x03551; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x43552; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x83553; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)3554; GFX11-CU-NEXT: v_mov_b32_e32 v0, s23555; GFX11-CU-NEXT: v_mov_b32_e32 v1, s13556; GFX11-CU-NEXT: v_mov_b32_e32 v2, s03557; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163558; GFX11-CU-NEXT: s_endpgm3559;3560; GFX12-WGP-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:3561; GFX12-WGP: ; %bb.0: ; %entry3562; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x03563; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x43564; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x83565; GFX12-WGP-NEXT: s_wait_kmcnt 0x03566; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s23567; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s13568; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s03569; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163570; GFX12-WGP-NEXT: s_endpgm3571;3572; GFX12-CU-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:3573; GFX12-CU: ; %bb.0: ; %entry3574; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x03575; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x43576; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x83577; GFX12-CU-NEXT: s_wait_kmcnt 0x03578; GFX12-CU-NEXT: v_mov_b32_e32 v0, s23579; GFX12-CU-NEXT: v_mov_b32_e32 v1, s13580; GFX12-CU-NEXT: v_mov_b32_e32 v2, s03581; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163582; GFX12-CU-NEXT: s_endpgm3583;3584; GFX1250-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:3585; GFX1250: ; %bb.0: ; %entry3586; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 13587; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x03588; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x43589; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x83590; GFX1250-NEXT: s_wait_kmcnt 0x03591; GFX1250-NEXT: v_mov_b32_e32 v0, s23592; GFX1250-NEXT: v_mov_b32_e32 v1, s13593; GFX1250-NEXT: v_mov_b32_e32 v2, s03594; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163595; GFX1250-NEXT: s_endpgm3596 ptr addrspace(3) %out, i32 %in, i32 %old) {3597entry:3598 %gep = getelementptr i32, ptr addrspace(3) %out, i32 43599 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") seq_cst monotonic3600 ret void3601}3602 3603define amdgpu_kernel void @local_singlethread_monotonic_acquire_cmpxchg(3604; GFX6-LABEL: local_singlethread_monotonic_acquire_cmpxchg:3605; GFX6: ; %bb.0: ; %entry3606; GFX6-NEXT: s_load_dword s6, s[8:9], 0x03607; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr63608; GFX6-NEXT: s_load_dword s4, s[8:9], 0x13609; GFX6-NEXT: s_load_dword s5, s[8:9], 0x23610; GFX6-NEXT: s_mov_b32 m0, -13611; GFX6-NEXT: s_waitcnt lgkmcnt(0)3612; GFX6-NEXT: v_mov_b32_e32 v0, s63613; GFX6-NEXT: v_mov_b32_e32 v1, s53614; GFX6-NEXT: v_mov_b32_e32 v2, s43615; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163616; GFX6-NEXT: s_endpgm3617;3618; GFX7-LABEL: local_singlethread_monotonic_acquire_cmpxchg:3619; GFX7: ; %bb.0: ; %entry3620; GFX7-NEXT: s_load_dword s6, s[8:9], 0x03621; GFX7-NEXT: s_load_dword s4, s[8:9], 0x13622; GFX7-NEXT: s_load_dword s5, s[8:9], 0x23623; GFX7-NEXT: s_mov_b32 m0, -13624; GFX7-NEXT: s_waitcnt lgkmcnt(0)3625; GFX7-NEXT: v_mov_b32_e32 v0, s63626; GFX7-NEXT: v_mov_b32_e32 v1, s53627; GFX7-NEXT: v_mov_b32_e32 v2, s43628; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163629; GFX7-NEXT: s_endpgm3630;3631; GFX10-WGP-LABEL: local_singlethread_monotonic_acquire_cmpxchg:3632; GFX10-WGP: ; %bb.0: ; %entry3633; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x03634; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x43635; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x83636; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)3637; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s63638; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s53639; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s43640; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163641; GFX10-WGP-NEXT: s_endpgm3642;3643; GFX10-CU-LABEL: local_singlethread_monotonic_acquire_cmpxchg:3644; GFX10-CU: ; %bb.0: ; %entry3645; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x03646; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x43647; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x83648; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)3649; GFX10-CU-NEXT: v_mov_b32_e32 v0, s63650; GFX10-CU-NEXT: v_mov_b32_e32 v1, s53651; GFX10-CU-NEXT: v_mov_b32_e32 v2, s43652; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163653; GFX10-CU-NEXT: s_endpgm3654;3655; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_acquire_cmpxchg:3656; SKIP-CACHE-INV: ; %bb.0: ; %entry3657; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x03658; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x13659; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x23660; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -13661; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)3662; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s23663; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s13664; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s03665; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163666; SKIP-CACHE-INV-NEXT: s_endpgm3667;3668; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_acquire_cmpxchg:3669; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry3670; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x03671; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x43672; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x83673; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)3674; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s63675; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s53676; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s43677; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163678; GFX90A-NOTTGSPLIT-NEXT: s_endpgm3679;3680; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_acquire_cmpxchg:3681; GFX90A-TGSPLIT: ; %bb.0: ; %entry3682; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x03683; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x43684; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x83685; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)3686; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s63687; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s53688; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s43689; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163690; GFX90A-TGSPLIT-NEXT: s_endpgm3691;3692; GFX942-NOTTGSPLIT-LABEL: local_singlethread_monotonic_acquire_cmpxchg:3693; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry3694; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x03695; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x43696; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x83697; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)3698; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s23699; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s13700; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s03701; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163702; GFX942-NOTTGSPLIT-NEXT: s_endpgm3703;3704; GFX942-TGSPLIT-LABEL: local_singlethread_monotonic_acquire_cmpxchg:3705; GFX942-TGSPLIT: ; %bb.0: ; %entry3706; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x03707; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x43708; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x83709; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)3710; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s23711; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s13712; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s03713; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163714; GFX942-TGSPLIT-NEXT: s_endpgm3715;3716; GFX11-WGP-LABEL: local_singlethread_monotonic_acquire_cmpxchg:3717; GFX11-WGP: ; %bb.0: ; %entry3718; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x03719; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x43720; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x83721; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)3722; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s23723; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s13724; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s03725; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163726; GFX11-WGP-NEXT: s_endpgm3727;3728; GFX11-CU-LABEL: local_singlethread_monotonic_acquire_cmpxchg:3729; GFX11-CU: ; %bb.0: ; %entry3730; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x03731; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x43732; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x83733; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)3734; GFX11-CU-NEXT: v_mov_b32_e32 v0, s23735; GFX11-CU-NEXT: v_mov_b32_e32 v1, s13736; GFX11-CU-NEXT: v_mov_b32_e32 v2, s03737; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163738; GFX11-CU-NEXT: s_endpgm3739;3740; GFX12-WGP-LABEL: local_singlethread_monotonic_acquire_cmpxchg:3741; GFX12-WGP: ; %bb.0: ; %entry3742; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x03743; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x43744; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x83745; GFX12-WGP-NEXT: s_wait_kmcnt 0x03746; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s23747; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s13748; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s03749; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163750; GFX12-WGP-NEXT: s_endpgm3751;3752; GFX12-CU-LABEL: local_singlethread_monotonic_acquire_cmpxchg:3753; GFX12-CU: ; %bb.0: ; %entry3754; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x03755; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x43756; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x83757; GFX12-CU-NEXT: s_wait_kmcnt 0x03758; GFX12-CU-NEXT: v_mov_b32_e32 v0, s23759; GFX12-CU-NEXT: v_mov_b32_e32 v1, s13760; GFX12-CU-NEXT: v_mov_b32_e32 v2, s03761; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163762; GFX12-CU-NEXT: s_endpgm3763;3764; GFX1250-LABEL: local_singlethread_monotonic_acquire_cmpxchg:3765; GFX1250: ; %bb.0: ; %entry3766; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 13767; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x03768; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x43769; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x83770; GFX1250-NEXT: s_wait_kmcnt 0x03771; GFX1250-NEXT: v_mov_b32_e32 v0, s23772; GFX1250-NEXT: v_mov_b32_e32 v1, s13773; GFX1250-NEXT: v_mov_b32_e32 v2, s03774; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163775; GFX1250-NEXT: s_endpgm3776 ptr addrspace(3) %out, i32 %in, i32 %old) {3777entry:3778 %gep = getelementptr i32, ptr addrspace(3) %out, i32 43779 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") monotonic acquire3780 ret void3781}3782 3783define amdgpu_kernel void @local_singlethread_acquire_acquire_cmpxchg(3784; GFX6-LABEL: local_singlethread_acquire_acquire_cmpxchg:3785; GFX6: ; %bb.0: ; %entry3786; GFX6-NEXT: s_load_dword s6, s[8:9], 0x03787; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr63788; GFX6-NEXT: s_load_dword s4, s[8:9], 0x13789; GFX6-NEXT: s_load_dword s5, s[8:9], 0x23790; GFX6-NEXT: s_mov_b32 m0, -13791; GFX6-NEXT: s_waitcnt lgkmcnt(0)3792; GFX6-NEXT: v_mov_b32_e32 v0, s63793; GFX6-NEXT: v_mov_b32_e32 v1, s53794; GFX6-NEXT: v_mov_b32_e32 v2, s43795; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163796; GFX6-NEXT: s_endpgm3797;3798; GFX7-LABEL: local_singlethread_acquire_acquire_cmpxchg:3799; GFX7: ; %bb.0: ; %entry3800; GFX7-NEXT: s_load_dword s6, s[8:9], 0x03801; GFX7-NEXT: s_load_dword s4, s[8:9], 0x13802; GFX7-NEXT: s_load_dword s5, s[8:9], 0x23803; GFX7-NEXT: s_mov_b32 m0, -13804; GFX7-NEXT: s_waitcnt lgkmcnt(0)3805; GFX7-NEXT: v_mov_b32_e32 v0, s63806; GFX7-NEXT: v_mov_b32_e32 v1, s53807; GFX7-NEXT: v_mov_b32_e32 v2, s43808; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163809; GFX7-NEXT: s_endpgm3810;3811; GFX10-WGP-LABEL: local_singlethread_acquire_acquire_cmpxchg:3812; GFX10-WGP: ; %bb.0: ; %entry3813; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x03814; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x43815; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x83816; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)3817; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s63818; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s53819; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s43820; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163821; GFX10-WGP-NEXT: s_endpgm3822;3823; GFX10-CU-LABEL: local_singlethread_acquire_acquire_cmpxchg:3824; GFX10-CU: ; %bb.0: ; %entry3825; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x03826; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x43827; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x83828; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)3829; GFX10-CU-NEXT: v_mov_b32_e32 v0, s63830; GFX10-CU-NEXT: v_mov_b32_e32 v1, s53831; GFX10-CU-NEXT: v_mov_b32_e32 v2, s43832; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163833; GFX10-CU-NEXT: s_endpgm3834;3835; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_acquire_cmpxchg:3836; SKIP-CACHE-INV: ; %bb.0: ; %entry3837; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x03838; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x13839; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x23840; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -13841; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)3842; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s23843; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s13844; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s03845; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163846; SKIP-CACHE-INV-NEXT: s_endpgm3847;3848; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_acquire_cmpxchg:3849; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry3850; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x03851; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x43852; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x83853; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)3854; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s63855; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s53856; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s43857; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163858; GFX90A-NOTTGSPLIT-NEXT: s_endpgm3859;3860; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_acquire_cmpxchg:3861; GFX90A-TGSPLIT: ; %bb.0: ; %entry3862; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x03863; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x43864; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x83865; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)3866; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s63867; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s53868; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s43869; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163870; GFX90A-TGSPLIT-NEXT: s_endpgm3871;3872; GFX942-NOTTGSPLIT-LABEL: local_singlethread_acquire_acquire_cmpxchg:3873; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry3874; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x03875; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x43876; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x83877; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)3878; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s23879; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s13880; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s03881; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163882; GFX942-NOTTGSPLIT-NEXT: s_endpgm3883;3884; GFX942-TGSPLIT-LABEL: local_singlethread_acquire_acquire_cmpxchg:3885; GFX942-TGSPLIT: ; %bb.0: ; %entry3886; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x03887; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x43888; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x83889; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)3890; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s23891; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s13892; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s03893; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163894; GFX942-TGSPLIT-NEXT: s_endpgm3895;3896; GFX11-WGP-LABEL: local_singlethread_acquire_acquire_cmpxchg:3897; GFX11-WGP: ; %bb.0: ; %entry3898; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x03899; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x43900; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x83901; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)3902; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s23903; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s13904; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s03905; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163906; GFX11-WGP-NEXT: s_endpgm3907;3908; GFX11-CU-LABEL: local_singlethread_acquire_acquire_cmpxchg:3909; GFX11-CU: ; %bb.0: ; %entry3910; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x03911; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x43912; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x83913; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)3914; GFX11-CU-NEXT: v_mov_b32_e32 v0, s23915; GFX11-CU-NEXT: v_mov_b32_e32 v1, s13916; GFX11-CU-NEXT: v_mov_b32_e32 v2, s03917; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163918; GFX11-CU-NEXT: s_endpgm3919;3920; GFX12-WGP-LABEL: local_singlethread_acquire_acquire_cmpxchg:3921; GFX12-WGP: ; %bb.0: ; %entry3922; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x03923; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x43924; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x83925; GFX12-WGP-NEXT: s_wait_kmcnt 0x03926; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s23927; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s13928; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s03929; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163930; GFX12-WGP-NEXT: s_endpgm3931;3932; GFX12-CU-LABEL: local_singlethread_acquire_acquire_cmpxchg:3933; GFX12-CU: ; %bb.0: ; %entry3934; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x03935; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x43936; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x83937; GFX12-CU-NEXT: s_wait_kmcnt 0x03938; GFX12-CU-NEXT: v_mov_b32_e32 v0, s23939; GFX12-CU-NEXT: v_mov_b32_e32 v1, s13940; GFX12-CU-NEXT: v_mov_b32_e32 v2, s03941; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163942; GFX12-CU-NEXT: s_endpgm3943;3944; GFX1250-LABEL: local_singlethread_acquire_acquire_cmpxchg:3945; GFX1250: ; %bb.0: ; %entry3946; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 13947; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x03948; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x43949; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x83950; GFX1250-NEXT: s_wait_kmcnt 0x03951; GFX1250-NEXT: v_mov_b32_e32 v0, s23952; GFX1250-NEXT: v_mov_b32_e32 v1, s13953; GFX1250-NEXT: v_mov_b32_e32 v2, s03954; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:163955; GFX1250-NEXT: s_endpgm3956 ptr addrspace(3) %out, i32 %in, i32 %old) {3957entry:3958 %gep = getelementptr i32, ptr addrspace(3) %out, i32 43959 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") acquire acquire3960 ret void3961}3962 3963define amdgpu_kernel void @local_singlethread_release_acquire_cmpxchg(3964; GFX6-LABEL: local_singlethread_release_acquire_cmpxchg:3965; GFX6: ; %bb.0: ; %entry3966; GFX6-NEXT: s_load_dword s6, s[8:9], 0x03967; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr63968; GFX6-NEXT: s_load_dword s4, s[8:9], 0x13969; GFX6-NEXT: s_load_dword s5, s[8:9], 0x23970; GFX6-NEXT: s_mov_b32 m0, -13971; GFX6-NEXT: s_waitcnt lgkmcnt(0)3972; GFX6-NEXT: v_mov_b32_e32 v0, s63973; GFX6-NEXT: v_mov_b32_e32 v1, s53974; GFX6-NEXT: v_mov_b32_e32 v2, s43975; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163976; GFX6-NEXT: s_endpgm3977;3978; GFX7-LABEL: local_singlethread_release_acquire_cmpxchg:3979; GFX7: ; %bb.0: ; %entry3980; GFX7-NEXT: s_load_dword s6, s[8:9], 0x03981; GFX7-NEXT: s_load_dword s4, s[8:9], 0x13982; GFX7-NEXT: s_load_dword s5, s[8:9], 0x23983; GFX7-NEXT: s_mov_b32 m0, -13984; GFX7-NEXT: s_waitcnt lgkmcnt(0)3985; GFX7-NEXT: v_mov_b32_e32 v0, s63986; GFX7-NEXT: v_mov_b32_e32 v1, s53987; GFX7-NEXT: v_mov_b32_e32 v2, s43988; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:163989; GFX7-NEXT: s_endpgm3990;3991; GFX10-WGP-LABEL: local_singlethread_release_acquire_cmpxchg:3992; GFX10-WGP: ; %bb.0: ; %entry3993; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x03994; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x43995; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x83996; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)3997; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s63998; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s53999; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s44000; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164001; GFX10-WGP-NEXT: s_endpgm4002;4003; GFX10-CU-LABEL: local_singlethread_release_acquire_cmpxchg:4004; GFX10-CU: ; %bb.0: ; %entry4005; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x04006; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x44007; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x84008; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)4009; GFX10-CU-NEXT: v_mov_b32_e32 v0, s64010; GFX10-CU-NEXT: v_mov_b32_e32 v1, s54011; GFX10-CU-NEXT: v_mov_b32_e32 v2, s44012; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164013; GFX10-CU-NEXT: s_endpgm4014;4015; SKIP-CACHE-INV-LABEL: local_singlethread_release_acquire_cmpxchg:4016; SKIP-CACHE-INV: ; %bb.0: ; %entry4017; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x04018; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x14019; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x24020; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -14021; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)4022; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s24023; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s14024; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s04025; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164026; SKIP-CACHE-INV-NEXT: s_endpgm4027;4028; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_acquire_cmpxchg:4029; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry4030; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x04031; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x44032; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x84033; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4034; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s64035; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s54036; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s44037; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164038; GFX90A-NOTTGSPLIT-NEXT: s_endpgm4039;4040; GFX90A-TGSPLIT-LABEL: local_singlethread_release_acquire_cmpxchg:4041; GFX90A-TGSPLIT: ; %bb.0: ; %entry4042; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x04043; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x44044; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x84045; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4046; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s64047; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s54048; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s44049; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164050; GFX90A-TGSPLIT-NEXT: s_endpgm4051;4052; GFX942-NOTTGSPLIT-LABEL: local_singlethread_release_acquire_cmpxchg:4053; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry4054; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x04055; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x44056; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x84057; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4058; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s24059; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s14060; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s04061; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164062; GFX942-NOTTGSPLIT-NEXT: s_endpgm4063;4064; GFX942-TGSPLIT-LABEL: local_singlethread_release_acquire_cmpxchg:4065; GFX942-TGSPLIT: ; %bb.0: ; %entry4066; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x04067; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x44068; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x84069; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4070; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s24071; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s14072; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s04073; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164074; GFX942-TGSPLIT-NEXT: s_endpgm4075;4076; GFX11-WGP-LABEL: local_singlethread_release_acquire_cmpxchg:4077; GFX11-WGP: ; %bb.0: ; %entry4078; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x04079; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x44080; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x84081; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)4082; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s24083; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s14084; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s04085; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164086; GFX11-WGP-NEXT: s_endpgm4087;4088; GFX11-CU-LABEL: local_singlethread_release_acquire_cmpxchg:4089; GFX11-CU: ; %bb.0: ; %entry4090; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x04091; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x44092; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x84093; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)4094; GFX11-CU-NEXT: v_mov_b32_e32 v0, s24095; GFX11-CU-NEXT: v_mov_b32_e32 v1, s14096; GFX11-CU-NEXT: v_mov_b32_e32 v2, s04097; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164098; GFX11-CU-NEXT: s_endpgm4099;4100; GFX12-WGP-LABEL: local_singlethread_release_acquire_cmpxchg:4101; GFX12-WGP: ; %bb.0: ; %entry4102; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x04103; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x44104; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x84105; GFX12-WGP-NEXT: s_wait_kmcnt 0x04106; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s24107; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s14108; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s04109; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164110; GFX12-WGP-NEXT: s_endpgm4111;4112; GFX12-CU-LABEL: local_singlethread_release_acquire_cmpxchg:4113; GFX12-CU: ; %bb.0: ; %entry4114; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x04115; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x44116; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x84117; GFX12-CU-NEXT: s_wait_kmcnt 0x04118; GFX12-CU-NEXT: v_mov_b32_e32 v0, s24119; GFX12-CU-NEXT: v_mov_b32_e32 v1, s14120; GFX12-CU-NEXT: v_mov_b32_e32 v2, s04121; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164122; GFX12-CU-NEXT: s_endpgm4123;4124; GFX1250-LABEL: local_singlethread_release_acquire_cmpxchg:4125; GFX1250: ; %bb.0: ; %entry4126; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 14127; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x04128; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x44129; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x84130; GFX1250-NEXT: s_wait_kmcnt 0x04131; GFX1250-NEXT: v_mov_b32_e32 v0, s24132; GFX1250-NEXT: v_mov_b32_e32 v1, s14133; GFX1250-NEXT: v_mov_b32_e32 v2, s04134; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164135; GFX1250-NEXT: s_endpgm4136 ptr addrspace(3) %out, i32 %in, i32 %old) {4137entry:4138 %gep = getelementptr i32, ptr addrspace(3) %out, i32 44139 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") release acquire4140 ret void4141}4142 4143define amdgpu_kernel void @local_singlethread_acq_rel_acquire_cmpxchg(4144; GFX6-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:4145; GFX6: ; %bb.0: ; %entry4146; GFX6-NEXT: s_load_dword s6, s[8:9], 0x04147; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr64148; GFX6-NEXT: s_load_dword s4, s[8:9], 0x14149; GFX6-NEXT: s_load_dword s5, s[8:9], 0x24150; GFX6-NEXT: s_mov_b32 m0, -14151; GFX6-NEXT: s_waitcnt lgkmcnt(0)4152; GFX6-NEXT: v_mov_b32_e32 v0, s64153; GFX6-NEXT: v_mov_b32_e32 v1, s54154; GFX6-NEXT: v_mov_b32_e32 v2, s44155; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164156; GFX6-NEXT: s_endpgm4157;4158; GFX7-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:4159; GFX7: ; %bb.0: ; %entry4160; GFX7-NEXT: s_load_dword s6, s[8:9], 0x04161; GFX7-NEXT: s_load_dword s4, s[8:9], 0x14162; GFX7-NEXT: s_load_dword s5, s[8:9], 0x24163; GFX7-NEXT: s_mov_b32 m0, -14164; GFX7-NEXT: s_waitcnt lgkmcnt(0)4165; GFX7-NEXT: v_mov_b32_e32 v0, s64166; GFX7-NEXT: v_mov_b32_e32 v1, s54167; GFX7-NEXT: v_mov_b32_e32 v2, s44168; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164169; GFX7-NEXT: s_endpgm4170;4171; GFX10-WGP-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:4172; GFX10-WGP: ; %bb.0: ; %entry4173; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x04174; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x44175; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x84176; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)4177; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s64178; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s54179; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s44180; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164181; GFX10-WGP-NEXT: s_endpgm4182;4183; GFX10-CU-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:4184; GFX10-CU: ; %bb.0: ; %entry4185; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x04186; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x44187; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x84188; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)4189; GFX10-CU-NEXT: v_mov_b32_e32 v0, s64190; GFX10-CU-NEXT: v_mov_b32_e32 v1, s54191; GFX10-CU-NEXT: v_mov_b32_e32 v2, s44192; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164193; GFX10-CU-NEXT: s_endpgm4194;4195; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:4196; SKIP-CACHE-INV: ; %bb.0: ; %entry4197; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x04198; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x14199; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x24200; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -14201; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)4202; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s24203; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s14204; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s04205; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164206; SKIP-CACHE-INV-NEXT: s_endpgm4207;4208; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:4209; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry4210; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x04211; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x44212; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x84213; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4214; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s64215; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s54216; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s44217; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164218; GFX90A-NOTTGSPLIT-NEXT: s_endpgm4219;4220; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:4221; GFX90A-TGSPLIT: ; %bb.0: ; %entry4222; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x04223; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x44224; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x84225; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4226; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s64227; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s54228; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s44229; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164230; GFX90A-TGSPLIT-NEXT: s_endpgm4231;4232; GFX942-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:4233; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry4234; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x04235; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x44236; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x84237; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4238; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s24239; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s14240; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s04241; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164242; GFX942-NOTTGSPLIT-NEXT: s_endpgm4243;4244; GFX942-TGSPLIT-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:4245; GFX942-TGSPLIT: ; %bb.0: ; %entry4246; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x04247; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x44248; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x84249; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4250; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s24251; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s14252; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s04253; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164254; GFX942-TGSPLIT-NEXT: s_endpgm4255;4256; GFX11-WGP-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:4257; GFX11-WGP: ; %bb.0: ; %entry4258; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x04259; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x44260; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x84261; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)4262; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s24263; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s14264; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s04265; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164266; GFX11-WGP-NEXT: s_endpgm4267;4268; GFX11-CU-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:4269; GFX11-CU: ; %bb.0: ; %entry4270; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x04271; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x44272; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x84273; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)4274; GFX11-CU-NEXT: v_mov_b32_e32 v0, s24275; GFX11-CU-NEXT: v_mov_b32_e32 v1, s14276; GFX11-CU-NEXT: v_mov_b32_e32 v2, s04277; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164278; GFX11-CU-NEXT: s_endpgm4279;4280; GFX12-WGP-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:4281; GFX12-WGP: ; %bb.0: ; %entry4282; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x04283; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x44284; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x84285; GFX12-WGP-NEXT: s_wait_kmcnt 0x04286; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s24287; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s14288; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s04289; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164290; GFX12-WGP-NEXT: s_endpgm4291;4292; GFX12-CU-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:4293; GFX12-CU: ; %bb.0: ; %entry4294; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x04295; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x44296; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x84297; GFX12-CU-NEXT: s_wait_kmcnt 0x04298; GFX12-CU-NEXT: v_mov_b32_e32 v0, s24299; GFX12-CU-NEXT: v_mov_b32_e32 v1, s14300; GFX12-CU-NEXT: v_mov_b32_e32 v2, s04301; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164302; GFX12-CU-NEXT: s_endpgm4303;4304; GFX1250-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:4305; GFX1250: ; %bb.0: ; %entry4306; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 14307; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x04308; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x44309; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x84310; GFX1250-NEXT: s_wait_kmcnt 0x04311; GFX1250-NEXT: v_mov_b32_e32 v0, s24312; GFX1250-NEXT: v_mov_b32_e32 v1, s14313; GFX1250-NEXT: v_mov_b32_e32 v2, s04314; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164315; GFX1250-NEXT: s_endpgm4316 ptr addrspace(3) %out, i32 %in, i32 %old) {4317entry:4318 %gep = getelementptr i32, ptr addrspace(3) %out, i32 44319 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") acq_rel acquire4320 ret void4321}4322 4323define amdgpu_kernel void @local_singlethread_seq_cst_acquire_cmpxchg(4324; GFX6-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:4325; GFX6: ; %bb.0: ; %entry4326; GFX6-NEXT: s_load_dword s6, s[8:9], 0x04327; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr64328; GFX6-NEXT: s_load_dword s4, s[8:9], 0x14329; GFX6-NEXT: s_load_dword s5, s[8:9], 0x24330; GFX6-NEXT: s_mov_b32 m0, -14331; GFX6-NEXT: s_waitcnt lgkmcnt(0)4332; GFX6-NEXT: v_mov_b32_e32 v0, s64333; GFX6-NEXT: v_mov_b32_e32 v1, s54334; GFX6-NEXT: v_mov_b32_e32 v2, s44335; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164336; GFX6-NEXT: s_endpgm4337;4338; GFX7-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:4339; GFX7: ; %bb.0: ; %entry4340; GFX7-NEXT: s_load_dword s6, s[8:9], 0x04341; GFX7-NEXT: s_load_dword s4, s[8:9], 0x14342; GFX7-NEXT: s_load_dword s5, s[8:9], 0x24343; GFX7-NEXT: s_mov_b32 m0, -14344; GFX7-NEXT: s_waitcnt lgkmcnt(0)4345; GFX7-NEXT: v_mov_b32_e32 v0, s64346; GFX7-NEXT: v_mov_b32_e32 v1, s54347; GFX7-NEXT: v_mov_b32_e32 v2, s44348; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164349; GFX7-NEXT: s_endpgm4350;4351; GFX10-WGP-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:4352; GFX10-WGP: ; %bb.0: ; %entry4353; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x04354; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x44355; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x84356; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)4357; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s64358; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s54359; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s44360; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164361; GFX10-WGP-NEXT: s_endpgm4362;4363; GFX10-CU-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:4364; GFX10-CU: ; %bb.0: ; %entry4365; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x04366; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x44367; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x84368; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)4369; GFX10-CU-NEXT: v_mov_b32_e32 v0, s64370; GFX10-CU-NEXT: v_mov_b32_e32 v1, s54371; GFX10-CU-NEXT: v_mov_b32_e32 v2, s44372; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164373; GFX10-CU-NEXT: s_endpgm4374;4375; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:4376; SKIP-CACHE-INV: ; %bb.0: ; %entry4377; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x04378; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x14379; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x24380; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -14381; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)4382; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s24383; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s14384; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s04385; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164386; SKIP-CACHE-INV-NEXT: s_endpgm4387;4388; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:4389; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry4390; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x04391; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x44392; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x84393; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4394; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s64395; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s54396; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s44397; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164398; GFX90A-NOTTGSPLIT-NEXT: s_endpgm4399;4400; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:4401; GFX90A-TGSPLIT: ; %bb.0: ; %entry4402; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x04403; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x44404; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x84405; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4406; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s64407; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s54408; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s44409; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164410; GFX90A-TGSPLIT-NEXT: s_endpgm4411;4412; GFX942-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:4413; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry4414; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x04415; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x44416; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x84417; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4418; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s24419; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s14420; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s04421; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164422; GFX942-NOTTGSPLIT-NEXT: s_endpgm4423;4424; GFX942-TGSPLIT-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:4425; GFX942-TGSPLIT: ; %bb.0: ; %entry4426; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x04427; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x44428; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x84429; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4430; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s24431; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s14432; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s04433; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164434; GFX942-TGSPLIT-NEXT: s_endpgm4435;4436; GFX11-WGP-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:4437; GFX11-WGP: ; %bb.0: ; %entry4438; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x04439; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x44440; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x84441; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)4442; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s24443; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s14444; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s04445; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164446; GFX11-WGP-NEXT: s_endpgm4447;4448; GFX11-CU-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:4449; GFX11-CU: ; %bb.0: ; %entry4450; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x04451; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x44452; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x84453; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)4454; GFX11-CU-NEXT: v_mov_b32_e32 v0, s24455; GFX11-CU-NEXT: v_mov_b32_e32 v1, s14456; GFX11-CU-NEXT: v_mov_b32_e32 v2, s04457; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164458; GFX11-CU-NEXT: s_endpgm4459;4460; GFX12-WGP-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:4461; GFX12-WGP: ; %bb.0: ; %entry4462; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x04463; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x44464; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x84465; GFX12-WGP-NEXT: s_wait_kmcnt 0x04466; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s24467; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s14468; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s04469; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164470; GFX12-WGP-NEXT: s_endpgm4471;4472; GFX12-CU-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:4473; GFX12-CU: ; %bb.0: ; %entry4474; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x04475; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x44476; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x84477; GFX12-CU-NEXT: s_wait_kmcnt 0x04478; GFX12-CU-NEXT: v_mov_b32_e32 v0, s24479; GFX12-CU-NEXT: v_mov_b32_e32 v1, s14480; GFX12-CU-NEXT: v_mov_b32_e32 v2, s04481; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164482; GFX12-CU-NEXT: s_endpgm4483;4484; GFX1250-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:4485; GFX1250: ; %bb.0: ; %entry4486; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 14487; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x04488; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x44489; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x84490; GFX1250-NEXT: s_wait_kmcnt 0x04491; GFX1250-NEXT: v_mov_b32_e32 v0, s24492; GFX1250-NEXT: v_mov_b32_e32 v1, s14493; GFX1250-NEXT: v_mov_b32_e32 v2, s04494; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164495; GFX1250-NEXT: s_endpgm4496 ptr addrspace(3) %out, i32 %in, i32 %old) {4497entry:4498 %gep = getelementptr i32, ptr addrspace(3) %out, i32 44499 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") seq_cst acquire4500 ret void4501}4502 4503define amdgpu_kernel void @local_singlethread_monotonic_seq_cst_cmpxchg(4504; GFX6-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:4505; GFX6: ; %bb.0: ; %entry4506; GFX6-NEXT: s_load_dword s6, s[8:9], 0x04507; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr64508; GFX6-NEXT: s_load_dword s4, s[8:9], 0x14509; GFX6-NEXT: s_load_dword s5, s[8:9], 0x24510; GFX6-NEXT: s_mov_b32 m0, -14511; GFX6-NEXT: s_waitcnt lgkmcnt(0)4512; GFX6-NEXT: v_mov_b32_e32 v0, s64513; GFX6-NEXT: v_mov_b32_e32 v1, s54514; GFX6-NEXT: v_mov_b32_e32 v2, s44515; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164516; GFX6-NEXT: s_endpgm4517;4518; GFX7-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:4519; GFX7: ; %bb.0: ; %entry4520; GFX7-NEXT: s_load_dword s6, s[8:9], 0x04521; GFX7-NEXT: s_load_dword s4, s[8:9], 0x14522; GFX7-NEXT: s_load_dword s5, s[8:9], 0x24523; GFX7-NEXT: s_mov_b32 m0, -14524; GFX7-NEXT: s_waitcnt lgkmcnt(0)4525; GFX7-NEXT: v_mov_b32_e32 v0, s64526; GFX7-NEXT: v_mov_b32_e32 v1, s54527; GFX7-NEXT: v_mov_b32_e32 v2, s44528; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164529; GFX7-NEXT: s_endpgm4530;4531; GFX10-WGP-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:4532; GFX10-WGP: ; %bb.0: ; %entry4533; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x04534; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x44535; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x84536; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)4537; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s64538; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s54539; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s44540; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164541; GFX10-WGP-NEXT: s_endpgm4542;4543; GFX10-CU-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:4544; GFX10-CU: ; %bb.0: ; %entry4545; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x04546; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x44547; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x84548; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)4549; GFX10-CU-NEXT: v_mov_b32_e32 v0, s64550; GFX10-CU-NEXT: v_mov_b32_e32 v1, s54551; GFX10-CU-NEXT: v_mov_b32_e32 v2, s44552; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164553; GFX10-CU-NEXT: s_endpgm4554;4555; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:4556; SKIP-CACHE-INV: ; %bb.0: ; %entry4557; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x04558; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x14559; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x24560; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -14561; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)4562; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s24563; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s14564; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s04565; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164566; SKIP-CACHE-INV-NEXT: s_endpgm4567;4568; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:4569; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry4570; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x04571; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x44572; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x84573; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4574; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s64575; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s54576; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s44577; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164578; GFX90A-NOTTGSPLIT-NEXT: s_endpgm4579;4580; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:4581; GFX90A-TGSPLIT: ; %bb.0: ; %entry4582; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x04583; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x44584; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x84585; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4586; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s64587; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s54588; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s44589; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164590; GFX90A-TGSPLIT-NEXT: s_endpgm4591;4592; GFX942-NOTTGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:4593; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry4594; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x04595; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x44596; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x84597; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4598; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s24599; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s14600; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s04601; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164602; GFX942-NOTTGSPLIT-NEXT: s_endpgm4603;4604; GFX942-TGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:4605; GFX942-TGSPLIT: ; %bb.0: ; %entry4606; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x04607; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x44608; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x84609; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4610; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s24611; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s14612; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s04613; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164614; GFX942-TGSPLIT-NEXT: s_endpgm4615;4616; GFX11-WGP-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:4617; GFX11-WGP: ; %bb.0: ; %entry4618; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x04619; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x44620; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x84621; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)4622; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s24623; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s14624; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s04625; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164626; GFX11-WGP-NEXT: s_endpgm4627;4628; GFX11-CU-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:4629; GFX11-CU: ; %bb.0: ; %entry4630; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x04631; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x44632; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x84633; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)4634; GFX11-CU-NEXT: v_mov_b32_e32 v0, s24635; GFX11-CU-NEXT: v_mov_b32_e32 v1, s14636; GFX11-CU-NEXT: v_mov_b32_e32 v2, s04637; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164638; GFX11-CU-NEXT: s_endpgm4639;4640; GFX12-WGP-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:4641; GFX12-WGP: ; %bb.0: ; %entry4642; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x04643; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x44644; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x84645; GFX12-WGP-NEXT: s_wait_kmcnt 0x04646; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s24647; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s14648; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s04649; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164650; GFX12-WGP-NEXT: s_endpgm4651;4652; GFX12-CU-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:4653; GFX12-CU: ; %bb.0: ; %entry4654; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x04655; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x44656; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x84657; GFX12-CU-NEXT: s_wait_kmcnt 0x04658; GFX12-CU-NEXT: v_mov_b32_e32 v0, s24659; GFX12-CU-NEXT: v_mov_b32_e32 v1, s14660; GFX12-CU-NEXT: v_mov_b32_e32 v2, s04661; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164662; GFX12-CU-NEXT: s_endpgm4663;4664; GFX1250-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:4665; GFX1250: ; %bb.0: ; %entry4666; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 14667; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x04668; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x44669; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x84670; GFX1250-NEXT: s_wait_kmcnt 0x04671; GFX1250-NEXT: v_mov_b32_e32 v0, s24672; GFX1250-NEXT: v_mov_b32_e32 v1, s14673; GFX1250-NEXT: v_mov_b32_e32 v2, s04674; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164675; GFX1250-NEXT: s_endpgm4676 ptr addrspace(3) %out, i32 %in, i32 %old) {4677entry:4678 %gep = getelementptr i32, ptr addrspace(3) %out, i32 44679 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") monotonic seq_cst4680 ret void4681}4682 4683define amdgpu_kernel void @local_singlethread_acquire_seq_cst_cmpxchg(4684; GFX6-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:4685; GFX6: ; %bb.0: ; %entry4686; GFX6-NEXT: s_load_dword s6, s[8:9], 0x04687; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr64688; GFX6-NEXT: s_load_dword s4, s[8:9], 0x14689; GFX6-NEXT: s_load_dword s5, s[8:9], 0x24690; GFX6-NEXT: s_mov_b32 m0, -14691; GFX6-NEXT: s_waitcnt lgkmcnt(0)4692; GFX6-NEXT: v_mov_b32_e32 v0, s64693; GFX6-NEXT: v_mov_b32_e32 v1, s54694; GFX6-NEXT: v_mov_b32_e32 v2, s44695; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164696; GFX6-NEXT: s_endpgm4697;4698; GFX7-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:4699; GFX7: ; %bb.0: ; %entry4700; GFX7-NEXT: s_load_dword s6, s[8:9], 0x04701; GFX7-NEXT: s_load_dword s4, s[8:9], 0x14702; GFX7-NEXT: s_load_dword s5, s[8:9], 0x24703; GFX7-NEXT: s_mov_b32 m0, -14704; GFX7-NEXT: s_waitcnt lgkmcnt(0)4705; GFX7-NEXT: v_mov_b32_e32 v0, s64706; GFX7-NEXT: v_mov_b32_e32 v1, s54707; GFX7-NEXT: v_mov_b32_e32 v2, s44708; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164709; GFX7-NEXT: s_endpgm4710;4711; GFX10-WGP-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:4712; GFX10-WGP: ; %bb.0: ; %entry4713; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x04714; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x44715; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x84716; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)4717; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s64718; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s54719; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s44720; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164721; GFX10-WGP-NEXT: s_endpgm4722;4723; GFX10-CU-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:4724; GFX10-CU: ; %bb.0: ; %entry4725; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x04726; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x44727; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x84728; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)4729; GFX10-CU-NEXT: v_mov_b32_e32 v0, s64730; GFX10-CU-NEXT: v_mov_b32_e32 v1, s54731; GFX10-CU-NEXT: v_mov_b32_e32 v2, s44732; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164733; GFX10-CU-NEXT: s_endpgm4734;4735; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:4736; SKIP-CACHE-INV: ; %bb.0: ; %entry4737; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x04738; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x14739; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x24740; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -14741; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)4742; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s24743; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s14744; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s04745; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164746; SKIP-CACHE-INV-NEXT: s_endpgm4747;4748; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:4749; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry4750; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x04751; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x44752; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x84753; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4754; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s64755; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s54756; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s44757; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164758; GFX90A-NOTTGSPLIT-NEXT: s_endpgm4759;4760; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:4761; GFX90A-TGSPLIT: ; %bb.0: ; %entry4762; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x04763; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x44764; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x84765; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4766; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s64767; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s54768; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s44769; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164770; GFX90A-TGSPLIT-NEXT: s_endpgm4771;4772; GFX942-NOTTGSPLIT-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:4773; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry4774; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x04775; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x44776; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x84777; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4778; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s24779; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s14780; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s04781; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164782; GFX942-NOTTGSPLIT-NEXT: s_endpgm4783;4784; GFX942-TGSPLIT-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:4785; GFX942-TGSPLIT: ; %bb.0: ; %entry4786; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x04787; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x44788; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x84789; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4790; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s24791; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s14792; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s04793; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164794; GFX942-TGSPLIT-NEXT: s_endpgm4795;4796; GFX11-WGP-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:4797; GFX11-WGP: ; %bb.0: ; %entry4798; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x04799; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x44800; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x84801; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)4802; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s24803; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s14804; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s04805; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164806; GFX11-WGP-NEXT: s_endpgm4807;4808; GFX11-CU-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:4809; GFX11-CU: ; %bb.0: ; %entry4810; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x04811; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x44812; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x84813; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)4814; GFX11-CU-NEXT: v_mov_b32_e32 v0, s24815; GFX11-CU-NEXT: v_mov_b32_e32 v1, s14816; GFX11-CU-NEXT: v_mov_b32_e32 v2, s04817; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164818; GFX11-CU-NEXT: s_endpgm4819;4820; GFX12-WGP-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:4821; GFX12-WGP: ; %bb.0: ; %entry4822; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x04823; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x44824; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x84825; GFX12-WGP-NEXT: s_wait_kmcnt 0x04826; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s24827; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s14828; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s04829; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164830; GFX12-WGP-NEXT: s_endpgm4831;4832; GFX12-CU-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:4833; GFX12-CU: ; %bb.0: ; %entry4834; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x04835; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x44836; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x84837; GFX12-CU-NEXT: s_wait_kmcnt 0x04838; GFX12-CU-NEXT: v_mov_b32_e32 v0, s24839; GFX12-CU-NEXT: v_mov_b32_e32 v1, s14840; GFX12-CU-NEXT: v_mov_b32_e32 v2, s04841; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164842; GFX12-CU-NEXT: s_endpgm4843;4844; GFX1250-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:4845; GFX1250: ; %bb.0: ; %entry4846; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 14847; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x04848; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x44849; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x84850; GFX1250-NEXT: s_wait_kmcnt 0x04851; GFX1250-NEXT: v_mov_b32_e32 v0, s24852; GFX1250-NEXT: v_mov_b32_e32 v1, s14853; GFX1250-NEXT: v_mov_b32_e32 v2, s04854; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164855; GFX1250-NEXT: s_endpgm4856 ptr addrspace(3) %out, i32 %in, i32 %old) {4857entry:4858 %gep = getelementptr i32, ptr addrspace(3) %out, i32 44859 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") acquire seq_cst4860 ret void4861}4862 4863define amdgpu_kernel void @local_singlethread_release_seq_cst_cmpxchg(4864; GFX6-LABEL: local_singlethread_release_seq_cst_cmpxchg:4865; GFX6: ; %bb.0: ; %entry4866; GFX6-NEXT: s_load_dword s6, s[8:9], 0x04867; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr64868; GFX6-NEXT: s_load_dword s4, s[8:9], 0x14869; GFX6-NEXT: s_load_dword s5, s[8:9], 0x24870; GFX6-NEXT: s_mov_b32 m0, -14871; GFX6-NEXT: s_waitcnt lgkmcnt(0)4872; GFX6-NEXT: v_mov_b32_e32 v0, s64873; GFX6-NEXT: v_mov_b32_e32 v1, s54874; GFX6-NEXT: v_mov_b32_e32 v2, s44875; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164876; GFX6-NEXT: s_endpgm4877;4878; GFX7-LABEL: local_singlethread_release_seq_cst_cmpxchg:4879; GFX7: ; %bb.0: ; %entry4880; GFX7-NEXT: s_load_dword s6, s[8:9], 0x04881; GFX7-NEXT: s_load_dword s4, s[8:9], 0x14882; GFX7-NEXT: s_load_dword s5, s[8:9], 0x24883; GFX7-NEXT: s_mov_b32 m0, -14884; GFX7-NEXT: s_waitcnt lgkmcnt(0)4885; GFX7-NEXT: v_mov_b32_e32 v0, s64886; GFX7-NEXT: v_mov_b32_e32 v1, s54887; GFX7-NEXT: v_mov_b32_e32 v2, s44888; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164889; GFX7-NEXT: s_endpgm4890;4891; GFX10-WGP-LABEL: local_singlethread_release_seq_cst_cmpxchg:4892; GFX10-WGP: ; %bb.0: ; %entry4893; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x04894; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x44895; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x84896; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)4897; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s64898; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s54899; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s44900; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164901; GFX10-WGP-NEXT: s_endpgm4902;4903; GFX10-CU-LABEL: local_singlethread_release_seq_cst_cmpxchg:4904; GFX10-CU: ; %bb.0: ; %entry4905; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x04906; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x44907; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x84908; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)4909; GFX10-CU-NEXT: v_mov_b32_e32 v0, s64910; GFX10-CU-NEXT: v_mov_b32_e32 v1, s54911; GFX10-CU-NEXT: v_mov_b32_e32 v2, s44912; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164913; GFX10-CU-NEXT: s_endpgm4914;4915; SKIP-CACHE-INV-LABEL: local_singlethread_release_seq_cst_cmpxchg:4916; SKIP-CACHE-INV: ; %bb.0: ; %entry4917; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x04918; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x14919; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x24920; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -14921; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)4922; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s24923; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s14924; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s04925; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164926; SKIP-CACHE-INV-NEXT: s_endpgm4927;4928; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_seq_cst_cmpxchg:4929; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry4930; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x04931; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x44932; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x84933; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4934; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s64935; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s54936; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s44937; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164938; GFX90A-NOTTGSPLIT-NEXT: s_endpgm4939;4940; GFX90A-TGSPLIT-LABEL: local_singlethread_release_seq_cst_cmpxchg:4941; GFX90A-TGSPLIT: ; %bb.0: ; %entry4942; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x04943; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x44944; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x84945; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4946; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s64947; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s54948; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s44949; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164950; GFX90A-TGSPLIT-NEXT: s_endpgm4951;4952; GFX942-NOTTGSPLIT-LABEL: local_singlethread_release_seq_cst_cmpxchg:4953; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry4954; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x04955; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x44956; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x84957; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4958; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s24959; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s14960; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s04961; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164962; GFX942-NOTTGSPLIT-NEXT: s_endpgm4963;4964; GFX942-TGSPLIT-LABEL: local_singlethread_release_seq_cst_cmpxchg:4965; GFX942-TGSPLIT: ; %bb.0: ; %entry4966; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x04967; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x44968; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x84969; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)4970; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s24971; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s14972; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s04973; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:164974; GFX942-TGSPLIT-NEXT: s_endpgm4975;4976; GFX11-WGP-LABEL: local_singlethread_release_seq_cst_cmpxchg:4977; GFX11-WGP: ; %bb.0: ; %entry4978; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x04979; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x44980; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x84981; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)4982; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s24983; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s14984; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s04985; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164986; GFX11-WGP-NEXT: s_endpgm4987;4988; GFX11-CU-LABEL: local_singlethread_release_seq_cst_cmpxchg:4989; GFX11-CU: ; %bb.0: ; %entry4990; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x04991; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x44992; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x84993; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)4994; GFX11-CU-NEXT: v_mov_b32_e32 v0, s24995; GFX11-CU-NEXT: v_mov_b32_e32 v1, s14996; GFX11-CU-NEXT: v_mov_b32_e32 v2, s04997; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:164998; GFX11-CU-NEXT: s_endpgm4999;5000; GFX12-WGP-LABEL: local_singlethread_release_seq_cst_cmpxchg:5001; GFX12-WGP: ; %bb.0: ; %entry5002; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x05003; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x45004; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x85005; GFX12-WGP-NEXT: s_wait_kmcnt 0x05006; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s25007; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s15008; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s05009; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:165010; GFX12-WGP-NEXT: s_endpgm5011;5012; GFX12-CU-LABEL: local_singlethread_release_seq_cst_cmpxchg:5013; GFX12-CU: ; %bb.0: ; %entry5014; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x05015; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x45016; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x85017; GFX12-CU-NEXT: s_wait_kmcnt 0x05018; GFX12-CU-NEXT: v_mov_b32_e32 v0, s25019; GFX12-CU-NEXT: v_mov_b32_e32 v1, s15020; GFX12-CU-NEXT: v_mov_b32_e32 v2, s05021; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:165022; GFX12-CU-NEXT: s_endpgm5023;5024; GFX1250-LABEL: local_singlethread_release_seq_cst_cmpxchg:5025; GFX1250: ; %bb.0: ; %entry5026; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 15027; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x05028; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x45029; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x85030; GFX1250-NEXT: s_wait_kmcnt 0x05031; GFX1250-NEXT: v_mov_b32_e32 v0, s25032; GFX1250-NEXT: v_mov_b32_e32 v1, s15033; GFX1250-NEXT: v_mov_b32_e32 v2, s05034; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:165035; GFX1250-NEXT: s_endpgm5036 ptr addrspace(3) %out, i32 %in, i32 %old) {5037entry:5038 %gep = getelementptr i32, ptr addrspace(3) %out, i32 45039 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") release seq_cst5040 ret void5041}5042 5043define amdgpu_kernel void @local_singlethread_acq_rel_seq_cst_cmpxchg(5044; GFX6-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:5045; GFX6: ; %bb.0: ; %entry5046; GFX6-NEXT: s_load_dword s6, s[8:9], 0x05047; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr65048; GFX6-NEXT: s_load_dword s4, s[8:9], 0x15049; GFX6-NEXT: s_load_dword s5, s[8:9], 0x25050; GFX6-NEXT: s_mov_b32 m0, -15051; GFX6-NEXT: s_waitcnt lgkmcnt(0)5052; GFX6-NEXT: v_mov_b32_e32 v0, s65053; GFX6-NEXT: v_mov_b32_e32 v1, s55054; GFX6-NEXT: v_mov_b32_e32 v2, s45055; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:165056; GFX6-NEXT: s_endpgm5057;5058; GFX7-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:5059; GFX7: ; %bb.0: ; %entry5060; GFX7-NEXT: s_load_dword s6, s[8:9], 0x05061; GFX7-NEXT: s_load_dword s4, s[8:9], 0x15062; GFX7-NEXT: s_load_dword s5, s[8:9], 0x25063; GFX7-NEXT: s_mov_b32 m0, -15064; GFX7-NEXT: s_waitcnt lgkmcnt(0)5065; GFX7-NEXT: v_mov_b32_e32 v0, s65066; GFX7-NEXT: v_mov_b32_e32 v1, s55067; GFX7-NEXT: v_mov_b32_e32 v2, s45068; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:165069; GFX7-NEXT: s_endpgm5070;5071; GFX10-WGP-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:5072; GFX10-WGP: ; %bb.0: ; %entry5073; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x05074; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x45075; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x85076; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)5077; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s65078; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s55079; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s45080; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:165081; GFX10-WGP-NEXT: s_endpgm5082;5083; GFX10-CU-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:5084; GFX10-CU: ; %bb.0: ; %entry5085; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x05086; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x45087; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x85088; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)5089; GFX10-CU-NEXT: v_mov_b32_e32 v0, s65090; GFX10-CU-NEXT: v_mov_b32_e32 v1, s55091; GFX10-CU-NEXT: v_mov_b32_e32 v2, s45092; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:165093; GFX10-CU-NEXT: s_endpgm5094;5095; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:5096; SKIP-CACHE-INV: ; %bb.0: ; %entry5097; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x05098; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x15099; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x25100; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -15101; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)5102; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s25103; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s15104; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s05105; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:165106; SKIP-CACHE-INV-NEXT: s_endpgm5107;5108; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:5109; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry5110; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x05111; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x45112; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x85113; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5114; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s65115; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s55116; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s45117; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:165118; GFX90A-NOTTGSPLIT-NEXT: s_endpgm5119;5120; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:5121; GFX90A-TGSPLIT: ; %bb.0: ; %entry5122; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x05123; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x45124; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x85125; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5126; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s65127; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s55128; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s45129; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:165130; GFX90A-TGSPLIT-NEXT: s_endpgm5131;5132; GFX942-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:5133; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry5134; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x05135; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x45136; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x85137; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5138; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s25139; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s15140; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s05141; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:165142; GFX942-NOTTGSPLIT-NEXT: s_endpgm5143;5144; GFX942-TGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:5145; GFX942-TGSPLIT: ; %bb.0: ; %entry5146; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x05147; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x45148; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x85149; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5150; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s25151; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s15152; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s05153; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:165154; GFX942-TGSPLIT-NEXT: s_endpgm5155;5156; GFX11-WGP-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:5157; GFX11-WGP: ; %bb.0: ; %entry5158; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x05159; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x45160; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x85161; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)5162; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s25163; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s15164; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s05165; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:165166; GFX11-WGP-NEXT: s_endpgm5167;5168; GFX11-CU-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:5169; GFX11-CU: ; %bb.0: ; %entry5170; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x05171; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x45172; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x85173; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)5174; GFX11-CU-NEXT: v_mov_b32_e32 v0, s25175; GFX11-CU-NEXT: v_mov_b32_e32 v1, s15176; GFX11-CU-NEXT: v_mov_b32_e32 v2, s05177; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:165178; GFX11-CU-NEXT: s_endpgm5179;5180; GFX12-WGP-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:5181; GFX12-WGP: ; %bb.0: ; %entry5182; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x05183; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x45184; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x85185; GFX12-WGP-NEXT: s_wait_kmcnt 0x05186; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s25187; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s15188; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s05189; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:165190; GFX12-WGP-NEXT: s_endpgm5191;5192; GFX12-CU-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:5193; GFX12-CU: ; %bb.0: ; %entry5194; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x05195; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x45196; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x85197; GFX12-CU-NEXT: s_wait_kmcnt 0x05198; GFX12-CU-NEXT: v_mov_b32_e32 v0, s25199; GFX12-CU-NEXT: v_mov_b32_e32 v1, s15200; GFX12-CU-NEXT: v_mov_b32_e32 v2, s05201; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:165202; GFX12-CU-NEXT: s_endpgm5203;5204; GFX1250-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:5205; GFX1250: ; %bb.0: ; %entry5206; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 15207; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x05208; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x45209; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x85210; GFX1250-NEXT: s_wait_kmcnt 0x05211; GFX1250-NEXT: v_mov_b32_e32 v0, s25212; GFX1250-NEXT: v_mov_b32_e32 v1, s15213; GFX1250-NEXT: v_mov_b32_e32 v2, s05214; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:165215; GFX1250-NEXT: s_endpgm5216 ptr addrspace(3) %out, i32 %in, i32 %old) {5217entry:5218 %gep = getelementptr i32, ptr addrspace(3) %out, i32 45219 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") acq_rel seq_cst5220 ret void5221}5222 5223define amdgpu_kernel void @local_singlethread_seq_cst_seq_cst_cmpxchg(5224; GFX6-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:5225; GFX6: ; %bb.0: ; %entry5226; GFX6-NEXT: s_load_dword s6, s[8:9], 0x05227; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr65228; GFX6-NEXT: s_load_dword s4, s[8:9], 0x15229; GFX6-NEXT: s_load_dword s5, s[8:9], 0x25230; GFX6-NEXT: s_mov_b32 m0, -15231; GFX6-NEXT: s_waitcnt lgkmcnt(0)5232; GFX6-NEXT: v_mov_b32_e32 v0, s65233; GFX6-NEXT: v_mov_b32_e32 v1, s55234; GFX6-NEXT: v_mov_b32_e32 v2, s45235; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:165236; GFX6-NEXT: s_endpgm5237;5238; GFX7-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:5239; GFX7: ; %bb.0: ; %entry5240; GFX7-NEXT: s_load_dword s6, s[8:9], 0x05241; GFX7-NEXT: s_load_dword s4, s[8:9], 0x15242; GFX7-NEXT: s_load_dword s5, s[8:9], 0x25243; GFX7-NEXT: s_mov_b32 m0, -15244; GFX7-NEXT: s_waitcnt lgkmcnt(0)5245; GFX7-NEXT: v_mov_b32_e32 v0, s65246; GFX7-NEXT: v_mov_b32_e32 v1, s55247; GFX7-NEXT: v_mov_b32_e32 v2, s45248; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:165249; GFX7-NEXT: s_endpgm5250;5251; GFX10-WGP-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:5252; GFX10-WGP: ; %bb.0: ; %entry5253; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x05254; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x45255; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x85256; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)5257; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s65258; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s55259; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s45260; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:165261; GFX10-WGP-NEXT: s_endpgm5262;5263; GFX10-CU-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:5264; GFX10-CU: ; %bb.0: ; %entry5265; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x05266; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x45267; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x85268; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)5269; GFX10-CU-NEXT: v_mov_b32_e32 v0, s65270; GFX10-CU-NEXT: v_mov_b32_e32 v1, s55271; GFX10-CU-NEXT: v_mov_b32_e32 v2, s45272; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:165273; GFX10-CU-NEXT: s_endpgm5274;5275; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:5276; SKIP-CACHE-INV: ; %bb.0: ; %entry5277; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x05278; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x15279; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x25280; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -15281; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)5282; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s25283; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s15284; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s05285; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:165286; SKIP-CACHE-INV-NEXT: s_endpgm5287;5288; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:5289; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry5290; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x05291; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x45292; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x85293; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5294; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s65295; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s55296; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s45297; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:165298; GFX90A-NOTTGSPLIT-NEXT: s_endpgm5299;5300; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:5301; GFX90A-TGSPLIT: ; %bb.0: ; %entry5302; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x05303; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x45304; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x85305; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5306; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s65307; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s55308; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s45309; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:165310; GFX90A-TGSPLIT-NEXT: s_endpgm5311;5312; GFX942-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:5313; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry5314; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x05315; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x45316; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x85317; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5318; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s25319; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s15320; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s05321; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:165322; GFX942-NOTTGSPLIT-NEXT: s_endpgm5323;5324; GFX942-TGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:5325; GFX942-TGSPLIT: ; %bb.0: ; %entry5326; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x05327; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x45328; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x85329; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5330; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s25331; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s15332; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s05333; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:165334; GFX942-TGSPLIT-NEXT: s_endpgm5335;5336; GFX11-WGP-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:5337; GFX11-WGP: ; %bb.0: ; %entry5338; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x05339; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x45340; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x85341; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)5342; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s25343; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s15344; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s05345; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:165346; GFX11-WGP-NEXT: s_endpgm5347;5348; GFX11-CU-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:5349; GFX11-CU: ; %bb.0: ; %entry5350; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x05351; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x45352; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x85353; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)5354; GFX11-CU-NEXT: v_mov_b32_e32 v0, s25355; GFX11-CU-NEXT: v_mov_b32_e32 v1, s15356; GFX11-CU-NEXT: v_mov_b32_e32 v2, s05357; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:165358; GFX11-CU-NEXT: s_endpgm5359;5360; GFX12-WGP-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:5361; GFX12-WGP: ; %bb.0: ; %entry5362; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x05363; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x45364; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x85365; GFX12-WGP-NEXT: s_wait_kmcnt 0x05366; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s25367; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s15368; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s05369; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:165370; GFX12-WGP-NEXT: s_endpgm5371;5372; GFX12-CU-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:5373; GFX12-CU: ; %bb.0: ; %entry5374; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x05375; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x45376; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x85377; GFX12-CU-NEXT: s_wait_kmcnt 0x05378; GFX12-CU-NEXT: v_mov_b32_e32 v0, s25379; GFX12-CU-NEXT: v_mov_b32_e32 v1, s15380; GFX12-CU-NEXT: v_mov_b32_e32 v2, s05381; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:165382; GFX12-CU-NEXT: s_endpgm5383;5384; GFX1250-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:5385; GFX1250: ; %bb.0: ; %entry5386; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 15387; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x05388; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x45389; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x85390; GFX1250-NEXT: s_wait_kmcnt 0x05391; GFX1250-NEXT: v_mov_b32_e32 v0, s25392; GFX1250-NEXT: v_mov_b32_e32 v1, s15393; GFX1250-NEXT: v_mov_b32_e32 v2, s05394; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:165395; GFX1250-NEXT: s_endpgm5396 ptr addrspace(3) %out, i32 %in, i32 %old) {5397entry:5398 %gep = getelementptr i32, ptr addrspace(3) %out, i32 45399 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") seq_cst seq_cst5400 ret void5401}5402 5403define amdgpu_kernel void @local_singlethread_monotonic_monotonic_ret_cmpxchg(5404; GFX6-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:5405; GFX6: ; %bb.0: ; %entry5406; GFX6-NEXT: s_load_dword s4, s[8:9], 0x05407; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr45408; GFX6-NEXT: s_load_dword s5, s[8:9], 0x15409; GFX6-NEXT: s_load_dword s6, s[8:9], 0x25410; GFX6-NEXT: s_mov_b32 m0, -15411; GFX6-NEXT: s_waitcnt lgkmcnt(0)5412; GFX6-NEXT: v_mov_b32_e32 v0, s45413; GFX6-NEXT: v_mov_b32_e32 v1, s65414; GFX6-NEXT: v_mov_b32_e32 v2, s55415; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165416; GFX6-NEXT: s_mov_b32 m0, -15417; GFX6-NEXT: v_mov_b32_e32 v0, s45418; GFX6-NEXT: s_waitcnt lgkmcnt(0)5419; GFX6-NEXT: ds_write_b32 v0, v15420; GFX6-NEXT: s_endpgm5421;5422; GFX7-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:5423; GFX7: ; %bb.0: ; %entry5424; GFX7-NEXT: s_load_dword s4, s[8:9], 0x05425; GFX7-NEXT: s_load_dword s5, s[8:9], 0x15426; GFX7-NEXT: s_load_dword s6, s[8:9], 0x25427; GFX7-NEXT: s_mov_b32 m0, -15428; GFX7-NEXT: s_waitcnt lgkmcnt(0)5429; GFX7-NEXT: v_mov_b32_e32 v0, s45430; GFX7-NEXT: v_mov_b32_e32 v1, s65431; GFX7-NEXT: v_mov_b32_e32 v2, s55432; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165433; GFX7-NEXT: s_mov_b32 m0, -15434; GFX7-NEXT: v_mov_b32_e32 v0, s45435; GFX7-NEXT: s_waitcnt lgkmcnt(0)5436; GFX7-NEXT: ds_write_b32 v0, v15437; GFX7-NEXT: s_endpgm5438;5439; GFX10-WGP-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:5440; GFX10-WGP: ; %bb.0: ; %entry5441; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x05442; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x45443; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x85444; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)5445; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s45446; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s65447; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s55448; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165449; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s45450; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)5451; GFX10-WGP-NEXT: ds_write_b32 v0, v15452; GFX10-WGP-NEXT: s_endpgm5453;5454; GFX10-CU-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:5455; GFX10-CU: ; %bb.0: ; %entry5456; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x05457; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x45458; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x85459; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)5460; GFX10-CU-NEXT: v_mov_b32_e32 v0, s45461; GFX10-CU-NEXT: v_mov_b32_e32 v1, s65462; GFX10-CU-NEXT: v_mov_b32_e32 v2, s55463; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165464; GFX10-CU-NEXT: v_mov_b32_e32 v0, s45465; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)5466; GFX10-CU-NEXT: ds_write_b32 v0, v15467; GFX10-CU-NEXT: s_endpgm5468;5469; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:5470; SKIP-CACHE-INV: ; %bb.0: ; %entry5471; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x05472; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x15473; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x25474; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -15475; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)5476; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s05477; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s25478; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s15479; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165480; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -15481; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s05482; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)5483; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v15484; SKIP-CACHE-INV-NEXT: s_endpgm5485;5486; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:5487; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry5488; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x05489; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x45490; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x85491; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5492; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s45493; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s65494; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s55495; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165496; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s45497; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5498; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v15499; GFX90A-NOTTGSPLIT-NEXT: s_endpgm5500;5501; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:5502; GFX90A-TGSPLIT: ; %bb.0: ; %entry5503; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x05504; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x45505; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x85506; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5507; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s45508; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s65509; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s55510; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165511; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s45512; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5513; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v15514; GFX90A-TGSPLIT-NEXT: s_endpgm5515;5516; GFX942-NOTTGSPLIT-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:5517; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry5518; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x05519; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x45520; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x85521; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5522; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s05523; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s25524; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s15525; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165526; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s05527; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5528; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v15529; GFX942-NOTTGSPLIT-NEXT: s_endpgm5530;5531; GFX942-TGSPLIT-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:5532; GFX942-TGSPLIT: ; %bb.0: ; %entry5533; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x05534; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x45535; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x85536; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5537; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s05538; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s25539; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s15540; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165541; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s05542; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5543; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v15544; GFX942-TGSPLIT-NEXT: s_endpgm5545;5546; GFX11-WGP-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:5547; GFX11-WGP: ; %bb.0: ; %entry5548; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x05549; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x45550; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x85551; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)5552; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s05553; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s25554; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s15555; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:165556; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s05557; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)5558; GFX11-WGP-NEXT: ds_store_b32 v0, v15559; GFX11-WGP-NEXT: s_endpgm5560;5561; GFX11-CU-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:5562; GFX11-CU: ; %bb.0: ; %entry5563; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x05564; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x45565; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x85566; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)5567; GFX11-CU-NEXT: v_mov_b32_e32 v0, s05568; GFX11-CU-NEXT: v_mov_b32_e32 v1, s25569; GFX11-CU-NEXT: v_mov_b32_e32 v2, s15570; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:165571; GFX11-CU-NEXT: v_mov_b32_e32 v0, s05572; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)5573; GFX11-CU-NEXT: ds_store_b32 v0, v15574; GFX11-CU-NEXT: s_endpgm5575;5576; GFX12-WGP-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:5577; GFX12-WGP: ; %bb.0: ; %entry5578; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x05579; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x45580; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x85581; GFX12-WGP-NEXT: s_wait_kmcnt 0x05582; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s05583; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s25584; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s15585; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:165586; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s05587; GFX12-WGP-NEXT: s_wait_dscnt 0x05588; GFX12-WGP-NEXT: ds_store_b32 v0, v15589; GFX12-WGP-NEXT: s_endpgm5590;5591; GFX12-CU-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:5592; GFX12-CU: ; %bb.0: ; %entry5593; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x05594; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x45595; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x85596; GFX12-CU-NEXT: s_wait_kmcnt 0x05597; GFX12-CU-NEXT: v_mov_b32_e32 v0, s05598; GFX12-CU-NEXT: v_mov_b32_e32 v1, s25599; GFX12-CU-NEXT: v_mov_b32_e32 v2, s15600; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:165601; GFX12-CU-NEXT: v_mov_b32_e32 v0, s05602; GFX12-CU-NEXT: s_wait_dscnt 0x05603; GFX12-CU-NEXT: ds_store_b32 v0, v15604; GFX12-CU-NEXT: s_endpgm5605;5606; GFX1250-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:5607; GFX1250: ; %bb.0: ; %entry5608; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 15609; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x05610; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x45611; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x85612; GFX1250-NEXT: s_wait_kmcnt 0x05613; GFX1250-NEXT: v_mov_b32_e32 v0, s05614; GFX1250-NEXT: v_mov_b32_e32 v1, s25615; GFX1250-NEXT: v_mov_b32_e32 v2, s15616; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:165617; GFX1250-NEXT: v_mov_b32_e32 v0, s05618; GFX1250-NEXT: s_wait_dscnt 0x05619; GFX1250-NEXT: ds_store_b32 v0, v15620; GFX1250-NEXT: s_endpgm5621 ptr addrspace(3) %out, i32 %in, i32 %old) {5622entry:5623 %gep = getelementptr i32, ptr addrspace(3) %out, i32 45624 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") monotonic monotonic5625 %val0 = extractvalue { i32, i1 } %val, 05626 store i32 %val0, ptr addrspace(3) %out, align 45627 ret void5628}5629 5630define amdgpu_kernel void @local_singlethread_acquire_monotonic_ret_cmpxchg(5631; GFX6-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:5632; GFX6: ; %bb.0: ; %entry5633; GFX6-NEXT: s_load_dword s4, s[8:9], 0x05634; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr45635; GFX6-NEXT: s_load_dword s5, s[8:9], 0x15636; GFX6-NEXT: s_load_dword s6, s[8:9], 0x25637; GFX6-NEXT: s_mov_b32 m0, -15638; GFX6-NEXT: s_waitcnt lgkmcnt(0)5639; GFX6-NEXT: v_mov_b32_e32 v0, s45640; GFX6-NEXT: v_mov_b32_e32 v1, s65641; GFX6-NEXT: v_mov_b32_e32 v2, s55642; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165643; GFX6-NEXT: s_mov_b32 m0, -15644; GFX6-NEXT: v_mov_b32_e32 v0, s45645; GFX6-NEXT: s_waitcnt lgkmcnt(0)5646; GFX6-NEXT: ds_write_b32 v0, v15647; GFX6-NEXT: s_endpgm5648;5649; GFX7-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:5650; GFX7: ; %bb.0: ; %entry5651; GFX7-NEXT: s_load_dword s4, s[8:9], 0x05652; GFX7-NEXT: s_load_dword s5, s[8:9], 0x15653; GFX7-NEXT: s_load_dword s6, s[8:9], 0x25654; GFX7-NEXT: s_mov_b32 m0, -15655; GFX7-NEXT: s_waitcnt lgkmcnt(0)5656; GFX7-NEXT: v_mov_b32_e32 v0, s45657; GFX7-NEXT: v_mov_b32_e32 v1, s65658; GFX7-NEXT: v_mov_b32_e32 v2, s55659; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165660; GFX7-NEXT: s_mov_b32 m0, -15661; GFX7-NEXT: v_mov_b32_e32 v0, s45662; GFX7-NEXT: s_waitcnt lgkmcnt(0)5663; GFX7-NEXT: ds_write_b32 v0, v15664; GFX7-NEXT: s_endpgm5665;5666; GFX10-WGP-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:5667; GFX10-WGP: ; %bb.0: ; %entry5668; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x05669; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x45670; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x85671; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)5672; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s45673; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s65674; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s55675; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165676; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s45677; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)5678; GFX10-WGP-NEXT: ds_write_b32 v0, v15679; GFX10-WGP-NEXT: s_endpgm5680;5681; GFX10-CU-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:5682; GFX10-CU: ; %bb.0: ; %entry5683; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x05684; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x45685; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x85686; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)5687; GFX10-CU-NEXT: v_mov_b32_e32 v0, s45688; GFX10-CU-NEXT: v_mov_b32_e32 v1, s65689; GFX10-CU-NEXT: v_mov_b32_e32 v2, s55690; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165691; GFX10-CU-NEXT: v_mov_b32_e32 v0, s45692; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)5693; GFX10-CU-NEXT: ds_write_b32 v0, v15694; GFX10-CU-NEXT: s_endpgm5695;5696; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:5697; SKIP-CACHE-INV: ; %bb.0: ; %entry5698; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x05699; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x15700; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x25701; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -15702; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)5703; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s05704; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s25705; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s15706; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165707; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -15708; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s05709; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)5710; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v15711; SKIP-CACHE-INV-NEXT: s_endpgm5712;5713; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:5714; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry5715; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x05716; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x45717; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x85718; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5719; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s45720; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s65721; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s55722; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165723; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s45724; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5725; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v15726; GFX90A-NOTTGSPLIT-NEXT: s_endpgm5727;5728; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:5729; GFX90A-TGSPLIT: ; %bb.0: ; %entry5730; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x05731; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x45732; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x85733; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5734; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s45735; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s65736; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s55737; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165738; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s45739; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5740; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v15741; GFX90A-TGSPLIT-NEXT: s_endpgm5742;5743; GFX942-NOTTGSPLIT-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:5744; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry5745; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x05746; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x45747; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x85748; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5749; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s05750; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s25751; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s15752; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165753; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s05754; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5755; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v15756; GFX942-NOTTGSPLIT-NEXT: s_endpgm5757;5758; GFX942-TGSPLIT-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:5759; GFX942-TGSPLIT: ; %bb.0: ; %entry5760; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x05761; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x45762; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x85763; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5764; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s05765; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s25766; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s15767; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165768; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s05769; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5770; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v15771; GFX942-TGSPLIT-NEXT: s_endpgm5772;5773; GFX11-WGP-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:5774; GFX11-WGP: ; %bb.0: ; %entry5775; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x05776; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x45777; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x85778; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)5779; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s05780; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s25781; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s15782; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:165783; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s05784; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)5785; GFX11-WGP-NEXT: ds_store_b32 v0, v15786; GFX11-WGP-NEXT: s_endpgm5787;5788; GFX11-CU-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:5789; GFX11-CU: ; %bb.0: ; %entry5790; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x05791; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x45792; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x85793; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)5794; GFX11-CU-NEXT: v_mov_b32_e32 v0, s05795; GFX11-CU-NEXT: v_mov_b32_e32 v1, s25796; GFX11-CU-NEXT: v_mov_b32_e32 v2, s15797; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:165798; GFX11-CU-NEXT: v_mov_b32_e32 v0, s05799; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)5800; GFX11-CU-NEXT: ds_store_b32 v0, v15801; GFX11-CU-NEXT: s_endpgm5802;5803; GFX12-WGP-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:5804; GFX12-WGP: ; %bb.0: ; %entry5805; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x05806; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x45807; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x85808; GFX12-WGP-NEXT: s_wait_kmcnt 0x05809; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s05810; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s25811; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s15812; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:165813; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s05814; GFX12-WGP-NEXT: s_wait_dscnt 0x05815; GFX12-WGP-NEXT: ds_store_b32 v0, v15816; GFX12-WGP-NEXT: s_endpgm5817;5818; GFX12-CU-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:5819; GFX12-CU: ; %bb.0: ; %entry5820; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x05821; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x45822; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x85823; GFX12-CU-NEXT: s_wait_kmcnt 0x05824; GFX12-CU-NEXT: v_mov_b32_e32 v0, s05825; GFX12-CU-NEXT: v_mov_b32_e32 v1, s25826; GFX12-CU-NEXT: v_mov_b32_e32 v2, s15827; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:165828; GFX12-CU-NEXT: v_mov_b32_e32 v0, s05829; GFX12-CU-NEXT: s_wait_dscnt 0x05830; GFX12-CU-NEXT: ds_store_b32 v0, v15831; GFX12-CU-NEXT: s_endpgm5832;5833; GFX1250-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:5834; GFX1250: ; %bb.0: ; %entry5835; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 15836; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x05837; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x45838; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x85839; GFX1250-NEXT: s_wait_kmcnt 0x05840; GFX1250-NEXT: v_mov_b32_e32 v0, s05841; GFX1250-NEXT: v_mov_b32_e32 v1, s25842; GFX1250-NEXT: v_mov_b32_e32 v2, s15843; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:165844; GFX1250-NEXT: v_mov_b32_e32 v0, s05845; GFX1250-NEXT: s_wait_dscnt 0x05846; GFX1250-NEXT: ds_store_b32 v0, v15847; GFX1250-NEXT: s_endpgm5848 ptr addrspace(3) %out, i32 %in, i32 %old) {5849entry:5850 %gep = getelementptr i32, ptr addrspace(3) %out, i32 45851 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") acquire monotonic5852 %val0 = extractvalue { i32, i1 } %val, 05853 store i32 %val0, ptr addrspace(3) %out, align 45854 ret void5855}5856 5857define amdgpu_kernel void @local_singlethread_release_monotonic_ret_cmpxchg(5858; GFX6-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:5859; GFX6: ; %bb.0: ; %entry5860; GFX6-NEXT: s_load_dword s4, s[8:9], 0x05861; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr45862; GFX6-NEXT: s_load_dword s5, s[8:9], 0x15863; GFX6-NEXT: s_load_dword s6, s[8:9], 0x25864; GFX6-NEXT: s_mov_b32 m0, -15865; GFX6-NEXT: s_waitcnt lgkmcnt(0)5866; GFX6-NEXT: v_mov_b32_e32 v0, s45867; GFX6-NEXT: v_mov_b32_e32 v1, s65868; GFX6-NEXT: v_mov_b32_e32 v2, s55869; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165870; GFX6-NEXT: s_mov_b32 m0, -15871; GFX6-NEXT: v_mov_b32_e32 v0, s45872; GFX6-NEXT: s_waitcnt lgkmcnt(0)5873; GFX6-NEXT: ds_write_b32 v0, v15874; GFX6-NEXT: s_endpgm5875;5876; GFX7-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:5877; GFX7: ; %bb.0: ; %entry5878; GFX7-NEXT: s_load_dword s4, s[8:9], 0x05879; GFX7-NEXT: s_load_dword s5, s[8:9], 0x15880; GFX7-NEXT: s_load_dword s6, s[8:9], 0x25881; GFX7-NEXT: s_mov_b32 m0, -15882; GFX7-NEXT: s_waitcnt lgkmcnt(0)5883; GFX7-NEXT: v_mov_b32_e32 v0, s45884; GFX7-NEXT: v_mov_b32_e32 v1, s65885; GFX7-NEXT: v_mov_b32_e32 v2, s55886; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165887; GFX7-NEXT: s_mov_b32 m0, -15888; GFX7-NEXT: v_mov_b32_e32 v0, s45889; GFX7-NEXT: s_waitcnt lgkmcnt(0)5890; GFX7-NEXT: ds_write_b32 v0, v15891; GFX7-NEXT: s_endpgm5892;5893; GFX10-WGP-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:5894; GFX10-WGP: ; %bb.0: ; %entry5895; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x05896; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x45897; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x85898; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)5899; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s45900; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s65901; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s55902; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165903; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s45904; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)5905; GFX10-WGP-NEXT: ds_write_b32 v0, v15906; GFX10-WGP-NEXT: s_endpgm5907;5908; GFX10-CU-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:5909; GFX10-CU: ; %bb.0: ; %entry5910; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x05911; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x45912; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x85913; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)5914; GFX10-CU-NEXT: v_mov_b32_e32 v0, s45915; GFX10-CU-NEXT: v_mov_b32_e32 v1, s65916; GFX10-CU-NEXT: v_mov_b32_e32 v2, s55917; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165918; GFX10-CU-NEXT: v_mov_b32_e32 v0, s45919; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)5920; GFX10-CU-NEXT: ds_write_b32 v0, v15921; GFX10-CU-NEXT: s_endpgm5922;5923; SKIP-CACHE-INV-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:5924; SKIP-CACHE-INV: ; %bb.0: ; %entry5925; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x05926; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x15927; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x25928; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -15929; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)5930; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s05931; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s25932; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s15933; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165934; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -15935; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s05936; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)5937; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v15938; SKIP-CACHE-INV-NEXT: s_endpgm5939;5940; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:5941; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry5942; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x05943; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x45944; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x85945; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5946; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s45947; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s65948; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s55949; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165950; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s45951; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5952; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v15953; GFX90A-NOTTGSPLIT-NEXT: s_endpgm5954;5955; GFX90A-TGSPLIT-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:5956; GFX90A-TGSPLIT: ; %bb.0: ; %entry5957; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x05958; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x45959; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x85960; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5961; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s45962; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s65963; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s55964; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165965; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s45966; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5967; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v15968; GFX90A-TGSPLIT-NEXT: s_endpgm5969;5970; GFX942-NOTTGSPLIT-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:5971; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry5972; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x05973; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x45974; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x85975; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5976; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s05977; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s25978; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s15979; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165980; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s05981; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5982; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v15983; GFX942-NOTTGSPLIT-NEXT: s_endpgm5984;5985; GFX942-TGSPLIT-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:5986; GFX942-TGSPLIT: ; %bb.0: ; %entry5987; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x05988; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x45989; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x85990; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5991; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s05992; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s25993; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s15994; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:165995; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s05996; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)5997; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v15998; GFX942-TGSPLIT-NEXT: s_endpgm5999;6000; GFX11-WGP-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:6001; GFX11-WGP: ; %bb.0: ; %entry6002; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x06003; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x46004; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x86005; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)6006; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s06007; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s26008; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s16009; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166010; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s06011; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)6012; GFX11-WGP-NEXT: ds_store_b32 v0, v16013; GFX11-WGP-NEXT: s_endpgm6014;6015; GFX11-CU-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:6016; GFX11-CU: ; %bb.0: ; %entry6017; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x06018; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x46019; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x86020; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)6021; GFX11-CU-NEXT: v_mov_b32_e32 v0, s06022; GFX11-CU-NEXT: v_mov_b32_e32 v1, s26023; GFX11-CU-NEXT: v_mov_b32_e32 v2, s16024; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166025; GFX11-CU-NEXT: v_mov_b32_e32 v0, s06026; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)6027; GFX11-CU-NEXT: ds_store_b32 v0, v16028; GFX11-CU-NEXT: s_endpgm6029;6030; GFX12-WGP-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:6031; GFX12-WGP: ; %bb.0: ; %entry6032; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x06033; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x46034; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x86035; GFX12-WGP-NEXT: s_wait_kmcnt 0x06036; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s06037; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s26038; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s16039; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166040; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s06041; GFX12-WGP-NEXT: s_wait_dscnt 0x06042; GFX12-WGP-NEXT: ds_store_b32 v0, v16043; GFX12-WGP-NEXT: s_endpgm6044;6045; GFX12-CU-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:6046; GFX12-CU: ; %bb.0: ; %entry6047; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x06048; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x46049; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x86050; GFX12-CU-NEXT: s_wait_kmcnt 0x06051; GFX12-CU-NEXT: v_mov_b32_e32 v0, s06052; GFX12-CU-NEXT: v_mov_b32_e32 v1, s26053; GFX12-CU-NEXT: v_mov_b32_e32 v2, s16054; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166055; GFX12-CU-NEXT: v_mov_b32_e32 v0, s06056; GFX12-CU-NEXT: s_wait_dscnt 0x06057; GFX12-CU-NEXT: ds_store_b32 v0, v16058; GFX12-CU-NEXT: s_endpgm6059;6060; GFX1250-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:6061; GFX1250: ; %bb.0: ; %entry6062; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 16063; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x06064; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x46065; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x86066; GFX1250-NEXT: s_wait_kmcnt 0x06067; GFX1250-NEXT: v_mov_b32_e32 v0, s06068; GFX1250-NEXT: v_mov_b32_e32 v1, s26069; GFX1250-NEXT: v_mov_b32_e32 v2, s16070; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166071; GFX1250-NEXT: v_mov_b32_e32 v0, s06072; GFX1250-NEXT: s_wait_dscnt 0x06073; GFX1250-NEXT: ds_store_b32 v0, v16074; GFX1250-NEXT: s_endpgm6075 ptr addrspace(3) %out, i32 %in, i32 %old) {6076entry:6077 %gep = getelementptr i32, ptr addrspace(3) %out, i32 46078 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") release monotonic6079 %val0 = extractvalue { i32, i1 } %val, 06080 store i32 %val0, ptr addrspace(3) %out, align 46081 ret void6082}6083 6084define amdgpu_kernel void @local_singlethread_acq_rel_monotonic_ret_cmpxchg(6085; GFX6-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:6086; GFX6: ; %bb.0: ; %entry6087; GFX6-NEXT: s_load_dword s4, s[8:9], 0x06088; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr46089; GFX6-NEXT: s_load_dword s5, s[8:9], 0x16090; GFX6-NEXT: s_load_dword s6, s[8:9], 0x26091; GFX6-NEXT: s_mov_b32 m0, -16092; GFX6-NEXT: s_waitcnt lgkmcnt(0)6093; GFX6-NEXT: v_mov_b32_e32 v0, s46094; GFX6-NEXT: v_mov_b32_e32 v1, s66095; GFX6-NEXT: v_mov_b32_e32 v2, s56096; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166097; GFX6-NEXT: s_mov_b32 m0, -16098; GFX6-NEXT: v_mov_b32_e32 v0, s46099; GFX6-NEXT: s_waitcnt lgkmcnt(0)6100; GFX6-NEXT: ds_write_b32 v0, v16101; GFX6-NEXT: s_endpgm6102;6103; GFX7-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:6104; GFX7: ; %bb.0: ; %entry6105; GFX7-NEXT: s_load_dword s4, s[8:9], 0x06106; GFX7-NEXT: s_load_dword s5, s[8:9], 0x16107; GFX7-NEXT: s_load_dword s6, s[8:9], 0x26108; GFX7-NEXT: s_mov_b32 m0, -16109; GFX7-NEXT: s_waitcnt lgkmcnt(0)6110; GFX7-NEXT: v_mov_b32_e32 v0, s46111; GFX7-NEXT: v_mov_b32_e32 v1, s66112; GFX7-NEXT: v_mov_b32_e32 v2, s56113; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166114; GFX7-NEXT: s_mov_b32 m0, -16115; GFX7-NEXT: v_mov_b32_e32 v0, s46116; GFX7-NEXT: s_waitcnt lgkmcnt(0)6117; GFX7-NEXT: ds_write_b32 v0, v16118; GFX7-NEXT: s_endpgm6119;6120; GFX10-WGP-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:6121; GFX10-WGP: ; %bb.0: ; %entry6122; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x06123; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x46124; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x86125; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)6126; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s46127; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s66128; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s56129; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166130; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s46131; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)6132; GFX10-WGP-NEXT: ds_write_b32 v0, v16133; GFX10-WGP-NEXT: s_endpgm6134;6135; GFX10-CU-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:6136; GFX10-CU: ; %bb.0: ; %entry6137; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x06138; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x46139; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x86140; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)6141; GFX10-CU-NEXT: v_mov_b32_e32 v0, s46142; GFX10-CU-NEXT: v_mov_b32_e32 v1, s66143; GFX10-CU-NEXT: v_mov_b32_e32 v2, s56144; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166145; GFX10-CU-NEXT: v_mov_b32_e32 v0, s46146; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)6147; GFX10-CU-NEXT: ds_write_b32 v0, v16148; GFX10-CU-NEXT: s_endpgm6149;6150; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:6151; SKIP-CACHE-INV: ; %bb.0: ; %entry6152; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x06153; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x16154; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x26155; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -16156; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)6157; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s06158; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s26159; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s16160; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166161; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -16162; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s06163; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)6164; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v16165; SKIP-CACHE-INV-NEXT: s_endpgm6166;6167; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:6168; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry6169; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x06170; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x46171; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x86172; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6173; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s46174; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s66175; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s56176; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166177; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s46178; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6179; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v16180; GFX90A-NOTTGSPLIT-NEXT: s_endpgm6181;6182; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:6183; GFX90A-TGSPLIT: ; %bb.0: ; %entry6184; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x06185; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x46186; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x86187; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6188; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s46189; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s66190; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s56191; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166192; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s46193; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6194; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v16195; GFX90A-TGSPLIT-NEXT: s_endpgm6196;6197; GFX942-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:6198; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry6199; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x06200; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x46201; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x86202; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6203; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s06204; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s26205; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s16206; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166207; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s06208; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6209; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v16210; GFX942-NOTTGSPLIT-NEXT: s_endpgm6211;6212; GFX942-TGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:6213; GFX942-TGSPLIT: ; %bb.0: ; %entry6214; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x06215; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x46216; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x86217; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6218; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s06219; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s26220; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s16221; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166222; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s06223; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6224; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v16225; GFX942-TGSPLIT-NEXT: s_endpgm6226;6227; GFX11-WGP-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:6228; GFX11-WGP: ; %bb.0: ; %entry6229; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x06230; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x46231; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x86232; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)6233; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s06234; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s26235; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s16236; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166237; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s06238; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)6239; GFX11-WGP-NEXT: ds_store_b32 v0, v16240; GFX11-WGP-NEXT: s_endpgm6241;6242; GFX11-CU-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:6243; GFX11-CU: ; %bb.0: ; %entry6244; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x06245; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x46246; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x86247; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)6248; GFX11-CU-NEXT: v_mov_b32_e32 v0, s06249; GFX11-CU-NEXT: v_mov_b32_e32 v1, s26250; GFX11-CU-NEXT: v_mov_b32_e32 v2, s16251; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166252; GFX11-CU-NEXT: v_mov_b32_e32 v0, s06253; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)6254; GFX11-CU-NEXT: ds_store_b32 v0, v16255; GFX11-CU-NEXT: s_endpgm6256;6257; GFX12-WGP-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:6258; GFX12-WGP: ; %bb.0: ; %entry6259; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x06260; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x46261; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x86262; GFX12-WGP-NEXT: s_wait_kmcnt 0x06263; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s06264; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s26265; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s16266; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166267; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s06268; GFX12-WGP-NEXT: s_wait_dscnt 0x06269; GFX12-WGP-NEXT: ds_store_b32 v0, v16270; GFX12-WGP-NEXT: s_endpgm6271;6272; GFX12-CU-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:6273; GFX12-CU: ; %bb.0: ; %entry6274; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x06275; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x46276; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x86277; GFX12-CU-NEXT: s_wait_kmcnt 0x06278; GFX12-CU-NEXT: v_mov_b32_e32 v0, s06279; GFX12-CU-NEXT: v_mov_b32_e32 v1, s26280; GFX12-CU-NEXT: v_mov_b32_e32 v2, s16281; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166282; GFX12-CU-NEXT: v_mov_b32_e32 v0, s06283; GFX12-CU-NEXT: s_wait_dscnt 0x06284; GFX12-CU-NEXT: ds_store_b32 v0, v16285; GFX12-CU-NEXT: s_endpgm6286;6287; GFX1250-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:6288; GFX1250: ; %bb.0: ; %entry6289; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 16290; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x06291; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x46292; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x86293; GFX1250-NEXT: s_wait_kmcnt 0x06294; GFX1250-NEXT: v_mov_b32_e32 v0, s06295; GFX1250-NEXT: v_mov_b32_e32 v1, s26296; GFX1250-NEXT: v_mov_b32_e32 v2, s16297; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166298; GFX1250-NEXT: v_mov_b32_e32 v0, s06299; GFX1250-NEXT: s_wait_dscnt 0x06300; GFX1250-NEXT: ds_store_b32 v0, v16301; GFX1250-NEXT: s_endpgm6302 ptr addrspace(3) %out, i32 %in, i32 %old) {6303entry:6304 %gep = getelementptr i32, ptr addrspace(3) %out, i32 46305 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") acq_rel monotonic6306 %val0 = extractvalue { i32, i1 } %val, 06307 store i32 %val0, ptr addrspace(3) %out, align 46308 ret void6309}6310 6311define amdgpu_kernel void @local_singlethread_seq_cst_monotonic_ret_cmpxchg(6312; GFX6-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:6313; GFX6: ; %bb.0: ; %entry6314; GFX6-NEXT: s_load_dword s4, s[8:9], 0x06315; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr46316; GFX6-NEXT: s_load_dword s5, s[8:9], 0x16317; GFX6-NEXT: s_load_dword s6, s[8:9], 0x26318; GFX6-NEXT: s_mov_b32 m0, -16319; GFX6-NEXT: s_waitcnt lgkmcnt(0)6320; GFX6-NEXT: v_mov_b32_e32 v0, s46321; GFX6-NEXT: v_mov_b32_e32 v1, s66322; GFX6-NEXT: v_mov_b32_e32 v2, s56323; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166324; GFX6-NEXT: s_mov_b32 m0, -16325; GFX6-NEXT: v_mov_b32_e32 v0, s46326; GFX6-NEXT: s_waitcnt lgkmcnt(0)6327; GFX6-NEXT: ds_write_b32 v0, v16328; GFX6-NEXT: s_endpgm6329;6330; GFX7-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:6331; GFX7: ; %bb.0: ; %entry6332; GFX7-NEXT: s_load_dword s4, s[8:9], 0x06333; GFX7-NEXT: s_load_dword s5, s[8:9], 0x16334; GFX7-NEXT: s_load_dword s6, s[8:9], 0x26335; GFX7-NEXT: s_mov_b32 m0, -16336; GFX7-NEXT: s_waitcnt lgkmcnt(0)6337; GFX7-NEXT: v_mov_b32_e32 v0, s46338; GFX7-NEXT: v_mov_b32_e32 v1, s66339; GFX7-NEXT: v_mov_b32_e32 v2, s56340; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166341; GFX7-NEXT: s_mov_b32 m0, -16342; GFX7-NEXT: v_mov_b32_e32 v0, s46343; GFX7-NEXT: s_waitcnt lgkmcnt(0)6344; GFX7-NEXT: ds_write_b32 v0, v16345; GFX7-NEXT: s_endpgm6346;6347; GFX10-WGP-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:6348; GFX10-WGP: ; %bb.0: ; %entry6349; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x06350; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x46351; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x86352; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)6353; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s46354; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s66355; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s56356; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166357; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s46358; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)6359; GFX10-WGP-NEXT: ds_write_b32 v0, v16360; GFX10-WGP-NEXT: s_endpgm6361;6362; GFX10-CU-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:6363; GFX10-CU: ; %bb.0: ; %entry6364; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x06365; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x46366; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x86367; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)6368; GFX10-CU-NEXT: v_mov_b32_e32 v0, s46369; GFX10-CU-NEXT: v_mov_b32_e32 v1, s66370; GFX10-CU-NEXT: v_mov_b32_e32 v2, s56371; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166372; GFX10-CU-NEXT: v_mov_b32_e32 v0, s46373; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)6374; GFX10-CU-NEXT: ds_write_b32 v0, v16375; GFX10-CU-NEXT: s_endpgm6376;6377; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:6378; SKIP-CACHE-INV: ; %bb.0: ; %entry6379; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x06380; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x16381; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x26382; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -16383; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)6384; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s06385; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s26386; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s16387; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166388; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -16389; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s06390; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)6391; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v16392; SKIP-CACHE-INV-NEXT: s_endpgm6393;6394; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:6395; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry6396; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x06397; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x46398; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x86399; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6400; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s46401; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s66402; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s56403; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166404; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s46405; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6406; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v16407; GFX90A-NOTTGSPLIT-NEXT: s_endpgm6408;6409; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:6410; GFX90A-TGSPLIT: ; %bb.0: ; %entry6411; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x06412; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x46413; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x86414; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6415; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s46416; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s66417; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s56418; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166419; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s46420; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6421; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v16422; GFX90A-TGSPLIT-NEXT: s_endpgm6423;6424; GFX942-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:6425; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry6426; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x06427; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x46428; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x86429; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6430; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s06431; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s26432; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s16433; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166434; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s06435; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6436; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v16437; GFX942-NOTTGSPLIT-NEXT: s_endpgm6438;6439; GFX942-TGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:6440; GFX942-TGSPLIT: ; %bb.0: ; %entry6441; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x06442; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x46443; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x86444; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6445; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s06446; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s26447; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s16448; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166449; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s06450; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6451; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v16452; GFX942-TGSPLIT-NEXT: s_endpgm6453;6454; GFX11-WGP-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:6455; GFX11-WGP: ; %bb.0: ; %entry6456; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x06457; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x46458; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x86459; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)6460; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s06461; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s26462; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s16463; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166464; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s06465; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)6466; GFX11-WGP-NEXT: ds_store_b32 v0, v16467; GFX11-WGP-NEXT: s_endpgm6468;6469; GFX11-CU-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:6470; GFX11-CU: ; %bb.0: ; %entry6471; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x06472; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x46473; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x86474; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)6475; GFX11-CU-NEXT: v_mov_b32_e32 v0, s06476; GFX11-CU-NEXT: v_mov_b32_e32 v1, s26477; GFX11-CU-NEXT: v_mov_b32_e32 v2, s16478; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166479; GFX11-CU-NEXT: v_mov_b32_e32 v0, s06480; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)6481; GFX11-CU-NEXT: ds_store_b32 v0, v16482; GFX11-CU-NEXT: s_endpgm6483;6484; GFX12-WGP-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:6485; GFX12-WGP: ; %bb.0: ; %entry6486; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x06487; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x46488; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x86489; GFX12-WGP-NEXT: s_wait_kmcnt 0x06490; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s06491; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s26492; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s16493; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166494; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s06495; GFX12-WGP-NEXT: s_wait_dscnt 0x06496; GFX12-WGP-NEXT: ds_store_b32 v0, v16497; GFX12-WGP-NEXT: s_endpgm6498;6499; GFX12-CU-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:6500; GFX12-CU: ; %bb.0: ; %entry6501; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x06502; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x46503; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x86504; GFX12-CU-NEXT: s_wait_kmcnt 0x06505; GFX12-CU-NEXT: v_mov_b32_e32 v0, s06506; GFX12-CU-NEXT: v_mov_b32_e32 v1, s26507; GFX12-CU-NEXT: v_mov_b32_e32 v2, s16508; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166509; GFX12-CU-NEXT: v_mov_b32_e32 v0, s06510; GFX12-CU-NEXT: s_wait_dscnt 0x06511; GFX12-CU-NEXT: ds_store_b32 v0, v16512; GFX12-CU-NEXT: s_endpgm6513;6514; GFX1250-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:6515; GFX1250: ; %bb.0: ; %entry6516; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 16517; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x06518; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x46519; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x86520; GFX1250-NEXT: s_wait_kmcnt 0x06521; GFX1250-NEXT: v_mov_b32_e32 v0, s06522; GFX1250-NEXT: v_mov_b32_e32 v1, s26523; GFX1250-NEXT: v_mov_b32_e32 v2, s16524; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166525; GFX1250-NEXT: v_mov_b32_e32 v0, s06526; GFX1250-NEXT: s_wait_dscnt 0x06527; GFX1250-NEXT: ds_store_b32 v0, v16528; GFX1250-NEXT: s_endpgm6529 ptr addrspace(3) %out, i32 %in, i32 %old) {6530entry:6531 %gep = getelementptr i32, ptr addrspace(3) %out, i32 46532 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") seq_cst monotonic6533 %val0 = extractvalue { i32, i1 } %val, 06534 store i32 %val0, ptr addrspace(3) %out, align 46535 ret void6536}6537 6538define amdgpu_kernel void @local_singlethread_monotonic_acquire_ret_cmpxchg(6539; GFX6-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:6540; GFX6: ; %bb.0: ; %entry6541; GFX6-NEXT: s_load_dword s4, s[8:9], 0x06542; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr46543; GFX6-NEXT: s_load_dword s5, s[8:9], 0x16544; GFX6-NEXT: s_load_dword s6, s[8:9], 0x26545; GFX6-NEXT: s_mov_b32 m0, -16546; GFX6-NEXT: s_waitcnt lgkmcnt(0)6547; GFX6-NEXT: v_mov_b32_e32 v0, s46548; GFX6-NEXT: v_mov_b32_e32 v1, s66549; GFX6-NEXT: v_mov_b32_e32 v2, s56550; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166551; GFX6-NEXT: s_mov_b32 m0, -16552; GFX6-NEXT: v_mov_b32_e32 v0, s46553; GFX6-NEXT: s_waitcnt lgkmcnt(0)6554; GFX6-NEXT: ds_write_b32 v0, v16555; GFX6-NEXT: s_endpgm6556;6557; GFX7-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:6558; GFX7: ; %bb.0: ; %entry6559; GFX7-NEXT: s_load_dword s4, s[8:9], 0x06560; GFX7-NEXT: s_load_dword s5, s[8:9], 0x16561; GFX7-NEXT: s_load_dword s6, s[8:9], 0x26562; GFX7-NEXT: s_mov_b32 m0, -16563; GFX7-NEXT: s_waitcnt lgkmcnt(0)6564; GFX7-NEXT: v_mov_b32_e32 v0, s46565; GFX7-NEXT: v_mov_b32_e32 v1, s66566; GFX7-NEXT: v_mov_b32_e32 v2, s56567; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166568; GFX7-NEXT: s_mov_b32 m0, -16569; GFX7-NEXT: v_mov_b32_e32 v0, s46570; GFX7-NEXT: s_waitcnt lgkmcnt(0)6571; GFX7-NEXT: ds_write_b32 v0, v16572; GFX7-NEXT: s_endpgm6573;6574; GFX10-WGP-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:6575; GFX10-WGP: ; %bb.0: ; %entry6576; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x06577; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x46578; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x86579; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)6580; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s46581; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s66582; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s56583; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166584; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s46585; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)6586; GFX10-WGP-NEXT: ds_write_b32 v0, v16587; GFX10-WGP-NEXT: s_endpgm6588;6589; GFX10-CU-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:6590; GFX10-CU: ; %bb.0: ; %entry6591; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x06592; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x46593; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x86594; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)6595; GFX10-CU-NEXT: v_mov_b32_e32 v0, s46596; GFX10-CU-NEXT: v_mov_b32_e32 v1, s66597; GFX10-CU-NEXT: v_mov_b32_e32 v2, s56598; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166599; GFX10-CU-NEXT: v_mov_b32_e32 v0, s46600; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)6601; GFX10-CU-NEXT: ds_write_b32 v0, v16602; GFX10-CU-NEXT: s_endpgm6603;6604; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:6605; SKIP-CACHE-INV: ; %bb.0: ; %entry6606; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x06607; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x16608; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x26609; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -16610; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)6611; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s06612; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s26613; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s16614; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166615; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -16616; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s06617; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)6618; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v16619; SKIP-CACHE-INV-NEXT: s_endpgm6620;6621; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:6622; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry6623; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x06624; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x46625; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x86626; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6627; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s46628; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s66629; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s56630; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166631; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s46632; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6633; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v16634; GFX90A-NOTTGSPLIT-NEXT: s_endpgm6635;6636; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:6637; GFX90A-TGSPLIT: ; %bb.0: ; %entry6638; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x06639; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x46640; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x86641; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6642; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s46643; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s66644; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s56645; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166646; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s46647; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6648; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v16649; GFX90A-TGSPLIT-NEXT: s_endpgm6650;6651; GFX942-NOTTGSPLIT-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:6652; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry6653; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x06654; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x46655; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x86656; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6657; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s06658; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s26659; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s16660; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166661; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s06662; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6663; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v16664; GFX942-NOTTGSPLIT-NEXT: s_endpgm6665;6666; GFX942-TGSPLIT-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:6667; GFX942-TGSPLIT: ; %bb.0: ; %entry6668; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x06669; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x46670; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x86671; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6672; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s06673; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s26674; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s16675; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166676; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s06677; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6678; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v16679; GFX942-TGSPLIT-NEXT: s_endpgm6680;6681; GFX11-WGP-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:6682; GFX11-WGP: ; %bb.0: ; %entry6683; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x06684; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x46685; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x86686; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)6687; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s06688; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s26689; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s16690; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166691; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s06692; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)6693; GFX11-WGP-NEXT: ds_store_b32 v0, v16694; GFX11-WGP-NEXT: s_endpgm6695;6696; GFX11-CU-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:6697; GFX11-CU: ; %bb.0: ; %entry6698; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x06699; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x46700; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x86701; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)6702; GFX11-CU-NEXT: v_mov_b32_e32 v0, s06703; GFX11-CU-NEXT: v_mov_b32_e32 v1, s26704; GFX11-CU-NEXT: v_mov_b32_e32 v2, s16705; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166706; GFX11-CU-NEXT: v_mov_b32_e32 v0, s06707; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)6708; GFX11-CU-NEXT: ds_store_b32 v0, v16709; GFX11-CU-NEXT: s_endpgm6710;6711; GFX12-WGP-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:6712; GFX12-WGP: ; %bb.0: ; %entry6713; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x06714; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x46715; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x86716; GFX12-WGP-NEXT: s_wait_kmcnt 0x06717; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s06718; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s26719; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s16720; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166721; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s06722; GFX12-WGP-NEXT: s_wait_dscnt 0x06723; GFX12-WGP-NEXT: ds_store_b32 v0, v16724; GFX12-WGP-NEXT: s_endpgm6725;6726; GFX12-CU-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:6727; GFX12-CU: ; %bb.0: ; %entry6728; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x06729; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x46730; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x86731; GFX12-CU-NEXT: s_wait_kmcnt 0x06732; GFX12-CU-NEXT: v_mov_b32_e32 v0, s06733; GFX12-CU-NEXT: v_mov_b32_e32 v1, s26734; GFX12-CU-NEXT: v_mov_b32_e32 v2, s16735; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166736; GFX12-CU-NEXT: v_mov_b32_e32 v0, s06737; GFX12-CU-NEXT: s_wait_dscnt 0x06738; GFX12-CU-NEXT: ds_store_b32 v0, v16739; GFX12-CU-NEXT: s_endpgm6740;6741; GFX1250-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:6742; GFX1250: ; %bb.0: ; %entry6743; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 16744; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x06745; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x46746; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x86747; GFX1250-NEXT: s_wait_kmcnt 0x06748; GFX1250-NEXT: v_mov_b32_e32 v0, s06749; GFX1250-NEXT: v_mov_b32_e32 v1, s26750; GFX1250-NEXT: v_mov_b32_e32 v2, s16751; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166752; GFX1250-NEXT: v_mov_b32_e32 v0, s06753; GFX1250-NEXT: s_wait_dscnt 0x06754; GFX1250-NEXT: ds_store_b32 v0, v16755; GFX1250-NEXT: s_endpgm6756 ptr addrspace(3) %out, i32 %in, i32 %old) {6757entry:6758 %gep = getelementptr i32, ptr addrspace(3) %out, i32 46759 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") monotonic acquire6760 %val0 = extractvalue { i32, i1 } %val, 06761 store i32 %val0, ptr addrspace(3) %out, align 46762 ret void6763}6764 6765define amdgpu_kernel void @local_singlethread_acquire_acquire_ret_cmpxchg(6766; GFX6-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:6767; GFX6: ; %bb.0: ; %entry6768; GFX6-NEXT: s_load_dword s4, s[8:9], 0x06769; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr46770; GFX6-NEXT: s_load_dword s5, s[8:9], 0x16771; GFX6-NEXT: s_load_dword s6, s[8:9], 0x26772; GFX6-NEXT: s_mov_b32 m0, -16773; GFX6-NEXT: s_waitcnt lgkmcnt(0)6774; GFX6-NEXT: v_mov_b32_e32 v0, s46775; GFX6-NEXT: v_mov_b32_e32 v1, s66776; GFX6-NEXT: v_mov_b32_e32 v2, s56777; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166778; GFX6-NEXT: s_mov_b32 m0, -16779; GFX6-NEXT: v_mov_b32_e32 v0, s46780; GFX6-NEXT: s_waitcnt lgkmcnt(0)6781; GFX6-NEXT: ds_write_b32 v0, v16782; GFX6-NEXT: s_endpgm6783;6784; GFX7-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:6785; GFX7: ; %bb.0: ; %entry6786; GFX7-NEXT: s_load_dword s4, s[8:9], 0x06787; GFX7-NEXT: s_load_dword s5, s[8:9], 0x16788; GFX7-NEXT: s_load_dword s6, s[8:9], 0x26789; GFX7-NEXT: s_mov_b32 m0, -16790; GFX7-NEXT: s_waitcnt lgkmcnt(0)6791; GFX7-NEXT: v_mov_b32_e32 v0, s46792; GFX7-NEXT: v_mov_b32_e32 v1, s66793; GFX7-NEXT: v_mov_b32_e32 v2, s56794; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166795; GFX7-NEXT: s_mov_b32 m0, -16796; GFX7-NEXT: v_mov_b32_e32 v0, s46797; GFX7-NEXT: s_waitcnt lgkmcnt(0)6798; GFX7-NEXT: ds_write_b32 v0, v16799; GFX7-NEXT: s_endpgm6800;6801; GFX10-WGP-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:6802; GFX10-WGP: ; %bb.0: ; %entry6803; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x06804; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x46805; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x86806; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)6807; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s46808; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s66809; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s56810; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166811; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s46812; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)6813; GFX10-WGP-NEXT: ds_write_b32 v0, v16814; GFX10-WGP-NEXT: s_endpgm6815;6816; GFX10-CU-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:6817; GFX10-CU: ; %bb.0: ; %entry6818; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x06819; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x46820; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x86821; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)6822; GFX10-CU-NEXT: v_mov_b32_e32 v0, s46823; GFX10-CU-NEXT: v_mov_b32_e32 v1, s66824; GFX10-CU-NEXT: v_mov_b32_e32 v2, s56825; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166826; GFX10-CU-NEXT: v_mov_b32_e32 v0, s46827; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)6828; GFX10-CU-NEXT: ds_write_b32 v0, v16829; GFX10-CU-NEXT: s_endpgm6830;6831; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:6832; SKIP-CACHE-INV: ; %bb.0: ; %entry6833; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x06834; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x16835; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x26836; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -16837; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)6838; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s06839; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s26840; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s16841; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166842; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -16843; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s06844; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)6845; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v16846; SKIP-CACHE-INV-NEXT: s_endpgm6847;6848; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:6849; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry6850; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x06851; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x46852; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x86853; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6854; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s46855; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s66856; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s56857; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166858; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s46859; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6860; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v16861; GFX90A-NOTTGSPLIT-NEXT: s_endpgm6862;6863; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:6864; GFX90A-TGSPLIT: ; %bb.0: ; %entry6865; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x06866; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x46867; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x86868; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6869; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s46870; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s66871; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s56872; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166873; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s46874; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6875; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v16876; GFX90A-TGSPLIT-NEXT: s_endpgm6877;6878; GFX942-NOTTGSPLIT-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:6879; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry6880; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x06881; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x46882; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x86883; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6884; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s06885; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s26886; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s16887; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166888; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s06889; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6890; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v16891; GFX942-NOTTGSPLIT-NEXT: s_endpgm6892;6893; GFX942-TGSPLIT-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:6894; GFX942-TGSPLIT: ; %bb.0: ; %entry6895; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x06896; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x46897; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x86898; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6899; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s06900; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s26901; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s16902; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:166903; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s06904; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)6905; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v16906; GFX942-TGSPLIT-NEXT: s_endpgm6907;6908; GFX11-WGP-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:6909; GFX11-WGP: ; %bb.0: ; %entry6910; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x06911; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x46912; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x86913; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)6914; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s06915; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s26916; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s16917; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166918; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s06919; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)6920; GFX11-WGP-NEXT: ds_store_b32 v0, v16921; GFX11-WGP-NEXT: s_endpgm6922;6923; GFX11-CU-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:6924; GFX11-CU: ; %bb.0: ; %entry6925; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x06926; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x46927; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x86928; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)6929; GFX11-CU-NEXT: v_mov_b32_e32 v0, s06930; GFX11-CU-NEXT: v_mov_b32_e32 v1, s26931; GFX11-CU-NEXT: v_mov_b32_e32 v2, s16932; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166933; GFX11-CU-NEXT: v_mov_b32_e32 v0, s06934; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)6935; GFX11-CU-NEXT: ds_store_b32 v0, v16936; GFX11-CU-NEXT: s_endpgm6937;6938; GFX12-WGP-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:6939; GFX12-WGP: ; %bb.0: ; %entry6940; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x06941; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x46942; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x86943; GFX12-WGP-NEXT: s_wait_kmcnt 0x06944; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s06945; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s26946; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s16947; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166948; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s06949; GFX12-WGP-NEXT: s_wait_dscnt 0x06950; GFX12-WGP-NEXT: ds_store_b32 v0, v16951; GFX12-WGP-NEXT: s_endpgm6952;6953; GFX12-CU-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:6954; GFX12-CU: ; %bb.0: ; %entry6955; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x06956; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x46957; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x86958; GFX12-CU-NEXT: s_wait_kmcnt 0x06959; GFX12-CU-NEXT: v_mov_b32_e32 v0, s06960; GFX12-CU-NEXT: v_mov_b32_e32 v1, s26961; GFX12-CU-NEXT: v_mov_b32_e32 v2, s16962; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166963; GFX12-CU-NEXT: v_mov_b32_e32 v0, s06964; GFX12-CU-NEXT: s_wait_dscnt 0x06965; GFX12-CU-NEXT: ds_store_b32 v0, v16966; GFX12-CU-NEXT: s_endpgm6967;6968; GFX1250-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:6969; GFX1250: ; %bb.0: ; %entry6970; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 16971; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x06972; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x46973; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x86974; GFX1250-NEXT: s_wait_kmcnt 0x06975; GFX1250-NEXT: v_mov_b32_e32 v0, s06976; GFX1250-NEXT: v_mov_b32_e32 v1, s26977; GFX1250-NEXT: v_mov_b32_e32 v2, s16978; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:166979; GFX1250-NEXT: v_mov_b32_e32 v0, s06980; GFX1250-NEXT: s_wait_dscnt 0x06981; GFX1250-NEXT: ds_store_b32 v0, v16982; GFX1250-NEXT: s_endpgm6983 ptr addrspace(3) %out, i32 %in, i32 %old) {6984entry:6985 %gep = getelementptr i32, ptr addrspace(3) %out, i32 46986 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") acquire acquire6987 %val0 = extractvalue { i32, i1 } %val, 06988 store i32 %val0, ptr addrspace(3) %out, align 46989 ret void6990}6991 6992define amdgpu_kernel void @local_singlethread_release_acquire_ret_cmpxchg(6993; GFX6-LABEL: local_singlethread_release_acquire_ret_cmpxchg:6994; GFX6: ; %bb.0: ; %entry6995; GFX6-NEXT: s_load_dword s4, s[8:9], 0x06996; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr46997; GFX6-NEXT: s_load_dword s5, s[8:9], 0x16998; GFX6-NEXT: s_load_dword s6, s[8:9], 0x26999; GFX6-NEXT: s_mov_b32 m0, -17000; GFX6-NEXT: s_waitcnt lgkmcnt(0)7001; GFX6-NEXT: v_mov_b32_e32 v0, s47002; GFX6-NEXT: v_mov_b32_e32 v1, s67003; GFX6-NEXT: v_mov_b32_e32 v2, s57004; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167005; GFX6-NEXT: s_mov_b32 m0, -17006; GFX6-NEXT: v_mov_b32_e32 v0, s47007; GFX6-NEXT: s_waitcnt lgkmcnt(0)7008; GFX6-NEXT: ds_write_b32 v0, v17009; GFX6-NEXT: s_endpgm7010;7011; GFX7-LABEL: local_singlethread_release_acquire_ret_cmpxchg:7012; GFX7: ; %bb.0: ; %entry7013; GFX7-NEXT: s_load_dword s4, s[8:9], 0x07014; GFX7-NEXT: s_load_dword s5, s[8:9], 0x17015; GFX7-NEXT: s_load_dword s6, s[8:9], 0x27016; GFX7-NEXT: s_mov_b32 m0, -17017; GFX7-NEXT: s_waitcnt lgkmcnt(0)7018; GFX7-NEXT: v_mov_b32_e32 v0, s47019; GFX7-NEXT: v_mov_b32_e32 v1, s67020; GFX7-NEXT: v_mov_b32_e32 v2, s57021; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167022; GFX7-NEXT: s_mov_b32 m0, -17023; GFX7-NEXT: v_mov_b32_e32 v0, s47024; GFX7-NEXT: s_waitcnt lgkmcnt(0)7025; GFX7-NEXT: ds_write_b32 v0, v17026; GFX7-NEXT: s_endpgm7027;7028; GFX10-WGP-LABEL: local_singlethread_release_acquire_ret_cmpxchg:7029; GFX10-WGP: ; %bb.0: ; %entry7030; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x07031; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x47032; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x87033; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)7034; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s47035; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s67036; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s57037; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167038; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s47039; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)7040; GFX10-WGP-NEXT: ds_write_b32 v0, v17041; GFX10-WGP-NEXT: s_endpgm7042;7043; GFX10-CU-LABEL: local_singlethread_release_acquire_ret_cmpxchg:7044; GFX10-CU: ; %bb.0: ; %entry7045; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x07046; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x47047; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x87048; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)7049; GFX10-CU-NEXT: v_mov_b32_e32 v0, s47050; GFX10-CU-NEXT: v_mov_b32_e32 v1, s67051; GFX10-CU-NEXT: v_mov_b32_e32 v2, s57052; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167053; GFX10-CU-NEXT: v_mov_b32_e32 v0, s47054; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)7055; GFX10-CU-NEXT: ds_write_b32 v0, v17056; GFX10-CU-NEXT: s_endpgm7057;7058; SKIP-CACHE-INV-LABEL: local_singlethread_release_acquire_ret_cmpxchg:7059; SKIP-CACHE-INV: ; %bb.0: ; %entry7060; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x07061; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x17062; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x27063; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -17064; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)7065; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s07066; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s27067; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s17068; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167069; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -17070; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s07071; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)7072; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v17073; SKIP-CACHE-INV-NEXT: s_endpgm7074;7075; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_acquire_ret_cmpxchg:7076; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry7077; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x07078; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x47079; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x87080; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7081; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s47082; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s67083; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s57084; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167085; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s47086; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7087; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v17088; GFX90A-NOTTGSPLIT-NEXT: s_endpgm7089;7090; GFX90A-TGSPLIT-LABEL: local_singlethread_release_acquire_ret_cmpxchg:7091; GFX90A-TGSPLIT: ; %bb.0: ; %entry7092; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x07093; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x47094; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x87095; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7096; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s47097; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s67098; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s57099; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167100; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s47101; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7102; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v17103; GFX90A-TGSPLIT-NEXT: s_endpgm7104;7105; GFX942-NOTTGSPLIT-LABEL: local_singlethread_release_acquire_ret_cmpxchg:7106; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry7107; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x07108; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x47109; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x87110; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7111; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s07112; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s27113; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s17114; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167115; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s07116; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7117; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v17118; GFX942-NOTTGSPLIT-NEXT: s_endpgm7119;7120; GFX942-TGSPLIT-LABEL: local_singlethread_release_acquire_ret_cmpxchg:7121; GFX942-TGSPLIT: ; %bb.0: ; %entry7122; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x07123; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x47124; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x87125; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7126; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s07127; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s27128; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s17129; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167130; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s07131; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7132; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v17133; GFX942-TGSPLIT-NEXT: s_endpgm7134;7135; GFX11-WGP-LABEL: local_singlethread_release_acquire_ret_cmpxchg:7136; GFX11-WGP: ; %bb.0: ; %entry7137; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x07138; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x47139; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x87140; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)7141; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s07142; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s27143; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s17144; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:167145; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s07146; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)7147; GFX11-WGP-NEXT: ds_store_b32 v0, v17148; GFX11-WGP-NEXT: s_endpgm7149;7150; GFX11-CU-LABEL: local_singlethread_release_acquire_ret_cmpxchg:7151; GFX11-CU: ; %bb.0: ; %entry7152; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x07153; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x47154; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x87155; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)7156; GFX11-CU-NEXT: v_mov_b32_e32 v0, s07157; GFX11-CU-NEXT: v_mov_b32_e32 v1, s27158; GFX11-CU-NEXT: v_mov_b32_e32 v2, s17159; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:167160; GFX11-CU-NEXT: v_mov_b32_e32 v0, s07161; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)7162; GFX11-CU-NEXT: ds_store_b32 v0, v17163; GFX11-CU-NEXT: s_endpgm7164;7165; GFX12-WGP-LABEL: local_singlethread_release_acquire_ret_cmpxchg:7166; GFX12-WGP: ; %bb.0: ; %entry7167; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x07168; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x47169; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x87170; GFX12-WGP-NEXT: s_wait_kmcnt 0x07171; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s07172; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s27173; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s17174; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:167175; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s07176; GFX12-WGP-NEXT: s_wait_dscnt 0x07177; GFX12-WGP-NEXT: ds_store_b32 v0, v17178; GFX12-WGP-NEXT: s_endpgm7179;7180; GFX12-CU-LABEL: local_singlethread_release_acquire_ret_cmpxchg:7181; GFX12-CU: ; %bb.0: ; %entry7182; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x07183; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x47184; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x87185; GFX12-CU-NEXT: s_wait_kmcnt 0x07186; GFX12-CU-NEXT: v_mov_b32_e32 v0, s07187; GFX12-CU-NEXT: v_mov_b32_e32 v1, s27188; GFX12-CU-NEXT: v_mov_b32_e32 v2, s17189; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:167190; GFX12-CU-NEXT: v_mov_b32_e32 v0, s07191; GFX12-CU-NEXT: s_wait_dscnt 0x07192; GFX12-CU-NEXT: ds_store_b32 v0, v17193; GFX12-CU-NEXT: s_endpgm7194;7195; GFX1250-LABEL: local_singlethread_release_acquire_ret_cmpxchg:7196; GFX1250: ; %bb.0: ; %entry7197; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 17198; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x07199; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x47200; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x87201; GFX1250-NEXT: s_wait_kmcnt 0x07202; GFX1250-NEXT: v_mov_b32_e32 v0, s07203; GFX1250-NEXT: v_mov_b32_e32 v1, s27204; GFX1250-NEXT: v_mov_b32_e32 v2, s17205; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:167206; GFX1250-NEXT: v_mov_b32_e32 v0, s07207; GFX1250-NEXT: s_wait_dscnt 0x07208; GFX1250-NEXT: ds_store_b32 v0, v17209; GFX1250-NEXT: s_endpgm7210 ptr addrspace(3) %out, i32 %in, i32 %old) {7211entry:7212 %gep = getelementptr i32, ptr addrspace(3) %out, i32 47213 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") release acquire7214 %val0 = extractvalue { i32, i1 } %val, 07215 store i32 %val0, ptr addrspace(3) %out, align 47216 ret void7217}7218 7219define amdgpu_kernel void @local_singlethread_acq_rel_acquire_ret_cmpxchg(7220; GFX6-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:7221; GFX6: ; %bb.0: ; %entry7222; GFX6-NEXT: s_load_dword s4, s[8:9], 0x07223; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr47224; GFX6-NEXT: s_load_dword s5, s[8:9], 0x17225; GFX6-NEXT: s_load_dword s6, s[8:9], 0x27226; GFX6-NEXT: s_mov_b32 m0, -17227; GFX6-NEXT: s_waitcnt lgkmcnt(0)7228; GFX6-NEXT: v_mov_b32_e32 v0, s47229; GFX6-NEXT: v_mov_b32_e32 v1, s67230; GFX6-NEXT: v_mov_b32_e32 v2, s57231; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167232; GFX6-NEXT: s_mov_b32 m0, -17233; GFX6-NEXT: v_mov_b32_e32 v0, s47234; GFX6-NEXT: s_waitcnt lgkmcnt(0)7235; GFX6-NEXT: ds_write_b32 v0, v17236; GFX6-NEXT: s_endpgm7237;7238; GFX7-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:7239; GFX7: ; %bb.0: ; %entry7240; GFX7-NEXT: s_load_dword s4, s[8:9], 0x07241; GFX7-NEXT: s_load_dword s5, s[8:9], 0x17242; GFX7-NEXT: s_load_dword s6, s[8:9], 0x27243; GFX7-NEXT: s_mov_b32 m0, -17244; GFX7-NEXT: s_waitcnt lgkmcnt(0)7245; GFX7-NEXT: v_mov_b32_e32 v0, s47246; GFX7-NEXT: v_mov_b32_e32 v1, s67247; GFX7-NEXT: v_mov_b32_e32 v2, s57248; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167249; GFX7-NEXT: s_mov_b32 m0, -17250; GFX7-NEXT: v_mov_b32_e32 v0, s47251; GFX7-NEXT: s_waitcnt lgkmcnt(0)7252; GFX7-NEXT: ds_write_b32 v0, v17253; GFX7-NEXT: s_endpgm7254;7255; GFX10-WGP-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:7256; GFX10-WGP: ; %bb.0: ; %entry7257; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x07258; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x47259; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x87260; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)7261; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s47262; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s67263; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s57264; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167265; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s47266; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)7267; GFX10-WGP-NEXT: ds_write_b32 v0, v17268; GFX10-WGP-NEXT: s_endpgm7269;7270; GFX10-CU-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:7271; GFX10-CU: ; %bb.0: ; %entry7272; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x07273; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x47274; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x87275; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)7276; GFX10-CU-NEXT: v_mov_b32_e32 v0, s47277; GFX10-CU-NEXT: v_mov_b32_e32 v1, s67278; GFX10-CU-NEXT: v_mov_b32_e32 v2, s57279; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167280; GFX10-CU-NEXT: v_mov_b32_e32 v0, s47281; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)7282; GFX10-CU-NEXT: ds_write_b32 v0, v17283; GFX10-CU-NEXT: s_endpgm7284;7285; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:7286; SKIP-CACHE-INV: ; %bb.0: ; %entry7287; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x07288; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x17289; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x27290; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -17291; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)7292; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s07293; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s27294; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s17295; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167296; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -17297; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s07298; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)7299; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v17300; SKIP-CACHE-INV-NEXT: s_endpgm7301;7302; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:7303; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry7304; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x07305; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x47306; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x87307; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7308; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s47309; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s67310; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s57311; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167312; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s47313; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7314; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v17315; GFX90A-NOTTGSPLIT-NEXT: s_endpgm7316;7317; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:7318; GFX90A-TGSPLIT: ; %bb.0: ; %entry7319; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x07320; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x47321; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x87322; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7323; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s47324; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s67325; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s57326; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167327; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s47328; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7329; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v17330; GFX90A-TGSPLIT-NEXT: s_endpgm7331;7332; GFX942-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:7333; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry7334; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x07335; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x47336; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x87337; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7338; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s07339; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s27340; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s17341; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167342; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s07343; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7344; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v17345; GFX942-NOTTGSPLIT-NEXT: s_endpgm7346;7347; GFX942-TGSPLIT-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:7348; GFX942-TGSPLIT: ; %bb.0: ; %entry7349; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x07350; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x47351; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x87352; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7353; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s07354; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s27355; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s17356; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167357; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s07358; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7359; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v17360; GFX942-TGSPLIT-NEXT: s_endpgm7361;7362; GFX11-WGP-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:7363; GFX11-WGP: ; %bb.0: ; %entry7364; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x07365; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x47366; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x87367; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)7368; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s07369; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s27370; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s17371; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:167372; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s07373; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)7374; GFX11-WGP-NEXT: ds_store_b32 v0, v17375; GFX11-WGP-NEXT: s_endpgm7376;7377; GFX11-CU-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:7378; GFX11-CU: ; %bb.0: ; %entry7379; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x07380; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x47381; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x87382; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)7383; GFX11-CU-NEXT: v_mov_b32_e32 v0, s07384; GFX11-CU-NEXT: v_mov_b32_e32 v1, s27385; GFX11-CU-NEXT: v_mov_b32_e32 v2, s17386; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:167387; GFX11-CU-NEXT: v_mov_b32_e32 v0, s07388; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)7389; GFX11-CU-NEXT: ds_store_b32 v0, v17390; GFX11-CU-NEXT: s_endpgm7391;7392; GFX12-WGP-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:7393; GFX12-WGP: ; %bb.0: ; %entry7394; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x07395; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x47396; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x87397; GFX12-WGP-NEXT: s_wait_kmcnt 0x07398; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s07399; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s27400; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s17401; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:167402; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s07403; GFX12-WGP-NEXT: s_wait_dscnt 0x07404; GFX12-WGP-NEXT: ds_store_b32 v0, v17405; GFX12-WGP-NEXT: s_endpgm7406;7407; GFX12-CU-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:7408; GFX12-CU: ; %bb.0: ; %entry7409; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x07410; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x47411; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x87412; GFX12-CU-NEXT: s_wait_kmcnt 0x07413; GFX12-CU-NEXT: v_mov_b32_e32 v0, s07414; GFX12-CU-NEXT: v_mov_b32_e32 v1, s27415; GFX12-CU-NEXT: v_mov_b32_e32 v2, s17416; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:167417; GFX12-CU-NEXT: v_mov_b32_e32 v0, s07418; GFX12-CU-NEXT: s_wait_dscnt 0x07419; GFX12-CU-NEXT: ds_store_b32 v0, v17420; GFX12-CU-NEXT: s_endpgm7421;7422; GFX1250-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:7423; GFX1250: ; %bb.0: ; %entry7424; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 17425; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x07426; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x47427; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x87428; GFX1250-NEXT: s_wait_kmcnt 0x07429; GFX1250-NEXT: v_mov_b32_e32 v0, s07430; GFX1250-NEXT: v_mov_b32_e32 v1, s27431; GFX1250-NEXT: v_mov_b32_e32 v2, s17432; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:167433; GFX1250-NEXT: v_mov_b32_e32 v0, s07434; GFX1250-NEXT: s_wait_dscnt 0x07435; GFX1250-NEXT: ds_store_b32 v0, v17436; GFX1250-NEXT: s_endpgm7437 ptr addrspace(3) %out, i32 %in, i32 %old) {7438entry:7439 %gep = getelementptr i32, ptr addrspace(3) %out, i32 47440 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") acq_rel acquire7441 %val0 = extractvalue { i32, i1 } %val, 07442 store i32 %val0, ptr addrspace(3) %out, align 47443 ret void7444}7445 7446define amdgpu_kernel void @local_singlethread_seq_cst_acquire_ret_cmpxchg(7447; GFX6-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:7448; GFX6: ; %bb.0: ; %entry7449; GFX6-NEXT: s_load_dword s4, s[8:9], 0x07450; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr47451; GFX6-NEXT: s_load_dword s5, s[8:9], 0x17452; GFX6-NEXT: s_load_dword s6, s[8:9], 0x27453; GFX6-NEXT: s_mov_b32 m0, -17454; GFX6-NEXT: s_waitcnt lgkmcnt(0)7455; GFX6-NEXT: v_mov_b32_e32 v0, s47456; GFX6-NEXT: v_mov_b32_e32 v1, s67457; GFX6-NEXT: v_mov_b32_e32 v2, s57458; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167459; GFX6-NEXT: s_mov_b32 m0, -17460; GFX6-NEXT: v_mov_b32_e32 v0, s47461; GFX6-NEXT: s_waitcnt lgkmcnt(0)7462; GFX6-NEXT: ds_write_b32 v0, v17463; GFX6-NEXT: s_endpgm7464;7465; GFX7-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:7466; GFX7: ; %bb.0: ; %entry7467; GFX7-NEXT: s_load_dword s4, s[8:9], 0x07468; GFX7-NEXT: s_load_dword s5, s[8:9], 0x17469; GFX7-NEXT: s_load_dword s6, s[8:9], 0x27470; GFX7-NEXT: s_mov_b32 m0, -17471; GFX7-NEXT: s_waitcnt lgkmcnt(0)7472; GFX7-NEXT: v_mov_b32_e32 v0, s47473; GFX7-NEXT: v_mov_b32_e32 v1, s67474; GFX7-NEXT: v_mov_b32_e32 v2, s57475; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167476; GFX7-NEXT: s_mov_b32 m0, -17477; GFX7-NEXT: v_mov_b32_e32 v0, s47478; GFX7-NEXT: s_waitcnt lgkmcnt(0)7479; GFX7-NEXT: ds_write_b32 v0, v17480; GFX7-NEXT: s_endpgm7481;7482; GFX10-WGP-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:7483; GFX10-WGP: ; %bb.0: ; %entry7484; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x07485; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x47486; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x87487; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)7488; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s47489; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s67490; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s57491; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167492; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s47493; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)7494; GFX10-WGP-NEXT: ds_write_b32 v0, v17495; GFX10-WGP-NEXT: s_endpgm7496;7497; GFX10-CU-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:7498; GFX10-CU: ; %bb.0: ; %entry7499; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x07500; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x47501; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x87502; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)7503; GFX10-CU-NEXT: v_mov_b32_e32 v0, s47504; GFX10-CU-NEXT: v_mov_b32_e32 v1, s67505; GFX10-CU-NEXT: v_mov_b32_e32 v2, s57506; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167507; GFX10-CU-NEXT: v_mov_b32_e32 v0, s47508; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)7509; GFX10-CU-NEXT: ds_write_b32 v0, v17510; GFX10-CU-NEXT: s_endpgm7511;7512; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:7513; SKIP-CACHE-INV: ; %bb.0: ; %entry7514; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x07515; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x17516; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x27517; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -17518; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)7519; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s07520; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s27521; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s17522; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167523; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -17524; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s07525; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)7526; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v17527; SKIP-CACHE-INV-NEXT: s_endpgm7528;7529; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:7530; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry7531; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x07532; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x47533; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x87534; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7535; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s47536; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s67537; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s57538; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167539; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s47540; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7541; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v17542; GFX90A-NOTTGSPLIT-NEXT: s_endpgm7543;7544; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:7545; GFX90A-TGSPLIT: ; %bb.0: ; %entry7546; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x07547; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x47548; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x87549; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7550; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s47551; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s67552; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s57553; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167554; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s47555; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7556; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v17557; GFX90A-TGSPLIT-NEXT: s_endpgm7558;7559; GFX942-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:7560; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry7561; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x07562; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x47563; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x87564; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7565; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s07566; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s27567; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s17568; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167569; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s07570; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7571; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v17572; GFX942-NOTTGSPLIT-NEXT: s_endpgm7573;7574; GFX942-TGSPLIT-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:7575; GFX942-TGSPLIT: ; %bb.0: ; %entry7576; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x07577; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x47578; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x87579; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7580; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s07581; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s27582; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s17583; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167584; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s07585; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7586; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v17587; GFX942-TGSPLIT-NEXT: s_endpgm7588;7589; GFX11-WGP-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:7590; GFX11-WGP: ; %bb.0: ; %entry7591; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x07592; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x47593; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x87594; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)7595; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s07596; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s27597; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s17598; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:167599; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s07600; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)7601; GFX11-WGP-NEXT: ds_store_b32 v0, v17602; GFX11-WGP-NEXT: s_endpgm7603;7604; GFX11-CU-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:7605; GFX11-CU: ; %bb.0: ; %entry7606; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x07607; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x47608; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x87609; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)7610; GFX11-CU-NEXT: v_mov_b32_e32 v0, s07611; GFX11-CU-NEXT: v_mov_b32_e32 v1, s27612; GFX11-CU-NEXT: v_mov_b32_e32 v2, s17613; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:167614; GFX11-CU-NEXT: v_mov_b32_e32 v0, s07615; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)7616; GFX11-CU-NEXT: ds_store_b32 v0, v17617; GFX11-CU-NEXT: s_endpgm7618;7619; GFX12-WGP-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:7620; GFX12-WGP: ; %bb.0: ; %entry7621; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x07622; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x47623; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x87624; GFX12-WGP-NEXT: s_wait_kmcnt 0x07625; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s07626; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s27627; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s17628; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:167629; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s07630; GFX12-WGP-NEXT: s_wait_dscnt 0x07631; GFX12-WGP-NEXT: ds_store_b32 v0, v17632; GFX12-WGP-NEXT: s_endpgm7633;7634; GFX12-CU-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:7635; GFX12-CU: ; %bb.0: ; %entry7636; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x07637; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x47638; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x87639; GFX12-CU-NEXT: s_wait_kmcnt 0x07640; GFX12-CU-NEXT: v_mov_b32_e32 v0, s07641; GFX12-CU-NEXT: v_mov_b32_e32 v1, s27642; GFX12-CU-NEXT: v_mov_b32_e32 v2, s17643; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:167644; GFX12-CU-NEXT: v_mov_b32_e32 v0, s07645; GFX12-CU-NEXT: s_wait_dscnt 0x07646; GFX12-CU-NEXT: ds_store_b32 v0, v17647; GFX12-CU-NEXT: s_endpgm7648;7649; GFX1250-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:7650; GFX1250: ; %bb.0: ; %entry7651; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 17652; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x07653; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x47654; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x87655; GFX1250-NEXT: s_wait_kmcnt 0x07656; GFX1250-NEXT: v_mov_b32_e32 v0, s07657; GFX1250-NEXT: v_mov_b32_e32 v1, s27658; GFX1250-NEXT: v_mov_b32_e32 v2, s17659; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:167660; GFX1250-NEXT: v_mov_b32_e32 v0, s07661; GFX1250-NEXT: s_wait_dscnt 0x07662; GFX1250-NEXT: ds_store_b32 v0, v17663; GFX1250-NEXT: s_endpgm7664 ptr addrspace(3) %out, i32 %in, i32 %old) {7665entry:7666 %gep = getelementptr i32, ptr addrspace(3) %out, i32 47667 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") seq_cst acquire7668 %val0 = extractvalue { i32, i1 } %val, 07669 store i32 %val0, ptr addrspace(3) %out, align 47670 ret void7671}7672 7673define amdgpu_kernel void @local_singlethread_monotonic_seq_cst_ret_cmpxchg(7674; GFX6-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:7675; GFX6: ; %bb.0: ; %entry7676; GFX6-NEXT: s_load_dword s4, s[8:9], 0x07677; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr47678; GFX6-NEXT: s_load_dword s5, s[8:9], 0x17679; GFX6-NEXT: s_load_dword s6, s[8:9], 0x27680; GFX6-NEXT: s_mov_b32 m0, -17681; GFX6-NEXT: s_waitcnt lgkmcnt(0)7682; GFX6-NEXT: v_mov_b32_e32 v0, s47683; GFX6-NEXT: v_mov_b32_e32 v1, s67684; GFX6-NEXT: v_mov_b32_e32 v2, s57685; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167686; GFX6-NEXT: s_mov_b32 m0, -17687; GFX6-NEXT: v_mov_b32_e32 v0, s47688; GFX6-NEXT: s_waitcnt lgkmcnt(0)7689; GFX6-NEXT: ds_write_b32 v0, v17690; GFX6-NEXT: s_endpgm7691;7692; GFX7-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:7693; GFX7: ; %bb.0: ; %entry7694; GFX7-NEXT: s_load_dword s4, s[8:9], 0x07695; GFX7-NEXT: s_load_dword s5, s[8:9], 0x17696; GFX7-NEXT: s_load_dword s6, s[8:9], 0x27697; GFX7-NEXT: s_mov_b32 m0, -17698; GFX7-NEXT: s_waitcnt lgkmcnt(0)7699; GFX7-NEXT: v_mov_b32_e32 v0, s47700; GFX7-NEXT: v_mov_b32_e32 v1, s67701; GFX7-NEXT: v_mov_b32_e32 v2, s57702; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167703; GFX7-NEXT: s_mov_b32 m0, -17704; GFX7-NEXT: v_mov_b32_e32 v0, s47705; GFX7-NEXT: s_waitcnt lgkmcnt(0)7706; GFX7-NEXT: ds_write_b32 v0, v17707; GFX7-NEXT: s_endpgm7708;7709; GFX10-WGP-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:7710; GFX10-WGP: ; %bb.0: ; %entry7711; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x07712; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x47713; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x87714; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)7715; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s47716; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s67717; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s57718; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167719; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s47720; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)7721; GFX10-WGP-NEXT: ds_write_b32 v0, v17722; GFX10-WGP-NEXT: s_endpgm7723;7724; GFX10-CU-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:7725; GFX10-CU: ; %bb.0: ; %entry7726; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x07727; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x47728; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x87729; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)7730; GFX10-CU-NEXT: v_mov_b32_e32 v0, s47731; GFX10-CU-NEXT: v_mov_b32_e32 v1, s67732; GFX10-CU-NEXT: v_mov_b32_e32 v2, s57733; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167734; GFX10-CU-NEXT: v_mov_b32_e32 v0, s47735; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)7736; GFX10-CU-NEXT: ds_write_b32 v0, v17737; GFX10-CU-NEXT: s_endpgm7738;7739; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:7740; SKIP-CACHE-INV: ; %bb.0: ; %entry7741; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x07742; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x17743; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x27744; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -17745; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)7746; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s07747; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s27748; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s17749; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167750; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -17751; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s07752; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)7753; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v17754; SKIP-CACHE-INV-NEXT: s_endpgm7755;7756; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:7757; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry7758; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x07759; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x47760; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x87761; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7762; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s47763; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s67764; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s57765; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167766; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s47767; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7768; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v17769; GFX90A-NOTTGSPLIT-NEXT: s_endpgm7770;7771; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:7772; GFX90A-TGSPLIT: ; %bb.0: ; %entry7773; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x07774; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x47775; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x87776; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7777; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s47778; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s67779; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s57780; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167781; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s47782; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7783; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v17784; GFX90A-TGSPLIT-NEXT: s_endpgm7785;7786; GFX942-NOTTGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:7787; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry7788; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x07789; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x47790; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x87791; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7792; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s07793; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s27794; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s17795; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167796; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s07797; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7798; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v17799; GFX942-NOTTGSPLIT-NEXT: s_endpgm7800;7801; GFX942-TGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:7802; GFX942-TGSPLIT: ; %bb.0: ; %entry7803; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x07804; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x47805; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x87806; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7807; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s07808; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s27809; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s17810; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167811; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s07812; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7813; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v17814; GFX942-TGSPLIT-NEXT: s_endpgm7815;7816; GFX11-WGP-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:7817; GFX11-WGP: ; %bb.0: ; %entry7818; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x07819; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x47820; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x87821; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)7822; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s07823; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s27824; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s17825; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:167826; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s07827; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)7828; GFX11-WGP-NEXT: ds_store_b32 v0, v17829; GFX11-WGP-NEXT: s_endpgm7830;7831; GFX11-CU-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:7832; GFX11-CU: ; %bb.0: ; %entry7833; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x07834; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x47835; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x87836; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)7837; GFX11-CU-NEXT: v_mov_b32_e32 v0, s07838; GFX11-CU-NEXT: v_mov_b32_e32 v1, s27839; GFX11-CU-NEXT: v_mov_b32_e32 v2, s17840; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:167841; GFX11-CU-NEXT: v_mov_b32_e32 v0, s07842; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)7843; GFX11-CU-NEXT: ds_store_b32 v0, v17844; GFX11-CU-NEXT: s_endpgm7845;7846; GFX12-WGP-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:7847; GFX12-WGP: ; %bb.0: ; %entry7848; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x07849; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x47850; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x87851; GFX12-WGP-NEXT: s_wait_kmcnt 0x07852; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s07853; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s27854; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s17855; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:167856; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s07857; GFX12-WGP-NEXT: s_wait_dscnt 0x07858; GFX12-WGP-NEXT: ds_store_b32 v0, v17859; GFX12-WGP-NEXT: s_endpgm7860;7861; GFX12-CU-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:7862; GFX12-CU: ; %bb.0: ; %entry7863; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x07864; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x47865; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x87866; GFX12-CU-NEXT: s_wait_kmcnt 0x07867; GFX12-CU-NEXT: v_mov_b32_e32 v0, s07868; GFX12-CU-NEXT: v_mov_b32_e32 v1, s27869; GFX12-CU-NEXT: v_mov_b32_e32 v2, s17870; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:167871; GFX12-CU-NEXT: v_mov_b32_e32 v0, s07872; GFX12-CU-NEXT: s_wait_dscnt 0x07873; GFX12-CU-NEXT: ds_store_b32 v0, v17874; GFX12-CU-NEXT: s_endpgm7875;7876; GFX1250-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:7877; GFX1250: ; %bb.0: ; %entry7878; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 17879; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x07880; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x47881; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x87882; GFX1250-NEXT: s_wait_kmcnt 0x07883; GFX1250-NEXT: v_mov_b32_e32 v0, s07884; GFX1250-NEXT: v_mov_b32_e32 v1, s27885; GFX1250-NEXT: v_mov_b32_e32 v2, s17886; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:167887; GFX1250-NEXT: v_mov_b32_e32 v0, s07888; GFX1250-NEXT: s_wait_dscnt 0x07889; GFX1250-NEXT: ds_store_b32 v0, v17890; GFX1250-NEXT: s_endpgm7891 ptr addrspace(3) %out, i32 %in, i32 %old) {7892entry:7893 %gep = getelementptr i32, ptr addrspace(3) %out, i32 47894 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") monotonic seq_cst7895 %val0 = extractvalue { i32, i1 } %val, 07896 store i32 %val0, ptr addrspace(3) %out, align 47897 ret void7898}7899 7900define amdgpu_kernel void @local_singlethread_acquire_seq_cst_ret_cmpxchg(7901; GFX6-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:7902; GFX6: ; %bb.0: ; %entry7903; GFX6-NEXT: s_load_dword s4, s[8:9], 0x07904; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr47905; GFX6-NEXT: s_load_dword s5, s[8:9], 0x17906; GFX6-NEXT: s_load_dword s6, s[8:9], 0x27907; GFX6-NEXT: s_mov_b32 m0, -17908; GFX6-NEXT: s_waitcnt lgkmcnt(0)7909; GFX6-NEXT: v_mov_b32_e32 v0, s47910; GFX6-NEXT: v_mov_b32_e32 v1, s67911; GFX6-NEXT: v_mov_b32_e32 v2, s57912; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167913; GFX6-NEXT: s_mov_b32 m0, -17914; GFX6-NEXT: v_mov_b32_e32 v0, s47915; GFX6-NEXT: s_waitcnt lgkmcnt(0)7916; GFX6-NEXT: ds_write_b32 v0, v17917; GFX6-NEXT: s_endpgm7918;7919; GFX7-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:7920; GFX7: ; %bb.0: ; %entry7921; GFX7-NEXT: s_load_dword s4, s[8:9], 0x07922; GFX7-NEXT: s_load_dword s5, s[8:9], 0x17923; GFX7-NEXT: s_load_dword s6, s[8:9], 0x27924; GFX7-NEXT: s_mov_b32 m0, -17925; GFX7-NEXT: s_waitcnt lgkmcnt(0)7926; GFX7-NEXT: v_mov_b32_e32 v0, s47927; GFX7-NEXT: v_mov_b32_e32 v1, s67928; GFX7-NEXT: v_mov_b32_e32 v2, s57929; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167930; GFX7-NEXT: s_mov_b32 m0, -17931; GFX7-NEXT: v_mov_b32_e32 v0, s47932; GFX7-NEXT: s_waitcnt lgkmcnt(0)7933; GFX7-NEXT: ds_write_b32 v0, v17934; GFX7-NEXT: s_endpgm7935;7936; GFX10-WGP-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:7937; GFX10-WGP: ; %bb.0: ; %entry7938; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x07939; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x47940; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x87941; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)7942; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s47943; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s67944; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s57945; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167946; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s47947; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)7948; GFX10-WGP-NEXT: ds_write_b32 v0, v17949; GFX10-WGP-NEXT: s_endpgm7950;7951; GFX10-CU-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:7952; GFX10-CU: ; %bb.0: ; %entry7953; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x07954; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x47955; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x87956; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)7957; GFX10-CU-NEXT: v_mov_b32_e32 v0, s47958; GFX10-CU-NEXT: v_mov_b32_e32 v1, s67959; GFX10-CU-NEXT: v_mov_b32_e32 v2, s57960; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167961; GFX10-CU-NEXT: v_mov_b32_e32 v0, s47962; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)7963; GFX10-CU-NEXT: ds_write_b32 v0, v17964; GFX10-CU-NEXT: s_endpgm7965;7966; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:7967; SKIP-CACHE-INV: ; %bb.0: ; %entry7968; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x07969; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x17970; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x27971; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -17972; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)7973; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s07974; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s27975; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s17976; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167977; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -17978; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s07979; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)7980; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v17981; SKIP-CACHE-INV-NEXT: s_endpgm7982;7983; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:7984; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry7985; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x07986; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x47987; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x87988; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7989; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s47990; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s67991; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s57992; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:167993; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s47994; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)7995; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v17996; GFX90A-NOTTGSPLIT-NEXT: s_endpgm7997;7998; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:7999; GFX90A-TGSPLIT: ; %bb.0: ; %entry8000; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x08001; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x48002; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x88003; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8004; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s48005; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s68006; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s58007; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168008; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s48009; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8010; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v18011; GFX90A-TGSPLIT-NEXT: s_endpgm8012;8013; GFX942-NOTTGSPLIT-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:8014; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry8015; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x08016; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x48017; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x88018; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8019; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s08020; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s28021; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s18022; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168023; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s08024; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8025; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v18026; GFX942-NOTTGSPLIT-NEXT: s_endpgm8027;8028; GFX942-TGSPLIT-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:8029; GFX942-TGSPLIT: ; %bb.0: ; %entry8030; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x08031; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x48032; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x88033; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8034; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s08035; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s28036; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s18037; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168038; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s08039; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8040; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v18041; GFX942-TGSPLIT-NEXT: s_endpgm8042;8043; GFX11-WGP-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:8044; GFX11-WGP: ; %bb.0: ; %entry8045; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x08046; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x48047; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x88048; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)8049; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s08050; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s28051; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s18052; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:168053; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s08054; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)8055; GFX11-WGP-NEXT: ds_store_b32 v0, v18056; GFX11-WGP-NEXT: s_endpgm8057;8058; GFX11-CU-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:8059; GFX11-CU: ; %bb.0: ; %entry8060; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x08061; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x48062; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x88063; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)8064; GFX11-CU-NEXT: v_mov_b32_e32 v0, s08065; GFX11-CU-NEXT: v_mov_b32_e32 v1, s28066; GFX11-CU-NEXT: v_mov_b32_e32 v2, s18067; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:168068; GFX11-CU-NEXT: v_mov_b32_e32 v0, s08069; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)8070; GFX11-CU-NEXT: ds_store_b32 v0, v18071; GFX11-CU-NEXT: s_endpgm8072;8073; GFX12-WGP-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:8074; GFX12-WGP: ; %bb.0: ; %entry8075; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x08076; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x48077; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x88078; GFX12-WGP-NEXT: s_wait_kmcnt 0x08079; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s08080; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s28081; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s18082; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:168083; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s08084; GFX12-WGP-NEXT: s_wait_dscnt 0x08085; GFX12-WGP-NEXT: ds_store_b32 v0, v18086; GFX12-WGP-NEXT: s_endpgm8087;8088; GFX12-CU-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:8089; GFX12-CU: ; %bb.0: ; %entry8090; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x08091; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x48092; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x88093; GFX12-CU-NEXT: s_wait_kmcnt 0x08094; GFX12-CU-NEXT: v_mov_b32_e32 v0, s08095; GFX12-CU-NEXT: v_mov_b32_e32 v1, s28096; GFX12-CU-NEXT: v_mov_b32_e32 v2, s18097; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:168098; GFX12-CU-NEXT: v_mov_b32_e32 v0, s08099; GFX12-CU-NEXT: s_wait_dscnt 0x08100; GFX12-CU-NEXT: ds_store_b32 v0, v18101; GFX12-CU-NEXT: s_endpgm8102;8103; GFX1250-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:8104; GFX1250: ; %bb.0: ; %entry8105; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 18106; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x08107; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x48108; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x88109; GFX1250-NEXT: s_wait_kmcnt 0x08110; GFX1250-NEXT: v_mov_b32_e32 v0, s08111; GFX1250-NEXT: v_mov_b32_e32 v1, s28112; GFX1250-NEXT: v_mov_b32_e32 v2, s18113; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:168114; GFX1250-NEXT: v_mov_b32_e32 v0, s08115; GFX1250-NEXT: s_wait_dscnt 0x08116; GFX1250-NEXT: ds_store_b32 v0, v18117; GFX1250-NEXT: s_endpgm8118 ptr addrspace(3) %out, i32 %in, i32 %old) {8119entry:8120 %gep = getelementptr i32, ptr addrspace(3) %out, i32 48121 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") acquire seq_cst8122 %val0 = extractvalue { i32, i1 } %val, 08123 store i32 %val0, ptr addrspace(3) %out, align 48124 ret void8125}8126 8127define amdgpu_kernel void @local_singlethread_release_seq_cst_ret_cmpxchg(8128; GFX6-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:8129; GFX6: ; %bb.0: ; %entry8130; GFX6-NEXT: s_load_dword s4, s[8:9], 0x08131; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr48132; GFX6-NEXT: s_load_dword s5, s[8:9], 0x18133; GFX6-NEXT: s_load_dword s6, s[8:9], 0x28134; GFX6-NEXT: s_mov_b32 m0, -18135; GFX6-NEXT: s_waitcnt lgkmcnt(0)8136; GFX6-NEXT: v_mov_b32_e32 v0, s48137; GFX6-NEXT: v_mov_b32_e32 v1, s68138; GFX6-NEXT: v_mov_b32_e32 v2, s58139; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168140; GFX6-NEXT: s_mov_b32 m0, -18141; GFX6-NEXT: v_mov_b32_e32 v0, s48142; GFX6-NEXT: s_waitcnt lgkmcnt(0)8143; GFX6-NEXT: ds_write_b32 v0, v18144; GFX6-NEXT: s_endpgm8145;8146; GFX7-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:8147; GFX7: ; %bb.0: ; %entry8148; GFX7-NEXT: s_load_dword s4, s[8:9], 0x08149; GFX7-NEXT: s_load_dword s5, s[8:9], 0x18150; GFX7-NEXT: s_load_dword s6, s[8:9], 0x28151; GFX7-NEXT: s_mov_b32 m0, -18152; GFX7-NEXT: s_waitcnt lgkmcnt(0)8153; GFX7-NEXT: v_mov_b32_e32 v0, s48154; GFX7-NEXT: v_mov_b32_e32 v1, s68155; GFX7-NEXT: v_mov_b32_e32 v2, s58156; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168157; GFX7-NEXT: s_mov_b32 m0, -18158; GFX7-NEXT: v_mov_b32_e32 v0, s48159; GFX7-NEXT: s_waitcnt lgkmcnt(0)8160; GFX7-NEXT: ds_write_b32 v0, v18161; GFX7-NEXT: s_endpgm8162;8163; GFX10-WGP-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:8164; GFX10-WGP: ; %bb.0: ; %entry8165; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x08166; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x48167; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x88168; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)8169; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s48170; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s68171; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s58172; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168173; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s48174; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)8175; GFX10-WGP-NEXT: ds_write_b32 v0, v18176; GFX10-WGP-NEXT: s_endpgm8177;8178; GFX10-CU-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:8179; GFX10-CU: ; %bb.0: ; %entry8180; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x08181; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x48182; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x88183; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)8184; GFX10-CU-NEXT: v_mov_b32_e32 v0, s48185; GFX10-CU-NEXT: v_mov_b32_e32 v1, s68186; GFX10-CU-NEXT: v_mov_b32_e32 v2, s58187; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168188; GFX10-CU-NEXT: v_mov_b32_e32 v0, s48189; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)8190; GFX10-CU-NEXT: ds_write_b32 v0, v18191; GFX10-CU-NEXT: s_endpgm8192;8193; SKIP-CACHE-INV-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:8194; SKIP-CACHE-INV: ; %bb.0: ; %entry8195; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x08196; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x18197; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x28198; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -18199; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)8200; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s08201; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s28202; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s18203; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168204; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -18205; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s08206; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)8207; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v18208; SKIP-CACHE-INV-NEXT: s_endpgm8209;8210; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:8211; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry8212; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x08213; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x48214; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x88215; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8216; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s48217; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s68218; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s58219; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168220; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s48221; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8222; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v18223; GFX90A-NOTTGSPLIT-NEXT: s_endpgm8224;8225; GFX90A-TGSPLIT-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:8226; GFX90A-TGSPLIT: ; %bb.0: ; %entry8227; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x08228; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x48229; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x88230; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8231; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s48232; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s68233; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s58234; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168235; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s48236; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8237; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v18238; GFX90A-TGSPLIT-NEXT: s_endpgm8239;8240; GFX942-NOTTGSPLIT-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:8241; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry8242; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x08243; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x48244; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x88245; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8246; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s08247; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s28248; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s18249; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168250; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s08251; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8252; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v18253; GFX942-NOTTGSPLIT-NEXT: s_endpgm8254;8255; GFX942-TGSPLIT-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:8256; GFX942-TGSPLIT: ; %bb.0: ; %entry8257; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x08258; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x48259; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x88260; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8261; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s08262; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s28263; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s18264; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168265; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s08266; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8267; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v18268; GFX942-TGSPLIT-NEXT: s_endpgm8269;8270; GFX11-WGP-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:8271; GFX11-WGP: ; %bb.0: ; %entry8272; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x08273; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x48274; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x88275; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)8276; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s08277; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s28278; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s18279; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:168280; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s08281; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)8282; GFX11-WGP-NEXT: ds_store_b32 v0, v18283; GFX11-WGP-NEXT: s_endpgm8284;8285; GFX11-CU-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:8286; GFX11-CU: ; %bb.0: ; %entry8287; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x08288; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x48289; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x88290; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)8291; GFX11-CU-NEXT: v_mov_b32_e32 v0, s08292; GFX11-CU-NEXT: v_mov_b32_e32 v1, s28293; GFX11-CU-NEXT: v_mov_b32_e32 v2, s18294; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:168295; GFX11-CU-NEXT: v_mov_b32_e32 v0, s08296; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)8297; GFX11-CU-NEXT: ds_store_b32 v0, v18298; GFX11-CU-NEXT: s_endpgm8299;8300; GFX12-WGP-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:8301; GFX12-WGP: ; %bb.0: ; %entry8302; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x08303; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x48304; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x88305; GFX12-WGP-NEXT: s_wait_kmcnt 0x08306; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s08307; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s28308; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s18309; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:168310; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s08311; GFX12-WGP-NEXT: s_wait_dscnt 0x08312; GFX12-WGP-NEXT: ds_store_b32 v0, v18313; GFX12-WGP-NEXT: s_endpgm8314;8315; GFX12-CU-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:8316; GFX12-CU: ; %bb.0: ; %entry8317; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x08318; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x48319; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x88320; GFX12-CU-NEXT: s_wait_kmcnt 0x08321; GFX12-CU-NEXT: v_mov_b32_e32 v0, s08322; GFX12-CU-NEXT: v_mov_b32_e32 v1, s28323; GFX12-CU-NEXT: v_mov_b32_e32 v2, s18324; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:168325; GFX12-CU-NEXT: v_mov_b32_e32 v0, s08326; GFX12-CU-NEXT: s_wait_dscnt 0x08327; GFX12-CU-NEXT: ds_store_b32 v0, v18328; GFX12-CU-NEXT: s_endpgm8329;8330; GFX1250-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:8331; GFX1250: ; %bb.0: ; %entry8332; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 18333; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x08334; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x48335; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x88336; GFX1250-NEXT: s_wait_kmcnt 0x08337; GFX1250-NEXT: v_mov_b32_e32 v0, s08338; GFX1250-NEXT: v_mov_b32_e32 v1, s28339; GFX1250-NEXT: v_mov_b32_e32 v2, s18340; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:168341; GFX1250-NEXT: v_mov_b32_e32 v0, s08342; GFX1250-NEXT: s_wait_dscnt 0x08343; GFX1250-NEXT: ds_store_b32 v0, v18344; GFX1250-NEXT: s_endpgm8345 ptr addrspace(3) %out, i32 %in, i32 %old) {8346entry:8347 %gep = getelementptr i32, ptr addrspace(3) %out, i32 48348 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") release seq_cst8349 %val0 = extractvalue { i32, i1 } %val, 08350 store i32 %val0, ptr addrspace(3) %out, align 48351 ret void8352}8353 8354define amdgpu_kernel void @local_singlethread_acq_rel_seq_cst_ret_cmpxchg(8355; GFX6-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:8356; GFX6: ; %bb.0: ; %entry8357; GFX6-NEXT: s_load_dword s4, s[8:9], 0x08358; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr48359; GFX6-NEXT: s_load_dword s5, s[8:9], 0x18360; GFX6-NEXT: s_load_dword s6, s[8:9], 0x28361; GFX6-NEXT: s_mov_b32 m0, -18362; GFX6-NEXT: s_waitcnt lgkmcnt(0)8363; GFX6-NEXT: v_mov_b32_e32 v0, s48364; GFX6-NEXT: v_mov_b32_e32 v1, s68365; GFX6-NEXT: v_mov_b32_e32 v2, s58366; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168367; GFX6-NEXT: s_mov_b32 m0, -18368; GFX6-NEXT: v_mov_b32_e32 v0, s48369; GFX6-NEXT: s_waitcnt lgkmcnt(0)8370; GFX6-NEXT: ds_write_b32 v0, v18371; GFX6-NEXT: s_endpgm8372;8373; GFX7-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:8374; GFX7: ; %bb.0: ; %entry8375; GFX7-NEXT: s_load_dword s4, s[8:9], 0x08376; GFX7-NEXT: s_load_dword s5, s[8:9], 0x18377; GFX7-NEXT: s_load_dword s6, s[8:9], 0x28378; GFX7-NEXT: s_mov_b32 m0, -18379; GFX7-NEXT: s_waitcnt lgkmcnt(0)8380; GFX7-NEXT: v_mov_b32_e32 v0, s48381; GFX7-NEXT: v_mov_b32_e32 v1, s68382; GFX7-NEXT: v_mov_b32_e32 v2, s58383; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168384; GFX7-NEXT: s_mov_b32 m0, -18385; GFX7-NEXT: v_mov_b32_e32 v0, s48386; GFX7-NEXT: s_waitcnt lgkmcnt(0)8387; GFX7-NEXT: ds_write_b32 v0, v18388; GFX7-NEXT: s_endpgm8389;8390; GFX10-WGP-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:8391; GFX10-WGP: ; %bb.0: ; %entry8392; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x08393; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x48394; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x88395; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)8396; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s48397; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s68398; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s58399; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168400; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s48401; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)8402; GFX10-WGP-NEXT: ds_write_b32 v0, v18403; GFX10-WGP-NEXT: s_endpgm8404;8405; GFX10-CU-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:8406; GFX10-CU: ; %bb.0: ; %entry8407; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x08408; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x48409; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x88410; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)8411; GFX10-CU-NEXT: v_mov_b32_e32 v0, s48412; GFX10-CU-NEXT: v_mov_b32_e32 v1, s68413; GFX10-CU-NEXT: v_mov_b32_e32 v2, s58414; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168415; GFX10-CU-NEXT: v_mov_b32_e32 v0, s48416; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)8417; GFX10-CU-NEXT: ds_write_b32 v0, v18418; GFX10-CU-NEXT: s_endpgm8419;8420; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:8421; SKIP-CACHE-INV: ; %bb.0: ; %entry8422; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x08423; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x18424; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x28425; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -18426; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)8427; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s08428; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s28429; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s18430; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168431; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -18432; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s08433; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)8434; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v18435; SKIP-CACHE-INV-NEXT: s_endpgm8436;8437; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:8438; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry8439; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x08440; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x48441; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x88442; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8443; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s48444; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s68445; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s58446; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168447; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s48448; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8449; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v18450; GFX90A-NOTTGSPLIT-NEXT: s_endpgm8451;8452; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:8453; GFX90A-TGSPLIT: ; %bb.0: ; %entry8454; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x08455; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x48456; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x88457; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8458; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s48459; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s68460; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s58461; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168462; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s48463; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8464; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v18465; GFX90A-TGSPLIT-NEXT: s_endpgm8466;8467; GFX942-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:8468; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry8469; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x08470; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x48471; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x88472; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8473; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s08474; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s28475; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s18476; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168477; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s08478; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8479; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v18480; GFX942-NOTTGSPLIT-NEXT: s_endpgm8481;8482; GFX942-TGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:8483; GFX942-TGSPLIT: ; %bb.0: ; %entry8484; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x08485; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x48486; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x88487; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8488; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s08489; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s28490; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s18491; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168492; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s08493; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8494; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v18495; GFX942-TGSPLIT-NEXT: s_endpgm8496;8497; GFX11-WGP-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:8498; GFX11-WGP: ; %bb.0: ; %entry8499; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x08500; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x48501; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x88502; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)8503; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s08504; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s28505; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s18506; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:168507; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s08508; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)8509; GFX11-WGP-NEXT: ds_store_b32 v0, v18510; GFX11-WGP-NEXT: s_endpgm8511;8512; GFX11-CU-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:8513; GFX11-CU: ; %bb.0: ; %entry8514; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x08515; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x48516; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x88517; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)8518; GFX11-CU-NEXT: v_mov_b32_e32 v0, s08519; GFX11-CU-NEXT: v_mov_b32_e32 v1, s28520; GFX11-CU-NEXT: v_mov_b32_e32 v2, s18521; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:168522; GFX11-CU-NEXT: v_mov_b32_e32 v0, s08523; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)8524; GFX11-CU-NEXT: ds_store_b32 v0, v18525; GFX11-CU-NEXT: s_endpgm8526;8527; GFX12-WGP-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:8528; GFX12-WGP: ; %bb.0: ; %entry8529; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x08530; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x48531; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x88532; GFX12-WGP-NEXT: s_wait_kmcnt 0x08533; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s08534; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s28535; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s18536; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:168537; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s08538; GFX12-WGP-NEXT: s_wait_dscnt 0x08539; GFX12-WGP-NEXT: ds_store_b32 v0, v18540; GFX12-WGP-NEXT: s_endpgm8541;8542; GFX12-CU-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:8543; GFX12-CU: ; %bb.0: ; %entry8544; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x08545; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x48546; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x88547; GFX12-CU-NEXT: s_wait_kmcnt 0x08548; GFX12-CU-NEXT: v_mov_b32_e32 v0, s08549; GFX12-CU-NEXT: v_mov_b32_e32 v1, s28550; GFX12-CU-NEXT: v_mov_b32_e32 v2, s18551; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:168552; GFX12-CU-NEXT: v_mov_b32_e32 v0, s08553; GFX12-CU-NEXT: s_wait_dscnt 0x08554; GFX12-CU-NEXT: ds_store_b32 v0, v18555; GFX12-CU-NEXT: s_endpgm8556;8557; GFX1250-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:8558; GFX1250: ; %bb.0: ; %entry8559; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 18560; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x08561; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x48562; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x88563; GFX1250-NEXT: s_wait_kmcnt 0x08564; GFX1250-NEXT: v_mov_b32_e32 v0, s08565; GFX1250-NEXT: v_mov_b32_e32 v1, s28566; GFX1250-NEXT: v_mov_b32_e32 v2, s18567; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:168568; GFX1250-NEXT: v_mov_b32_e32 v0, s08569; GFX1250-NEXT: s_wait_dscnt 0x08570; GFX1250-NEXT: ds_store_b32 v0, v18571; GFX1250-NEXT: s_endpgm8572 ptr addrspace(3) %out, i32 %in, i32 %old) {8573entry:8574 %gep = getelementptr i32, ptr addrspace(3) %out, i32 48575 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") acq_rel seq_cst8576 %val0 = extractvalue { i32, i1 } %val, 08577 store i32 %val0, ptr addrspace(3) %out, align 48578 ret void8579}8580 8581define amdgpu_kernel void @local_singlethread_seq_cst_seq_cst_ret_cmpxchg(8582; GFX6-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:8583; GFX6: ; %bb.0: ; %entry8584; GFX6-NEXT: s_load_dword s4, s[8:9], 0x08585; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr48586; GFX6-NEXT: s_load_dword s5, s[8:9], 0x18587; GFX6-NEXT: s_load_dword s6, s[8:9], 0x28588; GFX6-NEXT: s_mov_b32 m0, -18589; GFX6-NEXT: s_waitcnt lgkmcnt(0)8590; GFX6-NEXT: v_mov_b32_e32 v0, s48591; GFX6-NEXT: v_mov_b32_e32 v1, s68592; GFX6-NEXT: v_mov_b32_e32 v2, s58593; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168594; GFX6-NEXT: s_mov_b32 m0, -18595; GFX6-NEXT: v_mov_b32_e32 v0, s48596; GFX6-NEXT: s_waitcnt lgkmcnt(0)8597; GFX6-NEXT: ds_write_b32 v0, v18598; GFX6-NEXT: s_endpgm8599;8600; GFX7-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:8601; GFX7: ; %bb.0: ; %entry8602; GFX7-NEXT: s_load_dword s4, s[8:9], 0x08603; GFX7-NEXT: s_load_dword s5, s[8:9], 0x18604; GFX7-NEXT: s_load_dword s6, s[8:9], 0x28605; GFX7-NEXT: s_mov_b32 m0, -18606; GFX7-NEXT: s_waitcnt lgkmcnt(0)8607; GFX7-NEXT: v_mov_b32_e32 v0, s48608; GFX7-NEXT: v_mov_b32_e32 v1, s68609; GFX7-NEXT: v_mov_b32_e32 v2, s58610; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168611; GFX7-NEXT: s_mov_b32 m0, -18612; GFX7-NEXT: v_mov_b32_e32 v0, s48613; GFX7-NEXT: s_waitcnt lgkmcnt(0)8614; GFX7-NEXT: ds_write_b32 v0, v18615; GFX7-NEXT: s_endpgm8616;8617; GFX10-WGP-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:8618; GFX10-WGP: ; %bb.0: ; %entry8619; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x08620; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x48621; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x88622; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)8623; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s48624; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s68625; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s58626; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168627; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s48628; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)8629; GFX10-WGP-NEXT: ds_write_b32 v0, v18630; GFX10-WGP-NEXT: s_endpgm8631;8632; GFX10-CU-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:8633; GFX10-CU: ; %bb.0: ; %entry8634; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x08635; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x48636; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x88637; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)8638; GFX10-CU-NEXT: v_mov_b32_e32 v0, s48639; GFX10-CU-NEXT: v_mov_b32_e32 v1, s68640; GFX10-CU-NEXT: v_mov_b32_e32 v2, s58641; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168642; GFX10-CU-NEXT: v_mov_b32_e32 v0, s48643; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)8644; GFX10-CU-NEXT: ds_write_b32 v0, v18645; GFX10-CU-NEXT: s_endpgm8646;8647; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:8648; SKIP-CACHE-INV: ; %bb.0: ; %entry8649; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x08650; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x18651; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x28652; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -18653; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)8654; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s08655; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s28656; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s18657; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168658; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -18659; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s08660; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)8661; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v18662; SKIP-CACHE-INV-NEXT: s_endpgm8663;8664; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:8665; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry8666; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x08667; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x48668; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x88669; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8670; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s48671; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s68672; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s58673; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168674; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s48675; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8676; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v18677; GFX90A-NOTTGSPLIT-NEXT: s_endpgm8678;8679; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:8680; GFX90A-TGSPLIT: ; %bb.0: ; %entry8681; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x08682; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x48683; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x88684; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8685; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s48686; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s68687; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s58688; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168689; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s48690; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8691; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v18692; GFX90A-TGSPLIT-NEXT: s_endpgm8693;8694; GFX942-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:8695; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry8696; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x08697; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x48698; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x88699; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8700; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s08701; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s28702; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s18703; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168704; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s08705; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8706; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v18707; GFX942-NOTTGSPLIT-NEXT: s_endpgm8708;8709; GFX942-TGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:8710; GFX942-TGSPLIT: ; %bb.0: ; %entry8711; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x08712; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x48713; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x88714; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8715; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s08716; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s28717; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s18718; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:168719; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s08720; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8721; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v18722; GFX942-TGSPLIT-NEXT: s_endpgm8723;8724; GFX11-WGP-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:8725; GFX11-WGP: ; %bb.0: ; %entry8726; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x08727; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x48728; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x88729; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)8730; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s08731; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s28732; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s18733; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:168734; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s08735; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)8736; GFX11-WGP-NEXT: ds_store_b32 v0, v18737; GFX11-WGP-NEXT: s_endpgm8738;8739; GFX11-CU-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:8740; GFX11-CU: ; %bb.0: ; %entry8741; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x08742; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x48743; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x88744; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)8745; GFX11-CU-NEXT: v_mov_b32_e32 v0, s08746; GFX11-CU-NEXT: v_mov_b32_e32 v1, s28747; GFX11-CU-NEXT: v_mov_b32_e32 v2, s18748; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:168749; GFX11-CU-NEXT: v_mov_b32_e32 v0, s08750; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)8751; GFX11-CU-NEXT: ds_store_b32 v0, v18752; GFX11-CU-NEXT: s_endpgm8753;8754; GFX12-WGP-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:8755; GFX12-WGP: ; %bb.0: ; %entry8756; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x08757; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x48758; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x88759; GFX12-WGP-NEXT: s_wait_kmcnt 0x08760; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s08761; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s28762; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s18763; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:168764; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s08765; GFX12-WGP-NEXT: s_wait_dscnt 0x08766; GFX12-WGP-NEXT: ds_store_b32 v0, v18767; GFX12-WGP-NEXT: s_endpgm8768;8769; GFX12-CU-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:8770; GFX12-CU: ; %bb.0: ; %entry8771; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x08772; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x48773; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x88774; GFX12-CU-NEXT: s_wait_kmcnt 0x08775; GFX12-CU-NEXT: v_mov_b32_e32 v0, s08776; GFX12-CU-NEXT: v_mov_b32_e32 v1, s28777; GFX12-CU-NEXT: v_mov_b32_e32 v2, s18778; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:168779; GFX12-CU-NEXT: v_mov_b32_e32 v0, s08780; GFX12-CU-NEXT: s_wait_dscnt 0x08781; GFX12-CU-NEXT: ds_store_b32 v0, v18782; GFX12-CU-NEXT: s_endpgm8783;8784; GFX1250-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:8785; GFX1250: ; %bb.0: ; %entry8786; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 18787; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x08788; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x48789; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x88790; GFX1250-NEXT: s_wait_kmcnt 0x08791; GFX1250-NEXT: v_mov_b32_e32 v0, s08792; GFX1250-NEXT: v_mov_b32_e32 v1, s28793; GFX1250-NEXT: v_mov_b32_e32 v2, s18794; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:168795; GFX1250-NEXT: v_mov_b32_e32 v0, s08796; GFX1250-NEXT: s_wait_dscnt 0x08797; GFX1250-NEXT: ds_store_b32 v0, v18798; GFX1250-NEXT: s_endpgm8799 ptr addrspace(3) %out, i32 %in, i32 %old) {8800entry:8801 %gep = getelementptr i32, ptr addrspace(3) %out, i32 48802 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread") seq_cst seq_cst8803 %val0 = extractvalue { i32, i1 } %val, 08804 store i32 %val0, ptr addrspace(3) %out, align 48805 ret void8806}8807 8808define amdgpu_kernel void @local_singlethread_one_as_unordered_load(8809; GFX6-LABEL: local_singlethread_one_as_unordered_load:8810; GFX6: ; %bb.0: ; %entry8811; GFX6-NEXT: s_load_dword s5, s[8:9], 0x08812; GFX6-NEXT: s_load_dword s4, s[8:9], 0x18813; GFX6-NEXT: ; kill: def $sgpr6 killed $sgpr48814; GFX6-NEXT: ; kill: def $sgpr6 killed $sgpr58815; GFX6-NEXT: s_mov_b32 m0, -18816; GFX6-NEXT: s_waitcnt lgkmcnt(0)8817; GFX6-NEXT: v_mov_b32_e32 v0, s58818; GFX6-NEXT: ds_read_b32 v1, v08819; GFX6-NEXT: s_mov_b32 m0, -18820; GFX6-NEXT: v_mov_b32_e32 v0, s48821; GFX6-NEXT: s_waitcnt lgkmcnt(0)8822; GFX6-NEXT: ds_write_b32 v0, v18823; GFX6-NEXT: s_endpgm8824;8825; GFX7-LABEL: local_singlethread_one_as_unordered_load:8826; GFX7: ; %bb.0: ; %entry8827; GFX7-NEXT: s_load_dword s5, s[8:9], 0x08828; GFX7-NEXT: s_load_dword s4, s[8:9], 0x18829; GFX7-NEXT: s_mov_b32 m0, -18830; GFX7-NEXT: s_waitcnt lgkmcnt(0)8831; GFX7-NEXT: v_mov_b32_e32 v0, s58832; GFX7-NEXT: ds_read_b32 v1, v08833; GFX7-NEXT: s_mov_b32 m0, -18834; GFX7-NEXT: v_mov_b32_e32 v0, s48835; GFX7-NEXT: s_waitcnt lgkmcnt(0)8836; GFX7-NEXT: ds_write_b32 v0, v18837; GFX7-NEXT: s_endpgm8838;8839; GFX10-WGP-LABEL: local_singlethread_one_as_unordered_load:8840; GFX10-WGP: ; %bb.0: ; %entry8841; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x08842; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x48843; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)8844; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s58845; GFX10-WGP-NEXT: ds_read_b32 v1, v08846; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s48847; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)8848; GFX10-WGP-NEXT: ds_write_b32 v0, v18849; GFX10-WGP-NEXT: s_endpgm8850;8851; GFX10-CU-LABEL: local_singlethread_one_as_unordered_load:8852; GFX10-CU: ; %bb.0: ; %entry8853; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x08854; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x48855; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)8856; GFX10-CU-NEXT: v_mov_b32_e32 v0, s58857; GFX10-CU-NEXT: ds_read_b32 v1, v08858; GFX10-CU-NEXT: v_mov_b32_e32 v0, s48859; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)8860; GFX10-CU-NEXT: ds_write_b32 v0, v18861; GFX10-CU-NEXT: s_endpgm8862;8863; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_unordered_load:8864; SKIP-CACHE-INV: ; %bb.0: ; %entry8865; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x08866; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x18867; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -18868; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)8869; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s18870; SKIP-CACHE-INV-NEXT: ds_read_b32 v1, v08871; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -18872; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s08873; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)8874; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v18875; SKIP-CACHE-INV-NEXT: s_endpgm8876;8877; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_unordered_load:8878; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry8879; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x08880; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x48881; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8882; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s58883; GFX90A-NOTTGSPLIT-NEXT: ds_read_b32 v1, v08884; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s48885; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8886; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v18887; GFX90A-NOTTGSPLIT-NEXT: s_endpgm8888;8889; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_unordered_load:8890; GFX90A-TGSPLIT: ; %bb.0: ; %entry8891; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x08892; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x48893; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8894; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s58895; GFX90A-TGSPLIT-NEXT: ds_read_b32 v1, v08896; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s48897; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8898; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v18899; GFX90A-TGSPLIT-NEXT: s_endpgm8900;8901; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_unordered_load:8902; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry8903; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x08904; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x48905; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8906; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s18907; GFX942-NOTTGSPLIT-NEXT: ds_read_b32 v1, v08908; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s08909; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8910; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v18911; GFX942-NOTTGSPLIT-NEXT: s_endpgm8912;8913; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_unordered_load:8914; GFX942-TGSPLIT: ; %bb.0: ; %entry8915; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x08916; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x48917; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8918; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s18919; GFX942-TGSPLIT-NEXT: ds_read_b32 v1, v08920; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s08921; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)8922; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v18923; GFX942-TGSPLIT-NEXT: s_endpgm8924;8925; GFX11-WGP-LABEL: local_singlethread_one_as_unordered_load:8926; GFX11-WGP: ; %bb.0: ; %entry8927; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x08928; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x48929; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)8930; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s18931; GFX11-WGP-NEXT: ds_load_b32 v1, v08932; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s08933; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)8934; GFX11-WGP-NEXT: ds_store_b32 v0, v18935; GFX11-WGP-NEXT: s_endpgm8936;8937; GFX11-CU-LABEL: local_singlethread_one_as_unordered_load:8938; GFX11-CU: ; %bb.0: ; %entry8939; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x08940; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x48941; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)8942; GFX11-CU-NEXT: v_mov_b32_e32 v0, s18943; GFX11-CU-NEXT: ds_load_b32 v1, v08944; GFX11-CU-NEXT: v_mov_b32_e32 v0, s08945; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)8946; GFX11-CU-NEXT: ds_store_b32 v0, v18947; GFX11-CU-NEXT: s_endpgm8948;8949; GFX12-WGP-LABEL: local_singlethread_one_as_unordered_load:8950; GFX12-WGP: ; %bb.0: ; %entry8951; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x08952; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x48953; GFX12-WGP-NEXT: s_wait_kmcnt 0x08954; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s18955; GFX12-WGP-NEXT: ds_load_b32 v1, v08956; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s08957; GFX12-WGP-NEXT: s_wait_dscnt 0x08958; GFX12-WGP-NEXT: ds_store_b32 v0, v18959; GFX12-WGP-NEXT: s_endpgm8960;8961; GFX12-CU-LABEL: local_singlethread_one_as_unordered_load:8962; GFX12-CU: ; %bb.0: ; %entry8963; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x08964; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x48965; GFX12-CU-NEXT: s_wait_kmcnt 0x08966; GFX12-CU-NEXT: v_mov_b32_e32 v0, s18967; GFX12-CU-NEXT: ds_load_b32 v1, v08968; GFX12-CU-NEXT: v_mov_b32_e32 v0, s08969; GFX12-CU-NEXT: s_wait_dscnt 0x08970; GFX12-CU-NEXT: ds_store_b32 v0, v18971; GFX12-CU-NEXT: s_endpgm8972;8973; GFX1250-LABEL: local_singlethread_one_as_unordered_load:8974; GFX1250: ; %bb.0: ; %entry8975; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 18976; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x08977; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x48978; GFX1250-NEXT: s_wait_kmcnt 0x08979; GFX1250-NEXT: v_mov_b32_e32 v0, s18980; GFX1250-NEXT: ds_load_b32 v1, v08981; GFX1250-NEXT: v_mov_b32_e32 v0, s08982; GFX1250-NEXT: s_wait_dscnt 0x08983; GFX1250-NEXT: ds_store_b32 v0, v18984; GFX1250-NEXT: s_endpgm8985 ptr addrspace(3) %in, ptr addrspace(3) %out) {8986entry:8987 %val = load atomic i32, ptr addrspace(3) %in syncscope("singlethread-one-as") unordered, align 48988 store i32 %val, ptr addrspace(3) %out8989 ret void8990}8991 8992define amdgpu_kernel void @local_singlethread_one_as_monotonic_load(8993; GFX6-LABEL: local_singlethread_one_as_monotonic_load:8994; GFX6: ; %bb.0: ; %entry8995; GFX6-NEXT: s_load_dword s5, s[8:9], 0x08996; GFX6-NEXT: s_load_dword s4, s[8:9], 0x18997; GFX6-NEXT: ; kill: def $sgpr6 killed $sgpr48998; GFX6-NEXT: ; kill: def $sgpr6 killed $sgpr58999; GFX6-NEXT: s_mov_b32 m0, -19000; GFX6-NEXT: s_waitcnt lgkmcnt(0)9001; GFX6-NEXT: v_mov_b32_e32 v0, s59002; GFX6-NEXT: ds_read_b32 v1, v09003; GFX6-NEXT: s_mov_b32 m0, -19004; GFX6-NEXT: v_mov_b32_e32 v0, s49005; GFX6-NEXT: s_waitcnt lgkmcnt(0)9006; GFX6-NEXT: ds_write_b32 v0, v19007; GFX6-NEXT: s_endpgm9008;9009; GFX7-LABEL: local_singlethread_one_as_monotonic_load:9010; GFX7: ; %bb.0: ; %entry9011; GFX7-NEXT: s_load_dword s5, s[8:9], 0x09012; GFX7-NEXT: s_load_dword s4, s[8:9], 0x19013; GFX7-NEXT: s_mov_b32 m0, -19014; GFX7-NEXT: s_waitcnt lgkmcnt(0)9015; GFX7-NEXT: v_mov_b32_e32 v0, s59016; GFX7-NEXT: ds_read_b32 v1, v09017; GFX7-NEXT: s_mov_b32 m0, -19018; GFX7-NEXT: v_mov_b32_e32 v0, s49019; GFX7-NEXT: s_waitcnt lgkmcnt(0)9020; GFX7-NEXT: ds_write_b32 v0, v19021; GFX7-NEXT: s_endpgm9022;9023; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_load:9024; GFX10-WGP: ; %bb.0: ; %entry9025; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x09026; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x49027; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)9028; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s59029; GFX10-WGP-NEXT: ds_read_b32 v1, v09030; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s49031; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)9032; GFX10-WGP-NEXT: ds_write_b32 v0, v19033; GFX10-WGP-NEXT: s_endpgm9034;9035; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_load:9036; GFX10-CU: ; %bb.0: ; %entry9037; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x09038; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x49039; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)9040; GFX10-CU-NEXT: v_mov_b32_e32 v0, s59041; GFX10-CU-NEXT: ds_read_b32 v1, v09042; GFX10-CU-NEXT: v_mov_b32_e32 v0, s49043; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)9044; GFX10-CU-NEXT: ds_write_b32 v0, v19045; GFX10-CU-NEXT: s_endpgm9046;9047; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_load:9048; SKIP-CACHE-INV: ; %bb.0: ; %entry9049; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x09050; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x19051; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -19052; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)9053; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s19054; SKIP-CACHE-INV-NEXT: ds_read_b32 v1, v09055; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -19056; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s09057; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)9058; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v19059; SKIP-CACHE-INV-NEXT: s_endpgm9060;9061; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_load:9062; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry9063; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x09064; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x49065; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9066; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s59067; GFX90A-NOTTGSPLIT-NEXT: ds_read_b32 v1, v09068; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s49069; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9070; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v19071; GFX90A-NOTTGSPLIT-NEXT: s_endpgm9072;9073; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_load:9074; GFX90A-TGSPLIT: ; %bb.0: ; %entry9075; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x09076; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x49077; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9078; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s59079; GFX90A-TGSPLIT-NEXT: ds_read_b32 v1, v09080; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s49081; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9082; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v19083; GFX90A-TGSPLIT-NEXT: s_endpgm9084;9085; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_load:9086; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry9087; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x09088; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x49089; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9090; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s19091; GFX942-NOTTGSPLIT-NEXT: ds_read_b32 v1, v09092; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s09093; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9094; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v19095; GFX942-NOTTGSPLIT-NEXT: s_endpgm9096;9097; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_load:9098; GFX942-TGSPLIT: ; %bb.0: ; %entry9099; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x09100; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x49101; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9102; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s19103; GFX942-TGSPLIT-NEXT: ds_read_b32 v1, v09104; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s09105; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9106; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v19107; GFX942-TGSPLIT-NEXT: s_endpgm9108;9109; GFX11-WGP-LABEL: local_singlethread_one_as_monotonic_load:9110; GFX11-WGP: ; %bb.0: ; %entry9111; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x09112; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x49113; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)9114; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s19115; GFX11-WGP-NEXT: ds_load_b32 v1, v09116; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s09117; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)9118; GFX11-WGP-NEXT: ds_store_b32 v0, v19119; GFX11-WGP-NEXT: s_endpgm9120;9121; GFX11-CU-LABEL: local_singlethread_one_as_monotonic_load:9122; GFX11-CU: ; %bb.0: ; %entry9123; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x09124; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x49125; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)9126; GFX11-CU-NEXT: v_mov_b32_e32 v0, s19127; GFX11-CU-NEXT: ds_load_b32 v1, v09128; GFX11-CU-NEXT: v_mov_b32_e32 v0, s09129; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)9130; GFX11-CU-NEXT: ds_store_b32 v0, v19131; GFX11-CU-NEXT: s_endpgm9132;9133; GFX12-WGP-LABEL: local_singlethread_one_as_monotonic_load:9134; GFX12-WGP: ; %bb.0: ; %entry9135; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x09136; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x49137; GFX12-WGP-NEXT: s_wait_kmcnt 0x09138; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s19139; GFX12-WGP-NEXT: ds_load_b32 v1, v09140; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s09141; GFX12-WGP-NEXT: s_wait_dscnt 0x09142; GFX12-WGP-NEXT: ds_store_b32 v0, v19143; GFX12-WGP-NEXT: s_endpgm9144;9145; GFX12-CU-LABEL: local_singlethread_one_as_monotonic_load:9146; GFX12-CU: ; %bb.0: ; %entry9147; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x09148; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x49149; GFX12-CU-NEXT: s_wait_kmcnt 0x09150; GFX12-CU-NEXT: v_mov_b32_e32 v0, s19151; GFX12-CU-NEXT: ds_load_b32 v1, v09152; GFX12-CU-NEXT: v_mov_b32_e32 v0, s09153; GFX12-CU-NEXT: s_wait_dscnt 0x09154; GFX12-CU-NEXT: ds_store_b32 v0, v19155; GFX12-CU-NEXT: s_endpgm9156;9157; GFX1250-LABEL: local_singlethread_one_as_monotonic_load:9158; GFX1250: ; %bb.0: ; %entry9159; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 19160; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x09161; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x49162; GFX1250-NEXT: s_wait_kmcnt 0x09163; GFX1250-NEXT: v_mov_b32_e32 v0, s19164; GFX1250-NEXT: ds_load_b32 v1, v09165; GFX1250-NEXT: v_mov_b32_e32 v0, s09166; GFX1250-NEXT: s_wait_dscnt 0x09167; GFX1250-NEXT: ds_store_b32 v0, v19168; GFX1250-NEXT: s_endpgm9169 ptr addrspace(3) %in, ptr addrspace(3) %out) {9170entry:9171 %val = load atomic i32, ptr addrspace(3) %in syncscope("singlethread-one-as") monotonic, align 49172 store i32 %val, ptr addrspace(3) %out9173 ret void9174}9175 9176define amdgpu_kernel void @local_singlethread_one_as_acquire_load(9177; GFX6-LABEL: local_singlethread_one_as_acquire_load:9178; GFX6: ; %bb.0: ; %entry9179; GFX6-NEXT: s_load_dword s5, s[8:9], 0x09180; GFX6-NEXT: s_load_dword s4, s[8:9], 0x19181; GFX6-NEXT: ; kill: def $sgpr6 killed $sgpr49182; GFX6-NEXT: ; kill: def $sgpr6 killed $sgpr59183; GFX6-NEXT: s_mov_b32 m0, -19184; GFX6-NEXT: s_waitcnt lgkmcnt(0)9185; GFX6-NEXT: v_mov_b32_e32 v0, s59186; GFX6-NEXT: ds_read_b32 v1, v09187; GFX6-NEXT: s_mov_b32 m0, -19188; GFX6-NEXT: v_mov_b32_e32 v0, s49189; GFX6-NEXT: s_waitcnt lgkmcnt(0)9190; GFX6-NEXT: ds_write_b32 v0, v19191; GFX6-NEXT: s_endpgm9192;9193; GFX7-LABEL: local_singlethread_one_as_acquire_load:9194; GFX7: ; %bb.0: ; %entry9195; GFX7-NEXT: s_load_dword s5, s[8:9], 0x09196; GFX7-NEXT: s_load_dword s4, s[8:9], 0x19197; GFX7-NEXT: s_mov_b32 m0, -19198; GFX7-NEXT: s_waitcnt lgkmcnt(0)9199; GFX7-NEXT: v_mov_b32_e32 v0, s59200; GFX7-NEXT: ds_read_b32 v1, v09201; GFX7-NEXT: s_mov_b32 m0, -19202; GFX7-NEXT: v_mov_b32_e32 v0, s49203; GFX7-NEXT: s_waitcnt lgkmcnt(0)9204; GFX7-NEXT: ds_write_b32 v0, v19205; GFX7-NEXT: s_endpgm9206;9207; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_load:9208; GFX10-WGP: ; %bb.0: ; %entry9209; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x09210; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x49211; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)9212; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s59213; GFX10-WGP-NEXT: ds_read_b32 v1, v09214; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s49215; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)9216; GFX10-WGP-NEXT: ds_write_b32 v0, v19217; GFX10-WGP-NEXT: s_endpgm9218;9219; GFX10-CU-LABEL: local_singlethread_one_as_acquire_load:9220; GFX10-CU: ; %bb.0: ; %entry9221; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x09222; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x49223; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)9224; GFX10-CU-NEXT: v_mov_b32_e32 v0, s59225; GFX10-CU-NEXT: ds_read_b32 v1, v09226; GFX10-CU-NEXT: v_mov_b32_e32 v0, s49227; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)9228; GFX10-CU-NEXT: ds_write_b32 v0, v19229; GFX10-CU-NEXT: s_endpgm9230;9231; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_load:9232; SKIP-CACHE-INV: ; %bb.0: ; %entry9233; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x09234; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x19235; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -19236; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)9237; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s19238; SKIP-CACHE-INV-NEXT: ds_read_b32 v1, v09239; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -19240; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s09241; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)9242; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v19243; SKIP-CACHE-INV-NEXT: s_endpgm9244;9245; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_load:9246; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry9247; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x09248; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x49249; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9250; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s59251; GFX90A-NOTTGSPLIT-NEXT: ds_read_b32 v1, v09252; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s49253; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9254; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v19255; GFX90A-NOTTGSPLIT-NEXT: s_endpgm9256;9257; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_load:9258; GFX90A-TGSPLIT: ; %bb.0: ; %entry9259; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x09260; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x49261; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9262; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s59263; GFX90A-TGSPLIT-NEXT: ds_read_b32 v1, v09264; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s49265; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9266; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v19267; GFX90A-TGSPLIT-NEXT: s_endpgm9268;9269; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_load:9270; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry9271; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x09272; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x49273; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9274; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s19275; GFX942-NOTTGSPLIT-NEXT: ds_read_b32 v1, v09276; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s09277; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9278; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v19279; GFX942-NOTTGSPLIT-NEXT: s_endpgm9280;9281; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_acquire_load:9282; GFX942-TGSPLIT: ; %bb.0: ; %entry9283; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x09284; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x49285; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9286; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s19287; GFX942-TGSPLIT-NEXT: ds_read_b32 v1, v09288; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s09289; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9290; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v19291; GFX942-TGSPLIT-NEXT: s_endpgm9292;9293; GFX11-WGP-LABEL: local_singlethread_one_as_acquire_load:9294; GFX11-WGP: ; %bb.0: ; %entry9295; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x09296; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x49297; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)9298; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s19299; GFX11-WGP-NEXT: ds_load_b32 v1, v09300; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s09301; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)9302; GFX11-WGP-NEXT: ds_store_b32 v0, v19303; GFX11-WGP-NEXT: s_endpgm9304;9305; GFX11-CU-LABEL: local_singlethread_one_as_acquire_load:9306; GFX11-CU: ; %bb.0: ; %entry9307; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x09308; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x49309; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)9310; GFX11-CU-NEXT: v_mov_b32_e32 v0, s19311; GFX11-CU-NEXT: ds_load_b32 v1, v09312; GFX11-CU-NEXT: v_mov_b32_e32 v0, s09313; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)9314; GFX11-CU-NEXT: ds_store_b32 v0, v19315; GFX11-CU-NEXT: s_endpgm9316;9317; GFX12-WGP-LABEL: local_singlethread_one_as_acquire_load:9318; GFX12-WGP: ; %bb.0: ; %entry9319; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x09320; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x49321; GFX12-WGP-NEXT: s_wait_kmcnt 0x09322; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s19323; GFX12-WGP-NEXT: ds_load_b32 v1, v09324; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s09325; GFX12-WGP-NEXT: s_wait_dscnt 0x09326; GFX12-WGP-NEXT: ds_store_b32 v0, v19327; GFX12-WGP-NEXT: s_endpgm9328;9329; GFX12-CU-LABEL: local_singlethread_one_as_acquire_load:9330; GFX12-CU: ; %bb.0: ; %entry9331; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x09332; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x49333; GFX12-CU-NEXT: s_wait_kmcnt 0x09334; GFX12-CU-NEXT: v_mov_b32_e32 v0, s19335; GFX12-CU-NEXT: ds_load_b32 v1, v09336; GFX12-CU-NEXT: v_mov_b32_e32 v0, s09337; GFX12-CU-NEXT: s_wait_dscnt 0x09338; GFX12-CU-NEXT: ds_store_b32 v0, v19339; GFX12-CU-NEXT: s_endpgm9340;9341; GFX1250-LABEL: local_singlethread_one_as_acquire_load:9342; GFX1250: ; %bb.0: ; %entry9343; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 19344; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x09345; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x49346; GFX1250-NEXT: s_wait_kmcnt 0x09347; GFX1250-NEXT: v_mov_b32_e32 v0, s19348; GFX1250-NEXT: ds_load_b32 v1, v09349; GFX1250-NEXT: v_mov_b32_e32 v0, s09350; GFX1250-NEXT: s_wait_dscnt 0x09351; GFX1250-NEXT: ds_store_b32 v0, v19352; GFX1250-NEXT: s_endpgm9353 ptr addrspace(3) %in, ptr addrspace(3) %out) {9354entry:9355 %val = load atomic i32, ptr addrspace(3) %in syncscope("singlethread-one-as") acquire, align 49356 store i32 %val, ptr addrspace(3) %out9357 ret void9358}9359 9360define amdgpu_kernel void @local_singlethread_one_as_seq_cst_load(9361; GFX6-LABEL: local_singlethread_one_as_seq_cst_load:9362; GFX6: ; %bb.0: ; %entry9363; GFX6-NEXT: s_load_dword s5, s[8:9], 0x09364; GFX6-NEXT: s_load_dword s4, s[8:9], 0x19365; GFX6-NEXT: ; kill: def $sgpr6 killed $sgpr49366; GFX6-NEXT: ; kill: def $sgpr6 killed $sgpr59367; GFX6-NEXT: s_mov_b32 m0, -19368; GFX6-NEXT: s_waitcnt lgkmcnt(0)9369; GFX6-NEXT: v_mov_b32_e32 v0, s59370; GFX6-NEXT: ds_read_b32 v1, v09371; GFX6-NEXT: s_mov_b32 m0, -19372; GFX6-NEXT: v_mov_b32_e32 v0, s49373; GFX6-NEXT: s_waitcnt lgkmcnt(0)9374; GFX6-NEXT: ds_write_b32 v0, v19375; GFX6-NEXT: s_endpgm9376;9377; GFX7-LABEL: local_singlethread_one_as_seq_cst_load:9378; GFX7: ; %bb.0: ; %entry9379; GFX7-NEXT: s_load_dword s5, s[8:9], 0x09380; GFX7-NEXT: s_load_dword s4, s[8:9], 0x19381; GFX7-NEXT: s_mov_b32 m0, -19382; GFX7-NEXT: s_waitcnt lgkmcnt(0)9383; GFX7-NEXT: v_mov_b32_e32 v0, s59384; GFX7-NEXT: ds_read_b32 v1, v09385; GFX7-NEXT: s_mov_b32 m0, -19386; GFX7-NEXT: v_mov_b32_e32 v0, s49387; GFX7-NEXT: s_waitcnt lgkmcnt(0)9388; GFX7-NEXT: ds_write_b32 v0, v19389; GFX7-NEXT: s_endpgm9390;9391; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_load:9392; GFX10-WGP: ; %bb.0: ; %entry9393; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x09394; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x49395; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)9396; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s59397; GFX10-WGP-NEXT: ds_read_b32 v1, v09398; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s49399; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)9400; GFX10-WGP-NEXT: ds_write_b32 v0, v19401; GFX10-WGP-NEXT: s_endpgm9402;9403; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_load:9404; GFX10-CU: ; %bb.0: ; %entry9405; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x09406; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x49407; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)9408; GFX10-CU-NEXT: v_mov_b32_e32 v0, s59409; GFX10-CU-NEXT: ds_read_b32 v1, v09410; GFX10-CU-NEXT: v_mov_b32_e32 v0, s49411; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)9412; GFX10-CU-NEXT: ds_write_b32 v0, v19413; GFX10-CU-NEXT: s_endpgm9414;9415; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_load:9416; SKIP-CACHE-INV: ; %bb.0: ; %entry9417; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x09418; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x19419; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -19420; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)9421; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s19422; SKIP-CACHE-INV-NEXT: ds_read_b32 v1, v09423; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -19424; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s09425; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)9426; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v19427; SKIP-CACHE-INV-NEXT: s_endpgm9428;9429; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_load:9430; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry9431; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x09432; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x49433; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9434; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s59435; GFX90A-NOTTGSPLIT-NEXT: ds_read_b32 v1, v09436; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s49437; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9438; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v19439; GFX90A-NOTTGSPLIT-NEXT: s_endpgm9440;9441; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_load:9442; GFX90A-TGSPLIT: ; %bb.0: ; %entry9443; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x09444; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x49445; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9446; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s59447; GFX90A-TGSPLIT-NEXT: ds_read_b32 v1, v09448; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s49449; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9450; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v19451; GFX90A-TGSPLIT-NEXT: s_endpgm9452;9453; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_load:9454; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry9455; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x09456; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x49457; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9458; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s19459; GFX942-NOTTGSPLIT-NEXT: ds_read_b32 v1, v09460; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s09461; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9462; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v19463; GFX942-NOTTGSPLIT-NEXT: s_endpgm9464;9465; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_load:9466; GFX942-TGSPLIT: ; %bb.0: ; %entry9467; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x09468; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x49469; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9470; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s19471; GFX942-TGSPLIT-NEXT: ds_read_b32 v1, v09472; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s09473; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9474; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v19475; GFX942-TGSPLIT-NEXT: s_endpgm9476;9477; GFX11-WGP-LABEL: local_singlethread_one_as_seq_cst_load:9478; GFX11-WGP: ; %bb.0: ; %entry9479; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x09480; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x49481; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)9482; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s19483; GFX11-WGP-NEXT: ds_load_b32 v1, v09484; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s09485; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)9486; GFX11-WGP-NEXT: ds_store_b32 v0, v19487; GFX11-WGP-NEXT: s_endpgm9488;9489; GFX11-CU-LABEL: local_singlethread_one_as_seq_cst_load:9490; GFX11-CU: ; %bb.0: ; %entry9491; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x09492; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x49493; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)9494; GFX11-CU-NEXT: v_mov_b32_e32 v0, s19495; GFX11-CU-NEXT: ds_load_b32 v1, v09496; GFX11-CU-NEXT: v_mov_b32_e32 v0, s09497; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)9498; GFX11-CU-NEXT: ds_store_b32 v0, v19499; GFX11-CU-NEXT: s_endpgm9500;9501; GFX12-WGP-LABEL: local_singlethread_one_as_seq_cst_load:9502; GFX12-WGP: ; %bb.0: ; %entry9503; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x09504; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x49505; GFX12-WGP-NEXT: s_wait_kmcnt 0x09506; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s19507; GFX12-WGP-NEXT: ds_load_b32 v1, v09508; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s09509; GFX12-WGP-NEXT: s_wait_dscnt 0x09510; GFX12-WGP-NEXT: ds_store_b32 v0, v19511; GFX12-WGP-NEXT: s_endpgm9512;9513; GFX12-CU-LABEL: local_singlethread_one_as_seq_cst_load:9514; GFX12-CU: ; %bb.0: ; %entry9515; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x09516; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x49517; GFX12-CU-NEXT: s_wait_kmcnt 0x09518; GFX12-CU-NEXT: v_mov_b32_e32 v0, s19519; GFX12-CU-NEXT: ds_load_b32 v1, v09520; GFX12-CU-NEXT: v_mov_b32_e32 v0, s09521; GFX12-CU-NEXT: s_wait_dscnt 0x09522; GFX12-CU-NEXT: ds_store_b32 v0, v19523; GFX12-CU-NEXT: s_endpgm9524;9525; GFX1250-LABEL: local_singlethread_one_as_seq_cst_load:9526; GFX1250: ; %bb.0: ; %entry9527; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 19528; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x09529; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x49530; GFX1250-NEXT: s_wait_kmcnt 0x09531; GFX1250-NEXT: v_mov_b32_e32 v0, s19532; GFX1250-NEXT: ds_load_b32 v1, v09533; GFX1250-NEXT: v_mov_b32_e32 v0, s09534; GFX1250-NEXT: s_wait_dscnt 0x09535; GFX1250-NEXT: ds_store_b32 v0, v19536; GFX1250-NEXT: s_endpgm9537 ptr addrspace(3) %in, ptr addrspace(3) %out) {9538entry:9539 %val = load atomic i32, ptr addrspace(3) %in syncscope("singlethread-one-as") seq_cst, align 49540 store i32 %val, ptr addrspace(3) %out9541 ret void9542}9543 9544define amdgpu_kernel void @local_singlethread_one_as_unordered_store(9545; GFX6-LABEL: local_singlethread_one_as_unordered_store:9546; GFX6: ; %bb.0: ; %entry9547; GFX6-NEXT: s_load_dword s5, s[8:9], 0x19548; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr59549; GFX6-NEXT: s_load_dword s4, s[8:9], 0x09550; GFX6-NEXT: s_mov_b32 m0, -19551; GFX6-NEXT: s_waitcnt lgkmcnt(0)9552; GFX6-NEXT: v_mov_b32_e32 v0, s59553; GFX6-NEXT: v_mov_b32_e32 v1, s49554; GFX6-NEXT: ds_write_b32 v0, v19555; GFX6-NEXT: s_endpgm9556;9557; GFX7-LABEL: local_singlethread_one_as_unordered_store:9558; GFX7: ; %bb.0: ; %entry9559; GFX7-NEXT: s_load_dword s4, s[8:9], 0x09560; GFX7-NEXT: s_load_dword s5, s[8:9], 0x19561; GFX7-NEXT: s_mov_b32 m0, -19562; GFX7-NEXT: s_waitcnt lgkmcnt(0)9563; GFX7-NEXT: v_mov_b32_e32 v0, s59564; GFX7-NEXT: v_mov_b32_e32 v1, s49565; GFX7-NEXT: ds_write_b32 v0, v19566; GFX7-NEXT: s_endpgm9567;9568; GFX10-WGP-LABEL: local_singlethread_one_as_unordered_store:9569; GFX10-WGP: ; %bb.0: ; %entry9570; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x09571; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x49572; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)9573; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s59574; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s49575; GFX10-WGP-NEXT: ds_write_b32 v0, v19576; GFX10-WGP-NEXT: s_endpgm9577;9578; GFX10-CU-LABEL: local_singlethread_one_as_unordered_store:9579; GFX10-CU: ; %bb.0: ; %entry9580; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x09581; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x49582; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)9583; GFX10-CU-NEXT: v_mov_b32_e32 v0, s59584; GFX10-CU-NEXT: v_mov_b32_e32 v1, s49585; GFX10-CU-NEXT: ds_write_b32 v0, v19586; GFX10-CU-NEXT: s_endpgm9587;9588; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_unordered_store:9589; SKIP-CACHE-INV: ; %bb.0: ; %entry9590; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x09591; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x19592; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -19593; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)9594; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s19595; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s09596; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v19597; SKIP-CACHE-INV-NEXT: s_endpgm9598;9599; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_unordered_store:9600; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry9601; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x09602; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x49603; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9604; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s59605; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s49606; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v19607; GFX90A-NOTTGSPLIT-NEXT: s_endpgm9608;9609; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_unordered_store:9610; GFX90A-TGSPLIT: ; %bb.0: ; %entry9611; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x09612; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x49613; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9614; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s59615; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s49616; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v19617; GFX90A-TGSPLIT-NEXT: s_endpgm9618;9619; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_unordered_store:9620; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry9621; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x09622; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x49623; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9624; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s19625; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s09626; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v19627; GFX942-NOTTGSPLIT-NEXT: s_endpgm9628;9629; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_unordered_store:9630; GFX942-TGSPLIT: ; %bb.0: ; %entry9631; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x09632; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x49633; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9634; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s19635; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s09636; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v19637; GFX942-TGSPLIT-NEXT: s_endpgm9638;9639; GFX11-WGP-LABEL: local_singlethread_one_as_unordered_store:9640; GFX11-WGP: ; %bb.0: ; %entry9641; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x09642; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x49643; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)9644; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s19645; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s09646; GFX11-WGP-NEXT: ds_store_b32 v0, v19647; GFX11-WGP-NEXT: s_endpgm9648;9649; GFX11-CU-LABEL: local_singlethread_one_as_unordered_store:9650; GFX11-CU: ; %bb.0: ; %entry9651; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x09652; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x49653; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)9654; GFX11-CU-NEXT: v_mov_b32_e32 v0, s19655; GFX11-CU-NEXT: v_mov_b32_e32 v1, s09656; GFX11-CU-NEXT: ds_store_b32 v0, v19657; GFX11-CU-NEXT: s_endpgm9658;9659; GFX12-WGP-LABEL: local_singlethread_one_as_unordered_store:9660; GFX12-WGP: ; %bb.0: ; %entry9661; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x09662; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x49663; GFX12-WGP-NEXT: s_wait_kmcnt 0x09664; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s19665; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s09666; GFX12-WGP-NEXT: ds_store_b32 v0, v19667; GFX12-WGP-NEXT: s_endpgm9668;9669; GFX12-CU-LABEL: local_singlethread_one_as_unordered_store:9670; GFX12-CU: ; %bb.0: ; %entry9671; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x09672; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x49673; GFX12-CU-NEXT: s_wait_kmcnt 0x09674; GFX12-CU-NEXT: v_mov_b32_e32 v0, s19675; GFX12-CU-NEXT: v_mov_b32_e32 v1, s09676; GFX12-CU-NEXT: ds_store_b32 v0, v19677; GFX12-CU-NEXT: s_endpgm9678;9679; GFX1250-LABEL: local_singlethread_one_as_unordered_store:9680; GFX1250: ; %bb.0: ; %entry9681; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 19682; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x09683; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x49684; GFX1250-NEXT: s_wait_kmcnt 0x09685; GFX1250-NEXT: v_mov_b32_e32 v0, s19686; GFX1250-NEXT: v_mov_b32_e32 v1, s09687; GFX1250-NEXT: ds_store_b32 v0, v19688; GFX1250-NEXT: s_endpgm9689 i32 %in, ptr addrspace(3) %out) {9690entry:9691 store atomic i32 %in, ptr addrspace(3) %out syncscope("singlethread-one-as") unordered, align 49692 ret void9693}9694 9695define amdgpu_kernel void @local_singlethread_one_as_monotonic_store(9696; GFX6-LABEL: local_singlethread_one_as_monotonic_store:9697; GFX6: ; %bb.0: ; %entry9698; GFX6-NEXT: s_load_dword s5, s[8:9], 0x19699; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr59700; GFX6-NEXT: s_load_dword s4, s[8:9], 0x09701; GFX6-NEXT: s_mov_b32 m0, -19702; GFX6-NEXT: s_waitcnt lgkmcnt(0)9703; GFX6-NEXT: v_mov_b32_e32 v0, s59704; GFX6-NEXT: v_mov_b32_e32 v1, s49705; GFX6-NEXT: ds_write_b32 v0, v19706; GFX6-NEXT: s_endpgm9707;9708; GFX7-LABEL: local_singlethread_one_as_monotonic_store:9709; GFX7: ; %bb.0: ; %entry9710; GFX7-NEXT: s_load_dword s4, s[8:9], 0x09711; GFX7-NEXT: s_load_dword s5, s[8:9], 0x19712; GFX7-NEXT: s_mov_b32 m0, -19713; GFX7-NEXT: s_waitcnt lgkmcnt(0)9714; GFX7-NEXT: v_mov_b32_e32 v0, s59715; GFX7-NEXT: v_mov_b32_e32 v1, s49716; GFX7-NEXT: ds_write_b32 v0, v19717; GFX7-NEXT: s_endpgm9718;9719; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_store:9720; GFX10-WGP: ; %bb.0: ; %entry9721; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x09722; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x49723; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)9724; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s59725; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s49726; GFX10-WGP-NEXT: ds_write_b32 v0, v19727; GFX10-WGP-NEXT: s_endpgm9728;9729; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_store:9730; GFX10-CU: ; %bb.0: ; %entry9731; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x09732; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x49733; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)9734; GFX10-CU-NEXT: v_mov_b32_e32 v0, s59735; GFX10-CU-NEXT: v_mov_b32_e32 v1, s49736; GFX10-CU-NEXT: ds_write_b32 v0, v19737; GFX10-CU-NEXT: s_endpgm9738;9739; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_store:9740; SKIP-CACHE-INV: ; %bb.0: ; %entry9741; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x09742; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x19743; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -19744; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)9745; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s19746; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s09747; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v19748; SKIP-CACHE-INV-NEXT: s_endpgm9749;9750; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_store:9751; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry9752; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x09753; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x49754; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9755; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s59756; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s49757; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v19758; GFX90A-NOTTGSPLIT-NEXT: s_endpgm9759;9760; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_store:9761; GFX90A-TGSPLIT: ; %bb.0: ; %entry9762; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x09763; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x49764; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9765; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s59766; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s49767; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v19768; GFX90A-TGSPLIT-NEXT: s_endpgm9769;9770; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_store:9771; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry9772; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x09773; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x49774; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9775; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s19776; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s09777; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v19778; GFX942-NOTTGSPLIT-NEXT: s_endpgm9779;9780; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_store:9781; GFX942-TGSPLIT: ; %bb.0: ; %entry9782; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x09783; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x49784; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9785; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s19786; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s09787; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v19788; GFX942-TGSPLIT-NEXT: s_endpgm9789;9790; GFX11-WGP-LABEL: local_singlethread_one_as_monotonic_store:9791; GFX11-WGP: ; %bb.0: ; %entry9792; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x09793; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x49794; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)9795; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s19796; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s09797; GFX11-WGP-NEXT: ds_store_b32 v0, v19798; GFX11-WGP-NEXT: s_endpgm9799;9800; GFX11-CU-LABEL: local_singlethread_one_as_monotonic_store:9801; GFX11-CU: ; %bb.0: ; %entry9802; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x09803; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x49804; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)9805; GFX11-CU-NEXT: v_mov_b32_e32 v0, s19806; GFX11-CU-NEXT: v_mov_b32_e32 v1, s09807; GFX11-CU-NEXT: ds_store_b32 v0, v19808; GFX11-CU-NEXT: s_endpgm9809;9810; GFX12-WGP-LABEL: local_singlethread_one_as_monotonic_store:9811; GFX12-WGP: ; %bb.0: ; %entry9812; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x09813; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x49814; GFX12-WGP-NEXT: s_wait_kmcnt 0x09815; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s19816; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s09817; GFX12-WGP-NEXT: ds_store_b32 v0, v19818; GFX12-WGP-NEXT: s_endpgm9819;9820; GFX12-CU-LABEL: local_singlethread_one_as_monotonic_store:9821; GFX12-CU: ; %bb.0: ; %entry9822; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x09823; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x49824; GFX12-CU-NEXT: s_wait_kmcnt 0x09825; GFX12-CU-NEXT: v_mov_b32_e32 v0, s19826; GFX12-CU-NEXT: v_mov_b32_e32 v1, s09827; GFX12-CU-NEXT: ds_store_b32 v0, v19828; GFX12-CU-NEXT: s_endpgm9829;9830; GFX1250-LABEL: local_singlethread_one_as_monotonic_store:9831; GFX1250: ; %bb.0: ; %entry9832; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 19833; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x09834; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x49835; GFX1250-NEXT: s_wait_kmcnt 0x09836; GFX1250-NEXT: v_mov_b32_e32 v0, s19837; GFX1250-NEXT: v_mov_b32_e32 v1, s09838; GFX1250-NEXT: ds_store_b32 v0, v19839; GFX1250-NEXT: s_endpgm9840 i32 %in, ptr addrspace(3) %out) {9841entry:9842 store atomic i32 %in, ptr addrspace(3) %out syncscope("singlethread-one-as") monotonic, align 49843 ret void9844}9845 9846define amdgpu_kernel void @local_singlethread_one_as_release_store(9847; GFX6-LABEL: local_singlethread_one_as_release_store:9848; GFX6: ; %bb.0: ; %entry9849; GFX6-NEXT: s_load_dword s5, s[8:9], 0x19850; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr59851; GFX6-NEXT: s_load_dword s4, s[8:9], 0x09852; GFX6-NEXT: s_mov_b32 m0, -19853; GFX6-NEXT: s_waitcnt lgkmcnt(0)9854; GFX6-NEXT: v_mov_b32_e32 v0, s59855; GFX6-NEXT: v_mov_b32_e32 v1, s49856; GFX6-NEXT: ds_write_b32 v0, v19857; GFX6-NEXT: s_endpgm9858;9859; GFX7-LABEL: local_singlethread_one_as_release_store:9860; GFX7: ; %bb.0: ; %entry9861; GFX7-NEXT: s_load_dword s4, s[8:9], 0x09862; GFX7-NEXT: s_load_dword s5, s[8:9], 0x19863; GFX7-NEXT: s_mov_b32 m0, -19864; GFX7-NEXT: s_waitcnt lgkmcnt(0)9865; GFX7-NEXT: v_mov_b32_e32 v0, s59866; GFX7-NEXT: v_mov_b32_e32 v1, s49867; GFX7-NEXT: ds_write_b32 v0, v19868; GFX7-NEXT: s_endpgm9869;9870; GFX10-WGP-LABEL: local_singlethread_one_as_release_store:9871; GFX10-WGP: ; %bb.0: ; %entry9872; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x09873; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x49874; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)9875; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s59876; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s49877; GFX10-WGP-NEXT: ds_write_b32 v0, v19878; GFX10-WGP-NEXT: s_endpgm9879;9880; GFX10-CU-LABEL: local_singlethread_one_as_release_store:9881; GFX10-CU: ; %bb.0: ; %entry9882; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x09883; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x49884; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)9885; GFX10-CU-NEXT: v_mov_b32_e32 v0, s59886; GFX10-CU-NEXT: v_mov_b32_e32 v1, s49887; GFX10-CU-NEXT: ds_write_b32 v0, v19888; GFX10-CU-NEXT: s_endpgm9889;9890; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_store:9891; SKIP-CACHE-INV: ; %bb.0: ; %entry9892; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x09893; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x19894; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -19895; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)9896; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s19897; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s09898; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v19899; SKIP-CACHE-INV-NEXT: s_endpgm9900;9901; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_store:9902; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry9903; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x09904; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x49905; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9906; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s59907; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s49908; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v19909; GFX90A-NOTTGSPLIT-NEXT: s_endpgm9910;9911; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_store:9912; GFX90A-TGSPLIT: ; %bb.0: ; %entry9913; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x09914; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x49915; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9916; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s59917; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s49918; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v19919; GFX90A-TGSPLIT-NEXT: s_endpgm9920;9921; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_store:9922; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry9923; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x09924; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x49925; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9926; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s19927; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s09928; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v19929; GFX942-NOTTGSPLIT-NEXT: s_endpgm9930;9931; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_release_store:9932; GFX942-TGSPLIT: ; %bb.0: ; %entry9933; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x09934; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x49935; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)9936; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s19937; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s09938; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v19939; GFX942-TGSPLIT-NEXT: s_endpgm9940;9941; GFX11-WGP-LABEL: local_singlethread_one_as_release_store:9942; GFX11-WGP: ; %bb.0: ; %entry9943; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x09944; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x49945; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)9946; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s19947; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s09948; GFX11-WGP-NEXT: ds_store_b32 v0, v19949; GFX11-WGP-NEXT: s_endpgm9950;9951; GFX11-CU-LABEL: local_singlethread_one_as_release_store:9952; GFX11-CU: ; %bb.0: ; %entry9953; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x09954; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x49955; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)9956; GFX11-CU-NEXT: v_mov_b32_e32 v0, s19957; GFX11-CU-NEXT: v_mov_b32_e32 v1, s09958; GFX11-CU-NEXT: ds_store_b32 v0, v19959; GFX11-CU-NEXT: s_endpgm9960;9961; GFX12-WGP-LABEL: local_singlethread_one_as_release_store:9962; GFX12-WGP: ; %bb.0: ; %entry9963; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x09964; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x49965; GFX12-WGP-NEXT: s_wait_kmcnt 0x09966; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s19967; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s09968; GFX12-WGP-NEXT: ds_store_b32 v0, v19969; GFX12-WGP-NEXT: s_endpgm9970;9971; GFX12-CU-LABEL: local_singlethread_one_as_release_store:9972; GFX12-CU: ; %bb.0: ; %entry9973; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x09974; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x49975; GFX12-CU-NEXT: s_wait_kmcnt 0x09976; GFX12-CU-NEXT: v_mov_b32_e32 v0, s19977; GFX12-CU-NEXT: v_mov_b32_e32 v1, s09978; GFX12-CU-NEXT: ds_store_b32 v0, v19979; GFX12-CU-NEXT: s_endpgm9980;9981; GFX1250-LABEL: local_singlethread_one_as_release_store:9982; GFX1250: ; %bb.0: ; %entry9983; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 19984; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x09985; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x49986; GFX1250-NEXT: s_wait_kmcnt 0x09987; GFX1250-NEXT: v_mov_b32_e32 v0, s19988; GFX1250-NEXT: v_mov_b32_e32 v1, s09989; GFX1250-NEXT: ds_store_b32 v0, v19990; GFX1250-NEXT: s_endpgm9991 i32 %in, ptr addrspace(3) %out) {9992entry:9993 store atomic i32 %in, ptr addrspace(3) %out syncscope("singlethread-one-as") release, align 49994 ret void9995}9996 9997define amdgpu_kernel void @local_singlethread_one_as_seq_cst_store(9998; GFX6-LABEL: local_singlethread_one_as_seq_cst_store:9999; GFX6: ; %bb.0: ; %entry10000; GFX6-NEXT: s_load_dword s5, s[8:9], 0x110001; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr510002; GFX6-NEXT: s_load_dword s4, s[8:9], 0x010003; GFX6-NEXT: s_mov_b32 m0, -110004; GFX6-NEXT: s_waitcnt lgkmcnt(0)10005; GFX6-NEXT: v_mov_b32_e32 v0, s510006; GFX6-NEXT: v_mov_b32_e32 v1, s410007; GFX6-NEXT: ds_write_b32 v0, v110008; GFX6-NEXT: s_endpgm10009;10010; GFX7-LABEL: local_singlethread_one_as_seq_cst_store:10011; GFX7: ; %bb.0: ; %entry10012; GFX7-NEXT: s_load_dword s4, s[8:9], 0x010013; GFX7-NEXT: s_load_dword s5, s[8:9], 0x110014; GFX7-NEXT: s_mov_b32 m0, -110015; GFX7-NEXT: s_waitcnt lgkmcnt(0)10016; GFX7-NEXT: v_mov_b32_e32 v0, s510017; GFX7-NEXT: v_mov_b32_e32 v1, s410018; GFX7-NEXT: ds_write_b32 v0, v110019; GFX7-NEXT: s_endpgm10020;10021; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_store:10022; GFX10-WGP: ; %bb.0: ; %entry10023; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x010024; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x410025; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)10026; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s510027; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s410028; GFX10-WGP-NEXT: ds_write_b32 v0, v110029; GFX10-WGP-NEXT: s_endpgm10030;10031; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_store:10032; GFX10-CU: ; %bb.0: ; %entry10033; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x010034; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x410035; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)10036; GFX10-CU-NEXT: v_mov_b32_e32 v0, s510037; GFX10-CU-NEXT: v_mov_b32_e32 v1, s410038; GFX10-CU-NEXT: ds_write_b32 v0, v110039; GFX10-CU-NEXT: s_endpgm10040;10041; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_store:10042; SKIP-CACHE-INV: ; %bb.0: ; %entry10043; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x010044; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x110045; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -110046; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)10047; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s110048; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s010049; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v110050; SKIP-CACHE-INV-NEXT: s_endpgm10051;10052; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_store:10053; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry10054; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x010055; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x410056; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10057; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s510058; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s410059; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v110060; GFX90A-NOTTGSPLIT-NEXT: s_endpgm10061;10062; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_store:10063; GFX90A-TGSPLIT: ; %bb.0: ; %entry10064; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x010065; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x410066; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10067; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s510068; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s410069; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v110070; GFX90A-TGSPLIT-NEXT: s_endpgm10071;10072; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_store:10073; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry10074; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x010075; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x410076; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10077; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s110078; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s010079; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v110080; GFX942-NOTTGSPLIT-NEXT: s_endpgm10081;10082; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_store:10083; GFX942-TGSPLIT: ; %bb.0: ; %entry10084; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x010085; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x410086; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10087; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s110088; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s010089; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v110090; GFX942-TGSPLIT-NEXT: s_endpgm10091;10092; GFX11-WGP-LABEL: local_singlethread_one_as_seq_cst_store:10093; GFX11-WGP: ; %bb.0: ; %entry10094; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x010095; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x410096; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)10097; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s110098; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s010099; GFX11-WGP-NEXT: ds_store_b32 v0, v110100; GFX11-WGP-NEXT: s_endpgm10101;10102; GFX11-CU-LABEL: local_singlethread_one_as_seq_cst_store:10103; GFX11-CU: ; %bb.0: ; %entry10104; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x010105; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x410106; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)10107; GFX11-CU-NEXT: v_mov_b32_e32 v0, s110108; GFX11-CU-NEXT: v_mov_b32_e32 v1, s010109; GFX11-CU-NEXT: ds_store_b32 v0, v110110; GFX11-CU-NEXT: s_endpgm10111;10112; GFX12-WGP-LABEL: local_singlethread_one_as_seq_cst_store:10113; GFX12-WGP: ; %bb.0: ; %entry10114; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x010115; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x410116; GFX12-WGP-NEXT: s_wait_kmcnt 0x010117; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s110118; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s010119; GFX12-WGP-NEXT: ds_store_b32 v0, v110120; GFX12-WGP-NEXT: s_endpgm10121;10122; GFX12-CU-LABEL: local_singlethread_one_as_seq_cst_store:10123; GFX12-CU: ; %bb.0: ; %entry10124; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x010125; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x410126; GFX12-CU-NEXT: s_wait_kmcnt 0x010127; GFX12-CU-NEXT: v_mov_b32_e32 v0, s110128; GFX12-CU-NEXT: v_mov_b32_e32 v1, s010129; GFX12-CU-NEXT: ds_store_b32 v0, v110130; GFX12-CU-NEXT: s_endpgm10131;10132; GFX1250-LABEL: local_singlethread_one_as_seq_cst_store:10133; GFX1250: ; %bb.0: ; %entry10134; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 110135; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x010136; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x410137; GFX1250-NEXT: s_wait_kmcnt 0x010138; GFX1250-NEXT: v_mov_b32_e32 v0, s110139; GFX1250-NEXT: v_mov_b32_e32 v1, s010140; GFX1250-NEXT: ds_store_b32 v0, v110141; GFX1250-NEXT: s_endpgm10142 i32 %in, ptr addrspace(3) %out) {10143entry:10144 store atomic i32 %in, ptr addrspace(3) %out syncscope("singlethread-one-as") seq_cst, align 410145 ret void10146}10147 10148define amdgpu_kernel void @local_singlethread_one_as_monotonic_atomicrmw(10149; GFX6-LABEL: local_singlethread_one_as_monotonic_atomicrmw:10150; GFX6: ; %bb.0: ; %entry10151; GFX6-NEXT: s_load_dword s5, s[8:9], 0x010152; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr510153; GFX6-NEXT: s_load_dword s4, s[8:9], 0x110154; GFX6-NEXT: s_mov_b32 m0, -110155; GFX6-NEXT: s_waitcnt lgkmcnt(0)10156; GFX6-NEXT: v_mov_b32_e32 v0, s510157; GFX6-NEXT: v_mov_b32_e32 v1, s410158; GFX6-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110159; GFX6-NEXT: s_endpgm10160;10161; GFX7-LABEL: local_singlethread_one_as_monotonic_atomicrmw:10162; GFX7: ; %bb.0: ; %entry10163; GFX7-NEXT: s_load_dword s5, s[8:9], 0x010164; GFX7-NEXT: s_load_dword s4, s[8:9], 0x110165; GFX7-NEXT: s_mov_b32 m0, -110166; GFX7-NEXT: s_waitcnt lgkmcnt(0)10167; GFX7-NEXT: v_mov_b32_e32 v0, s510168; GFX7-NEXT: v_mov_b32_e32 v1, s410169; GFX7-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110170; GFX7-NEXT: s_endpgm10171;10172; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_atomicrmw:10173; GFX10-WGP: ; %bb.0: ; %entry10174; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x010175; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x410176; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)10177; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s510178; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s410179; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110180; GFX10-WGP-NEXT: s_endpgm10181;10182; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_atomicrmw:10183; GFX10-CU: ; %bb.0: ; %entry10184; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x010185; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x410186; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)10187; GFX10-CU-NEXT: v_mov_b32_e32 v0, s510188; GFX10-CU-NEXT: v_mov_b32_e32 v1, s410189; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110190; GFX10-CU-NEXT: s_endpgm10191;10192; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_atomicrmw:10193; SKIP-CACHE-INV: ; %bb.0: ; %entry10194; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x010195; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x110196; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -110197; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)10198; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s110199; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s010200; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110201; SKIP-CACHE-INV-NEXT: s_endpgm10202;10203; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_atomicrmw:10204; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry10205; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x010206; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x410207; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10208; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s510209; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s410210; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110211; GFX90A-NOTTGSPLIT-NEXT: s_endpgm10212;10213; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_atomicrmw:10214; GFX90A-TGSPLIT: ; %bb.0: ; %entry10215; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x010216; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x410217; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10218; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s510219; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s410220; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110221; GFX90A-TGSPLIT-NEXT: s_endpgm10222;10223; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_atomicrmw:10224; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry10225; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x010226; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x410227; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10228; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s110229; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s010230; GFX942-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110231; GFX942-NOTTGSPLIT-NEXT: s_endpgm10232;10233; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_atomicrmw:10234; GFX942-TGSPLIT: ; %bb.0: ; %entry10235; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x010236; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x410237; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10238; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s110239; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s010240; GFX942-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110241; GFX942-TGSPLIT-NEXT: s_endpgm10242;10243; GFX11-WGP-LABEL: local_singlethread_one_as_monotonic_atomicrmw:10244; GFX11-WGP: ; %bb.0: ; %entry10245; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x010246; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x410247; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)10248; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s110249; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s010250; GFX11-WGP-NEXT: ds_storexchg_rtn_b32 v0, v0, v110251; GFX11-WGP-NEXT: s_endpgm10252;10253; GFX11-CU-LABEL: local_singlethread_one_as_monotonic_atomicrmw:10254; GFX11-CU: ; %bb.0: ; %entry10255; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x010256; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x410257; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)10258; GFX11-CU-NEXT: v_mov_b32_e32 v0, s110259; GFX11-CU-NEXT: v_mov_b32_e32 v1, s010260; GFX11-CU-NEXT: ds_storexchg_rtn_b32 v0, v0, v110261; GFX11-CU-NEXT: s_endpgm10262;10263; GFX12-WGP-LABEL: local_singlethread_one_as_monotonic_atomicrmw:10264; GFX12-WGP: ; %bb.0: ; %entry10265; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x010266; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x410267; GFX12-WGP-NEXT: s_wait_kmcnt 0x010268; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s110269; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s010270; GFX12-WGP-NEXT: ds_storexchg_rtn_b32 v0, v0, v110271; GFX12-WGP-NEXT: s_endpgm10272;10273; GFX12-CU-LABEL: local_singlethread_one_as_monotonic_atomicrmw:10274; GFX12-CU: ; %bb.0: ; %entry10275; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x010276; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x410277; GFX12-CU-NEXT: s_wait_kmcnt 0x010278; GFX12-CU-NEXT: v_mov_b32_e32 v0, s110279; GFX12-CU-NEXT: v_mov_b32_e32 v1, s010280; GFX12-CU-NEXT: ds_storexchg_rtn_b32 v0, v0, v110281; GFX12-CU-NEXT: s_endpgm10282;10283; GFX1250-LABEL: local_singlethread_one_as_monotonic_atomicrmw:10284; GFX1250: ; %bb.0: ; %entry10285; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 110286; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x010287; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x410288; GFX1250-NEXT: s_wait_kmcnt 0x010289; GFX1250-NEXT: v_mov_b32_e32 v0, s110290; GFX1250-NEXT: v_mov_b32_e32 v1, s010291; GFX1250-NEXT: ds_storexchg_rtn_b32 v0, v0, v110292; GFX1250-NEXT: s_endpgm10293 ptr addrspace(3) %out, i32 %in) {10294entry:10295 %val = atomicrmw volatile xchg ptr addrspace(3) %out, i32 %in syncscope("singlethread-one-as") monotonic10296 ret void10297}10298 10299define amdgpu_kernel void @local_singlethread_one_as_acquire_atomicrmw(10300; GFX6-LABEL: local_singlethread_one_as_acquire_atomicrmw:10301; GFX6: ; %bb.0: ; %entry10302; GFX6-NEXT: s_load_dword s5, s[8:9], 0x010303; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr510304; GFX6-NEXT: s_load_dword s4, s[8:9], 0x110305; GFX6-NEXT: s_mov_b32 m0, -110306; GFX6-NEXT: s_waitcnt lgkmcnt(0)10307; GFX6-NEXT: v_mov_b32_e32 v0, s510308; GFX6-NEXT: v_mov_b32_e32 v1, s410309; GFX6-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110310; GFX6-NEXT: s_endpgm10311;10312; GFX7-LABEL: local_singlethread_one_as_acquire_atomicrmw:10313; GFX7: ; %bb.0: ; %entry10314; GFX7-NEXT: s_load_dword s5, s[8:9], 0x010315; GFX7-NEXT: s_load_dword s4, s[8:9], 0x110316; GFX7-NEXT: s_mov_b32 m0, -110317; GFX7-NEXT: s_waitcnt lgkmcnt(0)10318; GFX7-NEXT: v_mov_b32_e32 v0, s510319; GFX7-NEXT: v_mov_b32_e32 v1, s410320; GFX7-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110321; GFX7-NEXT: s_endpgm10322;10323; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_atomicrmw:10324; GFX10-WGP: ; %bb.0: ; %entry10325; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x010326; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x410327; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)10328; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s510329; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s410330; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110331; GFX10-WGP-NEXT: s_endpgm10332;10333; GFX10-CU-LABEL: local_singlethread_one_as_acquire_atomicrmw:10334; GFX10-CU: ; %bb.0: ; %entry10335; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x010336; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x410337; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)10338; GFX10-CU-NEXT: v_mov_b32_e32 v0, s510339; GFX10-CU-NEXT: v_mov_b32_e32 v1, s410340; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110341; GFX10-CU-NEXT: s_endpgm10342;10343; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_atomicrmw:10344; SKIP-CACHE-INV: ; %bb.0: ; %entry10345; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x010346; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x110347; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -110348; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)10349; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s110350; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s010351; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110352; SKIP-CACHE-INV-NEXT: s_endpgm10353;10354; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_atomicrmw:10355; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry10356; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x010357; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x410358; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10359; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s510360; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s410361; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110362; GFX90A-NOTTGSPLIT-NEXT: s_endpgm10363;10364; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_atomicrmw:10365; GFX90A-TGSPLIT: ; %bb.0: ; %entry10366; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x010367; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x410368; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10369; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s510370; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s410371; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110372; GFX90A-TGSPLIT-NEXT: s_endpgm10373;10374; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_atomicrmw:10375; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry10376; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x010377; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x410378; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10379; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s110380; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s010381; GFX942-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110382; GFX942-NOTTGSPLIT-NEXT: s_endpgm10383;10384; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_acquire_atomicrmw:10385; GFX942-TGSPLIT: ; %bb.0: ; %entry10386; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x010387; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x410388; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10389; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s110390; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s010391; GFX942-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110392; GFX942-TGSPLIT-NEXT: s_endpgm10393;10394; GFX11-WGP-LABEL: local_singlethread_one_as_acquire_atomicrmw:10395; GFX11-WGP: ; %bb.0: ; %entry10396; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x010397; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x410398; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)10399; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s110400; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s010401; GFX11-WGP-NEXT: ds_storexchg_rtn_b32 v0, v0, v110402; GFX11-WGP-NEXT: s_endpgm10403;10404; GFX11-CU-LABEL: local_singlethread_one_as_acquire_atomicrmw:10405; GFX11-CU: ; %bb.0: ; %entry10406; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x010407; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x410408; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)10409; GFX11-CU-NEXT: v_mov_b32_e32 v0, s110410; GFX11-CU-NEXT: v_mov_b32_e32 v1, s010411; GFX11-CU-NEXT: ds_storexchg_rtn_b32 v0, v0, v110412; GFX11-CU-NEXT: s_endpgm10413;10414; GFX12-WGP-LABEL: local_singlethread_one_as_acquire_atomicrmw:10415; GFX12-WGP: ; %bb.0: ; %entry10416; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x010417; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x410418; GFX12-WGP-NEXT: s_wait_kmcnt 0x010419; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s110420; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s010421; GFX12-WGP-NEXT: ds_storexchg_rtn_b32 v0, v0, v110422; GFX12-WGP-NEXT: s_endpgm10423;10424; GFX12-CU-LABEL: local_singlethread_one_as_acquire_atomicrmw:10425; GFX12-CU: ; %bb.0: ; %entry10426; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x010427; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x410428; GFX12-CU-NEXT: s_wait_kmcnt 0x010429; GFX12-CU-NEXT: v_mov_b32_e32 v0, s110430; GFX12-CU-NEXT: v_mov_b32_e32 v1, s010431; GFX12-CU-NEXT: ds_storexchg_rtn_b32 v0, v0, v110432; GFX12-CU-NEXT: s_endpgm10433;10434; GFX1250-LABEL: local_singlethread_one_as_acquire_atomicrmw:10435; GFX1250: ; %bb.0: ; %entry10436; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 110437; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x010438; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x410439; GFX1250-NEXT: s_wait_kmcnt 0x010440; GFX1250-NEXT: v_mov_b32_e32 v0, s110441; GFX1250-NEXT: v_mov_b32_e32 v1, s010442; GFX1250-NEXT: ds_storexchg_rtn_b32 v0, v0, v110443; GFX1250-NEXT: s_endpgm10444 ptr addrspace(3) %out, i32 %in) {10445entry:10446 %val = atomicrmw volatile xchg ptr addrspace(3) %out, i32 %in syncscope("singlethread-one-as") acquire10447 ret void10448}10449 10450define amdgpu_kernel void @local_singlethread_one_as_release_atomicrmw(10451; GFX6-LABEL: local_singlethread_one_as_release_atomicrmw:10452; GFX6: ; %bb.0: ; %entry10453; GFX6-NEXT: s_load_dword s5, s[8:9], 0x010454; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr510455; GFX6-NEXT: s_load_dword s4, s[8:9], 0x110456; GFX6-NEXT: s_mov_b32 m0, -110457; GFX6-NEXT: s_waitcnt lgkmcnt(0)10458; GFX6-NEXT: v_mov_b32_e32 v0, s510459; GFX6-NEXT: v_mov_b32_e32 v1, s410460; GFX6-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110461; GFX6-NEXT: s_endpgm10462;10463; GFX7-LABEL: local_singlethread_one_as_release_atomicrmw:10464; GFX7: ; %bb.0: ; %entry10465; GFX7-NEXT: s_load_dword s5, s[8:9], 0x010466; GFX7-NEXT: s_load_dword s4, s[8:9], 0x110467; GFX7-NEXT: s_mov_b32 m0, -110468; GFX7-NEXT: s_waitcnt lgkmcnt(0)10469; GFX7-NEXT: v_mov_b32_e32 v0, s510470; GFX7-NEXT: v_mov_b32_e32 v1, s410471; GFX7-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110472; GFX7-NEXT: s_endpgm10473;10474; GFX10-WGP-LABEL: local_singlethread_one_as_release_atomicrmw:10475; GFX10-WGP: ; %bb.0: ; %entry10476; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x010477; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x410478; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)10479; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s510480; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s410481; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110482; GFX10-WGP-NEXT: s_endpgm10483;10484; GFX10-CU-LABEL: local_singlethread_one_as_release_atomicrmw:10485; GFX10-CU: ; %bb.0: ; %entry10486; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x010487; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x410488; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)10489; GFX10-CU-NEXT: v_mov_b32_e32 v0, s510490; GFX10-CU-NEXT: v_mov_b32_e32 v1, s410491; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110492; GFX10-CU-NEXT: s_endpgm10493;10494; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_atomicrmw:10495; SKIP-CACHE-INV: ; %bb.0: ; %entry10496; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x010497; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x110498; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -110499; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)10500; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s110501; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s010502; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110503; SKIP-CACHE-INV-NEXT: s_endpgm10504;10505; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_atomicrmw:10506; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry10507; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x010508; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x410509; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10510; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s510511; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s410512; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110513; GFX90A-NOTTGSPLIT-NEXT: s_endpgm10514;10515; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_atomicrmw:10516; GFX90A-TGSPLIT: ; %bb.0: ; %entry10517; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x010518; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x410519; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10520; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s510521; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s410522; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110523; GFX90A-TGSPLIT-NEXT: s_endpgm10524;10525; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_atomicrmw:10526; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry10527; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x010528; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x410529; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10530; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s110531; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s010532; GFX942-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110533; GFX942-NOTTGSPLIT-NEXT: s_endpgm10534;10535; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_release_atomicrmw:10536; GFX942-TGSPLIT: ; %bb.0: ; %entry10537; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x010538; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x410539; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10540; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s110541; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s010542; GFX942-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110543; GFX942-TGSPLIT-NEXT: s_endpgm10544;10545; GFX11-WGP-LABEL: local_singlethread_one_as_release_atomicrmw:10546; GFX11-WGP: ; %bb.0: ; %entry10547; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x010548; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x410549; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)10550; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s110551; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s010552; GFX11-WGP-NEXT: ds_storexchg_rtn_b32 v0, v0, v110553; GFX11-WGP-NEXT: s_endpgm10554;10555; GFX11-CU-LABEL: local_singlethread_one_as_release_atomicrmw:10556; GFX11-CU: ; %bb.0: ; %entry10557; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x010558; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x410559; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)10560; GFX11-CU-NEXT: v_mov_b32_e32 v0, s110561; GFX11-CU-NEXT: v_mov_b32_e32 v1, s010562; GFX11-CU-NEXT: ds_storexchg_rtn_b32 v0, v0, v110563; GFX11-CU-NEXT: s_endpgm10564;10565; GFX12-WGP-LABEL: local_singlethread_one_as_release_atomicrmw:10566; GFX12-WGP: ; %bb.0: ; %entry10567; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x010568; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x410569; GFX12-WGP-NEXT: s_wait_kmcnt 0x010570; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s110571; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s010572; GFX12-WGP-NEXT: ds_storexchg_rtn_b32 v0, v0, v110573; GFX12-WGP-NEXT: s_endpgm10574;10575; GFX12-CU-LABEL: local_singlethread_one_as_release_atomicrmw:10576; GFX12-CU: ; %bb.0: ; %entry10577; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x010578; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x410579; GFX12-CU-NEXT: s_wait_kmcnt 0x010580; GFX12-CU-NEXT: v_mov_b32_e32 v0, s110581; GFX12-CU-NEXT: v_mov_b32_e32 v1, s010582; GFX12-CU-NEXT: ds_storexchg_rtn_b32 v0, v0, v110583; GFX12-CU-NEXT: s_endpgm10584;10585; GFX1250-LABEL: local_singlethread_one_as_release_atomicrmw:10586; GFX1250: ; %bb.0: ; %entry10587; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 110588; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x010589; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x410590; GFX1250-NEXT: s_wait_kmcnt 0x010591; GFX1250-NEXT: v_mov_b32_e32 v0, s110592; GFX1250-NEXT: v_mov_b32_e32 v1, s010593; GFX1250-NEXT: ds_storexchg_rtn_b32 v0, v0, v110594; GFX1250-NEXT: s_endpgm10595 ptr addrspace(3) %out, i32 %in) {10596entry:10597 %val = atomicrmw volatile xchg ptr addrspace(3) %out, i32 %in syncscope("singlethread-one-as") release10598 ret void10599}10600 10601define amdgpu_kernel void @local_singlethread_one_as_acq_rel_atomicrmw(10602; GFX6-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:10603; GFX6: ; %bb.0: ; %entry10604; GFX6-NEXT: s_load_dword s5, s[8:9], 0x010605; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr510606; GFX6-NEXT: s_load_dword s4, s[8:9], 0x110607; GFX6-NEXT: s_mov_b32 m0, -110608; GFX6-NEXT: s_waitcnt lgkmcnt(0)10609; GFX6-NEXT: v_mov_b32_e32 v0, s510610; GFX6-NEXT: v_mov_b32_e32 v1, s410611; GFX6-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110612; GFX6-NEXT: s_endpgm10613;10614; GFX7-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:10615; GFX7: ; %bb.0: ; %entry10616; GFX7-NEXT: s_load_dword s5, s[8:9], 0x010617; GFX7-NEXT: s_load_dword s4, s[8:9], 0x110618; GFX7-NEXT: s_mov_b32 m0, -110619; GFX7-NEXT: s_waitcnt lgkmcnt(0)10620; GFX7-NEXT: v_mov_b32_e32 v0, s510621; GFX7-NEXT: v_mov_b32_e32 v1, s410622; GFX7-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110623; GFX7-NEXT: s_endpgm10624;10625; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:10626; GFX10-WGP: ; %bb.0: ; %entry10627; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x010628; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x410629; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)10630; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s510631; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s410632; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110633; GFX10-WGP-NEXT: s_endpgm10634;10635; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:10636; GFX10-CU: ; %bb.0: ; %entry10637; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x010638; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x410639; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)10640; GFX10-CU-NEXT: v_mov_b32_e32 v0, s510641; GFX10-CU-NEXT: v_mov_b32_e32 v1, s410642; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110643; GFX10-CU-NEXT: s_endpgm10644;10645; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:10646; SKIP-CACHE-INV: ; %bb.0: ; %entry10647; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x010648; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x110649; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -110650; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)10651; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s110652; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s010653; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110654; SKIP-CACHE-INV-NEXT: s_endpgm10655;10656; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:10657; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry10658; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x010659; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x410660; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10661; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s510662; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s410663; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110664; GFX90A-NOTTGSPLIT-NEXT: s_endpgm10665;10666; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:10667; GFX90A-TGSPLIT: ; %bb.0: ; %entry10668; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x010669; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x410670; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10671; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s510672; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s410673; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110674; GFX90A-TGSPLIT-NEXT: s_endpgm10675;10676; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:10677; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry10678; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x010679; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x410680; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10681; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s110682; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s010683; GFX942-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110684; GFX942-NOTTGSPLIT-NEXT: s_endpgm10685;10686; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:10687; GFX942-TGSPLIT: ; %bb.0: ; %entry10688; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x010689; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x410690; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10691; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s110692; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s010693; GFX942-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110694; GFX942-TGSPLIT-NEXT: s_endpgm10695;10696; GFX11-WGP-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:10697; GFX11-WGP: ; %bb.0: ; %entry10698; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x010699; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x410700; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)10701; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s110702; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s010703; GFX11-WGP-NEXT: ds_storexchg_rtn_b32 v0, v0, v110704; GFX11-WGP-NEXT: s_endpgm10705;10706; GFX11-CU-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:10707; GFX11-CU: ; %bb.0: ; %entry10708; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x010709; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x410710; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)10711; GFX11-CU-NEXT: v_mov_b32_e32 v0, s110712; GFX11-CU-NEXT: v_mov_b32_e32 v1, s010713; GFX11-CU-NEXT: ds_storexchg_rtn_b32 v0, v0, v110714; GFX11-CU-NEXT: s_endpgm10715;10716; GFX12-WGP-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:10717; GFX12-WGP: ; %bb.0: ; %entry10718; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x010719; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x410720; GFX12-WGP-NEXT: s_wait_kmcnt 0x010721; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s110722; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s010723; GFX12-WGP-NEXT: ds_storexchg_rtn_b32 v0, v0, v110724; GFX12-WGP-NEXT: s_endpgm10725;10726; GFX12-CU-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:10727; GFX12-CU: ; %bb.0: ; %entry10728; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x010729; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x410730; GFX12-CU-NEXT: s_wait_kmcnt 0x010731; GFX12-CU-NEXT: v_mov_b32_e32 v0, s110732; GFX12-CU-NEXT: v_mov_b32_e32 v1, s010733; GFX12-CU-NEXT: ds_storexchg_rtn_b32 v0, v0, v110734; GFX12-CU-NEXT: s_endpgm10735;10736; GFX1250-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:10737; GFX1250: ; %bb.0: ; %entry10738; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 110739; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x010740; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x410741; GFX1250-NEXT: s_wait_kmcnt 0x010742; GFX1250-NEXT: v_mov_b32_e32 v0, s110743; GFX1250-NEXT: v_mov_b32_e32 v1, s010744; GFX1250-NEXT: ds_storexchg_rtn_b32 v0, v0, v110745; GFX1250-NEXT: s_endpgm10746 ptr addrspace(3) %out, i32 %in) {10747entry:10748 %val = atomicrmw volatile xchg ptr addrspace(3) %out, i32 %in syncscope("singlethread-one-as") acq_rel10749 ret void10750}10751 10752define amdgpu_kernel void @local_singlethread_one_as_seq_cst_atomicrmw(10753; GFX6-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:10754; GFX6: ; %bb.0: ; %entry10755; GFX6-NEXT: s_load_dword s5, s[8:9], 0x010756; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr510757; GFX6-NEXT: s_load_dword s4, s[8:9], 0x110758; GFX6-NEXT: s_mov_b32 m0, -110759; GFX6-NEXT: s_waitcnt lgkmcnt(0)10760; GFX6-NEXT: v_mov_b32_e32 v0, s510761; GFX6-NEXT: v_mov_b32_e32 v1, s410762; GFX6-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110763; GFX6-NEXT: s_endpgm10764;10765; GFX7-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:10766; GFX7: ; %bb.0: ; %entry10767; GFX7-NEXT: s_load_dword s5, s[8:9], 0x010768; GFX7-NEXT: s_load_dword s4, s[8:9], 0x110769; GFX7-NEXT: s_mov_b32 m0, -110770; GFX7-NEXT: s_waitcnt lgkmcnt(0)10771; GFX7-NEXT: v_mov_b32_e32 v0, s510772; GFX7-NEXT: v_mov_b32_e32 v1, s410773; GFX7-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110774; GFX7-NEXT: s_endpgm10775;10776; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:10777; GFX10-WGP: ; %bb.0: ; %entry10778; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x010779; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x410780; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)10781; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s510782; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s410783; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110784; GFX10-WGP-NEXT: s_endpgm10785;10786; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:10787; GFX10-CU: ; %bb.0: ; %entry10788; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x010789; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x410790; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)10791; GFX10-CU-NEXT: v_mov_b32_e32 v0, s510792; GFX10-CU-NEXT: v_mov_b32_e32 v1, s410793; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110794; GFX10-CU-NEXT: s_endpgm10795;10796; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:10797; SKIP-CACHE-INV: ; %bb.0: ; %entry10798; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x010799; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x110800; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -110801; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)10802; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s110803; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s010804; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110805; SKIP-CACHE-INV-NEXT: s_endpgm10806;10807; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:10808; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry10809; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x010810; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x410811; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10812; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s510813; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s410814; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110815; GFX90A-NOTTGSPLIT-NEXT: s_endpgm10816;10817; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:10818; GFX90A-TGSPLIT: ; %bb.0: ; %entry10819; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x010820; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x410821; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10822; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s510823; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s410824; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110825; GFX90A-TGSPLIT-NEXT: s_endpgm10826;10827; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:10828; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry10829; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x010830; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x410831; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10832; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s110833; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s010834; GFX942-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110835; GFX942-NOTTGSPLIT-NEXT: s_endpgm10836;10837; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:10838; GFX942-TGSPLIT: ; %bb.0: ; %entry10839; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x010840; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x410841; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10842; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s110843; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s010844; GFX942-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v110845; GFX942-TGSPLIT-NEXT: s_endpgm10846;10847; GFX11-WGP-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:10848; GFX11-WGP: ; %bb.0: ; %entry10849; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x010850; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x410851; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)10852; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s110853; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s010854; GFX11-WGP-NEXT: ds_storexchg_rtn_b32 v0, v0, v110855; GFX11-WGP-NEXT: s_endpgm10856;10857; GFX11-CU-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:10858; GFX11-CU: ; %bb.0: ; %entry10859; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x010860; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x410861; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)10862; GFX11-CU-NEXT: v_mov_b32_e32 v0, s110863; GFX11-CU-NEXT: v_mov_b32_e32 v1, s010864; GFX11-CU-NEXT: ds_storexchg_rtn_b32 v0, v0, v110865; GFX11-CU-NEXT: s_endpgm10866;10867; GFX12-WGP-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:10868; GFX12-WGP: ; %bb.0: ; %entry10869; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x010870; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x410871; GFX12-WGP-NEXT: s_wait_kmcnt 0x010872; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s110873; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s010874; GFX12-WGP-NEXT: ds_storexchg_rtn_b32 v0, v0, v110875; GFX12-WGP-NEXT: s_endpgm10876;10877; GFX12-CU-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:10878; GFX12-CU: ; %bb.0: ; %entry10879; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x010880; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x410881; GFX12-CU-NEXT: s_wait_kmcnt 0x010882; GFX12-CU-NEXT: v_mov_b32_e32 v0, s110883; GFX12-CU-NEXT: v_mov_b32_e32 v1, s010884; GFX12-CU-NEXT: ds_storexchg_rtn_b32 v0, v0, v110885; GFX12-CU-NEXT: s_endpgm10886;10887; GFX1250-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:10888; GFX1250: ; %bb.0: ; %entry10889; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 110890; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x010891; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x410892; GFX1250-NEXT: s_wait_kmcnt 0x010893; GFX1250-NEXT: v_mov_b32_e32 v0, s110894; GFX1250-NEXT: v_mov_b32_e32 v1, s010895; GFX1250-NEXT: ds_storexchg_rtn_b32 v0, v0, v110896; GFX1250-NEXT: s_endpgm10897 ptr addrspace(3) %out, i32 %in) {10898entry:10899 %val = atomicrmw volatile xchg ptr addrspace(3) %out, i32 %in syncscope("singlethread-one-as") seq_cst10900 ret void10901}10902 10903define amdgpu_kernel void @local_singlethread_one_as_acquire_ret_atomicrmw(10904; GFX6-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:10905; GFX6: ; %bb.0: ; %entry10906; GFX6-NEXT: s_load_dword s4, s[8:9], 0x010907; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr410908; GFX6-NEXT: s_load_dword s5, s[8:9], 0x110909; GFX6-NEXT: s_mov_b32 m0, -110910; GFX6-NEXT: s_waitcnt lgkmcnt(0)10911; GFX6-NEXT: v_mov_b32_e32 v0, s410912; GFX6-NEXT: v_mov_b32_e32 v1, s510913; GFX6-NEXT: ds_wrxchg_rtn_b32 v1, v0, v110914; GFX6-NEXT: s_mov_b32 m0, -110915; GFX6-NEXT: v_mov_b32_e32 v0, s410916; GFX6-NEXT: s_waitcnt lgkmcnt(0)10917; GFX6-NEXT: ds_write_b32 v0, v110918; GFX6-NEXT: s_endpgm10919;10920; GFX7-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:10921; GFX7: ; %bb.0: ; %entry10922; GFX7-NEXT: s_load_dword s4, s[8:9], 0x010923; GFX7-NEXT: s_load_dword s5, s[8:9], 0x110924; GFX7-NEXT: s_mov_b32 m0, -110925; GFX7-NEXT: s_waitcnt lgkmcnt(0)10926; GFX7-NEXT: v_mov_b32_e32 v0, s410927; GFX7-NEXT: v_mov_b32_e32 v1, s510928; GFX7-NEXT: ds_wrxchg_rtn_b32 v1, v0, v110929; GFX7-NEXT: s_mov_b32 m0, -110930; GFX7-NEXT: v_mov_b32_e32 v0, s410931; GFX7-NEXT: s_waitcnt lgkmcnt(0)10932; GFX7-NEXT: ds_write_b32 v0, v110933; GFX7-NEXT: s_endpgm10934;10935; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:10936; GFX10-WGP: ; %bb.0: ; %entry10937; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x010938; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x410939; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)10940; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s410941; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s510942; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v1, v0, v110943; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s410944; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)10945; GFX10-WGP-NEXT: ds_write_b32 v0, v110946; GFX10-WGP-NEXT: s_endpgm10947;10948; GFX10-CU-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:10949; GFX10-CU: ; %bb.0: ; %entry10950; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x010951; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x410952; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)10953; GFX10-CU-NEXT: v_mov_b32_e32 v0, s410954; GFX10-CU-NEXT: v_mov_b32_e32 v1, s510955; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v1, v0, v110956; GFX10-CU-NEXT: v_mov_b32_e32 v0, s410957; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)10958; GFX10-CU-NEXT: ds_write_b32 v0, v110959; GFX10-CU-NEXT: s_endpgm10960;10961; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:10962; SKIP-CACHE-INV: ; %bb.0: ; %entry10963; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x010964; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x110965; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -110966; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)10967; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s010968; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s110969; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v1, v0, v110970; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -110971; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s010972; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)10973; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v110974; SKIP-CACHE-INV-NEXT: s_endpgm10975;10976; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:10977; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry10978; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x010979; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x410980; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10981; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s410982; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s510983; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v110984; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s410985; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10986; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v110987; GFX90A-NOTTGSPLIT-NEXT: s_endpgm10988;10989; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:10990; GFX90A-TGSPLIT: ; %bb.0: ; %entry10991; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x010992; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x410993; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10994; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s410995; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s510996; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v110997; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s410998; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)10999; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v111000; GFX90A-TGSPLIT-NEXT: s_endpgm11001;11002; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:11003; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry11004; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x011005; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x411006; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11007; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s011008; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s111009; GFX942-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v111010; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s011011; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11012; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v111013; GFX942-NOTTGSPLIT-NEXT: s_endpgm11014;11015; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:11016; GFX942-TGSPLIT: ; %bb.0: ; %entry11017; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x011018; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x411019; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11020; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s011021; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s111022; GFX942-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v111023; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s011024; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11025; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v111026; GFX942-TGSPLIT-NEXT: s_endpgm11027;11028; GFX11-WGP-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:11029; GFX11-WGP: ; %bb.0: ; %entry11030; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x011031; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x411032; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)11033; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s011034; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s111035; GFX11-WGP-NEXT: ds_storexchg_rtn_b32 v1, v0, v111036; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s011037; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)11038; GFX11-WGP-NEXT: ds_store_b32 v0, v111039; GFX11-WGP-NEXT: s_endpgm11040;11041; GFX11-CU-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:11042; GFX11-CU: ; %bb.0: ; %entry11043; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x011044; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x411045; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)11046; GFX11-CU-NEXT: v_mov_b32_e32 v0, s011047; GFX11-CU-NEXT: v_mov_b32_e32 v1, s111048; GFX11-CU-NEXT: ds_storexchg_rtn_b32 v1, v0, v111049; GFX11-CU-NEXT: v_mov_b32_e32 v0, s011050; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)11051; GFX11-CU-NEXT: ds_store_b32 v0, v111052; GFX11-CU-NEXT: s_endpgm11053;11054; GFX12-WGP-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:11055; GFX12-WGP: ; %bb.0: ; %entry11056; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x011057; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x411058; GFX12-WGP-NEXT: s_wait_kmcnt 0x011059; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s011060; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s111061; GFX12-WGP-NEXT: ds_storexchg_rtn_b32 v1, v0, v111062; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s011063; GFX12-WGP-NEXT: s_wait_dscnt 0x011064; GFX12-WGP-NEXT: ds_store_b32 v0, v111065; GFX12-WGP-NEXT: s_endpgm11066;11067; GFX12-CU-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:11068; GFX12-CU: ; %bb.0: ; %entry11069; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x011070; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x411071; GFX12-CU-NEXT: s_wait_kmcnt 0x011072; GFX12-CU-NEXT: v_mov_b32_e32 v0, s011073; GFX12-CU-NEXT: v_mov_b32_e32 v1, s111074; GFX12-CU-NEXT: ds_storexchg_rtn_b32 v1, v0, v111075; GFX12-CU-NEXT: v_mov_b32_e32 v0, s011076; GFX12-CU-NEXT: s_wait_dscnt 0x011077; GFX12-CU-NEXT: ds_store_b32 v0, v111078; GFX12-CU-NEXT: s_endpgm11079;11080; GFX1250-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:11081; GFX1250: ; %bb.0: ; %entry11082; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 111083; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x011084; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x411085; GFX1250-NEXT: s_wait_kmcnt 0x011086; GFX1250-NEXT: v_mov_b32_e32 v0, s011087; GFX1250-NEXT: v_mov_b32_e32 v1, s111088; GFX1250-NEXT: ds_storexchg_rtn_b32 v1, v0, v111089; GFX1250-NEXT: v_mov_b32_e32 v0, s011090; GFX1250-NEXT: s_wait_dscnt 0x011091; GFX1250-NEXT: ds_store_b32 v0, v111092; GFX1250-NEXT: s_endpgm11093 ptr addrspace(3) %out, i32 %in) {11094entry:11095 %val = atomicrmw volatile xchg ptr addrspace(3) %out, i32 %in syncscope("singlethread-one-as") acquire11096 store i32 %val, ptr addrspace(3) %out, align 411097 ret void11098}11099 11100define amdgpu_kernel void @local_singlethread_one_as_acq_rel_ret_atomicrmw(11101; GFX6-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:11102; GFX6: ; %bb.0: ; %entry11103; GFX6-NEXT: s_load_dword s4, s[8:9], 0x011104; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr411105; GFX6-NEXT: s_load_dword s5, s[8:9], 0x111106; GFX6-NEXT: s_mov_b32 m0, -111107; GFX6-NEXT: s_waitcnt lgkmcnt(0)11108; GFX6-NEXT: v_mov_b32_e32 v0, s411109; GFX6-NEXT: v_mov_b32_e32 v1, s511110; GFX6-NEXT: ds_wrxchg_rtn_b32 v1, v0, v111111; GFX6-NEXT: s_mov_b32 m0, -111112; GFX6-NEXT: v_mov_b32_e32 v0, s411113; GFX6-NEXT: s_waitcnt lgkmcnt(0)11114; GFX6-NEXT: ds_write_b32 v0, v111115; GFX6-NEXT: s_endpgm11116;11117; GFX7-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:11118; GFX7: ; %bb.0: ; %entry11119; GFX7-NEXT: s_load_dword s4, s[8:9], 0x011120; GFX7-NEXT: s_load_dword s5, s[8:9], 0x111121; GFX7-NEXT: s_mov_b32 m0, -111122; GFX7-NEXT: s_waitcnt lgkmcnt(0)11123; GFX7-NEXT: v_mov_b32_e32 v0, s411124; GFX7-NEXT: v_mov_b32_e32 v1, s511125; GFX7-NEXT: ds_wrxchg_rtn_b32 v1, v0, v111126; GFX7-NEXT: s_mov_b32 m0, -111127; GFX7-NEXT: v_mov_b32_e32 v0, s411128; GFX7-NEXT: s_waitcnt lgkmcnt(0)11129; GFX7-NEXT: ds_write_b32 v0, v111130; GFX7-NEXT: s_endpgm11131;11132; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:11133; GFX10-WGP: ; %bb.0: ; %entry11134; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x011135; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x411136; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)11137; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s411138; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s511139; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v1, v0, v111140; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s411141; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)11142; GFX10-WGP-NEXT: ds_write_b32 v0, v111143; GFX10-WGP-NEXT: s_endpgm11144;11145; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:11146; GFX10-CU: ; %bb.0: ; %entry11147; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x011148; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x411149; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)11150; GFX10-CU-NEXT: v_mov_b32_e32 v0, s411151; GFX10-CU-NEXT: v_mov_b32_e32 v1, s511152; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v1, v0, v111153; GFX10-CU-NEXT: v_mov_b32_e32 v0, s411154; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)11155; GFX10-CU-NEXT: ds_write_b32 v0, v111156; GFX10-CU-NEXT: s_endpgm11157;11158; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:11159; SKIP-CACHE-INV: ; %bb.0: ; %entry11160; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x011161; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x111162; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -111163; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)11164; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s011165; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s111166; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v1, v0, v111167; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -111168; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s011169; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)11170; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v111171; SKIP-CACHE-INV-NEXT: s_endpgm11172;11173; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:11174; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry11175; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x011176; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x411177; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11178; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s411179; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s511180; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v111181; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s411182; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11183; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v111184; GFX90A-NOTTGSPLIT-NEXT: s_endpgm11185;11186; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:11187; GFX90A-TGSPLIT: ; %bb.0: ; %entry11188; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x011189; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x411190; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11191; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s411192; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s511193; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v111194; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s411195; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11196; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v111197; GFX90A-TGSPLIT-NEXT: s_endpgm11198;11199; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:11200; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry11201; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x011202; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x411203; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11204; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s011205; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s111206; GFX942-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v111207; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s011208; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11209; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v111210; GFX942-NOTTGSPLIT-NEXT: s_endpgm11211;11212; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:11213; GFX942-TGSPLIT: ; %bb.0: ; %entry11214; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x011215; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x411216; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11217; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s011218; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s111219; GFX942-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v111220; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s011221; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11222; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v111223; GFX942-TGSPLIT-NEXT: s_endpgm11224;11225; GFX11-WGP-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:11226; GFX11-WGP: ; %bb.0: ; %entry11227; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x011228; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x411229; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)11230; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s011231; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s111232; GFX11-WGP-NEXT: ds_storexchg_rtn_b32 v1, v0, v111233; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s011234; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)11235; GFX11-WGP-NEXT: ds_store_b32 v0, v111236; GFX11-WGP-NEXT: s_endpgm11237;11238; GFX11-CU-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:11239; GFX11-CU: ; %bb.0: ; %entry11240; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x011241; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x411242; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)11243; GFX11-CU-NEXT: v_mov_b32_e32 v0, s011244; GFX11-CU-NEXT: v_mov_b32_e32 v1, s111245; GFX11-CU-NEXT: ds_storexchg_rtn_b32 v1, v0, v111246; GFX11-CU-NEXT: v_mov_b32_e32 v0, s011247; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)11248; GFX11-CU-NEXT: ds_store_b32 v0, v111249; GFX11-CU-NEXT: s_endpgm11250;11251; GFX12-WGP-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:11252; GFX12-WGP: ; %bb.0: ; %entry11253; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x011254; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x411255; GFX12-WGP-NEXT: s_wait_kmcnt 0x011256; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s011257; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s111258; GFX12-WGP-NEXT: ds_storexchg_rtn_b32 v1, v0, v111259; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s011260; GFX12-WGP-NEXT: s_wait_dscnt 0x011261; GFX12-WGP-NEXT: ds_store_b32 v0, v111262; GFX12-WGP-NEXT: s_endpgm11263;11264; GFX12-CU-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:11265; GFX12-CU: ; %bb.0: ; %entry11266; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x011267; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x411268; GFX12-CU-NEXT: s_wait_kmcnt 0x011269; GFX12-CU-NEXT: v_mov_b32_e32 v0, s011270; GFX12-CU-NEXT: v_mov_b32_e32 v1, s111271; GFX12-CU-NEXT: ds_storexchg_rtn_b32 v1, v0, v111272; GFX12-CU-NEXT: v_mov_b32_e32 v0, s011273; GFX12-CU-NEXT: s_wait_dscnt 0x011274; GFX12-CU-NEXT: ds_store_b32 v0, v111275; GFX12-CU-NEXT: s_endpgm11276;11277; GFX1250-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:11278; GFX1250: ; %bb.0: ; %entry11279; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 111280; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x011281; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x411282; GFX1250-NEXT: s_wait_kmcnt 0x011283; GFX1250-NEXT: v_mov_b32_e32 v0, s011284; GFX1250-NEXT: v_mov_b32_e32 v1, s111285; GFX1250-NEXT: ds_storexchg_rtn_b32 v1, v0, v111286; GFX1250-NEXT: v_mov_b32_e32 v0, s011287; GFX1250-NEXT: s_wait_dscnt 0x011288; GFX1250-NEXT: ds_store_b32 v0, v111289; GFX1250-NEXT: s_endpgm11290 ptr addrspace(3) %out, i32 %in) {11291entry:11292 %val = atomicrmw volatile xchg ptr addrspace(3) %out, i32 %in syncscope("singlethread-one-as") acq_rel11293 store i32 %val, ptr addrspace(3) %out, align 411294 ret void11295}11296 11297define amdgpu_kernel void @local_singlethread_one_as_seq_cst_ret_atomicrmw(11298; GFX6-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:11299; GFX6: ; %bb.0: ; %entry11300; GFX6-NEXT: s_load_dword s4, s[8:9], 0x011301; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr411302; GFX6-NEXT: s_load_dword s5, s[8:9], 0x111303; GFX6-NEXT: s_mov_b32 m0, -111304; GFX6-NEXT: s_waitcnt lgkmcnt(0)11305; GFX6-NEXT: v_mov_b32_e32 v0, s411306; GFX6-NEXT: v_mov_b32_e32 v1, s511307; GFX6-NEXT: ds_wrxchg_rtn_b32 v1, v0, v111308; GFX6-NEXT: s_mov_b32 m0, -111309; GFX6-NEXT: v_mov_b32_e32 v0, s411310; GFX6-NEXT: s_waitcnt lgkmcnt(0)11311; GFX6-NEXT: ds_write_b32 v0, v111312; GFX6-NEXT: s_endpgm11313;11314; GFX7-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:11315; GFX7: ; %bb.0: ; %entry11316; GFX7-NEXT: s_load_dword s4, s[8:9], 0x011317; GFX7-NEXT: s_load_dword s5, s[8:9], 0x111318; GFX7-NEXT: s_mov_b32 m0, -111319; GFX7-NEXT: s_waitcnt lgkmcnt(0)11320; GFX7-NEXT: v_mov_b32_e32 v0, s411321; GFX7-NEXT: v_mov_b32_e32 v1, s511322; GFX7-NEXT: ds_wrxchg_rtn_b32 v1, v0, v111323; GFX7-NEXT: s_mov_b32 m0, -111324; GFX7-NEXT: v_mov_b32_e32 v0, s411325; GFX7-NEXT: s_waitcnt lgkmcnt(0)11326; GFX7-NEXT: ds_write_b32 v0, v111327; GFX7-NEXT: s_endpgm11328;11329; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:11330; GFX10-WGP: ; %bb.0: ; %entry11331; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x011332; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x411333; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)11334; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s411335; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s511336; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v1, v0, v111337; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s411338; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)11339; GFX10-WGP-NEXT: ds_write_b32 v0, v111340; GFX10-WGP-NEXT: s_endpgm11341;11342; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:11343; GFX10-CU: ; %bb.0: ; %entry11344; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x011345; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x411346; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)11347; GFX10-CU-NEXT: v_mov_b32_e32 v0, s411348; GFX10-CU-NEXT: v_mov_b32_e32 v1, s511349; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v1, v0, v111350; GFX10-CU-NEXT: v_mov_b32_e32 v0, s411351; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)11352; GFX10-CU-NEXT: ds_write_b32 v0, v111353; GFX10-CU-NEXT: s_endpgm11354;11355; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:11356; SKIP-CACHE-INV: ; %bb.0: ; %entry11357; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x011358; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x111359; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -111360; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)11361; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s011362; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s111363; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v1, v0, v111364; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -111365; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s011366; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)11367; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v111368; SKIP-CACHE-INV-NEXT: s_endpgm11369;11370; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:11371; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry11372; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x011373; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x411374; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11375; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s411376; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s511377; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v111378; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s411379; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11380; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v111381; GFX90A-NOTTGSPLIT-NEXT: s_endpgm11382;11383; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:11384; GFX90A-TGSPLIT: ; %bb.0: ; %entry11385; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x011386; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x411387; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11388; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s411389; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s511390; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v111391; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s411392; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11393; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v111394; GFX90A-TGSPLIT-NEXT: s_endpgm11395;11396; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:11397; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry11398; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x011399; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x411400; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11401; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s011402; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s111403; GFX942-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v111404; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s011405; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11406; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v111407; GFX942-NOTTGSPLIT-NEXT: s_endpgm11408;11409; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:11410; GFX942-TGSPLIT: ; %bb.0: ; %entry11411; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x011412; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x411413; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11414; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s011415; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s111416; GFX942-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v111417; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s011418; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11419; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v111420; GFX942-TGSPLIT-NEXT: s_endpgm11421;11422; GFX11-WGP-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:11423; GFX11-WGP: ; %bb.0: ; %entry11424; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x011425; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x411426; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)11427; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s011428; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s111429; GFX11-WGP-NEXT: ds_storexchg_rtn_b32 v1, v0, v111430; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s011431; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)11432; GFX11-WGP-NEXT: ds_store_b32 v0, v111433; GFX11-WGP-NEXT: s_endpgm11434;11435; GFX11-CU-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:11436; GFX11-CU: ; %bb.0: ; %entry11437; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x011438; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x411439; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)11440; GFX11-CU-NEXT: v_mov_b32_e32 v0, s011441; GFX11-CU-NEXT: v_mov_b32_e32 v1, s111442; GFX11-CU-NEXT: ds_storexchg_rtn_b32 v1, v0, v111443; GFX11-CU-NEXT: v_mov_b32_e32 v0, s011444; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)11445; GFX11-CU-NEXT: ds_store_b32 v0, v111446; GFX11-CU-NEXT: s_endpgm11447;11448; GFX12-WGP-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:11449; GFX12-WGP: ; %bb.0: ; %entry11450; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x011451; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x411452; GFX12-WGP-NEXT: s_wait_kmcnt 0x011453; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s011454; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s111455; GFX12-WGP-NEXT: ds_storexchg_rtn_b32 v1, v0, v111456; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s011457; GFX12-WGP-NEXT: s_wait_dscnt 0x011458; GFX12-WGP-NEXT: ds_store_b32 v0, v111459; GFX12-WGP-NEXT: s_endpgm11460;11461; GFX12-CU-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:11462; GFX12-CU: ; %bb.0: ; %entry11463; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x011464; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x411465; GFX12-CU-NEXT: s_wait_kmcnt 0x011466; GFX12-CU-NEXT: v_mov_b32_e32 v0, s011467; GFX12-CU-NEXT: v_mov_b32_e32 v1, s111468; GFX12-CU-NEXT: ds_storexchg_rtn_b32 v1, v0, v111469; GFX12-CU-NEXT: v_mov_b32_e32 v0, s011470; GFX12-CU-NEXT: s_wait_dscnt 0x011471; GFX12-CU-NEXT: ds_store_b32 v0, v111472; GFX12-CU-NEXT: s_endpgm11473;11474; GFX1250-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:11475; GFX1250: ; %bb.0: ; %entry11476; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 111477; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x011478; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x411479; GFX1250-NEXT: s_wait_kmcnt 0x011480; GFX1250-NEXT: v_mov_b32_e32 v0, s011481; GFX1250-NEXT: v_mov_b32_e32 v1, s111482; GFX1250-NEXT: ds_storexchg_rtn_b32 v1, v0, v111483; GFX1250-NEXT: v_mov_b32_e32 v0, s011484; GFX1250-NEXT: s_wait_dscnt 0x011485; GFX1250-NEXT: ds_store_b32 v0, v111486; GFX1250-NEXT: s_endpgm11487 ptr addrspace(3) %out, i32 %in) {11488entry:11489 %val = atomicrmw volatile xchg ptr addrspace(3) %out, i32 %in syncscope("singlethread-one-as") seq_cst11490 store i32 %val, ptr addrspace(3) %out, align 411491 ret void11492}11493 11494define amdgpu_kernel void @local_singlethread_one_as_monotonic_monotonic_cmpxchg(11495; GFX6-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:11496; GFX6: ; %bb.0: ; %entry11497; GFX6-NEXT: s_load_dword s6, s[8:9], 0x011498; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr611499; GFX6-NEXT: s_load_dword s4, s[8:9], 0x111500; GFX6-NEXT: s_load_dword s5, s[8:9], 0x211501; GFX6-NEXT: s_mov_b32 m0, -111502; GFX6-NEXT: s_waitcnt lgkmcnt(0)11503; GFX6-NEXT: v_mov_b32_e32 v0, s611504; GFX6-NEXT: v_mov_b32_e32 v1, s511505; GFX6-NEXT: v_mov_b32_e32 v2, s411506; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611507; GFX6-NEXT: s_endpgm11508;11509; GFX7-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:11510; GFX7: ; %bb.0: ; %entry11511; GFX7-NEXT: s_load_dword s6, s[8:9], 0x011512; GFX7-NEXT: s_load_dword s4, s[8:9], 0x111513; GFX7-NEXT: s_load_dword s5, s[8:9], 0x211514; GFX7-NEXT: s_mov_b32 m0, -111515; GFX7-NEXT: s_waitcnt lgkmcnt(0)11516; GFX7-NEXT: v_mov_b32_e32 v0, s611517; GFX7-NEXT: v_mov_b32_e32 v1, s511518; GFX7-NEXT: v_mov_b32_e32 v2, s411519; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611520; GFX7-NEXT: s_endpgm11521;11522; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:11523; GFX10-WGP: ; %bb.0: ; %entry11524; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x011525; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x411526; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x811527; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)11528; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s611529; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s511530; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s411531; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611532; GFX10-WGP-NEXT: s_endpgm11533;11534; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:11535; GFX10-CU: ; %bb.0: ; %entry11536; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x011537; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x411538; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x811539; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)11540; GFX10-CU-NEXT: v_mov_b32_e32 v0, s611541; GFX10-CU-NEXT: v_mov_b32_e32 v1, s511542; GFX10-CU-NEXT: v_mov_b32_e32 v2, s411543; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611544; GFX10-CU-NEXT: s_endpgm11545;11546; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:11547; SKIP-CACHE-INV: ; %bb.0: ; %entry11548; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x011549; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x111550; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x211551; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -111552; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)11553; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s211554; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s111555; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s011556; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611557; SKIP-CACHE-INV-NEXT: s_endpgm11558;11559; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:11560; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry11561; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x011562; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x411563; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x811564; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11565; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s611566; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s511567; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s411568; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611569; GFX90A-NOTTGSPLIT-NEXT: s_endpgm11570;11571; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:11572; GFX90A-TGSPLIT: ; %bb.0: ; %entry11573; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x011574; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x411575; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x811576; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11577; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s611578; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s511579; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s411580; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611581; GFX90A-TGSPLIT-NEXT: s_endpgm11582;11583; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:11584; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry11585; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x011586; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x411587; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x811588; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11589; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s211590; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s111591; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s011592; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611593; GFX942-NOTTGSPLIT-NEXT: s_endpgm11594;11595; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:11596; GFX942-TGSPLIT: ; %bb.0: ; %entry11597; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x011598; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x411599; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x811600; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11601; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s211602; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s111603; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s011604; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611605; GFX942-TGSPLIT-NEXT: s_endpgm11606;11607; GFX11-WGP-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:11608; GFX11-WGP: ; %bb.0: ; %entry11609; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x011610; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x411611; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x811612; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)11613; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s211614; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s111615; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s011616; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1611617; GFX11-WGP-NEXT: s_endpgm11618;11619; GFX11-CU-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:11620; GFX11-CU: ; %bb.0: ; %entry11621; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x011622; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x411623; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x811624; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)11625; GFX11-CU-NEXT: v_mov_b32_e32 v0, s211626; GFX11-CU-NEXT: v_mov_b32_e32 v1, s111627; GFX11-CU-NEXT: v_mov_b32_e32 v2, s011628; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1611629; GFX11-CU-NEXT: s_endpgm11630;11631; GFX12-WGP-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:11632; GFX12-WGP: ; %bb.0: ; %entry11633; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x011634; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x411635; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x811636; GFX12-WGP-NEXT: s_wait_kmcnt 0x011637; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s211638; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s111639; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s011640; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1611641; GFX12-WGP-NEXT: s_endpgm11642;11643; GFX12-CU-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:11644; GFX12-CU: ; %bb.0: ; %entry11645; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x011646; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x411647; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x811648; GFX12-CU-NEXT: s_wait_kmcnt 0x011649; GFX12-CU-NEXT: v_mov_b32_e32 v0, s211650; GFX12-CU-NEXT: v_mov_b32_e32 v1, s111651; GFX12-CU-NEXT: v_mov_b32_e32 v2, s011652; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1611653; GFX12-CU-NEXT: s_endpgm11654;11655; GFX1250-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:11656; GFX1250: ; %bb.0: ; %entry11657; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 111658; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x011659; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x411660; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x811661; GFX1250-NEXT: s_wait_kmcnt 0x011662; GFX1250-NEXT: v_mov_b32_e32 v0, s211663; GFX1250-NEXT: v_mov_b32_e32 v1, s111664; GFX1250-NEXT: v_mov_b32_e32 v2, s011665; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1611666; GFX1250-NEXT: s_endpgm11667 ptr addrspace(3) %out, i32 %in, i32 %old) {11668entry:11669 %gep = getelementptr i32, ptr addrspace(3) %out, i32 411670 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") monotonic monotonic11671 ret void11672}11673 11674define amdgpu_kernel void @local_singlethread_one_as_acquire_monotonic_cmpxchg(11675; GFX6-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:11676; GFX6: ; %bb.0: ; %entry11677; GFX6-NEXT: s_load_dword s6, s[8:9], 0x011678; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr611679; GFX6-NEXT: s_load_dword s4, s[8:9], 0x111680; GFX6-NEXT: s_load_dword s5, s[8:9], 0x211681; GFX6-NEXT: s_mov_b32 m0, -111682; GFX6-NEXT: s_waitcnt lgkmcnt(0)11683; GFX6-NEXT: v_mov_b32_e32 v0, s611684; GFX6-NEXT: v_mov_b32_e32 v1, s511685; GFX6-NEXT: v_mov_b32_e32 v2, s411686; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611687; GFX6-NEXT: s_endpgm11688;11689; GFX7-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:11690; GFX7: ; %bb.0: ; %entry11691; GFX7-NEXT: s_load_dword s6, s[8:9], 0x011692; GFX7-NEXT: s_load_dword s4, s[8:9], 0x111693; GFX7-NEXT: s_load_dword s5, s[8:9], 0x211694; GFX7-NEXT: s_mov_b32 m0, -111695; GFX7-NEXT: s_waitcnt lgkmcnt(0)11696; GFX7-NEXT: v_mov_b32_e32 v0, s611697; GFX7-NEXT: v_mov_b32_e32 v1, s511698; GFX7-NEXT: v_mov_b32_e32 v2, s411699; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611700; GFX7-NEXT: s_endpgm11701;11702; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:11703; GFX10-WGP: ; %bb.0: ; %entry11704; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x011705; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x411706; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x811707; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)11708; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s611709; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s511710; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s411711; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611712; GFX10-WGP-NEXT: s_endpgm11713;11714; GFX10-CU-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:11715; GFX10-CU: ; %bb.0: ; %entry11716; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x011717; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x411718; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x811719; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)11720; GFX10-CU-NEXT: v_mov_b32_e32 v0, s611721; GFX10-CU-NEXT: v_mov_b32_e32 v1, s511722; GFX10-CU-NEXT: v_mov_b32_e32 v2, s411723; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611724; GFX10-CU-NEXT: s_endpgm11725;11726; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:11727; SKIP-CACHE-INV: ; %bb.0: ; %entry11728; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x011729; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x111730; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x211731; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -111732; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)11733; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s211734; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s111735; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s011736; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611737; SKIP-CACHE-INV-NEXT: s_endpgm11738;11739; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:11740; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry11741; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x011742; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x411743; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x811744; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11745; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s611746; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s511747; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s411748; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611749; GFX90A-NOTTGSPLIT-NEXT: s_endpgm11750;11751; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:11752; GFX90A-TGSPLIT: ; %bb.0: ; %entry11753; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x011754; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x411755; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x811756; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11757; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s611758; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s511759; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s411760; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611761; GFX90A-TGSPLIT-NEXT: s_endpgm11762;11763; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:11764; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry11765; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x011766; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x411767; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x811768; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11769; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s211770; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s111771; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s011772; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611773; GFX942-NOTTGSPLIT-NEXT: s_endpgm11774;11775; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:11776; GFX942-TGSPLIT: ; %bb.0: ; %entry11777; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x011778; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x411779; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x811780; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11781; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s211782; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s111783; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s011784; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611785; GFX942-TGSPLIT-NEXT: s_endpgm11786;11787; GFX11-WGP-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:11788; GFX11-WGP: ; %bb.0: ; %entry11789; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x011790; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x411791; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x811792; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)11793; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s211794; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s111795; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s011796; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1611797; GFX11-WGP-NEXT: s_endpgm11798;11799; GFX11-CU-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:11800; GFX11-CU: ; %bb.0: ; %entry11801; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x011802; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x411803; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x811804; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)11805; GFX11-CU-NEXT: v_mov_b32_e32 v0, s211806; GFX11-CU-NEXT: v_mov_b32_e32 v1, s111807; GFX11-CU-NEXT: v_mov_b32_e32 v2, s011808; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1611809; GFX11-CU-NEXT: s_endpgm11810;11811; GFX12-WGP-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:11812; GFX12-WGP: ; %bb.0: ; %entry11813; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x011814; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x411815; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x811816; GFX12-WGP-NEXT: s_wait_kmcnt 0x011817; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s211818; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s111819; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s011820; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1611821; GFX12-WGP-NEXT: s_endpgm11822;11823; GFX12-CU-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:11824; GFX12-CU: ; %bb.0: ; %entry11825; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x011826; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x411827; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x811828; GFX12-CU-NEXT: s_wait_kmcnt 0x011829; GFX12-CU-NEXT: v_mov_b32_e32 v0, s211830; GFX12-CU-NEXT: v_mov_b32_e32 v1, s111831; GFX12-CU-NEXT: v_mov_b32_e32 v2, s011832; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1611833; GFX12-CU-NEXT: s_endpgm11834;11835; GFX1250-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:11836; GFX1250: ; %bb.0: ; %entry11837; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 111838; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x011839; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x411840; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x811841; GFX1250-NEXT: s_wait_kmcnt 0x011842; GFX1250-NEXT: v_mov_b32_e32 v0, s211843; GFX1250-NEXT: v_mov_b32_e32 v1, s111844; GFX1250-NEXT: v_mov_b32_e32 v2, s011845; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1611846; GFX1250-NEXT: s_endpgm11847 ptr addrspace(3) %out, i32 %in, i32 %old) {11848entry:11849 %gep = getelementptr i32, ptr addrspace(3) %out, i32 411850 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acquire monotonic11851 ret void11852}11853 11854define amdgpu_kernel void @local_singlethread_one_as_release_monotonic_cmpxchg(11855; GFX6-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:11856; GFX6: ; %bb.0: ; %entry11857; GFX6-NEXT: s_load_dword s6, s[8:9], 0x011858; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr611859; GFX6-NEXT: s_load_dword s4, s[8:9], 0x111860; GFX6-NEXT: s_load_dword s5, s[8:9], 0x211861; GFX6-NEXT: s_mov_b32 m0, -111862; GFX6-NEXT: s_waitcnt lgkmcnt(0)11863; GFX6-NEXT: v_mov_b32_e32 v0, s611864; GFX6-NEXT: v_mov_b32_e32 v1, s511865; GFX6-NEXT: v_mov_b32_e32 v2, s411866; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611867; GFX6-NEXT: s_endpgm11868;11869; GFX7-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:11870; GFX7: ; %bb.0: ; %entry11871; GFX7-NEXT: s_load_dword s6, s[8:9], 0x011872; GFX7-NEXT: s_load_dword s4, s[8:9], 0x111873; GFX7-NEXT: s_load_dword s5, s[8:9], 0x211874; GFX7-NEXT: s_mov_b32 m0, -111875; GFX7-NEXT: s_waitcnt lgkmcnt(0)11876; GFX7-NEXT: v_mov_b32_e32 v0, s611877; GFX7-NEXT: v_mov_b32_e32 v1, s511878; GFX7-NEXT: v_mov_b32_e32 v2, s411879; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611880; GFX7-NEXT: s_endpgm11881;11882; GFX10-WGP-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:11883; GFX10-WGP: ; %bb.0: ; %entry11884; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x011885; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x411886; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x811887; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)11888; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s611889; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s511890; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s411891; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611892; GFX10-WGP-NEXT: s_endpgm11893;11894; GFX10-CU-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:11895; GFX10-CU: ; %bb.0: ; %entry11896; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x011897; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x411898; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x811899; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)11900; GFX10-CU-NEXT: v_mov_b32_e32 v0, s611901; GFX10-CU-NEXT: v_mov_b32_e32 v1, s511902; GFX10-CU-NEXT: v_mov_b32_e32 v2, s411903; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611904; GFX10-CU-NEXT: s_endpgm11905;11906; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:11907; SKIP-CACHE-INV: ; %bb.0: ; %entry11908; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x011909; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x111910; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x211911; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -111912; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)11913; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s211914; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s111915; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s011916; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611917; SKIP-CACHE-INV-NEXT: s_endpgm11918;11919; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:11920; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry11921; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x011922; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x411923; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x811924; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11925; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s611926; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s511927; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s411928; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611929; GFX90A-NOTTGSPLIT-NEXT: s_endpgm11930;11931; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:11932; GFX90A-TGSPLIT: ; %bb.0: ; %entry11933; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x011934; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x411935; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x811936; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11937; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s611938; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s511939; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s411940; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611941; GFX90A-TGSPLIT-NEXT: s_endpgm11942;11943; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:11944; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry11945; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x011946; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x411947; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x811948; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11949; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s211950; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s111951; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s011952; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611953; GFX942-NOTTGSPLIT-NEXT: s_endpgm11954;11955; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:11956; GFX942-TGSPLIT: ; %bb.0: ; %entry11957; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x011958; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x411959; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x811960; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)11961; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s211962; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s111963; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s011964; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1611965; GFX942-TGSPLIT-NEXT: s_endpgm11966;11967; GFX11-WGP-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:11968; GFX11-WGP: ; %bb.0: ; %entry11969; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x011970; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x411971; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x811972; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)11973; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s211974; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s111975; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s011976; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1611977; GFX11-WGP-NEXT: s_endpgm11978;11979; GFX11-CU-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:11980; GFX11-CU: ; %bb.0: ; %entry11981; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x011982; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x411983; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x811984; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)11985; GFX11-CU-NEXT: v_mov_b32_e32 v0, s211986; GFX11-CU-NEXT: v_mov_b32_e32 v1, s111987; GFX11-CU-NEXT: v_mov_b32_e32 v2, s011988; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1611989; GFX11-CU-NEXT: s_endpgm11990;11991; GFX12-WGP-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:11992; GFX12-WGP: ; %bb.0: ; %entry11993; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x011994; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x411995; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x811996; GFX12-WGP-NEXT: s_wait_kmcnt 0x011997; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s211998; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s111999; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s012000; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612001; GFX12-WGP-NEXT: s_endpgm12002;12003; GFX12-CU-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:12004; GFX12-CU: ; %bb.0: ; %entry12005; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x012006; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x412007; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x812008; GFX12-CU-NEXT: s_wait_kmcnt 0x012009; GFX12-CU-NEXT: v_mov_b32_e32 v0, s212010; GFX12-CU-NEXT: v_mov_b32_e32 v1, s112011; GFX12-CU-NEXT: v_mov_b32_e32 v2, s012012; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612013; GFX12-CU-NEXT: s_endpgm12014;12015; GFX1250-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:12016; GFX1250: ; %bb.0: ; %entry12017; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 112018; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x012019; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x412020; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x812021; GFX1250-NEXT: s_wait_kmcnt 0x012022; GFX1250-NEXT: v_mov_b32_e32 v0, s212023; GFX1250-NEXT: v_mov_b32_e32 v1, s112024; GFX1250-NEXT: v_mov_b32_e32 v2, s012025; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612026; GFX1250-NEXT: s_endpgm12027 ptr addrspace(3) %out, i32 %in, i32 %old) {12028entry:12029 %gep = getelementptr i32, ptr addrspace(3) %out, i32 412030 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") release monotonic12031 ret void12032}12033 12034define amdgpu_kernel void @local_singlethread_one_as_acq_rel_monotonic_cmpxchg(12035; GFX6-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:12036; GFX6: ; %bb.0: ; %entry12037; GFX6-NEXT: s_load_dword s6, s[8:9], 0x012038; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr612039; GFX6-NEXT: s_load_dword s4, s[8:9], 0x112040; GFX6-NEXT: s_load_dword s5, s[8:9], 0x212041; GFX6-NEXT: s_mov_b32 m0, -112042; GFX6-NEXT: s_waitcnt lgkmcnt(0)12043; GFX6-NEXT: v_mov_b32_e32 v0, s612044; GFX6-NEXT: v_mov_b32_e32 v1, s512045; GFX6-NEXT: v_mov_b32_e32 v2, s412046; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612047; GFX6-NEXT: s_endpgm12048;12049; GFX7-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:12050; GFX7: ; %bb.0: ; %entry12051; GFX7-NEXT: s_load_dword s6, s[8:9], 0x012052; GFX7-NEXT: s_load_dword s4, s[8:9], 0x112053; GFX7-NEXT: s_load_dword s5, s[8:9], 0x212054; GFX7-NEXT: s_mov_b32 m0, -112055; GFX7-NEXT: s_waitcnt lgkmcnt(0)12056; GFX7-NEXT: v_mov_b32_e32 v0, s612057; GFX7-NEXT: v_mov_b32_e32 v1, s512058; GFX7-NEXT: v_mov_b32_e32 v2, s412059; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612060; GFX7-NEXT: s_endpgm12061;12062; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:12063; GFX10-WGP: ; %bb.0: ; %entry12064; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x012065; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x412066; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x812067; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)12068; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s612069; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s512070; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s412071; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612072; GFX10-WGP-NEXT: s_endpgm12073;12074; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:12075; GFX10-CU: ; %bb.0: ; %entry12076; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x012077; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x412078; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x812079; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)12080; GFX10-CU-NEXT: v_mov_b32_e32 v0, s612081; GFX10-CU-NEXT: v_mov_b32_e32 v1, s512082; GFX10-CU-NEXT: v_mov_b32_e32 v2, s412083; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612084; GFX10-CU-NEXT: s_endpgm12085;12086; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:12087; SKIP-CACHE-INV: ; %bb.0: ; %entry12088; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x012089; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x112090; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x212091; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -112092; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)12093; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s212094; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s112095; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s012096; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612097; SKIP-CACHE-INV-NEXT: s_endpgm12098;12099; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:12100; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry12101; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x012102; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x412103; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x812104; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)12105; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s612106; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s512107; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s412108; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612109; GFX90A-NOTTGSPLIT-NEXT: s_endpgm12110;12111; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:12112; GFX90A-TGSPLIT: ; %bb.0: ; %entry12113; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x012114; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x412115; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x812116; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)12117; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s612118; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s512119; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s412120; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612121; GFX90A-TGSPLIT-NEXT: s_endpgm12122;12123; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:12124; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry12125; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x012126; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x412127; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x812128; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)12129; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s212130; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s112131; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s012132; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612133; GFX942-NOTTGSPLIT-NEXT: s_endpgm12134;12135; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:12136; GFX942-TGSPLIT: ; %bb.0: ; %entry12137; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x012138; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x412139; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x812140; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)12141; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s212142; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s112143; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s012144; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612145; GFX942-TGSPLIT-NEXT: s_endpgm12146;12147; GFX11-WGP-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:12148; GFX11-WGP: ; %bb.0: ; %entry12149; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x012150; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x412151; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x812152; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)12153; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s212154; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s112155; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s012156; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612157; GFX11-WGP-NEXT: s_endpgm12158;12159; GFX11-CU-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:12160; GFX11-CU: ; %bb.0: ; %entry12161; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x012162; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x412163; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x812164; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)12165; GFX11-CU-NEXT: v_mov_b32_e32 v0, s212166; GFX11-CU-NEXT: v_mov_b32_e32 v1, s112167; GFX11-CU-NEXT: v_mov_b32_e32 v2, s012168; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612169; GFX11-CU-NEXT: s_endpgm12170;12171; GFX12-WGP-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:12172; GFX12-WGP: ; %bb.0: ; %entry12173; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x012174; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x412175; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x812176; GFX12-WGP-NEXT: s_wait_kmcnt 0x012177; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s212178; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s112179; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s012180; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612181; GFX12-WGP-NEXT: s_endpgm12182;12183; GFX12-CU-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:12184; GFX12-CU: ; %bb.0: ; %entry12185; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x012186; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x412187; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x812188; GFX12-CU-NEXT: s_wait_kmcnt 0x012189; GFX12-CU-NEXT: v_mov_b32_e32 v0, s212190; GFX12-CU-NEXT: v_mov_b32_e32 v1, s112191; GFX12-CU-NEXT: v_mov_b32_e32 v2, s012192; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612193; GFX12-CU-NEXT: s_endpgm12194;12195; GFX1250-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:12196; GFX1250: ; %bb.0: ; %entry12197; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 112198; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x012199; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x412200; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x812201; GFX1250-NEXT: s_wait_kmcnt 0x012202; GFX1250-NEXT: v_mov_b32_e32 v0, s212203; GFX1250-NEXT: v_mov_b32_e32 v1, s112204; GFX1250-NEXT: v_mov_b32_e32 v2, s012205; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612206; GFX1250-NEXT: s_endpgm12207 ptr addrspace(3) %out, i32 %in, i32 %old) {12208entry:12209 %gep = getelementptr i32, ptr addrspace(3) %out, i32 412210 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acq_rel monotonic12211 ret void12212}12213 12214define amdgpu_kernel void @local_singlethread_one_as_seq_cst_monotonic_cmpxchg(12215; GFX6-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:12216; GFX6: ; %bb.0: ; %entry12217; GFX6-NEXT: s_load_dword s6, s[8:9], 0x012218; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr612219; GFX6-NEXT: s_load_dword s4, s[8:9], 0x112220; GFX6-NEXT: s_load_dword s5, s[8:9], 0x212221; GFX6-NEXT: s_mov_b32 m0, -112222; GFX6-NEXT: s_waitcnt lgkmcnt(0)12223; GFX6-NEXT: v_mov_b32_e32 v0, s612224; GFX6-NEXT: v_mov_b32_e32 v1, s512225; GFX6-NEXT: v_mov_b32_e32 v2, s412226; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612227; GFX6-NEXT: s_endpgm12228;12229; GFX7-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:12230; GFX7: ; %bb.0: ; %entry12231; GFX7-NEXT: s_load_dword s6, s[8:9], 0x012232; GFX7-NEXT: s_load_dword s4, s[8:9], 0x112233; GFX7-NEXT: s_load_dword s5, s[8:9], 0x212234; GFX7-NEXT: s_mov_b32 m0, -112235; GFX7-NEXT: s_waitcnt lgkmcnt(0)12236; GFX7-NEXT: v_mov_b32_e32 v0, s612237; GFX7-NEXT: v_mov_b32_e32 v1, s512238; GFX7-NEXT: v_mov_b32_e32 v2, s412239; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612240; GFX7-NEXT: s_endpgm12241;12242; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:12243; GFX10-WGP: ; %bb.0: ; %entry12244; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x012245; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x412246; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x812247; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)12248; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s612249; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s512250; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s412251; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612252; GFX10-WGP-NEXT: s_endpgm12253;12254; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:12255; GFX10-CU: ; %bb.0: ; %entry12256; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x012257; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x412258; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x812259; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)12260; GFX10-CU-NEXT: v_mov_b32_e32 v0, s612261; GFX10-CU-NEXT: v_mov_b32_e32 v1, s512262; GFX10-CU-NEXT: v_mov_b32_e32 v2, s412263; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612264; GFX10-CU-NEXT: s_endpgm12265;12266; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:12267; SKIP-CACHE-INV: ; %bb.0: ; %entry12268; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x012269; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x112270; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x212271; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -112272; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)12273; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s212274; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s112275; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s012276; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612277; SKIP-CACHE-INV-NEXT: s_endpgm12278;12279; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:12280; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry12281; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x012282; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x412283; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x812284; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)12285; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s612286; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s512287; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s412288; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612289; GFX90A-NOTTGSPLIT-NEXT: s_endpgm12290;12291; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:12292; GFX90A-TGSPLIT: ; %bb.0: ; %entry12293; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x012294; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x412295; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x812296; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)12297; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s612298; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s512299; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s412300; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612301; GFX90A-TGSPLIT-NEXT: s_endpgm12302;12303; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:12304; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry12305; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x012306; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x412307; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x812308; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)12309; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s212310; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s112311; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s012312; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612313; GFX942-NOTTGSPLIT-NEXT: s_endpgm12314;12315; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:12316; GFX942-TGSPLIT: ; %bb.0: ; %entry12317; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x012318; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x412319; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x812320; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)12321; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s212322; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s112323; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s012324; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612325; GFX942-TGSPLIT-NEXT: s_endpgm12326;12327; GFX11-WGP-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:12328; GFX11-WGP: ; %bb.0: ; %entry12329; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x012330; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x412331; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x812332; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)12333; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s212334; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s112335; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s012336; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612337; GFX11-WGP-NEXT: s_endpgm12338;12339; GFX11-CU-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:12340; GFX11-CU: ; %bb.0: ; %entry12341; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x012342; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x412343; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x812344; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)12345; GFX11-CU-NEXT: v_mov_b32_e32 v0, s212346; GFX11-CU-NEXT: v_mov_b32_e32 v1, s112347; GFX11-CU-NEXT: v_mov_b32_e32 v2, s012348; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612349; GFX11-CU-NEXT: s_endpgm12350;12351; GFX12-WGP-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:12352; GFX12-WGP: ; %bb.0: ; %entry12353; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x012354; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x412355; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x812356; GFX12-WGP-NEXT: s_wait_kmcnt 0x012357; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s212358; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s112359; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s012360; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612361; GFX12-WGP-NEXT: s_endpgm12362;12363; GFX12-CU-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:12364; GFX12-CU: ; %bb.0: ; %entry12365; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x012366; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x412367; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x812368; GFX12-CU-NEXT: s_wait_kmcnt 0x012369; GFX12-CU-NEXT: v_mov_b32_e32 v0, s212370; GFX12-CU-NEXT: v_mov_b32_e32 v1, s112371; GFX12-CU-NEXT: v_mov_b32_e32 v2, s012372; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612373; GFX12-CU-NEXT: s_endpgm12374;12375; GFX1250-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:12376; GFX1250: ; %bb.0: ; %entry12377; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 112378; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x012379; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x412380; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x812381; GFX1250-NEXT: s_wait_kmcnt 0x012382; GFX1250-NEXT: v_mov_b32_e32 v0, s212383; GFX1250-NEXT: v_mov_b32_e32 v1, s112384; GFX1250-NEXT: v_mov_b32_e32 v2, s012385; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612386; GFX1250-NEXT: s_endpgm12387 ptr addrspace(3) %out, i32 %in, i32 %old) {12388entry:12389 %gep = getelementptr i32, ptr addrspace(3) %out, i32 412390 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") seq_cst monotonic12391 ret void12392}12393 12394define amdgpu_kernel void @local_singlethread_one_as_monotonic_acquire_cmpxchg(12395; GFX6-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:12396; GFX6: ; %bb.0: ; %entry12397; GFX6-NEXT: s_load_dword s6, s[8:9], 0x012398; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr612399; GFX6-NEXT: s_load_dword s4, s[8:9], 0x112400; GFX6-NEXT: s_load_dword s5, s[8:9], 0x212401; GFX6-NEXT: s_mov_b32 m0, -112402; GFX6-NEXT: s_waitcnt lgkmcnt(0)12403; GFX6-NEXT: v_mov_b32_e32 v0, s612404; GFX6-NEXT: v_mov_b32_e32 v1, s512405; GFX6-NEXT: v_mov_b32_e32 v2, s412406; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612407; GFX6-NEXT: s_endpgm12408;12409; GFX7-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:12410; GFX7: ; %bb.0: ; %entry12411; GFX7-NEXT: s_load_dword s6, s[8:9], 0x012412; GFX7-NEXT: s_load_dword s4, s[8:9], 0x112413; GFX7-NEXT: s_load_dword s5, s[8:9], 0x212414; GFX7-NEXT: s_mov_b32 m0, -112415; GFX7-NEXT: s_waitcnt lgkmcnt(0)12416; GFX7-NEXT: v_mov_b32_e32 v0, s612417; GFX7-NEXT: v_mov_b32_e32 v1, s512418; GFX7-NEXT: v_mov_b32_e32 v2, s412419; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612420; GFX7-NEXT: s_endpgm12421;12422; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:12423; GFX10-WGP: ; %bb.0: ; %entry12424; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x012425; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x412426; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x812427; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)12428; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s612429; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s512430; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s412431; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612432; GFX10-WGP-NEXT: s_endpgm12433;12434; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:12435; GFX10-CU: ; %bb.0: ; %entry12436; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x012437; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x412438; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x812439; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)12440; GFX10-CU-NEXT: v_mov_b32_e32 v0, s612441; GFX10-CU-NEXT: v_mov_b32_e32 v1, s512442; GFX10-CU-NEXT: v_mov_b32_e32 v2, s412443; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612444; GFX10-CU-NEXT: s_endpgm12445;12446; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:12447; SKIP-CACHE-INV: ; %bb.0: ; %entry12448; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x012449; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x112450; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x212451; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -112452; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)12453; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s212454; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s112455; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s012456; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612457; SKIP-CACHE-INV-NEXT: s_endpgm12458;12459; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:12460; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry12461; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x012462; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x412463; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x812464; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)12465; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s612466; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s512467; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s412468; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612469; GFX90A-NOTTGSPLIT-NEXT: s_endpgm12470;12471; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:12472; GFX90A-TGSPLIT: ; %bb.0: ; %entry12473; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x012474; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x412475; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x812476; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)12477; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s612478; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s512479; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s412480; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612481; GFX90A-TGSPLIT-NEXT: s_endpgm12482;12483; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:12484; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry12485; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x012486; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x412487; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x812488; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)12489; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s212490; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s112491; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s012492; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612493; GFX942-NOTTGSPLIT-NEXT: s_endpgm12494;12495; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:12496; GFX942-TGSPLIT: ; %bb.0: ; %entry12497; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x012498; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x412499; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x812500; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)12501; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s212502; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s112503; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s012504; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612505; GFX942-TGSPLIT-NEXT: s_endpgm12506;12507; GFX11-WGP-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:12508; GFX11-WGP: ; %bb.0: ; %entry12509; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x012510; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x412511; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x812512; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)12513; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s212514; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s112515; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s012516; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612517; GFX11-WGP-NEXT: s_endpgm12518;12519; GFX11-CU-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:12520; GFX11-CU: ; %bb.0: ; %entry12521; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x012522; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x412523; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x812524; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)12525; GFX11-CU-NEXT: v_mov_b32_e32 v0, s212526; GFX11-CU-NEXT: v_mov_b32_e32 v1, s112527; GFX11-CU-NEXT: v_mov_b32_e32 v2, s012528; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612529; GFX11-CU-NEXT: s_endpgm12530;12531; GFX12-WGP-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:12532; GFX12-WGP: ; %bb.0: ; %entry12533; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x012534; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x412535; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x812536; GFX12-WGP-NEXT: s_wait_kmcnt 0x012537; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s212538; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s112539; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s012540; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612541; GFX12-WGP-NEXT: s_endpgm12542;12543; GFX12-CU-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:12544; GFX12-CU: ; %bb.0: ; %entry12545; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x012546; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x412547; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x812548; GFX12-CU-NEXT: s_wait_kmcnt 0x012549; GFX12-CU-NEXT: v_mov_b32_e32 v0, s212550; GFX12-CU-NEXT: v_mov_b32_e32 v1, s112551; GFX12-CU-NEXT: v_mov_b32_e32 v2, s012552; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612553; GFX12-CU-NEXT: s_endpgm12554;12555; GFX1250-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:12556; GFX1250: ; %bb.0: ; %entry12557; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 112558; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x012559; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x412560; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x812561; GFX1250-NEXT: s_wait_kmcnt 0x012562; GFX1250-NEXT: v_mov_b32_e32 v0, s212563; GFX1250-NEXT: v_mov_b32_e32 v1, s112564; GFX1250-NEXT: v_mov_b32_e32 v2, s012565; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612566; GFX1250-NEXT: s_endpgm12567 ptr addrspace(3) %out, i32 %in, i32 %old) {12568entry:12569 %gep = getelementptr i32, ptr addrspace(3) %out, i32 412570 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") monotonic acquire12571 ret void12572}12573 12574define amdgpu_kernel void @local_singlethread_one_as_acquire_acquire_cmpxchg(12575; GFX6-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:12576; GFX6: ; %bb.0: ; %entry12577; GFX6-NEXT: s_load_dword s6, s[8:9], 0x012578; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr612579; GFX6-NEXT: s_load_dword s4, s[8:9], 0x112580; GFX6-NEXT: s_load_dword s5, s[8:9], 0x212581; GFX6-NEXT: s_mov_b32 m0, -112582; GFX6-NEXT: s_waitcnt lgkmcnt(0)12583; GFX6-NEXT: v_mov_b32_e32 v0, s612584; GFX6-NEXT: v_mov_b32_e32 v1, s512585; GFX6-NEXT: v_mov_b32_e32 v2, s412586; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612587; GFX6-NEXT: s_endpgm12588;12589; GFX7-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:12590; GFX7: ; %bb.0: ; %entry12591; GFX7-NEXT: s_load_dword s6, s[8:9], 0x012592; GFX7-NEXT: s_load_dword s4, s[8:9], 0x112593; GFX7-NEXT: s_load_dword s5, s[8:9], 0x212594; GFX7-NEXT: s_mov_b32 m0, -112595; GFX7-NEXT: s_waitcnt lgkmcnt(0)12596; GFX7-NEXT: v_mov_b32_e32 v0, s612597; GFX7-NEXT: v_mov_b32_e32 v1, s512598; GFX7-NEXT: v_mov_b32_e32 v2, s412599; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612600; GFX7-NEXT: s_endpgm12601;12602; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:12603; GFX10-WGP: ; %bb.0: ; %entry12604; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x012605; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x412606; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x812607; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)12608; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s612609; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s512610; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s412611; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612612; GFX10-WGP-NEXT: s_endpgm12613;12614; GFX10-CU-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:12615; GFX10-CU: ; %bb.0: ; %entry12616; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x012617; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x412618; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x812619; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)12620; GFX10-CU-NEXT: v_mov_b32_e32 v0, s612621; GFX10-CU-NEXT: v_mov_b32_e32 v1, s512622; GFX10-CU-NEXT: v_mov_b32_e32 v2, s412623; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612624; GFX10-CU-NEXT: s_endpgm12625;12626; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:12627; SKIP-CACHE-INV: ; %bb.0: ; %entry12628; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x012629; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x112630; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x212631; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -112632; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)12633; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s212634; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s112635; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s012636; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612637; SKIP-CACHE-INV-NEXT: s_endpgm12638;12639; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:12640; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry12641; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x012642; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x412643; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x812644; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)12645; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s612646; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s512647; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s412648; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612649; GFX90A-NOTTGSPLIT-NEXT: s_endpgm12650;12651; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:12652; GFX90A-TGSPLIT: ; %bb.0: ; %entry12653; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x012654; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x412655; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x812656; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)12657; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s612658; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s512659; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s412660; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612661; GFX90A-TGSPLIT-NEXT: s_endpgm12662;12663; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:12664; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry12665; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x012666; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x412667; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x812668; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)12669; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s212670; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s112671; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s012672; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612673; GFX942-NOTTGSPLIT-NEXT: s_endpgm12674;12675; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:12676; GFX942-TGSPLIT: ; %bb.0: ; %entry12677; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x012678; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x412679; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x812680; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)12681; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s212682; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s112683; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s012684; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612685; GFX942-TGSPLIT-NEXT: s_endpgm12686;12687; GFX11-WGP-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:12688; GFX11-WGP: ; %bb.0: ; %entry12689; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x012690; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x412691; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x812692; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)12693; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s212694; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s112695; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s012696; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612697; GFX11-WGP-NEXT: s_endpgm12698;12699; GFX11-CU-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:12700; GFX11-CU: ; %bb.0: ; %entry12701; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x012702; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x412703; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x812704; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)12705; GFX11-CU-NEXT: v_mov_b32_e32 v0, s212706; GFX11-CU-NEXT: v_mov_b32_e32 v1, s112707; GFX11-CU-NEXT: v_mov_b32_e32 v2, s012708; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612709; GFX11-CU-NEXT: s_endpgm12710;12711; GFX12-WGP-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:12712; GFX12-WGP: ; %bb.0: ; %entry12713; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x012714; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x412715; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x812716; GFX12-WGP-NEXT: s_wait_kmcnt 0x012717; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s212718; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s112719; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s012720; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612721; GFX12-WGP-NEXT: s_endpgm12722;12723; GFX12-CU-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:12724; GFX12-CU: ; %bb.0: ; %entry12725; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x012726; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x412727; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x812728; GFX12-CU-NEXT: s_wait_kmcnt 0x012729; GFX12-CU-NEXT: v_mov_b32_e32 v0, s212730; GFX12-CU-NEXT: v_mov_b32_e32 v1, s112731; GFX12-CU-NEXT: v_mov_b32_e32 v2, s012732; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612733; GFX12-CU-NEXT: s_endpgm12734;12735; GFX1250-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:12736; GFX1250: ; %bb.0: ; %entry12737; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 112738; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x012739; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x412740; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x812741; GFX1250-NEXT: s_wait_kmcnt 0x012742; GFX1250-NEXT: v_mov_b32_e32 v0, s212743; GFX1250-NEXT: v_mov_b32_e32 v1, s112744; GFX1250-NEXT: v_mov_b32_e32 v2, s012745; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612746; GFX1250-NEXT: s_endpgm12747 ptr addrspace(3) %out, i32 %in, i32 %old) {12748entry:12749 %gep = getelementptr i32, ptr addrspace(3) %out, i32 412750 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acquire acquire12751 ret void12752}12753 12754define amdgpu_kernel void @local_singlethread_one_as_release_acquire_cmpxchg(12755; GFX6-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:12756; GFX6: ; %bb.0: ; %entry12757; GFX6-NEXT: s_load_dword s6, s[8:9], 0x012758; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr612759; GFX6-NEXT: s_load_dword s4, s[8:9], 0x112760; GFX6-NEXT: s_load_dword s5, s[8:9], 0x212761; GFX6-NEXT: s_mov_b32 m0, -112762; GFX6-NEXT: s_waitcnt lgkmcnt(0)12763; GFX6-NEXT: v_mov_b32_e32 v0, s612764; GFX6-NEXT: v_mov_b32_e32 v1, s512765; GFX6-NEXT: v_mov_b32_e32 v2, s412766; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612767; GFX6-NEXT: s_endpgm12768;12769; GFX7-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:12770; GFX7: ; %bb.0: ; %entry12771; GFX7-NEXT: s_load_dword s6, s[8:9], 0x012772; GFX7-NEXT: s_load_dword s4, s[8:9], 0x112773; GFX7-NEXT: s_load_dword s5, s[8:9], 0x212774; GFX7-NEXT: s_mov_b32 m0, -112775; GFX7-NEXT: s_waitcnt lgkmcnt(0)12776; GFX7-NEXT: v_mov_b32_e32 v0, s612777; GFX7-NEXT: v_mov_b32_e32 v1, s512778; GFX7-NEXT: v_mov_b32_e32 v2, s412779; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612780; GFX7-NEXT: s_endpgm12781;12782; GFX10-WGP-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:12783; GFX10-WGP: ; %bb.0: ; %entry12784; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x012785; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x412786; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x812787; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)12788; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s612789; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s512790; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s412791; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612792; GFX10-WGP-NEXT: s_endpgm12793;12794; GFX10-CU-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:12795; GFX10-CU: ; %bb.0: ; %entry12796; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x012797; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x412798; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x812799; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)12800; GFX10-CU-NEXT: v_mov_b32_e32 v0, s612801; GFX10-CU-NEXT: v_mov_b32_e32 v1, s512802; GFX10-CU-NEXT: v_mov_b32_e32 v2, s412803; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612804; GFX10-CU-NEXT: s_endpgm12805;12806; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:12807; SKIP-CACHE-INV: ; %bb.0: ; %entry12808; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x012809; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x112810; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x212811; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -112812; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)12813; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s212814; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s112815; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s012816; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612817; SKIP-CACHE-INV-NEXT: s_endpgm12818;12819; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:12820; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry12821; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x012822; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x412823; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x812824; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)12825; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s612826; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s512827; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s412828; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612829; GFX90A-NOTTGSPLIT-NEXT: s_endpgm12830;12831; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:12832; GFX90A-TGSPLIT: ; %bb.0: ; %entry12833; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x012834; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x412835; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x812836; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)12837; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s612838; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s512839; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s412840; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612841; GFX90A-TGSPLIT-NEXT: s_endpgm12842;12843; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:12844; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry12845; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x012846; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x412847; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x812848; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)12849; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s212850; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s112851; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s012852; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612853; GFX942-NOTTGSPLIT-NEXT: s_endpgm12854;12855; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:12856; GFX942-TGSPLIT: ; %bb.0: ; %entry12857; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x012858; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x412859; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x812860; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)12861; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s212862; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s112863; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s012864; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612865; GFX942-TGSPLIT-NEXT: s_endpgm12866;12867; GFX11-WGP-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:12868; GFX11-WGP: ; %bb.0: ; %entry12869; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x012870; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x412871; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x812872; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)12873; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s212874; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s112875; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s012876; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612877; GFX11-WGP-NEXT: s_endpgm12878;12879; GFX11-CU-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:12880; GFX11-CU: ; %bb.0: ; %entry12881; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x012882; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x412883; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x812884; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)12885; GFX11-CU-NEXT: v_mov_b32_e32 v0, s212886; GFX11-CU-NEXT: v_mov_b32_e32 v1, s112887; GFX11-CU-NEXT: v_mov_b32_e32 v2, s012888; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612889; GFX11-CU-NEXT: s_endpgm12890;12891; GFX12-WGP-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:12892; GFX12-WGP: ; %bb.0: ; %entry12893; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x012894; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x412895; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x812896; GFX12-WGP-NEXT: s_wait_kmcnt 0x012897; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s212898; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s112899; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s012900; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612901; GFX12-WGP-NEXT: s_endpgm12902;12903; GFX12-CU-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:12904; GFX12-CU: ; %bb.0: ; %entry12905; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x012906; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x412907; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x812908; GFX12-CU-NEXT: s_wait_kmcnt 0x012909; GFX12-CU-NEXT: v_mov_b32_e32 v0, s212910; GFX12-CU-NEXT: v_mov_b32_e32 v1, s112911; GFX12-CU-NEXT: v_mov_b32_e32 v2, s012912; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612913; GFX12-CU-NEXT: s_endpgm12914;12915; GFX1250-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:12916; GFX1250: ; %bb.0: ; %entry12917; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 112918; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x012919; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x412920; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x812921; GFX1250-NEXT: s_wait_kmcnt 0x012922; GFX1250-NEXT: v_mov_b32_e32 v0, s212923; GFX1250-NEXT: v_mov_b32_e32 v1, s112924; GFX1250-NEXT: v_mov_b32_e32 v2, s012925; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1612926; GFX1250-NEXT: s_endpgm12927 ptr addrspace(3) %out, i32 %in, i32 %old) {12928entry:12929 %gep = getelementptr i32, ptr addrspace(3) %out, i32 412930 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") release acquire12931 ret void12932}12933 12934define amdgpu_kernel void @local_singlethread_one_as_acq_rel_acquire_cmpxchg(12935; GFX6-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:12936; GFX6: ; %bb.0: ; %entry12937; GFX6-NEXT: s_load_dword s6, s[8:9], 0x012938; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr612939; GFX6-NEXT: s_load_dword s4, s[8:9], 0x112940; GFX6-NEXT: s_load_dword s5, s[8:9], 0x212941; GFX6-NEXT: s_mov_b32 m0, -112942; GFX6-NEXT: s_waitcnt lgkmcnt(0)12943; GFX6-NEXT: v_mov_b32_e32 v0, s612944; GFX6-NEXT: v_mov_b32_e32 v1, s512945; GFX6-NEXT: v_mov_b32_e32 v2, s412946; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612947; GFX6-NEXT: s_endpgm12948;12949; GFX7-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:12950; GFX7: ; %bb.0: ; %entry12951; GFX7-NEXT: s_load_dword s6, s[8:9], 0x012952; GFX7-NEXT: s_load_dword s4, s[8:9], 0x112953; GFX7-NEXT: s_load_dword s5, s[8:9], 0x212954; GFX7-NEXT: s_mov_b32 m0, -112955; GFX7-NEXT: s_waitcnt lgkmcnt(0)12956; GFX7-NEXT: v_mov_b32_e32 v0, s612957; GFX7-NEXT: v_mov_b32_e32 v1, s512958; GFX7-NEXT: v_mov_b32_e32 v2, s412959; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612960; GFX7-NEXT: s_endpgm12961;12962; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:12963; GFX10-WGP: ; %bb.0: ; %entry12964; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x012965; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x412966; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x812967; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)12968; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s612969; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s512970; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s412971; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612972; GFX10-WGP-NEXT: s_endpgm12973;12974; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:12975; GFX10-CU: ; %bb.0: ; %entry12976; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x012977; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x412978; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x812979; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)12980; GFX10-CU-NEXT: v_mov_b32_e32 v0, s612981; GFX10-CU-NEXT: v_mov_b32_e32 v1, s512982; GFX10-CU-NEXT: v_mov_b32_e32 v2, s412983; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612984; GFX10-CU-NEXT: s_endpgm12985;12986; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:12987; SKIP-CACHE-INV: ; %bb.0: ; %entry12988; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x012989; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x112990; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x212991; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -112992; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)12993; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s212994; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s112995; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s012996; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1612997; SKIP-CACHE-INV-NEXT: s_endpgm12998;12999; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:13000; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry13001; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x013002; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x413003; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x813004; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13005; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s613006; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s513007; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s413008; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613009; GFX90A-NOTTGSPLIT-NEXT: s_endpgm13010;13011; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:13012; GFX90A-TGSPLIT: ; %bb.0: ; %entry13013; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x013014; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x413015; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x813016; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13017; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s613018; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s513019; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s413020; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613021; GFX90A-TGSPLIT-NEXT: s_endpgm13022;13023; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:13024; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry13025; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x013026; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x413027; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x813028; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13029; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s213030; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s113031; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s013032; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613033; GFX942-NOTTGSPLIT-NEXT: s_endpgm13034;13035; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:13036; GFX942-TGSPLIT: ; %bb.0: ; %entry13037; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x013038; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x413039; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x813040; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13041; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s213042; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s113043; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s013044; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613045; GFX942-TGSPLIT-NEXT: s_endpgm13046;13047; GFX11-WGP-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:13048; GFX11-WGP: ; %bb.0: ; %entry13049; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x013050; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x413051; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x813052; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)13053; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s213054; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s113055; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s013056; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613057; GFX11-WGP-NEXT: s_endpgm13058;13059; GFX11-CU-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:13060; GFX11-CU: ; %bb.0: ; %entry13061; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x013062; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x413063; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x813064; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)13065; GFX11-CU-NEXT: v_mov_b32_e32 v0, s213066; GFX11-CU-NEXT: v_mov_b32_e32 v1, s113067; GFX11-CU-NEXT: v_mov_b32_e32 v2, s013068; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613069; GFX11-CU-NEXT: s_endpgm13070;13071; GFX12-WGP-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:13072; GFX12-WGP: ; %bb.0: ; %entry13073; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x013074; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x413075; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x813076; GFX12-WGP-NEXT: s_wait_kmcnt 0x013077; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s213078; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s113079; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s013080; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613081; GFX12-WGP-NEXT: s_endpgm13082;13083; GFX12-CU-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:13084; GFX12-CU: ; %bb.0: ; %entry13085; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x013086; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x413087; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x813088; GFX12-CU-NEXT: s_wait_kmcnt 0x013089; GFX12-CU-NEXT: v_mov_b32_e32 v0, s213090; GFX12-CU-NEXT: v_mov_b32_e32 v1, s113091; GFX12-CU-NEXT: v_mov_b32_e32 v2, s013092; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613093; GFX12-CU-NEXT: s_endpgm13094;13095; GFX1250-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:13096; GFX1250: ; %bb.0: ; %entry13097; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 113098; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x013099; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x413100; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x813101; GFX1250-NEXT: s_wait_kmcnt 0x013102; GFX1250-NEXT: v_mov_b32_e32 v0, s213103; GFX1250-NEXT: v_mov_b32_e32 v1, s113104; GFX1250-NEXT: v_mov_b32_e32 v2, s013105; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613106; GFX1250-NEXT: s_endpgm13107 ptr addrspace(3) %out, i32 %in, i32 %old) {13108entry:13109 %gep = getelementptr i32, ptr addrspace(3) %out, i32 413110 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acq_rel acquire13111 ret void13112}13113 13114define amdgpu_kernel void @local_singlethread_one_as_seq_cst_acquire_cmpxchg(13115; GFX6-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:13116; GFX6: ; %bb.0: ; %entry13117; GFX6-NEXT: s_load_dword s6, s[8:9], 0x013118; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr613119; GFX6-NEXT: s_load_dword s4, s[8:9], 0x113120; GFX6-NEXT: s_load_dword s5, s[8:9], 0x213121; GFX6-NEXT: s_mov_b32 m0, -113122; GFX6-NEXT: s_waitcnt lgkmcnt(0)13123; GFX6-NEXT: v_mov_b32_e32 v0, s613124; GFX6-NEXT: v_mov_b32_e32 v1, s513125; GFX6-NEXT: v_mov_b32_e32 v2, s413126; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613127; GFX6-NEXT: s_endpgm13128;13129; GFX7-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:13130; GFX7: ; %bb.0: ; %entry13131; GFX7-NEXT: s_load_dword s6, s[8:9], 0x013132; GFX7-NEXT: s_load_dword s4, s[8:9], 0x113133; GFX7-NEXT: s_load_dword s5, s[8:9], 0x213134; GFX7-NEXT: s_mov_b32 m0, -113135; GFX7-NEXT: s_waitcnt lgkmcnt(0)13136; GFX7-NEXT: v_mov_b32_e32 v0, s613137; GFX7-NEXT: v_mov_b32_e32 v1, s513138; GFX7-NEXT: v_mov_b32_e32 v2, s413139; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613140; GFX7-NEXT: s_endpgm13141;13142; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:13143; GFX10-WGP: ; %bb.0: ; %entry13144; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x013145; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x413146; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x813147; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)13148; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s613149; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s513150; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s413151; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613152; GFX10-WGP-NEXT: s_endpgm13153;13154; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:13155; GFX10-CU: ; %bb.0: ; %entry13156; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x013157; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x413158; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x813159; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)13160; GFX10-CU-NEXT: v_mov_b32_e32 v0, s613161; GFX10-CU-NEXT: v_mov_b32_e32 v1, s513162; GFX10-CU-NEXT: v_mov_b32_e32 v2, s413163; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613164; GFX10-CU-NEXT: s_endpgm13165;13166; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:13167; SKIP-CACHE-INV: ; %bb.0: ; %entry13168; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x013169; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x113170; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x213171; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -113172; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)13173; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s213174; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s113175; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s013176; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613177; SKIP-CACHE-INV-NEXT: s_endpgm13178;13179; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:13180; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry13181; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x013182; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x413183; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x813184; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13185; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s613186; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s513187; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s413188; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613189; GFX90A-NOTTGSPLIT-NEXT: s_endpgm13190;13191; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:13192; GFX90A-TGSPLIT: ; %bb.0: ; %entry13193; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x013194; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x413195; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x813196; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13197; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s613198; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s513199; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s413200; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613201; GFX90A-TGSPLIT-NEXT: s_endpgm13202;13203; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:13204; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry13205; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x013206; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x413207; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x813208; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13209; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s213210; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s113211; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s013212; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613213; GFX942-NOTTGSPLIT-NEXT: s_endpgm13214;13215; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:13216; GFX942-TGSPLIT: ; %bb.0: ; %entry13217; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x013218; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x413219; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x813220; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13221; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s213222; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s113223; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s013224; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613225; GFX942-TGSPLIT-NEXT: s_endpgm13226;13227; GFX11-WGP-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:13228; GFX11-WGP: ; %bb.0: ; %entry13229; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x013230; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x413231; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x813232; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)13233; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s213234; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s113235; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s013236; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613237; GFX11-WGP-NEXT: s_endpgm13238;13239; GFX11-CU-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:13240; GFX11-CU: ; %bb.0: ; %entry13241; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x013242; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x413243; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x813244; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)13245; GFX11-CU-NEXT: v_mov_b32_e32 v0, s213246; GFX11-CU-NEXT: v_mov_b32_e32 v1, s113247; GFX11-CU-NEXT: v_mov_b32_e32 v2, s013248; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613249; GFX11-CU-NEXT: s_endpgm13250;13251; GFX12-WGP-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:13252; GFX12-WGP: ; %bb.0: ; %entry13253; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x013254; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x413255; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x813256; GFX12-WGP-NEXT: s_wait_kmcnt 0x013257; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s213258; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s113259; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s013260; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613261; GFX12-WGP-NEXT: s_endpgm13262;13263; GFX12-CU-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:13264; GFX12-CU: ; %bb.0: ; %entry13265; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x013266; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x413267; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x813268; GFX12-CU-NEXT: s_wait_kmcnt 0x013269; GFX12-CU-NEXT: v_mov_b32_e32 v0, s213270; GFX12-CU-NEXT: v_mov_b32_e32 v1, s113271; GFX12-CU-NEXT: v_mov_b32_e32 v2, s013272; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613273; GFX12-CU-NEXT: s_endpgm13274;13275; GFX1250-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:13276; GFX1250: ; %bb.0: ; %entry13277; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 113278; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x013279; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x413280; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x813281; GFX1250-NEXT: s_wait_kmcnt 0x013282; GFX1250-NEXT: v_mov_b32_e32 v0, s213283; GFX1250-NEXT: v_mov_b32_e32 v1, s113284; GFX1250-NEXT: v_mov_b32_e32 v2, s013285; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613286; GFX1250-NEXT: s_endpgm13287 ptr addrspace(3) %out, i32 %in, i32 %old) {13288entry:13289 %gep = getelementptr i32, ptr addrspace(3) %out, i32 413290 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") seq_cst acquire13291 ret void13292}13293 13294define amdgpu_kernel void @local_singlethread_one_as_monotonic_seq_cst_cmpxchg(13295; GFX6-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:13296; GFX6: ; %bb.0: ; %entry13297; GFX6-NEXT: s_load_dword s6, s[8:9], 0x013298; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr613299; GFX6-NEXT: s_load_dword s4, s[8:9], 0x113300; GFX6-NEXT: s_load_dword s5, s[8:9], 0x213301; GFX6-NEXT: s_mov_b32 m0, -113302; GFX6-NEXT: s_waitcnt lgkmcnt(0)13303; GFX6-NEXT: v_mov_b32_e32 v0, s613304; GFX6-NEXT: v_mov_b32_e32 v1, s513305; GFX6-NEXT: v_mov_b32_e32 v2, s413306; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613307; GFX6-NEXT: s_endpgm13308;13309; GFX7-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:13310; GFX7: ; %bb.0: ; %entry13311; GFX7-NEXT: s_load_dword s6, s[8:9], 0x013312; GFX7-NEXT: s_load_dword s4, s[8:9], 0x113313; GFX7-NEXT: s_load_dword s5, s[8:9], 0x213314; GFX7-NEXT: s_mov_b32 m0, -113315; GFX7-NEXT: s_waitcnt lgkmcnt(0)13316; GFX7-NEXT: v_mov_b32_e32 v0, s613317; GFX7-NEXT: v_mov_b32_e32 v1, s513318; GFX7-NEXT: v_mov_b32_e32 v2, s413319; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613320; GFX7-NEXT: s_endpgm13321;13322; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:13323; GFX10-WGP: ; %bb.0: ; %entry13324; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x013325; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x413326; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x813327; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)13328; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s613329; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s513330; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s413331; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613332; GFX10-WGP-NEXT: s_endpgm13333;13334; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:13335; GFX10-CU: ; %bb.0: ; %entry13336; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x013337; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x413338; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x813339; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)13340; GFX10-CU-NEXT: v_mov_b32_e32 v0, s613341; GFX10-CU-NEXT: v_mov_b32_e32 v1, s513342; GFX10-CU-NEXT: v_mov_b32_e32 v2, s413343; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613344; GFX10-CU-NEXT: s_endpgm13345;13346; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:13347; SKIP-CACHE-INV: ; %bb.0: ; %entry13348; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x013349; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x113350; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x213351; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -113352; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)13353; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s213354; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s113355; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s013356; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613357; SKIP-CACHE-INV-NEXT: s_endpgm13358;13359; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:13360; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry13361; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x013362; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x413363; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x813364; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13365; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s613366; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s513367; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s413368; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613369; GFX90A-NOTTGSPLIT-NEXT: s_endpgm13370;13371; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:13372; GFX90A-TGSPLIT: ; %bb.0: ; %entry13373; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x013374; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x413375; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x813376; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13377; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s613378; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s513379; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s413380; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613381; GFX90A-TGSPLIT-NEXT: s_endpgm13382;13383; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:13384; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry13385; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x013386; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x413387; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x813388; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13389; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s213390; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s113391; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s013392; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613393; GFX942-NOTTGSPLIT-NEXT: s_endpgm13394;13395; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:13396; GFX942-TGSPLIT: ; %bb.0: ; %entry13397; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x013398; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x413399; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x813400; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13401; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s213402; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s113403; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s013404; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613405; GFX942-TGSPLIT-NEXT: s_endpgm13406;13407; GFX11-WGP-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:13408; GFX11-WGP: ; %bb.0: ; %entry13409; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x013410; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x413411; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x813412; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)13413; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s213414; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s113415; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s013416; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613417; GFX11-WGP-NEXT: s_endpgm13418;13419; GFX11-CU-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:13420; GFX11-CU: ; %bb.0: ; %entry13421; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x013422; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x413423; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x813424; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)13425; GFX11-CU-NEXT: v_mov_b32_e32 v0, s213426; GFX11-CU-NEXT: v_mov_b32_e32 v1, s113427; GFX11-CU-NEXT: v_mov_b32_e32 v2, s013428; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613429; GFX11-CU-NEXT: s_endpgm13430;13431; GFX12-WGP-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:13432; GFX12-WGP: ; %bb.0: ; %entry13433; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x013434; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x413435; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x813436; GFX12-WGP-NEXT: s_wait_kmcnt 0x013437; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s213438; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s113439; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s013440; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613441; GFX12-WGP-NEXT: s_endpgm13442;13443; GFX12-CU-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:13444; GFX12-CU: ; %bb.0: ; %entry13445; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x013446; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x413447; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x813448; GFX12-CU-NEXT: s_wait_kmcnt 0x013449; GFX12-CU-NEXT: v_mov_b32_e32 v0, s213450; GFX12-CU-NEXT: v_mov_b32_e32 v1, s113451; GFX12-CU-NEXT: v_mov_b32_e32 v2, s013452; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613453; GFX12-CU-NEXT: s_endpgm13454;13455; GFX1250-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:13456; GFX1250: ; %bb.0: ; %entry13457; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 113458; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x013459; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x413460; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x813461; GFX1250-NEXT: s_wait_kmcnt 0x013462; GFX1250-NEXT: v_mov_b32_e32 v0, s213463; GFX1250-NEXT: v_mov_b32_e32 v1, s113464; GFX1250-NEXT: v_mov_b32_e32 v2, s013465; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613466; GFX1250-NEXT: s_endpgm13467 ptr addrspace(3) %out, i32 %in, i32 %old) {13468entry:13469 %gep = getelementptr i32, ptr addrspace(3) %out, i32 413470 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") monotonic seq_cst13471 ret void13472}13473 13474define amdgpu_kernel void @local_singlethread_one_as_acquire_seq_cst_cmpxchg(13475; GFX6-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:13476; GFX6: ; %bb.0: ; %entry13477; GFX6-NEXT: s_load_dword s6, s[8:9], 0x013478; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr613479; GFX6-NEXT: s_load_dword s4, s[8:9], 0x113480; GFX6-NEXT: s_load_dword s5, s[8:9], 0x213481; GFX6-NEXT: s_mov_b32 m0, -113482; GFX6-NEXT: s_waitcnt lgkmcnt(0)13483; GFX6-NEXT: v_mov_b32_e32 v0, s613484; GFX6-NEXT: v_mov_b32_e32 v1, s513485; GFX6-NEXT: v_mov_b32_e32 v2, s413486; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613487; GFX6-NEXT: s_endpgm13488;13489; GFX7-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:13490; GFX7: ; %bb.0: ; %entry13491; GFX7-NEXT: s_load_dword s6, s[8:9], 0x013492; GFX7-NEXT: s_load_dword s4, s[8:9], 0x113493; GFX7-NEXT: s_load_dword s5, s[8:9], 0x213494; GFX7-NEXT: s_mov_b32 m0, -113495; GFX7-NEXT: s_waitcnt lgkmcnt(0)13496; GFX7-NEXT: v_mov_b32_e32 v0, s613497; GFX7-NEXT: v_mov_b32_e32 v1, s513498; GFX7-NEXT: v_mov_b32_e32 v2, s413499; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613500; GFX7-NEXT: s_endpgm13501;13502; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:13503; GFX10-WGP: ; %bb.0: ; %entry13504; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x013505; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x413506; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x813507; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)13508; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s613509; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s513510; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s413511; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613512; GFX10-WGP-NEXT: s_endpgm13513;13514; GFX10-CU-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:13515; GFX10-CU: ; %bb.0: ; %entry13516; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x013517; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x413518; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x813519; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)13520; GFX10-CU-NEXT: v_mov_b32_e32 v0, s613521; GFX10-CU-NEXT: v_mov_b32_e32 v1, s513522; GFX10-CU-NEXT: v_mov_b32_e32 v2, s413523; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613524; GFX10-CU-NEXT: s_endpgm13525;13526; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:13527; SKIP-CACHE-INV: ; %bb.0: ; %entry13528; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x013529; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x113530; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x213531; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -113532; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)13533; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s213534; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s113535; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s013536; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613537; SKIP-CACHE-INV-NEXT: s_endpgm13538;13539; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:13540; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry13541; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x013542; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x413543; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x813544; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13545; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s613546; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s513547; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s413548; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613549; GFX90A-NOTTGSPLIT-NEXT: s_endpgm13550;13551; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:13552; GFX90A-TGSPLIT: ; %bb.0: ; %entry13553; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x013554; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x413555; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x813556; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13557; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s613558; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s513559; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s413560; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613561; GFX90A-TGSPLIT-NEXT: s_endpgm13562;13563; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:13564; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry13565; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x013566; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x413567; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x813568; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13569; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s213570; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s113571; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s013572; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613573; GFX942-NOTTGSPLIT-NEXT: s_endpgm13574;13575; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:13576; GFX942-TGSPLIT: ; %bb.0: ; %entry13577; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x013578; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x413579; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x813580; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13581; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s213582; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s113583; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s013584; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613585; GFX942-TGSPLIT-NEXT: s_endpgm13586;13587; GFX11-WGP-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:13588; GFX11-WGP: ; %bb.0: ; %entry13589; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x013590; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x413591; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x813592; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)13593; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s213594; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s113595; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s013596; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613597; GFX11-WGP-NEXT: s_endpgm13598;13599; GFX11-CU-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:13600; GFX11-CU: ; %bb.0: ; %entry13601; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x013602; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x413603; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x813604; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)13605; GFX11-CU-NEXT: v_mov_b32_e32 v0, s213606; GFX11-CU-NEXT: v_mov_b32_e32 v1, s113607; GFX11-CU-NEXT: v_mov_b32_e32 v2, s013608; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613609; GFX11-CU-NEXT: s_endpgm13610;13611; GFX12-WGP-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:13612; GFX12-WGP: ; %bb.0: ; %entry13613; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x013614; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x413615; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x813616; GFX12-WGP-NEXT: s_wait_kmcnt 0x013617; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s213618; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s113619; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s013620; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613621; GFX12-WGP-NEXT: s_endpgm13622;13623; GFX12-CU-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:13624; GFX12-CU: ; %bb.0: ; %entry13625; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x013626; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x413627; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x813628; GFX12-CU-NEXT: s_wait_kmcnt 0x013629; GFX12-CU-NEXT: v_mov_b32_e32 v0, s213630; GFX12-CU-NEXT: v_mov_b32_e32 v1, s113631; GFX12-CU-NEXT: v_mov_b32_e32 v2, s013632; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613633; GFX12-CU-NEXT: s_endpgm13634;13635; GFX1250-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:13636; GFX1250: ; %bb.0: ; %entry13637; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 113638; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x013639; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x413640; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x813641; GFX1250-NEXT: s_wait_kmcnt 0x013642; GFX1250-NEXT: v_mov_b32_e32 v0, s213643; GFX1250-NEXT: v_mov_b32_e32 v1, s113644; GFX1250-NEXT: v_mov_b32_e32 v2, s013645; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613646; GFX1250-NEXT: s_endpgm13647 ptr addrspace(3) %out, i32 %in, i32 %old) {13648entry:13649 %gep = getelementptr i32, ptr addrspace(3) %out, i32 413650 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acquire seq_cst13651 ret void13652}13653 13654define amdgpu_kernel void @local_singlethread_one_as_release_seq_cst_cmpxchg(13655; GFX6-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:13656; GFX6: ; %bb.0: ; %entry13657; GFX6-NEXT: s_load_dword s6, s[8:9], 0x013658; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr613659; GFX6-NEXT: s_load_dword s4, s[8:9], 0x113660; GFX6-NEXT: s_load_dword s5, s[8:9], 0x213661; GFX6-NEXT: s_mov_b32 m0, -113662; GFX6-NEXT: s_waitcnt lgkmcnt(0)13663; GFX6-NEXT: v_mov_b32_e32 v0, s613664; GFX6-NEXT: v_mov_b32_e32 v1, s513665; GFX6-NEXT: v_mov_b32_e32 v2, s413666; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613667; GFX6-NEXT: s_endpgm13668;13669; GFX7-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:13670; GFX7: ; %bb.0: ; %entry13671; GFX7-NEXT: s_load_dword s6, s[8:9], 0x013672; GFX7-NEXT: s_load_dword s4, s[8:9], 0x113673; GFX7-NEXT: s_load_dword s5, s[8:9], 0x213674; GFX7-NEXT: s_mov_b32 m0, -113675; GFX7-NEXT: s_waitcnt lgkmcnt(0)13676; GFX7-NEXT: v_mov_b32_e32 v0, s613677; GFX7-NEXT: v_mov_b32_e32 v1, s513678; GFX7-NEXT: v_mov_b32_e32 v2, s413679; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613680; GFX7-NEXT: s_endpgm13681;13682; GFX10-WGP-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:13683; GFX10-WGP: ; %bb.0: ; %entry13684; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x013685; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x413686; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x813687; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)13688; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s613689; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s513690; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s413691; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613692; GFX10-WGP-NEXT: s_endpgm13693;13694; GFX10-CU-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:13695; GFX10-CU: ; %bb.0: ; %entry13696; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x013697; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x413698; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x813699; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)13700; GFX10-CU-NEXT: v_mov_b32_e32 v0, s613701; GFX10-CU-NEXT: v_mov_b32_e32 v1, s513702; GFX10-CU-NEXT: v_mov_b32_e32 v2, s413703; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613704; GFX10-CU-NEXT: s_endpgm13705;13706; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:13707; SKIP-CACHE-INV: ; %bb.0: ; %entry13708; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x013709; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x113710; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x213711; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -113712; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)13713; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s213714; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s113715; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s013716; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613717; SKIP-CACHE-INV-NEXT: s_endpgm13718;13719; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:13720; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry13721; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x013722; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x413723; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x813724; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13725; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s613726; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s513727; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s413728; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613729; GFX90A-NOTTGSPLIT-NEXT: s_endpgm13730;13731; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:13732; GFX90A-TGSPLIT: ; %bb.0: ; %entry13733; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x013734; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x413735; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x813736; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13737; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s613738; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s513739; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s413740; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613741; GFX90A-TGSPLIT-NEXT: s_endpgm13742;13743; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:13744; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry13745; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x013746; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x413747; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x813748; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13749; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s213750; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s113751; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s013752; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613753; GFX942-NOTTGSPLIT-NEXT: s_endpgm13754;13755; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:13756; GFX942-TGSPLIT: ; %bb.0: ; %entry13757; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x013758; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x413759; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x813760; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13761; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s213762; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s113763; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s013764; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613765; GFX942-TGSPLIT-NEXT: s_endpgm13766;13767; GFX11-WGP-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:13768; GFX11-WGP: ; %bb.0: ; %entry13769; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x013770; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x413771; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x813772; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)13773; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s213774; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s113775; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s013776; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613777; GFX11-WGP-NEXT: s_endpgm13778;13779; GFX11-CU-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:13780; GFX11-CU: ; %bb.0: ; %entry13781; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x013782; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x413783; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x813784; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)13785; GFX11-CU-NEXT: v_mov_b32_e32 v0, s213786; GFX11-CU-NEXT: v_mov_b32_e32 v1, s113787; GFX11-CU-NEXT: v_mov_b32_e32 v2, s013788; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613789; GFX11-CU-NEXT: s_endpgm13790;13791; GFX12-WGP-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:13792; GFX12-WGP: ; %bb.0: ; %entry13793; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x013794; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x413795; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x813796; GFX12-WGP-NEXT: s_wait_kmcnt 0x013797; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s213798; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s113799; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s013800; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613801; GFX12-WGP-NEXT: s_endpgm13802;13803; GFX12-CU-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:13804; GFX12-CU: ; %bb.0: ; %entry13805; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x013806; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x413807; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x813808; GFX12-CU-NEXT: s_wait_kmcnt 0x013809; GFX12-CU-NEXT: v_mov_b32_e32 v0, s213810; GFX12-CU-NEXT: v_mov_b32_e32 v1, s113811; GFX12-CU-NEXT: v_mov_b32_e32 v2, s013812; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613813; GFX12-CU-NEXT: s_endpgm13814;13815; GFX1250-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:13816; GFX1250: ; %bb.0: ; %entry13817; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 113818; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x013819; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x413820; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x813821; GFX1250-NEXT: s_wait_kmcnt 0x013822; GFX1250-NEXT: v_mov_b32_e32 v0, s213823; GFX1250-NEXT: v_mov_b32_e32 v1, s113824; GFX1250-NEXT: v_mov_b32_e32 v2, s013825; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613826; GFX1250-NEXT: s_endpgm13827 ptr addrspace(3) %out, i32 %in, i32 %old) {13828entry:13829 %gep = getelementptr i32, ptr addrspace(3) %out, i32 413830 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") release seq_cst13831 ret void13832}13833 13834define amdgpu_kernel void @local_singlethread_one_as_acq_rel_seq_cst_cmpxchg(13835; GFX6-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:13836; GFX6: ; %bb.0: ; %entry13837; GFX6-NEXT: s_load_dword s6, s[8:9], 0x013838; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr613839; GFX6-NEXT: s_load_dword s4, s[8:9], 0x113840; GFX6-NEXT: s_load_dword s5, s[8:9], 0x213841; GFX6-NEXT: s_mov_b32 m0, -113842; GFX6-NEXT: s_waitcnt lgkmcnt(0)13843; GFX6-NEXT: v_mov_b32_e32 v0, s613844; GFX6-NEXT: v_mov_b32_e32 v1, s513845; GFX6-NEXT: v_mov_b32_e32 v2, s413846; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613847; GFX6-NEXT: s_endpgm13848;13849; GFX7-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:13850; GFX7: ; %bb.0: ; %entry13851; GFX7-NEXT: s_load_dword s6, s[8:9], 0x013852; GFX7-NEXT: s_load_dword s4, s[8:9], 0x113853; GFX7-NEXT: s_load_dword s5, s[8:9], 0x213854; GFX7-NEXT: s_mov_b32 m0, -113855; GFX7-NEXT: s_waitcnt lgkmcnt(0)13856; GFX7-NEXT: v_mov_b32_e32 v0, s613857; GFX7-NEXT: v_mov_b32_e32 v1, s513858; GFX7-NEXT: v_mov_b32_e32 v2, s413859; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613860; GFX7-NEXT: s_endpgm13861;13862; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:13863; GFX10-WGP: ; %bb.0: ; %entry13864; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x013865; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x413866; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x813867; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)13868; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s613869; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s513870; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s413871; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613872; GFX10-WGP-NEXT: s_endpgm13873;13874; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:13875; GFX10-CU: ; %bb.0: ; %entry13876; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x013877; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x413878; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x813879; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)13880; GFX10-CU-NEXT: v_mov_b32_e32 v0, s613881; GFX10-CU-NEXT: v_mov_b32_e32 v1, s513882; GFX10-CU-NEXT: v_mov_b32_e32 v2, s413883; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613884; GFX10-CU-NEXT: s_endpgm13885;13886; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:13887; SKIP-CACHE-INV: ; %bb.0: ; %entry13888; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x013889; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x113890; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x213891; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -113892; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)13893; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s213894; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s113895; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s013896; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613897; SKIP-CACHE-INV-NEXT: s_endpgm13898;13899; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:13900; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry13901; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x013902; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x413903; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x813904; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13905; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s613906; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s513907; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s413908; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613909; GFX90A-NOTTGSPLIT-NEXT: s_endpgm13910;13911; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:13912; GFX90A-TGSPLIT: ; %bb.0: ; %entry13913; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x013914; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x413915; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x813916; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13917; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s613918; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s513919; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s413920; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613921; GFX90A-TGSPLIT-NEXT: s_endpgm13922;13923; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:13924; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry13925; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x013926; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x413927; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x813928; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13929; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s213930; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s113931; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s013932; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613933; GFX942-NOTTGSPLIT-NEXT: s_endpgm13934;13935; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:13936; GFX942-TGSPLIT: ; %bb.0: ; %entry13937; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x013938; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x413939; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x813940; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)13941; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s213942; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s113943; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s013944; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1613945; GFX942-TGSPLIT-NEXT: s_endpgm13946;13947; GFX11-WGP-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:13948; GFX11-WGP: ; %bb.0: ; %entry13949; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x013950; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x413951; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x813952; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)13953; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s213954; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s113955; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s013956; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613957; GFX11-WGP-NEXT: s_endpgm13958;13959; GFX11-CU-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:13960; GFX11-CU: ; %bb.0: ; %entry13961; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x013962; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x413963; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x813964; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)13965; GFX11-CU-NEXT: v_mov_b32_e32 v0, s213966; GFX11-CU-NEXT: v_mov_b32_e32 v1, s113967; GFX11-CU-NEXT: v_mov_b32_e32 v2, s013968; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613969; GFX11-CU-NEXT: s_endpgm13970;13971; GFX12-WGP-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:13972; GFX12-WGP: ; %bb.0: ; %entry13973; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x013974; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x413975; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x813976; GFX12-WGP-NEXT: s_wait_kmcnt 0x013977; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s213978; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s113979; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s013980; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613981; GFX12-WGP-NEXT: s_endpgm13982;13983; GFX12-CU-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:13984; GFX12-CU: ; %bb.0: ; %entry13985; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x013986; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x413987; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x813988; GFX12-CU-NEXT: s_wait_kmcnt 0x013989; GFX12-CU-NEXT: v_mov_b32_e32 v0, s213990; GFX12-CU-NEXT: v_mov_b32_e32 v1, s113991; GFX12-CU-NEXT: v_mov_b32_e32 v2, s013992; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1613993; GFX12-CU-NEXT: s_endpgm13994;13995; GFX1250-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:13996; GFX1250: ; %bb.0: ; %entry13997; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 113998; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x013999; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x414000; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x814001; GFX1250-NEXT: s_wait_kmcnt 0x014002; GFX1250-NEXT: v_mov_b32_e32 v0, s214003; GFX1250-NEXT: v_mov_b32_e32 v1, s114004; GFX1250-NEXT: v_mov_b32_e32 v2, s014005; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1614006; GFX1250-NEXT: s_endpgm14007 ptr addrspace(3) %out, i32 %in, i32 %old) {14008entry:14009 %gep = getelementptr i32, ptr addrspace(3) %out, i32 414010 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acq_rel seq_cst14011 ret void14012}14013 14014define amdgpu_kernel void @local_singlethread_one_as_seq_cst_seq_cst_cmpxchg(14015; GFX6-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:14016; GFX6: ; %bb.0: ; %entry14017; GFX6-NEXT: s_load_dword s6, s[8:9], 0x014018; GFX6-NEXT: ; kill: def $sgpr4 killed $sgpr614019; GFX6-NEXT: s_load_dword s4, s[8:9], 0x114020; GFX6-NEXT: s_load_dword s5, s[8:9], 0x214021; GFX6-NEXT: s_mov_b32 m0, -114022; GFX6-NEXT: s_waitcnt lgkmcnt(0)14023; GFX6-NEXT: v_mov_b32_e32 v0, s614024; GFX6-NEXT: v_mov_b32_e32 v1, s514025; GFX6-NEXT: v_mov_b32_e32 v2, s414026; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1614027; GFX6-NEXT: s_endpgm14028;14029; GFX7-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:14030; GFX7: ; %bb.0: ; %entry14031; GFX7-NEXT: s_load_dword s6, s[8:9], 0x014032; GFX7-NEXT: s_load_dword s4, s[8:9], 0x114033; GFX7-NEXT: s_load_dword s5, s[8:9], 0x214034; GFX7-NEXT: s_mov_b32 m0, -114035; GFX7-NEXT: s_waitcnt lgkmcnt(0)14036; GFX7-NEXT: v_mov_b32_e32 v0, s614037; GFX7-NEXT: v_mov_b32_e32 v1, s514038; GFX7-NEXT: v_mov_b32_e32 v2, s414039; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1614040; GFX7-NEXT: s_endpgm14041;14042; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:14043; GFX10-WGP: ; %bb.0: ; %entry14044; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x014045; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x414046; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x814047; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)14048; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s614049; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s514050; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s414051; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1614052; GFX10-WGP-NEXT: s_endpgm14053;14054; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:14055; GFX10-CU: ; %bb.0: ; %entry14056; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x014057; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x414058; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x814059; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)14060; GFX10-CU-NEXT: v_mov_b32_e32 v0, s614061; GFX10-CU-NEXT: v_mov_b32_e32 v1, s514062; GFX10-CU-NEXT: v_mov_b32_e32 v2, s414063; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1614064; GFX10-CU-NEXT: s_endpgm14065;14066; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:14067; SKIP-CACHE-INV: ; %bb.0: ; %entry14068; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x014069; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x114070; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x214071; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -114072; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)14073; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s214074; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s114075; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s014076; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1614077; SKIP-CACHE-INV-NEXT: s_endpgm14078;14079; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:14080; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry14081; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x014082; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x414083; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x814084; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14085; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s614086; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s514087; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s414088; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1614089; GFX90A-NOTTGSPLIT-NEXT: s_endpgm14090;14091; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:14092; GFX90A-TGSPLIT: ; %bb.0: ; %entry14093; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x014094; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x414095; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x814096; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14097; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s614098; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s514099; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s414100; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1614101; GFX90A-TGSPLIT-NEXT: s_endpgm14102;14103; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:14104; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry14105; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x014106; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x414107; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x814108; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14109; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s214110; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s114111; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s014112; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1614113; GFX942-NOTTGSPLIT-NEXT: s_endpgm14114;14115; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:14116; GFX942-TGSPLIT: ; %bb.0: ; %entry14117; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x014118; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x414119; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x814120; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14121; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s214122; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s114123; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s014124; GFX942-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:1614125; GFX942-TGSPLIT-NEXT: s_endpgm14126;14127; GFX11-WGP-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:14128; GFX11-WGP: ; %bb.0: ; %entry14129; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x014130; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x414131; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x814132; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)14133; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s214134; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s114135; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s014136; GFX11-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1614137; GFX11-WGP-NEXT: s_endpgm14138;14139; GFX11-CU-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:14140; GFX11-CU: ; %bb.0: ; %entry14141; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x014142; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x414143; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x814144; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)14145; GFX11-CU-NEXT: v_mov_b32_e32 v0, s214146; GFX11-CU-NEXT: v_mov_b32_e32 v1, s114147; GFX11-CU-NEXT: v_mov_b32_e32 v2, s014148; GFX11-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1614149; GFX11-CU-NEXT: s_endpgm14150;14151; GFX12-WGP-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:14152; GFX12-WGP: ; %bb.0: ; %entry14153; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x014154; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x414155; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x814156; GFX12-WGP-NEXT: s_wait_kmcnt 0x014157; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s214158; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s114159; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s014160; GFX12-WGP-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1614161; GFX12-WGP-NEXT: s_endpgm14162;14163; GFX12-CU-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:14164; GFX12-CU: ; %bb.0: ; %entry14165; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x014166; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x414167; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x814168; GFX12-CU-NEXT: s_wait_kmcnt 0x014169; GFX12-CU-NEXT: v_mov_b32_e32 v0, s214170; GFX12-CU-NEXT: v_mov_b32_e32 v1, s114171; GFX12-CU-NEXT: v_mov_b32_e32 v2, s014172; GFX12-CU-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1614173; GFX12-CU-NEXT: s_endpgm14174;14175; GFX1250-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:14176; GFX1250: ; %bb.0: ; %entry14177; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 114178; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x014179; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x414180; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x814181; GFX1250-NEXT: s_wait_kmcnt 0x014182; GFX1250-NEXT: v_mov_b32_e32 v0, s214183; GFX1250-NEXT: v_mov_b32_e32 v1, s114184; GFX1250-NEXT: v_mov_b32_e32 v2, s014185; GFX1250-NEXT: ds_cmpstore_b32 v0, v1, v2 offset:1614186; GFX1250-NEXT: s_endpgm14187 ptr addrspace(3) %out, i32 %in, i32 %old) {14188entry:14189 %gep = getelementptr i32, ptr addrspace(3) %out, i32 414190 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") seq_cst seq_cst14191 ret void14192}14193 14194define amdgpu_kernel void @local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg(14195; GFX6-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:14196; GFX6: ; %bb.0: ; %entry14197; GFX6-NEXT: s_load_dword s4, s[8:9], 0x014198; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr414199; GFX6-NEXT: s_load_dword s5, s[8:9], 0x114200; GFX6-NEXT: s_load_dword s6, s[8:9], 0x214201; GFX6-NEXT: s_mov_b32 m0, -114202; GFX6-NEXT: s_waitcnt lgkmcnt(0)14203; GFX6-NEXT: v_mov_b32_e32 v0, s414204; GFX6-NEXT: v_mov_b32_e32 v1, s614205; GFX6-NEXT: v_mov_b32_e32 v2, s514206; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614207; GFX6-NEXT: s_mov_b32 m0, -114208; GFX6-NEXT: v_mov_b32_e32 v0, s414209; GFX6-NEXT: s_waitcnt lgkmcnt(0)14210; GFX6-NEXT: ds_write_b32 v0, v114211; GFX6-NEXT: s_endpgm14212;14213; GFX7-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:14214; GFX7: ; %bb.0: ; %entry14215; GFX7-NEXT: s_load_dword s4, s[8:9], 0x014216; GFX7-NEXT: s_load_dword s5, s[8:9], 0x114217; GFX7-NEXT: s_load_dword s6, s[8:9], 0x214218; GFX7-NEXT: s_mov_b32 m0, -114219; GFX7-NEXT: s_waitcnt lgkmcnt(0)14220; GFX7-NEXT: v_mov_b32_e32 v0, s414221; GFX7-NEXT: v_mov_b32_e32 v1, s614222; GFX7-NEXT: v_mov_b32_e32 v2, s514223; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614224; GFX7-NEXT: s_mov_b32 m0, -114225; GFX7-NEXT: v_mov_b32_e32 v0, s414226; GFX7-NEXT: s_waitcnt lgkmcnt(0)14227; GFX7-NEXT: ds_write_b32 v0, v114228; GFX7-NEXT: s_endpgm14229;14230; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:14231; GFX10-WGP: ; %bb.0: ; %entry14232; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x014233; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x414234; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x814235; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)14236; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s414237; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s614238; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s514239; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614240; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s414241; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)14242; GFX10-WGP-NEXT: ds_write_b32 v0, v114243; GFX10-WGP-NEXT: s_endpgm14244;14245; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:14246; GFX10-CU: ; %bb.0: ; %entry14247; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x014248; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x414249; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x814250; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)14251; GFX10-CU-NEXT: v_mov_b32_e32 v0, s414252; GFX10-CU-NEXT: v_mov_b32_e32 v1, s614253; GFX10-CU-NEXT: v_mov_b32_e32 v2, s514254; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614255; GFX10-CU-NEXT: v_mov_b32_e32 v0, s414256; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)14257; GFX10-CU-NEXT: ds_write_b32 v0, v114258; GFX10-CU-NEXT: s_endpgm14259;14260; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:14261; SKIP-CACHE-INV: ; %bb.0: ; %entry14262; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x014263; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x114264; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x214265; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -114266; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)14267; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s014268; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s214269; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s114270; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614271; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -114272; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s014273; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)14274; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v114275; SKIP-CACHE-INV-NEXT: s_endpgm14276;14277; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:14278; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry14279; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x014280; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x414281; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x814282; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14283; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s414284; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s614285; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s514286; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614287; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s414288; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14289; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v114290; GFX90A-NOTTGSPLIT-NEXT: s_endpgm14291;14292; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:14293; GFX90A-TGSPLIT: ; %bb.0: ; %entry14294; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x014295; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x414296; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x814297; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14298; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s414299; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s614300; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s514301; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614302; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s414303; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14304; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v114305; GFX90A-TGSPLIT-NEXT: s_endpgm14306;14307; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:14308; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry14309; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x014310; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x414311; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x814312; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14313; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s014314; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s214315; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s114316; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614317; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s014318; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14319; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v114320; GFX942-NOTTGSPLIT-NEXT: s_endpgm14321;14322; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:14323; GFX942-TGSPLIT: ; %bb.0: ; %entry14324; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x014325; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x414326; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x814327; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14328; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s014329; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s214330; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s114331; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614332; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s014333; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14334; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v114335; GFX942-TGSPLIT-NEXT: s_endpgm14336;14337; GFX11-WGP-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:14338; GFX11-WGP: ; %bb.0: ; %entry14339; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x014340; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x414341; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x814342; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)14343; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s014344; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s214345; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s114346; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1614347; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s014348; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)14349; GFX11-WGP-NEXT: ds_store_b32 v0, v114350; GFX11-WGP-NEXT: s_endpgm14351;14352; GFX11-CU-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:14353; GFX11-CU: ; %bb.0: ; %entry14354; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x014355; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x414356; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x814357; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)14358; GFX11-CU-NEXT: v_mov_b32_e32 v0, s014359; GFX11-CU-NEXT: v_mov_b32_e32 v1, s214360; GFX11-CU-NEXT: v_mov_b32_e32 v2, s114361; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1614362; GFX11-CU-NEXT: v_mov_b32_e32 v0, s014363; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)14364; GFX11-CU-NEXT: ds_store_b32 v0, v114365; GFX11-CU-NEXT: s_endpgm14366;14367; GFX12-WGP-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:14368; GFX12-WGP: ; %bb.0: ; %entry14369; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x014370; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x414371; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x814372; GFX12-WGP-NEXT: s_wait_kmcnt 0x014373; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s014374; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s214375; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s114376; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1614377; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s014378; GFX12-WGP-NEXT: s_wait_dscnt 0x014379; GFX12-WGP-NEXT: ds_store_b32 v0, v114380; GFX12-WGP-NEXT: s_endpgm14381;14382; GFX12-CU-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:14383; GFX12-CU: ; %bb.0: ; %entry14384; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x014385; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x414386; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x814387; GFX12-CU-NEXT: s_wait_kmcnt 0x014388; GFX12-CU-NEXT: v_mov_b32_e32 v0, s014389; GFX12-CU-NEXT: v_mov_b32_e32 v1, s214390; GFX12-CU-NEXT: v_mov_b32_e32 v2, s114391; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1614392; GFX12-CU-NEXT: v_mov_b32_e32 v0, s014393; GFX12-CU-NEXT: s_wait_dscnt 0x014394; GFX12-CU-NEXT: ds_store_b32 v0, v114395; GFX12-CU-NEXT: s_endpgm14396;14397; GFX1250-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:14398; GFX1250: ; %bb.0: ; %entry14399; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 114400; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x014401; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x414402; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x814403; GFX1250-NEXT: s_wait_kmcnt 0x014404; GFX1250-NEXT: v_mov_b32_e32 v0, s014405; GFX1250-NEXT: v_mov_b32_e32 v1, s214406; GFX1250-NEXT: v_mov_b32_e32 v2, s114407; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1614408; GFX1250-NEXT: v_mov_b32_e32 v0, s014409; GFX1250-NEXT: s_wait_dscnt 0x014410; GFX1250-NEXT: ds_store_b32 v0, v114411; GFX1250-NEXT: s_endpgm14412 ptr addrspace(3) %out, i32 %in, i32 %old) {14413entry:14414 %gep = getelementptr i32, ptr addrspace(3) %out, i32 414415 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") monotonic monotonic14416 %val0 = extractvalue { i32, i1 } %val, 014417 store i32 %val0, ptr addrspace(3) %out, align 414418 ret void14419}14420 14421define amdgpu_kernel void @local_singlethread_one_as_acquire_monotonic_ret_cmpxchg(14422; GFX6-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:14423; GFX6: ; %bb.0: ; %entry14424; GFX6-NEXT: s_load_dword s4, s[8:9], 0x014425; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr414426; GFX6-NEXT: s_load_dword s5, s[8:9], 0x114427; GFX6-NEXT: s_load_dword s6, s[8:9], 0x214428; GFX6-NEXT: s_mov_b32 m0, -114429; GFX6-NEXT: s_waitcnt lgkmcnt(0)14430; GFX6-NEXT: v_mov_b32_e32 v0, s414431; GFX6-NEXT: v_mov_b32_e32 v1, s614432; GFX6-NEXT: v_mov_b32_e32 v2, s514433; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614434; GFX6-NEXT: s_mov_b32 m0, -114435; GFX6-NEXT: v_mov_b32_e32 v0, s414436; GFX6-NEXT: s_waitcnt lgkmcnt(0)14437; GFX6-NEXT: ds_write_b32 v0, v114438; GFX6-NEXT: s_endpgm14439;14440; GFX7-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:14441; GFX7: ; %bb.0: ; %entry14442; GFX7-NEXT: s_load_dword s4, s[8:9], 0x014443; GFX7-NEXT: s_load_dword s5, s[8:9], 0x114444; GFX7-NEXT: s_load_dword s6, s[8:9], 0x214445; GFX7-NEXT: s_mov_b32 m0, -114446; GFX7-NEXT: s_waitcnt lgkmcnt(0)14447; GFX7-NEXT: v_mov_b32_e32 v0, s414448; GFX7-NEXT: v_mov_b32_e32 v1, s614449; GFX7-NEXT: v_mov_b32_e32 v2, s514450; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614451; GFX7-NEXT: s_mov_b32 m0, -114452; GFX7-NEXT: v_mov_b32_e32 v0, s414453; GFX7-NEXT: s_waitcnt lgkmcnt(0)14454; GFX7-NEXT: ds_write_b32 v0, v114455; GFX7-NEXT: s_endpgm14456;14457; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:14458; GFX10-WGP: ; %bb.0: ; %entry14459; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x014460; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x414461; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x814462; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)14463; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s414464; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s614465; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s514466; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614467; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s414468; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)14469; GFX10-WGP-NEXT: ds_write_b32 v0, v114470; GFX10-WGP-NEXT: s_endpgm14471;14472; GFX10-CU-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:14473; GFX10-CU: ; %bb.0: ; %entry14474; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x014475; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x414476; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x814477; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)14478; GFX10-CU-NEXT: v_mov_b32_e32 v0, s414479; GFX10-CU-NEXT: v_mov_b32_e32 v1, s614480; GFX10-CU-NEXT: v_mov_b32_e32 v2, s514481; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614482; GFX10-CU-NEXT: v_mov_b32_e32 v0, s414483; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)14484; GFX10-CU-NEXT: ds_write_b32 v0, v114485; GFX10-CU-NEXT: s_endpgm14486;14487; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:14488; SKIP-CACHE-INV: ; %bb.0: ; %entry14489; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x014490; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x114491; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x214492; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -114493; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)14494; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s014495; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s214496; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s114497; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614498; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -114499; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s014500; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)14501; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v114502; SKIP-CACHE-INV-NEXT: s_endpgm14503;14504; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:14505; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry14506; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x014507; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x414508; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x814509; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14510; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s414511; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s614512; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s514513; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614514; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s414515; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14516; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v114517; GFX90A-NOTTGSPLIT-NEXT: s_endpgm14518;14519; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:14520; GFX90A-TGSPLIT: ; %bb.0: ; %entry14521; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x014522; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x414523; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x814524; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14525; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s414526; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s614527; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s514528; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614529; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s414530; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14531; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v114532; GFX90A-TGSPLIT-NEXT: s_endpgm14533;14534; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:14535; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry14536; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x014537; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x414538; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x814539; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14540; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s014541; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s214542; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s114543; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614544; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s014545; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14546; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v114547; GFX942-NOTTGSPLIT-NEXT: s_endpgm14548;14549; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:14550; GFX942-TGSPLIT: ; %bb.0: ; %entry14551; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x014552; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x414553; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x814554; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14555; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s014556; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s214557; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s114558; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614559; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s014560; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14561; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v114562; GFX942-TGSPLIT-NEXT: s_endpgm14563;14564; GFX11-WGP-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:14565; GFX11-WGP: ; %bb.0: ; %entry14566; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x014567; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x414568; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x814569; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)14570; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s014571; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s214572; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s114573; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1614574; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s014575; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)14576; GFX11-WGP-NEXT: ds_store_b32 v0, v114577; GFX11-WGP-NEXT: s_endpgm14578;14579; GFX11-CU-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:14580; GFX11-CU: ; %bb.0: ; %entry14581; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x014582; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x414583; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x814584; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)14585; GFX11-CU-NEXT: v_mov_b32_e32 v0, s014586; GFX11-CU-NEXT: v_mov_b32_e32 v1, s214587; GFX11-CU-NEXT: v_mov_b32_e32 v2, s114588; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1614589; GFX11-CU-NEXT: v_mov_b32_e32 v0, s014590; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)14591; GFX11-CU-NEXT: ds_store_b32 v0, v114592; GFX11-CU-NEXT: s_endpgm14593;14594; GFX12-WGP-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:14595; GFX12-WGP: ; %bb.0: ; %entry14596; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x014597; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x414598; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x814599; GFX12-WGP-NEXT: s_wait_kmcnt 0x014600; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s014601; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s214602; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s114603; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1614604; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s014605; GFX12-WGP-NEXT: s_wait_dscnt 0x014606; GFX12-WGP-NEXT: ds_store_b32 v0, v114607; GFX12-WGP-NEXT: s_endpgm14608;14609; GFX12-CU-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:14610; GFX12-CU: ; %bb.0: ; %entry14611; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x014612; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x414613; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x814614; GFX12-CU-NEXT: s_wait_kmcnt 0x014615; GFX12-CU-NEXT: v_mov_b32_e32 v0, s014616; GFX12-CU-NEXT: v_mov_b32_e32 v1, s214617; GFX12-CU-NEXT: v_mov_b32_e32 v2, s114618; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1614619; GFX12-CU-NEXT: v_mov_b32_e32 v0, s014620; GFX12-CU-NEXT: s_wait_dscnt 0x014621; GFX12-CU-NEXT: ds_store_b32 v0, v114622; GFX12-CU-NEXT: s_endpgm14623;14624; GFX1250-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:14625; GFX1250: ; %bb.0: ; %entry14626; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 114627; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x014628; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x414629; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x814630; GFX1250-NEXT: s_wait_kmcnt 0x014631; GFX1250-NEXT: v_mov_b32_e32 v0, s014632; GFX1250-NEXT: v_mov_b32_e32 v1, s214633; GFX1250-NEXT: v_mov_b32_e32 v2, s114634; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1614635; GFX1250-NEXT: v_mov_b32_e32 v0, s014636; GFX1250-NEXT: s_wait_dscnt 0x014637; GFX1250-NEXT: ds_store_b32 v0, v114638; GFX1250-NEXT: s_endpgm14639 ptr addrspace(3) %out, i32 %in, i32 %old) {14640entry:14641 %gep = getelementptr i32, ptr addrspace(3) %out, i32 414642 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acquire monotonic14643 %val0 = extractvalue { i32, i1 } %val, 014644 store i32 %val0, ptr addrspace(3) %out, align 414645 ret void14646}14647 14648define amdgpu_kernel void @local_singlethread_one_as_release_monotonic_ret_cmpxchg(14649; GFX6-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:14650; GFX6: ; %bb.0: ; %entry14651; GFX6-NEXT: s_load_dword s4, s[8:9], 0x014652; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr414653; GFX6-NEXT: s_load_dword s5, s[8:9], 0x114654; GFX6-NEXT: s_load_dword s6, s[8:9], 0x214655; GFX6-NEXT: s_mov_b32 m0, -114656; GFX6-NEXT: s_waitcnt lgkmcnt(0)14657; GFX6-NEXT: v_mov_b32_e32 v0, s414658; GFX6-NEXT: v_mov_b32_e32 v1, s614659; GFX6-NEXT: v_mov_b32_e32 v2, s514660; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614661; GFX6-NEXT: s_mov_b32 m0, -114662; GFX6-NEXT: v_mov_b32_e32 v0, s414663; GFX6-NEXT: s_waitcnt lgkmcnt(0)14664; GFX6-NEXT: ds_write_b32 v0, v114665; GFX6-NEXT: s_endpgm14666;14667; GFX7-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:14668; GFX7: ; %bb.0: ; %entry14669; GFX7-NEXT: s_load_dword s4, s[8:9], 0x014670; GFX7-NEXT: s_load_dword s5, s[8:9], 0x114671; GFX7-NEXT: s_load_dword s6, s[8:9], 0x214672; GFX7-NEXT: s_mov_b32 m0, -114673; GFX7-NEXT: s_waitcnt lgkmcnt(0)14674; GFX7-NEXT: v_mov_b32_e32 v0, s414675; GFX7-NEXT: v_mov_b32_e32 v1, s614676; GFX7-NEXT: v_mov_b32_e32 v2, s514677; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614678; GFX7-NEXT: s_mov_b32 m0, -114679; GFX7-NEXT: v_mov_b32_e32 v0, s414680; GFX7-NEXT: s_waitcnt lgkmcnt(0)14681; GFX7-NEXT: ds_write_b32 v0, v114682; GFX7-NEXT: s_endpgm14683;14684; GFX10-WGP-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:14685; GFX10-WGP: ; %bb.0: ; %entry14686; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x014687; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x414688; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x814689; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)14690; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s414691; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s614692; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s514693; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614694; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s414695; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)14696; GFX10-WGP-NEXT: ds_write_b32 v0, v114697; GFX10-WGP-NEXT: s_endpgm14698;14699; GFX10-CU-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:14700; GFX10-CU: ; %bb.0: ; %entry14701; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x014702; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x414703; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x814704; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)14705; GFX10-CU-NEXT: v_mov_b32_e32 v0, s414706; GFX10-CU-NEXT: v_mov_b32_e32 v1, s614707; GFX10-CU-NEXT: v_mov_b32_e32 v2, s514708; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614709; GFX10-CU-NEXT: v_mov_b32_e32 v0, s414710; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)14711; GFX10-CU-NEXT: ds_write_b32 v0, v114712; GFX10-CU-NEXT: s_endpgm14713;14714; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:14715; SKIP-CACHE-INV: ; %bb.0: ; %entry14716; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x014717; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x114718; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x214719; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -114720; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)14721; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s014722; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s214723; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s114724; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614725; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -114726; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s014727; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)14728; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v114729; SKIP-CACHE-INV-NEXT: s_endpgm14730;14731; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:14732; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry14733; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x014734; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x414735; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x814736; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14737; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s414738; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s614739; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s514740; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614741; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s414742; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14743; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v114744; GFX90A-NOTTGSPLIT-NEXT: s_endpgm14745;14746; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:14747; GFX90A-TGSPLIT: ; %bb.0: ; %entry14748; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x014749; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x414750; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x814751; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14752; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s414753; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s614754; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s514755; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614756; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s414757; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14758; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v114759; GFX90A-TGSPLIT-NEXT: s_endpgm14760;14761; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:14762; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry14763; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x014764; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x414765; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x814766; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14767; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s014768; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s214769; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s114770; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614771; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s014772; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14773; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v114774; GFX942-NOTTGSPLIT-NEXT: s_endpgm14775;14776; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:14777; GFX942-TGSPLIT: ; %bb.0: ; %entry14778; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x014779; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x414780; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x814781; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14782; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s014783; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s214784; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s114785; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614786; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s014787; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14788; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v114789; GFX942-TGSPLIT-NEXT: s_endpgm14790;14791; GFX11-WGP-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:14792; GFX11-WGP: ; %bb.0: ; %entry14793; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x014794; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x414795; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x814796; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)14797; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s014798; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s214799; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s114800; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1614801; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s014802; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)14803; GFX11-WGP-NEXT: ds_store_b32 v0, v114804; GFX11-WGP-NEXT: s_endpgm14805;14806; GFX11-CU-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:14807; GFX11-CU: ; %bb.0: ; %entry14808; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x014809; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x414810; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x814811; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)14812; GFX11-CU-NEXT: v_mov_b32_e32 v0, s014813; GFX11-CU-NEXT: v_mov_b32_e32 v1, s214814; GFX11-CU-NEXT: v_mov_b32_e32 v2, s114815; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1614816; GFX11-CU-NEXT: v_mov_b32_e32 v0, s014817; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)14818; GFX11-CU-NEXT: ds_store_b32 v0, v114819; GFX11-CU-NEXT: s_endpgm14820;14821; GFX12-WGP-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:14822; GFX12-WGP: ; %bb.0: ; %entry14823; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x014824; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x414825; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x814826; GFX12-WGP-NEXT: s_wait_kmcnt 0x014827; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s014828; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s214829; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s114830; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1614831; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s014832; GFX12-WGP-NEXT: s_wait_dscnt 0x014833; GFX12-WGP-NEXT: ds_store_b32 v0, v114834; GFX12-WGP-NEXT: s_endpgm14835;14836; GFX12-CU-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:14837; GFX12-CU: ; %bb.0: ; %entry14838; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x014839; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x414840; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x814841; GFX12-CU-NEXT: s_wait_kmcnt 0x014842; GFX12-CU-NEXT: v_mov_b32_e32 v0, s014843; GFX12-CU-NEXT: v_mov_b32_e32 v1, s214844; GFX12-CU-NEXT: v_mov_b32_e32 v2, s114845; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1614846; GFX12-CU-NEXT: v_mov_b32_e32 v0, s014847; GFX12-CU-NEXT: s_wait_dscnt 0x014848; GFX12-CU-NEXT: ds_store_b32 v0, v114849; GFX12-CU-NEXT: s_endpgm14850;14851; GFX1250-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:14852; GFX1250: ; %bb.0: ; %entry14853; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 114854; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x014855; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x414856; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x814857; GFX1250-NEXT: s_wait_kmcnt 0x014858; GFX1250-NEXT: v_mov_b32_e32 v0, s014859; GFX1250-NEXT: v_mov_b32_e32 v1, s214860; GFX1250-NEXT: v_mov_b32_e32 v2, s114861; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1614862; GFX1250-NEXT: v_mov_b32_e32 v0, s014863; GFX1250-NEXT: s_wait_dscnt 0x014864; GFX1250-NEXT: ds_store_b32 v0, v114865; GFX1250-NEXT: s_endpgm14866 ptr addrspace(3) %out, i32 %in, i32 %old) {14867entry:14868 %gep = getelementptr i32, ptr addrspace(3) %out, i32 414869 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") release monotonic14870 %val0 = extractvalue { i32, i1 } %val, 014871 store i32 %val0, ptr addrspace(3) %out, align 414872 ret void14873}14874 14875define amdgpu_kernel void @local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg(14876; GFX6-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:14877; GFX6: ; %bb.0: ; %entry14878; GFX6-NEXT: s_load_dword s4, s[8:9], 0x014879; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr414880; GFX6-NEXT: s_load_dword s5, s[8:9], 0x114881; GFX6-NEXT: s_load_dword s6, s[8:9], 0x214882; GFX6-NEXT: s_mov_b32 m0, -114883; GFX6-NEXT: s_waitcnt lgkmcnt(0)14884; GFX6-NEXT: v_mov_b32_e32 v0, s414885; GFX6-NEXT: v_mov_b32_e32 v1, s614886; GFX6-NEXT: v_mov_b32_e32 v2, s514887; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614888; GFX6-NEXT: s_mov_b32 m0, -114889; GFX6-NEXT: v_mov_b32_e32 v0, s414890; GFX6-NEXT: s_waitcnt lgkmcnt(0)14891; GFX6-NEXT: ds_write_b32 v0, v114892; GFX6-NEXT: s_endpgm14893;14894; GFX7-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:14895; GFX7: ; %bb.0: ; %entry14896; GFX7-NEXT: s_load_dword s4, s[8:9], 0x014897; GFX7-NEXT: s_load_dword s5, s[8:9], 0x114898; GFX7-NEXT: s_load_dword s6, s[8:9], 0x214899; GFX7-NEXT: s_mov_b32 m0, -114900; GFX7-NEXT: s_waitcnt lgkmcnt(0)14901; GFX7-NEXT: v_mov_b32_e32 v0, s414902; GFX7-NEXT: v_mov_b32_e32 v1, s614903; GFX7-NEXT: v_mov_b32_e32 v2, s514904; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614905; GFX7-NEXT: s_mov_b32 m0, -114906; GFX7-NEXT: v_mov_b32_e32 v0, s414907; GFX7-NEXT: s_waitcnt lgkmcnt(0)14908; GFX7-NEXT: ds_write_b32 v0, v114909; GFX7-NEXT: s_endpgm14910;14911; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:14912; GFX10-WGP: ; %bb.0: ; %entry14913; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x014914; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x414915; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x814916; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)14917; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s414918; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s614919; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s514920; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614921; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s414922; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)14923; GFX10-WGP-NEXT: ds_write_b32 v0, v114924; GFX10-WGP-NEXT: s_endpgm14925;14926; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:14927; GFX10-CU: ; %bb.0: ; %entry14928; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x014929; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x414930; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x814931; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)14932; GFX10-CU-NEXT: v_mov_b32_e32 v0, s414933; GFX10-CU-NEXT: v_mov_b32_e32 v1, s614934; GFX10-CU-NEXT: v_mov_b32_e32 v2, s514935; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614936; GFX10-CU-NEXT: v_mov_b32_e32 v0, s414937; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)14938; GFX10-CU-NEXT: ds_write_b32 v0, v114939; GFX10-CU-NEXT: s_endpgm14940;14941; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:14942; SKIP-CACHE-INV: ; %bb.0: ; %entry14943; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x014944; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x114945; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x214946; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -114947; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)14948; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s014949; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s214950; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s114951; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614952; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -114953; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s014954; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)14955; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v114956; SKIP-CACHE-INV-NEXT: s_endpgm14957;14958; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:14959; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry14960; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x014961; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x414962; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x814963; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14964; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s414965; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s614966; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s514967; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614968; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s414969; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14970; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v114971; GFX90A-NOTTGSPLIT-NEXT: s_endpgm14972;14973; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:14974; GFX90A-TGSPLIT: ; %bb.0: ; %entry14975; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x014976; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x414977; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x814978; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14979; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s414980; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s614981; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s514982; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614983; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s414984; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14985; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v114986; GFX90A-TGSPLIT-NEXT: s_endpgm14987;14988; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:14989; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry14990; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x014991; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x414992; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x814993; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)14994; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s014995; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s214996; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s114997; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1614998; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s014999; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15000; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v115001; GFX942-NOTTGSPLIT-NEXT: s_endpgm15002;15003; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:15004; GFX942-TGSPLIT: ; %bb.0: ; %entry15005; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x015006; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x415007; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x815008; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15009; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s015010; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s215011; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s115012; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615013; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s015014; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15015; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v115016; GFX942-TGSPLIT-NEXT: s_endpgm15017;15018; GFX11-WGP-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:15019; GFX11-WGP: ; %bb.0: ; %entry15020; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x015021; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x415022; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x815023; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)15024; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s015025; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s215026; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s115027; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615028; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s015029; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)15030; GFX11-WGP-NEXT: ds_store_b32 v0, v115031; GFX11-WGP-NEXT: s_endpgm15032;15033; GFX11-CU-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:15034; GFX11-CU: ; %bb.0: ; %entry15035; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x015036; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x415037; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x815038; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)15039; GFX11-CU-NEXT: v_mov_b32_e32 v0, s015040; GFX11-CU-NEXT: v_mov_b32_e32 v1, s215041; GFX11-CU-NEXT: v_mov_b32_e32 v2, s115042; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615043; GFX11-CU-NEXT: v_mov_b32_e32 v0, s015044; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)15045; GFX11-CU-NEXT: ds_store_b32 v0, v115046; GFX11-CU-NEXT: s_endpgm15047;15048; GFX12-WGP-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:15049; GFX12-WGP: ; %bb.0: ; %entry15050; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x015051; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x415052; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x815053; GFX12-WGP-NEXT: s_wait_kmcnt 0x015054; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s015055; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s215056; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s115057; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615058; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s015059; GFX12-WGP-NEXT: s_wait_dscnt 0x015060; GFX12-WGP-NEXT: ds_store_b32 v0, v115061; GFX12-WGP-NEXT: s_endpgm15062;15063; GFX12-CU-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:15064; GFX12-CU: ; %bb.0: ; %entry15065; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x015066; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x415067; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x815068; GFX12-CU-NEXT: s_wait_kmcnt 0x015069; GFX12-CU-NEXT: v_mov_b32_e32 v0, s015070; GFX12-CU-NEXT: v_mov_b32_e32 v1, s215071; GFX12-CU-NEXT: v_mov_b32_e32 v2, s115072; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615073; GFX12-CU-NEXT: v_mov_b32_e32 v0, s015074; GFX12-CU-NEXT: s_wait_dscnt 0x015075; GFX12-CU-NEXT: ds_store_b32 v0, v115076; GFX12-CU-NEXT: s_endpgm15077;15078; GFX1250-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:15079; GFX1250: ; %bb.0: ; %entry15080; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 115081; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x015082; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x415083; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x815084; GFX1250-NEXT: s_wait_kmcnt 0x015085; GFX1250-NEXT: v_mov_b32_e32 v0, s015086; GFX1250-NEXT: v_mov_b32_e32 v1, s215087; GFX1250-NEXT: v_mov_b32_e32 v2, s115088; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615089; GFX1250-NEXT: v_mov_b32_e32 v0, s015090; GFX1250-NEXT: s_wait_dscnt 0x015091; GFX1250-NEXT: ds_store_b32 v0, v115092; GFX1250-NEXT: s_endpgm15093 ptr addrspace(3) %out, i32 %in, i32 %old) {15094entry:15095 %gep = getelementptr i32, ptr addrspace(3) %out, i32 415096 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acq_rel monotonic15097 %val0 = extractvalue { i32, i1 } %val, 015098 store i32 %val0, ptr addrspace(3) %out, align 415099 ret void15100}15101 15102define amdgpu_kernel void @local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg(15103; GFX6-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:15104; GFX6: ; %bb.0: ; %entry15105; GFX6-NEXT: s_load_dword s4, s[8:9], 0x015106; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr415107; GFX6-NEXT: s_load_dword s5, s[8:9], 0x115108; GFX6-NEXT: s_load_dword s6, s[8:9], 0x215109; GFX6-NEXT: s_mov_b32 m0, -115110; GFX6-NEXT: s_waitcnt lgkmcnt(0)15111; GFX6-NEXT: v_mov_b32_e32 v0, s415112; GFX6-NEXT: v_mov_b32_e32 v1, s615113; GFX6-NEXT: v_mov_b32_e32 v2, s515114; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615115; GFX6-NEXT: s_mov_b32 m0, -115116; GFX6-NEXT: v_mov_b32_e32 v0, s415117; GFX6-NEXT: s_waitcnt lgkmcnt(0)15118; GFX6-NEXT: ds_write_b32 v0, v115119; GFX6-NEXT: s_endpgm15120;15121; GFX7-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:15122; GFX7: ; %bb.0: ; %entry15123; GFX7-NEXT: s_load_dword s4, s[8:9], 0x015124; GFX7-NEXT: s_load_dword s5, s[8:9], 0x115125; GFX7-NEXT: s_load_dword s6, s[8:9], 0x215126; GFX7-NEXT: s_mov_b32 m0, -115127; GFX7-NEXT: s_waitcnt lgkmcnt(0)15128; GFX7-NEXT: v_mov_b32_e32 v0, s415129; GFX7-NEXT: v_mov_b32_e32 v1, s615130; GFX7-NEXT: v_mov_b32_e32 v2, s515131; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615132; GFX7-NEXT: s_mov_b32 m0, -115133; GFX7-NEXT: v_mov_b32_e32 v0, s415134; GFX7-NEXT: s_waitcnt lgkmcnt(0)15135; GFX7-NEXT: ds_write_b32 v0, v115136; GFX7-NEXT: s_endpgm15137;15138; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:15139; GFX10-WGP: ; %bb.0: ; %entry15140; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x015141; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x415142; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x815143; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)15144; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s415145; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s615146; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s515147; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615148; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s415149; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)15150; GFX10-WGP-NEXT: ds_write_b32 v0, v115151; GFX10-WGP-NEXT: s_endpgm15152;15153; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:15154; GFX10-CU: ; %bb.0: ; %entry15155; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x015156; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x415157; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x815158; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)15159; GFX10-CU-NEXT: v_mov_b32_e32 v0, s415160; GFX10-CU-NEXT: v_mov_b32_e32 v1, s615161; GFX10-CU-NEXT: v_mov_b32_e32 v2, s515162; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615163; GFX10-CU-NEXT: v_mov_b32_e32 v0, s415164; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)15165; GFX10-CU-NEXT: ds_write_b32 v0, v115166; GFX10-CU-NEXT: s_endpgm15167;15168; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:15169; SKIP-CACHE-INV: ; %bb.0: ; %entry15170; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x015171; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x115172; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x215173; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -115174; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)15175; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s015176; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s215177; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s115178; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615179; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -115180; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s015181; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)15182; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v115183; SKIP-CACHE-INV-NEXT: s_endpgm15184;15185; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:15186; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry15187; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x015188; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x415189; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x815190; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15191; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s415192; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s615193; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s515194; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615195; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s415196; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15197; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v115198; GFX90A-NOTTGSPLIT-NEXT: s_endpgm15199;15200; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:15201; GFX90A-TGSPLIT: ; %bb.0: ; %entry15202; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x015203; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x415204; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x815205; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15206; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s415207; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s615208; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s515209; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615210; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s415211; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15212; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v115213; GFX90A-TGSPLIT-NEXT: s_endpgm15214;15215; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:15216; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry15217; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x015218; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x415219; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x815220; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15221; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s015222; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s215223; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s115224; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615225; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s015226; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15227; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v115228; GFX942-NOTTGSPLIT-NEXT: s_endpgm15229;15230; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:15231; GFX942-TGSPLIT: ; %bb.0: ; %entry15232; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x015233; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x415234; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x815235; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15236; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s015237; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s215238; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s115239; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615240; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s015241; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15242; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v115243; GFX942-TGSPLIT-NEXT: s_endpgm15244;15245; GFX11-WGP-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:15246; GFX11-WGP: ; %bb.0: ; %entry15247; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x015248; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x415249; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x815250; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)15251; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s015252; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s215253; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s115254; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615255; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s015256; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)15257; GFX11-WGP-NEXT: ds_store_b32 v0, v115258; GFX11-WGP-NEXT: s_endpgm15259;15260; GFX11-CU-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:15261; GFX11-CU: ; %bb.0: ; %entry15262; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x015263; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x415264; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x815265; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)15266; GFX11-CU-NEXT: v_mov_b32_e32 v0, s015267; GFX11-CU-NEXT: v_mov_b32_e32 v1, s215268; GFX11-CU-NEXT: v_mov_b32_e32 v2, s115269; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615270; GFX11-CU-NEXT: v_mov_b32_e32 v0, s015271; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)15272; GFX11-CU-NEXT: ds_store_b32 v0, v115273; GFX11-CU-NEXT: s_endpgm15274;15275; GFX12-WGP-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:15276; GFX12-WGP: ; %bb.0: ; %entry15277; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x015278; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x415279; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x815280; GFX12-WGP-NEXT: s_wait_kmcnt 0x015281; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s015282; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s215283; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s115284; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615285; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s015286; GFX12-WGP-NEXT: s_wait_dscnt 0x015287; GFX12-WGP-NEXT: ds_store_b32 v0, v115288; GFX12-WGP-NEXT: s_endpgm15289;15290; GFX12-CU-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:15291; GFX12-CU: ; %bb.0: ; %entry15292; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x015293; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x415294; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x815295; GFX12-CU-NEXT: s_wait_kmcnt 0x015296; GFX12-CU-NEXT: v_mov_b32_e32 v0, s015297; GFX12-CU-NEXT: v_mov_b32_e32 v1, s215298; GFX12-CU-NEXT: v_mov_b32_e32 v2, s115299; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615300; GFX12-CU-NEXT: v_mov_b32_e32 v0, s015301; GFX12-CU-NEXT: s_wait_dscnt 0x015302; GFX12-CU-NEXT: ds_store_b32 v0, v115303; GFX12-CU-NEXT: s_endpgm15304;15305; GFX1250-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:15306; GFX1250: ; %bb.0: ; %entry15307; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 115308; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x015309; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x415310; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x815311; GFX1250-NEXT: s_wait_kmcnt 0x015312; GFX1250-NEXT: v_mov_b32_e32 v0, s015313; GFX1250-NEXT: v_mov_b32_e32 v1, s215314; GFX1250-NEXT: v_mov_b32_e32 v2, s115315; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615316; GFX1250-NEXT: v_mov_b32_e32 v0, s015317; GFX1250-NEXT: s_wait_dscnt 0x015318; GFX1250-NEXT: ds_store_b32 v0, v115319; GFX1250-NEXT: s_endpgm15320 ptr addrspace(3) %out, i32 %in, i32 %old) {15321entry:15322 %gep = getelementptr i32, ptr addrspace(3) %out, i32 415323 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") seq_cst monotonic15324 %val0 = extractvalue { i32, i1 } %val, 015325 store i32 %val0, ptr addrspace(3) %out, align 415326 ret void15327}15328 15329define amdgpu_kernel void @local_singlethread_one_as_monotonic_acquire_ret_cmpxchg(15330; GFX6-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:15331; GFX6: ; %bb.0: ; %entry15332; GFX6-NEXT: s_load_dword s4, s[8:9], 0x015333; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr415334; GFX6-NEXT: s_load_dword s5, s[8:9], 0x115335; GFX6-NEXT: s_load_dword s6, s[8:9], 0x215336; GFX6-NEXT: s_mov_b32 m0, -115337; GFX6-NEXT: s_waitcnt lgkmcnt(0)15338; GFX6-NEXT: v_mov_b32_e32 v0, s415339; GFX6-NEXT: v_mov_b32_e32 v1, s615340; GFX6-NEXT: v_mov_b32_e32 v2, s515341; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615342; GFX6-NEXT: s_mov_b32 m0, -115343; GFX6-NEXT: v_mov_b32_e32 v0, s415344; GFX6-NEXT: s_waitcnt lgkmcnt(0)15345; GFX6-NEXT: ds_write_b32 v0, v115346; GFX6-NEXT: s_endpgm15347;15348; GFX7-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:15349; GFX7: ; %bb.0: ; %entry15350; GFX7-NEXT: s_load_dword s4, s[8:9], 0x015351; GFX7-NEXT: s_load_dword s5, s[8:9], 0x115352; GFX7-NEXT: s_load_dword s6, s[8:9], 0x215353; GFX7-NEXT: s_mov_b32 m0, -115354; GFX7-NEXT: s_waitcnt lgkmcnt(0)15355; GFX7-NEXT: v_mov_b32_e32 v0, s415356; GFX7-NEXT: v_mov_b32_e32 v1, s615357; GFX7-NEXT: v_mov_b32_e32 v2, s515358; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615359; GFX7-NEXT: s_mov_b32 m0, -115360; GFX7-NEXT: v_mov_b32_e32 v0, s415361; GFX7-NEXT: s_waitcnt lgkmcnt(0)15362; GFX7-NEXT: ds_write_b32 v0, v115363; GFX7-NEXT: s_endpgm15364;15365; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:15366; GFX10-WGP: ; %bb.0: ; %entry15367; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x015368; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x415369; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x815370; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)15371; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s415372; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s615373; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s515374; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615375; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s415376; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)15377; GFX10-WGP-NEXT: ds_write_b32 v0, v115378; GFX10-WGP-NEXT: s_endpgm15379;15380; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:15381; GFX10-CU: ; %bb.0: ; %entry15382; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x015383; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x415384; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x815385; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)15386; GFX10-CU-NEXT: v_mov_b32_e32 v0, s415387; GFX10-CU-NEXT: v_mov_b32_e32 v1, s615388; GFX10-CU-NEXT: v_mov_b32_e32 v2, s515389; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615390; GFX10-CU-NEXT: v_mov_b32_e32 v0, s415391; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)15392; GFX10-CU-NEXT: ds_write_b32 v0, v115393; GFX10-CU-NEXT: s_endpgm15394;15395; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:15396; SKIP-CACHE-INV: ; %bb.0: ; %entry15397; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x015398; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x115399; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x215400; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -115401; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)15402; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s015403; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s215404; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s115405; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615406; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -115407; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s015408; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)15409; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v115410; SKIP-CACHE-INV-NEXT: s_endpgm15411;15412; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:15413; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry15414; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x015415; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x415416; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x815417; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15418; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s415419; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s615420; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s515421; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615422; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s415423; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15424; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v115425; GFX90A-NOTTGSPLIT-NEXT: s_endpgm15426;15427; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:15428; GFX90A-TGSPLIT: ; %bb.0: ; %entry15429; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x015430; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x415431; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x815432; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15433; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s415434; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s615435; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s515436; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615437; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s415438; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15439; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v115440; GFX90A-TGSPLIT-NEXT: s_endpgm15441;15442; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:15443; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry15444; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x015445; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x415446; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x815447; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15448; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s015449; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s215450; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s115451; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615452; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s015453; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15454; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v115455; GFX942-NOTTGSPLIT-NEXT: s_endpgm15456;15457; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:15458; GFX942-TGSPLIT: ; %bb.0: ; %entry15459; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x015460; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x415461; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x815462; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15463; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s015464; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s215465; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s115466; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615467; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s015468; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15469; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v115470; GFX942-TGSPLIT-NEXT: s_endpgm15471;15472; GFX11-WGP-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:15473; GFX11-WGP: ; %bb.0: ; %entry15474; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x015475; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x415476; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x815477; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)15478; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s015479; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s215480; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s115481; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615482; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s015483; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)15484; GFX11-WGP-NEXT: ds_store_b32 v0, v115485; GFX11-WGP-NEXT: s_endpgm15486;15487; GFX11-CU-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:15488; GFX11-CU: ; %bb.0: ; %entry15489; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x015490; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x415491; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x815492; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)15493; GFX11-CU-NEXT: v_mov_b32_e32 v0, s015494; GFX11-CU-NEXT: v_mov_b32_e32 v1, s215495; GFX11-CU-NEXT: v_mov_b32_e32 v2, s115496; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615497; GFX11-CU-NEXT: v_mov_b32_e32 v0, s015498; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)15499; GFX11-CU-NEXT: ds_store_b32 v0, v115500; GFX11-CU-NEXT: s_endpgm15501;15502; GFX12-WGP-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:15503; GFX12-WGP: ; %bb.0: ; %entry15504; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x015505; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x415506; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x815507; GFX12-WGP-NEXT: s_wait_kmcnt 0x015508; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s015509; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s215510; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s115511; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615512; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s015513; GFX12-WGP-NEXT: s_wait_dscnt 0x015514; GFX12-WGP-NEXT: ds_store_b32 v0, v115515; GFX12-WGP-NEXT: s_endpgm15516;15517; GFX12-CU-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:15518; GFX12-CU: ; %bb.0: ; %entry15519; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x015520; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x415521; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x815522; GFX12-CU-NEXT: s_wait_kmcnt 0x015523; GFX12-CU-NEXT: v_mov_b32_e32 v0, s015524; GFX12-CU-NEXT: v_mov_b32_e32 v1, s215525; GFX12-CU-NEXT: v_mov_b32_e32 v2, s115526; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615527; GFX12-CU-NEXT: v_mov_b32_e32 v0, s015528; GFX12-CU-NEXT: s_wait_dscnt 0x015529; GFX12-CU-NEXT: ds_store_b32 v0, v115530; GFX12-CU-NEXT: s_endpgm15531;15532; GFX1250-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:15533; GFX1250: ; %bb.0: ; %entry15534; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 115535; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x015536; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x415537; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x815538; GFX1250-NEXT: s_wait_kmcnt 0x015539; GFX1250-NEXT: v_mov_b32_e32 v0, s015540; GFX1250-NEXT: v_mov_b32_e32 v1, s215541; GFX1250-NEXT: v_mov_b32_e32 v2, s115542; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615543; GFX1250-NEXT: v_mov_b32_e32 v0, s015544; GFX1250-NEXT: s_wait_dscnt 0x015545; GFX1250-NEXT: ds_store_b32 v0, v115546; GFX1250-NEXT: s_endpgm15547 ptr addrspace(3) %out, i32 %in, i32 %old) {15548entry:15549 %gep = getelementptr i32, ptr addrspace(3) %out, i32 415550 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") monotonic acquire15551 %val0 = extractvalue { i32, i1 } %val, 015552 store i32 %val0, ptr addrspace(3) %out, align 415553 ret void15554}15555 15556define amdgpu_kernel void @local_singlethread_one_as_acquire_acquire_ret_cmpxchg(15557; GFX6-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:15558; GFX6: ; %bb.0: ; %entry15559; GFX6-NEXT: s_load_dword s4, s[8:9], 0x015560; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr415561; GFX6-NEXT: s_load_dword s5, s[8:9], 0x115562; GFX6-NEXT: s_load_dword s6, s[8:9], 0x215563; GFX6-NEXT: s_mov_b32 m0, -115564; GFX6-NEXT: s_waitcnt lgkmcnt(0)15565; GFX6-NEXT: v_mov_b32_e32 v0, s415566; GFX6-NEXT: v_mov_b32_e32 v1, s615567; GFX6-NEXT: v_mov_b32_e32 v2, s515568; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615569; GFX6-NEXT: s_mov_b32 m0, -115570; GFX6-NEXT: v_mov_b32_e32 v0, s415571; GFX6-NEXT: s_waitcnt lgkmcnt(0)15572; GFX6-NEXT: ds_write_b32 v0, v115573; GFX6-NEXT: s_endpgm15574;15575; GFX7-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:15576; GFX7: ; %bb.0: ; %entry15577; GFX7-NEXT: s_load_dword s4, s[8:9], 0x015578; GFX7-NEXT: s_load_dword s5, s[8:9], 0x115579; GFX7-NEXT: s_load_dword s6, s[8:9], 0x215580; GFX7-NEXT: s_mov_b32 m0, -115581; GFX7-NEXT: s_waitcnt lgkmcnt(0)15582; GFX7-NEXT: v_mov_b32_e32 v0, s415583; GFX7-NEXT: v_mov_b32_e32 v1, s615584; GFX7-NEXT: v_mov_b32_e32 v2, s515585; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615586; GFX7-NEXT: s_mov_b32 m0, -115587; GFX7-NEXT: v_mov_b32_e32 v0, s415588; GFX7-NEXT: s_waitcnt lgkmcnt(0)15589; GFX7-NEXT: ds_write_b32 v0, v115590; GFX7-NEXT: s_endpgm15591;15592; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:15593; GFX10-WGP: ; %bb.0: ; %entry15594; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x015595; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x415596; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x815597; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)15598; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s415599; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s615600; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s515601; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615602; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s415603; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)15604; GFX10-WGP-NEXT: ds_write_b32 v0, v115605; GFX10-WGP-NEXT: s_endpgm15606;15607; GFX10-CU-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:15608; GFX10-CU: ; %bb.0: ; %entry15609; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x015610; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x415611; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x815612; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)15613; GFX10-CU-NEXT: v_mov_b32_e32 v0, s415614; GFX10-CU-NEXT: v_mov_b32_e32 v1, s615615; GFX10-CU-NEXT: v_mov_b32_e32 v2, s515616; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615617; GFX10-CU-NEXT: v_mov_b32_e32 v0, s415618; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)15619; GFX10-CU-NEXT: ds_write_b32 v0, v115620; GFX10-CU-NEXT: s_endpgm15621;15622; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:15623; SKIP-CACHE-INV: ; %bb.0: ; %entry15624; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x015625; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x115626; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x215627; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -115628; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)15629; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s015630; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s215631; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s115632; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615633; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -115634; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s015635; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)15636; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v115637; SKIP-CACHE-INV-NEXT: s_endpgm15638;15639; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:15640; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry15641; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x015642; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x415643; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x815644; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15645; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s415646; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s615647; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s515648; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615649; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s415650; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15651; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v115652; GFX90A-NOTTGSPLIT-NEXT: s_endpgm15653;15654; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:15655; GFX90A-TGSPLIT: ; %bb.0: ; %entry15656; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x015657; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x415658; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x815659; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15660; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s415661; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s615662; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s515663; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615664; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s415665; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15666; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v115667; GFX90A-TGSPLIT-NEXT: s_endpgm15668;15669; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:15670; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry15671; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x015672; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x415673; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x815674; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15675; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s015676; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s215677; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s115678; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615679; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s015680; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15681; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v115682; GFX942-NOTTGSPLIT-NEXT: s_endpgm15683;15684; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:15685; GFX942-TGSPLIT: ; %bb.0: ; %entry15686; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x015687; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x415688; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x815689; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15690; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s015691; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s215692; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s115693; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615694; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s015695; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15696; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v115697; GFX942-TGSPLIT-NEXT: s_endpgm15698;15699; GFX11-WGP-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:15700; GFX11-WGP: ; %bb.0: ; %entry15701; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x015702; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x415703; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x815704; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)15705; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s015706; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s215707; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s115708; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615709; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s015710; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)15711; GFX11-WGP-NEXT: ds_store_b32 v0, v115712; GFX11-WGP-NEXT: s_endpgm15713;15714; GFX11-CU-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:15715; GFX11-CU: ; %bb.0: ; %entry15716; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x015717; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x415718; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x815719; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)15720; GFX11-CU-NEXT: v_mov_b32_e32 v0, s015721; GFX11-CU-NEXT: v_mov_b32_e32 v1, s215722; GFX11-CU-NEXT: v_mov_b32_e32 v2, s115723; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615724; GFX11-CU-NEXT: v_mov_b32_e32 v0, s015725; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)15726; GFX11-CU-NEXT: ds_store_b32 v0, v115727; GFX11-CU-NEXT: s_endpgm15728;15729; GFX12-WGP-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:15730; GFX12-WGP: ; %bb.0: ; %entry15731; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x015732; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x415733; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x815734; GFX12-WGP-NEXT: s_wait_kmcnt 0x015735; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s015736; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s215737; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s115738; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615739; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s015740; GFX12-WGP-NEXT: s_wait_dscnt 0x015741; GFX12-WGP-NEXT: ds_store_b32 v0, v115742; GFX12-WGP-NEXT: s_endpgm15743;15744; GFX12-CU-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:15745; GFX12-CU: ; %bb.0: ; %entry15746; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x015747; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x415748; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x815749; GFX12-CU-NEXT: s_wait_kmcnt 0x015750; GFX12-CU-NEXT: v_mov_b32_e32 v0, s015751; GFX12-CU-NEXT: v_mov_b32_e32 v1, s215752; GFX12-CU-NEXT: v_mov_b32_e32 v2, s115753; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615754; GFX12-CU-NEXT: v_mov_b32_e32 v0, s015755; GFX12-CU-NEXT: s_wait_dscnt 0x015756; GFX12-CU-NEXT: ds_store_b32 v0, v115757; GFX12-CU-NEXT: s_endpgm15758;15759; GFX1250-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:15760; GFX1250: ; %bb.0: ; %entry15761; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 115762; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x015763; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x415764; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x815765; GFX1250-NEXT: s_wait_kmcnt 0x015766; GFX1250-NEXT: v_mov_b32_e32 v0, s015767; GFX1250-NEXT: v_mov_b32_e32 v1, s215768; GFX1250-NEXT: v_mov_b32_e32 v2, s115769; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615770; GFX1250-NEXT: v_mov_b32_e32 v0, s015771; GFX1250-NEXT: s_wait_dscnt 0x015772; GFX1250-NEXT: ds_store_b32 v0, v115773; GFX1250-NEXT: s_endpgm15774 ptr addrspace(3) %out, i32 %in, i32 %old) {15775entry:15776 %gep = getelementptr i32, ptr addrspace(3) %out, i32 415777 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acquire acquire15778 %val0 = extractvalue { i32, i1 } %val, 015779 store i32 %val0, ptr addrspace(3) %out, align 415780 ret void15781}15782 15783define amdgpu_kernel void @local_singlethread_one_as_release_acquire_ret_cmpxchg(15784; GFX6-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:15785; GFX6: ; %bb.0: ; %entry15786; GFX6-NEXT: s_load_dword s4, s[8:9], 0x015787; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr415788; GFX6-NEXT: s_load_dword s5, s[8:9], 0x115789; GFX6-NEXT: s_load_dword s6, s[8:9], 0x215790; GFX6-NEXT: s_mov_b32 m0, -115791; GFX6-NEXT: s_waitcnt lgkmcnt(0)15792; GFX6-NEXT: v_mov_b32_e32 v0, s415793; GFX6-NEXT: v_mov_b32_e32 v1, s615794; GFX6-NEXT: v_mov_b32_e32 v2, s515795; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615796; GFX6-NEXT: s_mov_b32 m0, -115797; GFX6-NEXT: v_mov_b32_e32 v0, s415798; GFX6-NEXT: s_waitcnt lgkmcnt(0)15799; GFX6-NEXT: ds_write_b32 v0, v115800; GFX6-NEXT: s_endpgm15801;15802; GFX7-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:15803; GFX7: ; %bb.0: ; %entry15804; GFX7-NEXT: s_load_dword s4, s[8:9], 0x015805; GFX7-NEXT: s_load_dword s5, s[8:9], 0x115806; GFX7-NEXT: s_load_dword s6, s[8:9], 0x215807; GFX7-NEXT: s_mov_b32 m0, -115808; GFX7-NEXT: s_waitcnt lgkmcnt(0)15809; GFX7-NEXT: v_mov_b32_e32 v0, s415810; GFX7-NEXT: v_mov_b32_e32 v1, s615811; GFX7-NEXT: v_mov_b32_e32 v2, s515812; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615813; GFX7-NEXT: s_mov_b32 m0, -115814; GFX7-NEXT: v_mov_b32_e32 v0, s415815; GFX7-NEXT: s_waitcnt lgkmcnt(0)15816; GFX7-NEXT: ds_write_b32 v0, v115817; GFX7-NEXT: s_endpgm15818;15819; GFX10-WGP-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:15820; GFX10-WGP: ; %bb.0: ; %entry15821; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x015822; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x415823; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x815824; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)15825; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s415826; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s615827; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s515828; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615829; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s415830; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)15831; GFX10-WGP-NEXT: ds_write_b32 v0, v115832; GFX10-WGP-NEXT: s_endpgm15833;15834; GFX10-CU-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:15835; GFX10-CU: ; %bb.0: ; %entry15836; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x015837; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x415838; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x815839; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)15840; GFX10-CU-NEXT: v_mov_b32_e32 v0, s415841; GFX10-CU-NEXT: v_mov_b32_e32 v1, s615842; GFX10-CU-NEXT: v_mov_b32_e32 v2, s515843; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615844; GFX10-CU-NEXT: v_mov_b32_e32 v0, s415845; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)15846; GFX10-CU-NEXT: ds_write_b32 v0, v115847; GFX10-CU-NEXT: s_endpgm15848;15849; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:15850; SKIP-CACHE-INV: ; %bb.0: ; %entry15851; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x015852; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x115853; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x215854; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -115855; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)15856; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s015857; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s215858; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s115859; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615860; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -115861; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s015862; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)15863; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v115864; SKIP-CACHE-INV-NEXT: s_endpgm15865;15866; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:15867; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry15868; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x015869; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x415870; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x815871; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15872; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s415873; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s615874; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s515875; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615876; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s415877; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15878; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v115879; GFX90A-NOTTGSPLIT-NEXT: s_endpgm15880;15881; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:15882; GFX90A-TGSPLIT: ; %bb.0: ; %entry15883; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x015884; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x415885; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x815886; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15887; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s415888; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s615889; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s515890; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615891; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s415892; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15893; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v115894; GFX90A-TGSPLIT-NEXT: s_endpgm15895;15896; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:15897; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry15898; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x015899; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x415900; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x815901; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15902; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s015903; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s215904; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s115905; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615906; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s015907; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15908; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v115909; GFX942-NOTTGSPLIT-NEXT: s_endpgm15910;15911; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:15912; GFX942-TGSPLIT: ; %bb.0: ; %entry15913; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x015914; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x415915; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x815916; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15917; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s015918; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s215919; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s115920; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1615921; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s015922; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)15923; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v115924; GFX942-TGSPLIT-NEXT: s_endpgm15925;15926; GFX11-WGP-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:15927; GFX11-WGP: ; %bb.0: ; %entry15928; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x015929; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x415930; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x815931; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)15932; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s015933; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s215934; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s115935; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615936; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s015937; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)15938; GFX11-WGP-NEXT: ds_store_b32 v0, v115939; GFX11-WGP-NEXT: s_endpgm15940;15941; GFX11-CU-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:15942; GFX11-CU: ; %bb.0: ; %entry15943; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x015944; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x415945; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x815946; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)15947; GFX11-CU-NEXT: v_mov_b32_e32 v0, s015948; GFX11-CU-NEXT: v_mov_b32_e32 v1, s215949; GFX11-CU-NEXT: v_mov_b32_e32 v2, s115950; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615951; GFX11-CU-NEXT: v_mov_b32_e32 v0, s015952; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)15953; GFX11-CU-NEXT: ds_store_b32 v0, v115954; GFX11-CU-NEXT: s_endpgm15955;15956; GFX12-WGP-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:15957; GFX12-WGP: ; %bb.0: ; %entry15958; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x015959; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x415960; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x815961; GFX12-WGP-NEXT: s_wait_kmcnt 0x015962; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s015963; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s215964; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s115965; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615966; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s015967; GFX12-WGP-NEXT: s_wait_dscnt 0x015968; GFX12-WGP-NEXT: ds_store_b32 v0, v115969; GFX12-WGP-NEXT: s_endpgm15970;15971; GFX12-CU-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:15972; GFX12-CU: ; %bb.0: ; %entry15973; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x015974; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x415975; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x815976; GFX12-CU-NEXT: s_wait_kmcnt 0x015977; GFX12-CU-NEXT: v_mov_b32_e32 v0, s015978; GFX12-CU-NEXT: v_mov_b32_e32 v1, s215979; GFX12-CU-NEXT: v_mov_b32_e32 v2, s115980; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615981; GFX12-CU-NEXT: v_mov_b32_e32 v0, s015982; GFX12-CU-NEXT: s_wait_dscnt 0x015983; GFX12-CU-NEXT: ds_store_b32 v0, v115984; GFX12-CU-NEXT: s_endpgm15985;15986; GFX1250-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:15987; GFX1250: ; %bb.0: ; %entry15988; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 115989; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x015990; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x415991; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x815992; GFX1250-NEXT: s_wait_kmcnt 0x015993; GFX1250-NEXT: v_mov_b32_e32 v0, s015994; GFX1250-NEXT: v_mov_b32_e32 v1, s215995; GFX1250-NEXT: v_mov_b32_e32 v2, s115996; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1615997; GFX1250-NEXT: v_mov_b32_e32 v0, s015998; GFX1250-NEXT: s_wait_dscnt 0x015999; GFX1250-NEXT: ds_store_b32 v0, v116000; GFX1250-NEXT: s_endpgm16001 ptr addrspace(3) %out, i32 %in, i32 %old) {16002entry:16003 %gep = getelementptr i32, ptr addrspace(3) %out, i32 416004 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") release acquire16005 %val0 = extractvalue { i32, i1 } %val, 016006 store i32 %val0, ptr addrspace(3) %out, align 416007 ret void16008}16009 16010define amdgpu_kernel void @local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg(16011; GFX6-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:16012; GFX6: ; %bb.0: ; %entry16013; GFX6-NEXT: s_load_dword s4, s[8:9], 0x016014; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr416015; GFX6-NEXT: s_load_dword s5, s[8:9], 0x116016; GFX6-NEXT: s_load_dword s6, s[8:9], 0x216017; GFX6-NEXT: s_mov_b32 m0, -116018; GFX6-NEXT: s_waitcnt lgkmcnt(0)16019; GFX6-NEXT: v_mov_b32_e32 v0, s416020; GFX6-NEXT: v_mov_b32_e32 v1, s616021; GFX6-NEXT: v_mov_b32_e32 v2, s516022; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616023; GFX6-NEXT: s_mov_b32 m0, -116024; GFX6-NEXT: v_mov_b32_e32 v0, s416025; GFX6-NEXT: s_waitcnt lgkmcnt(0)16026; GFX6-NEXT: ds_write_b32 v0, v116027; GFX6-NEXT: s_endpgm16028;16029; GFX7-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:16030; GFX7: ; %bb.0: ; %entry16031; GFX7-NEXT: s_load_dword s4, s[8:9], 0x016032; GFX7-NEXT: s_load_dword s5, s[8:9], 0x116033; GFX7-NEXT: s_load_dword s6, s[8:9], 0x216034; GFX7-NEXT: s_mov_b32 m0, -116035; GFX7-NEXT: s_waitcnt lgkmcnt(0)16036; GFX7-NEXT: v_mov_b32_e32 v0, s416037; GFX7-NEXT: v_mov_b32_e32 v1, s616038; GFX7-NEXT: v_mov_b32_e32 v2, s516039; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616040; GFX7-NEXT: s_mov_b32 m0, -116041; GFX7-NEXT: v_mov_b32_e32 v0, s416042; GFX7-NEXT: s_waitcnt lgkmcnt(0)16043; GFX7-NEXT: ds_write_b32 v0, v116044; GFX7-NEXT: s_endpgm16045;16046; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:16047; GFX10-WGP: ; %bb.0: ; %entry16048; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x016049; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x416050; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x816051; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)16052; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s416053; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s616054; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s516055; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616056; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s416057; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)16058; GFX10-WGP-NEXT: ds_write_b32 v0, v116059; GFX10-WGP-NEXT: s_endpgm16060;16061; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:16062; GFX10-CU: ; %bb.0: ; %entry16063; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x016064; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x416065; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x816066; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)16067; GFX10-CU-NEXT: v_mov_b32_e32 v0, s416068; GFX10-CU-NEXT: v_mov_b32_e32 v1, s616069; GFX10-CU-NEXT: v_mov_b32_e32 v2, s516070; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616071; GFX10-CU-NEXT: v_mov_b32_e32 v0, s416072; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)16073; GFX10-CU-NEXT: ds_write_b32 v0, v116074; GFX10-CU-NEXT: s_endpgm16075;16076; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:16077; SKIP-CACHE-INV: ; %bb.0: ; %entry16078; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x016079; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x116080; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x216081; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -116082; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)16083; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s016084; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s216085; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s116086; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616087; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -116088; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s016089; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)16090; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v116091; SKIP-CACHE-INV-NEXT: s_endpgm16092;16093; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:16094; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry16095; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x016096; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x416097; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x816098; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16099; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s416100; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s616101; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s516102; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616103; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s416104; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16105; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v116106; GFX90A-NOTTGSPLIT-NEXT: s_endpgm16107;16108; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:16109; GFX90A-TGSPLIT: ; %bb.0: ; %entry16110; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x016111; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x416112; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x816113; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16114; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s416115; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s616116; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s516117; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616118; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s416119; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16120; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v116121; GFX90A-TGSPLIT-NEXT: s_endpgm16122;16123; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:16124; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry16125; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x016126; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x416127; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x816128; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16129; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s016130; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s216131; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s116132; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616133; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s016134; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16135; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v116136; GFX942-NOTTGSPLIT-NEXT: s_endpgm16137;16138; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:16139; GFX942-TGSPLIT: ; %bb.0: ; %entry16140; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x016141; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x416142; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x816143; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16144; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s016145; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s216146; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s116147; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616148; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s016149; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16150; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v116151; GFX942-TGSPLIT-NEXT: s_endpgm16152;16153; GFX11-WGP-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:16154; GFX11-WGP: ; %bb.0: ; %entry16155; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x016156; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x416157; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x816158; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)16159; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s016160; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s216161; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s116162; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1616163; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s016164; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)16165; GFX11-WGP-NEXT: ds_store_b32 v0, v116166; GFX11-WGP-NEXT: s_endpgm16167;16168; GFX11-CU-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:16169; GFX11-CU: ; %bb.0: ; %entry16170; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x016171; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x416172; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x816173; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)16174; GFX11-CU-NEXT: v_mov_b32_e32 v0, s016175; GFX11-CU-NEXT: v_mov_b32_e32 v1, s216176; GFX11-CU-NEXT: v_mov_b32_e32 v2, s116177; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1616178; GFX11-CU-NEXT: v_mov_b32_e32 v0, s016179; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)16180; GFX11-CU-NEXT: ds_store_b32 v0, v116181; GFX11-CU-NEXT: s_endpgm16182;16183; GFX12-WGP-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:16184; GFX12-WGP: ; %bb.0: ; %entry16185; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x016186; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x416187; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x816188; GFX12-WGP-NEXT: s_wait_kmcnt 0x016189; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s016190; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s216191; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s116192; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1616193; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s016194; GFX12-WGP-NEXT: s_wait_dscnt 0x016195; GFX12-WGP-NEXT: ds_store_b32 v0, v116196; GFX12-WGP-NEXT: s_endpgm16197;16198; GFX12-CU-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:16199; GFX12-CU: ; %bb.0: ; %entry16200; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x016201; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x416202; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x816203; GFX12-CU-NEXT: s_wait_kmcnt 0x016204; GFX12-CU-NEXT: v_mov_b32_e32 v0, s016205; GFX12-CU-NEXT: v_mov_b32_e32 v1, s216206; GFX12-CU-NEXT: v_mov_b32_e32 v2, s116207; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1616208; GFX12-CU-NEXT: v_mov_b32_e32 v0, s016209; GFX12-CU-NEXT: s_wait_dscnt 0x016210; GFX12-CU-NEXT: ds_store_b32 v0, v116211; GFX12-CU-NEXT: s_endpgm16212;16213; GFX1250-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:16214; GFX1250: ; %bb.0: ; %entry16215; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 116216; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x016217; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x416218; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x816219; GFX1250-NEXT: s_wait_kmcnt 0x016220; GFX1250-NEXT: v_mov_b32_e32 v0, s016221; GFX1250-NEXT: v_mov_b32_e32 v1, s216222; GFX1250-NEXT: v_mov_b32_e32 v2, s116223; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1616224; GFX1250-NEXT: v_mov_b32_e32 v0, s016225; GFX1250-NEXT: s_wait_dscnt 0x016226; GFX1250-NEXT: ds_store_b32 v0, v116227; GFX1250-NEXT: s_endpgm16228 ptr addrspace(3) %out, i32 %in, i32 %old) {16229entry:16230 %gep = getelementptr i32, ptr addrspace(3) %out, i32 416231 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acq_rel acquire16232 %val0 = extractvalue { i32, i1 } %val, 016233 store i32 %val0, ptr addrspace(3) %out, align 416234 ret void16235}16236 16237define amdgpu_kernel void @local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg(16238; GFX6-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:16239; GFX6: ; %bb.0: ; %entry16240; GFX6-NEXT: s_load_dword s4, s[8:9], 0x016241; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr416242; GFX6-NEXT: s_load_dword s5, s[8:9], 0x116243; GFX6-NEXT: s_load_dword s6, s[8:9], 0x216244; GFX6-NEXT: s_mov_b32 m0, -116245; GFX6-NEXT: s_waitcnt lgkmcnt(0)16246; GFX6-NEXT: v_mov_b32_e32 v0, s416247; GFX6-NEXT: v_mov_b32_e32 v1, s616248; GFX6-NEXT: v_mov_b32_e32 v2, s516249; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616250; GFX6-NEXT: s_mov_b32 m0, -116251; GFX6-NEXT: v_mov_b32_e32 v0, s416252; GFX6-NEXT: s_waitcnt lgkmcnt(0)16253; GFX6-NEXT: ds_write_b32 v0, v116254; GFX6-NEXT: s_endpgm16255;16256; GFX7-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:16257; GFX7: ; %bb.0: ; %entry16258; GFX7-NEXT: s_load_dword s4, s[8:9], 0x016259; GFX7-NEXT: s_load_dword s5, s[8:9], 0x116260; GFX7-NEXT: s_load_dword s6, s[8:9], 0x216261; GFX7-NEXT: s_mov_b32 m0, -116262; GFX7-NEXT: s_waitcnt lgkmcnt(0)16263; GFX7-NEXT: v_mov_b32_e32 v0, s416264; GFX7-NEXT: v_mov_b32_e32 v1, s616265; GFX7-NEXT: v_mov_b32_e32 v2, s516266; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616267; GFX7-NEXT: s_mov_b32 m0, -116268; GFX7-NEXT: v_mov_b32_e32 v0, s416269; GFX7-NEXT: s_waitcnt lgkmcnt(0)16270; GFX7-NEXT: ds_write_b32 v0, v116271; GFX7-NEXT: s_endpgm16272;16273; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:16274; GFX10-WGP: ; %bb.0: ; %entry16275; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x016276; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x416277; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x816278; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)16279; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s416280; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s616281; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s516282; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616283; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s416284; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)16285; GFX10-WGP-NEXT: ds_write_b32 v0, v116286; GFX10-WGP-NEXT: s_endpgm16287;16288; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:16289; GFX10-CU: ; %bb.0: ; %entry16290; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x016291; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x416292; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x816293; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)16294; GFX10-CU-NEXT: v_mov_b32_e32 v0, s416295; GFX10-CU-NEXT: v_mov_b32_e32 v1, s616296; GFX10-CU-NEXT: v_mov_b32_e32 v2, s516297; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616298; GFX10-CU-NEXT: v_mov_b32_e32 v0, s416299; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)16300; GFX10-CU-NEXT: ds_write_b32 v0, v116301; GFX10-CU-NEXT: s_endpgm16302;16303; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:16304; SKIP-CACHE-INV: ; %bb.0: ; %entry16305; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x016306; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x116307; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x216308; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -116309; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)16310; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s016311; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s216312; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s116313; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616314; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -116315; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s016316; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)16317; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v116318; SKIP-CACHE-INV-NEXT: s_endpgm16319;16320; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:16321; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry16322; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x016323; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x416324; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x816325; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16326; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s416327; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s616328; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s516329; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616330; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s416331; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16332; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v116333; GFX90A-NOTTGSPLIT-NEXT: s_endpgm16334;16335; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:16336; GFX90A-TGSPLIT: ; %bb.0: ; %entry16337; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x016338; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x416339; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x816340; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16341; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s416342; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s616343; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s516344; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616345; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s416346; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16347; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v116348; GFX90A-TGSPLIT-NEXT: s_endpgm16349;16350; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:16351; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry16352; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x016353; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x416354; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x816355; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16356; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s016357; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s216358; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s116359; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616360; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s016361; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16362; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v116363; GFX942-NOTTGSPLIT-NEXT: s_endpgm16364;16365; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:16366; GFX942-TGSPLIT: ; %bb.0: ; %entry16367; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x016368; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x416369; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x816370; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16371; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s016372; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s216373; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s116374; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616375; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s016376; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16377; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v116378; GFX942-TGSPLIT-NEXT: s_endpgm16379;16380; GFX11-WGP-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:16381; GFX11-WGP: ; %bb.0: ; %entry16382; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x016383; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x416384; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x816385; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)16386; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s016387; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s216388; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s116389; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1616390; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s016391; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)16392; GFX11-WGP-NEXT: ds_store_b32 v0, v116393; GFX11-WGP-NEXT: s_endpgm16394;16395; GFX11-CU-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:16396; GFX11-CU: ; %bb.0: ; %entry16397; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x016398; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x416399; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x816400; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)16401; GFX11-CU-NEXT: v_mov_b32_e32 v0, s016402; GFX11-CU-NEXT: v_mov_b32_e32 v1, s216403; GFX11-CU-NEXT: v_mov_b32_e32 v2, s116404; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1616405; GFX11-CU-NEXT: v_mov_b32_e32 v0, s016406; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)16407; GFX11-CU-NEXT: ds_store_b32 v0, v116408; GFX11-CU-NEXT: s_endpgm16409;16410; GFX12-WGP-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:16411; GFX12-WGP: ; %bb.0: ; %entry16412; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x016413; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x416414; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x816415; GFX12-WGP-NEXT: s_wait_kmcnt 0x016416; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s016417; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s216418; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s116419; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1616420; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s016421; GFX12-WGP-NEXT: s_wait_dscnt 0x016422; GFX12-WGP-NEXT: ds_store_b32 v0, v116423; GFX12-WGP-NEXT: s_endpgm16424;16425; GFX12-CU-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:16426; GFX12-CU: ; %bb.0: ; %entry16427; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x016428; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x416429; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x816430; GFX12-CU-NEXT: s_wait_kmcnt 0x016431; GFX12-CU-NEXT: v_mov_b32_e32 v0, s016432; GFX12-CU-NEXT: v_mov_b32_e32 v1, s216433; GFX12-CU-NEXT: v_mov_b32_e32 v2, s116434; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1616435; GFX12-CU-NEXT: v_mov_b32_e32 v0, s016436; GFX12-CU-NEXT: s_wait_dscnt 0x016437; GFX12-CU-NEXT: ds_store_b32 v0, v116438; GFX12-CU-NEXT: s_endpgm16439;16440; GFX1250-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:16441; GFX1250: ; %bb.0: ; %entry16442; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 116443; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x016444; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x416445; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x816446; GFX1250-NEXT: s_wait_kmcnt 0x016447; GFX1250-NEXT: v_mov_b32_e32 v0, s016448; GFX1250-NEXT: v_mov_b32_e32 v1, s216449; GFX1250-NEXT: v_mov_b32_e32 v2, s116450; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1616451; GFX1250-NEXT: v_mov_b32_e32 v0, s016452; GFX1250-NEXT: s_wait_dscnt 0x016453; GFX1250-NEXT: ds_store_b32 v0, v116454; GFX1250-NEXT: s_endpgm16455 ptr addrspace(3) %out, i32 %in, i32 %old) {16456entry:16457 %gep = getelementptr i32, ptr addrspace(3) %out, i32 416458 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") seq_cst acquire16459 %val0 = extractvalue { i32, i1 } %val, 016460 store i32 %val0, ptr addrspace(3) %out, align 416461 ret void16462}16463 16464define amdgpu_kernel void @local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg(16465; GFX6-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:16466; GFX6: ; %bb.0: ; %entry16467; GFX6-NEXT: s_load_dword s4, s[8:9], 0x016468; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr416469; GFX6-NEXT: s_load_dword s5, s[8:9], 0x116470; GFX6-NEXT: s_load_dword s6, s[8:9], 0x216471; GFX6-NEXT: s_mov_b32 m0, -116472; GFX6-NEXT: s_waitcnt lgkmcnt(0)16473; GFX6-NEXT: v_mov_b32_e32 v0, s416474; GFX6-NEXT: v_mov_b32_e32 v1, s616475; GFX6-NEXT: v_mov_b32_e32 v2, s516476; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616477; GFX6-NEXT: s_mov_b32 m0, -116478; GFX6-NEXT: v_mov_b32_e32 v0, s416479; GFX6-NEXT: s_waitcnt lgkmcnt(0)16480; GFX6-NEXT: ds_write_b32 v0, v116481; GFX6-NEXT: s_endpgm16482;16483; GFX7-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:16484; GFX7: ; %bb.0: ; %entry16485; GFX7-NEXT: s_load_dword s4, s[8:9], 0x016486; GFX7-NEXT: s_load_dword s5, s[8:9], 0x116487; GFX7-NEXT: s_load_dword s6, s[8:9], 0x216488; GFX7-NEXT: s_mov_b32 m0, -116489; GFX7-NEXT: s_waitcnt lgkmcnt(0)16490; GFX7-NEXT: v_mov_b32_e32 v0, s416491; GFX7-NEXT: v_mov_b32_e32 v1, s616492; GFX7-NEXT: v_mov_b32_e32 v2, s516493; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616494; GFX7-NEXT: s_mov_b32 m0, -116495; GFX7-NEXT: v_mov_b32_e32 v0, s416496; GFX7-NEXT: s_waitcnt lgkmcnt(0)16497; GFX7-NEXT: ds_write_b32 v0, v116498; GFX7-NEXT: s_endpgm16499;16500; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:16501; GFX10-WGP: ; %bb.0: ; %entry16502; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x016503; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x416504; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x816505; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)16506; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s416507; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s616508; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s516509; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616510; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s416511; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)16512; GFX10-WGP-NEXT: ds_write_b32 v0, v116513; GFX10-WGP-NEXT: s_endpgm16514;16515; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:16516; GFX10-CU: ; %bb.0: ; %entry16517; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x016518; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x416519; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x816520; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)16521; GFX10-CU-NEXT: v_mov_b32_e32 v0, s416522; GFX10-CU-NEXT: v_mov_b32_e32 v1, s616523; GFX10-CU-NEXT: v_mov_b32_e32 v2, s516524; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616525; GFX10-CU-NEXT: v_mov_b32_e32 v0, s416526; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)16527; GFX10-CU-NEXT: ds_write_b32 v0, v116528; GFX10-CU-NEXT: s_endpgm16529;16530; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:16531; SKIP-CACHE-INV: ; %bb.0: ; %entry16532; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x016533; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x116534; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x216535; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -116536; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)16537; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s016538; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s216539; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s116540; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616541; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -116542; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s016543; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)16544; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v116545; SKIP-CACHE-INV-NEXT: s_endpgm16546;16547; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:16548; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry16549; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x016550; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x416551; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x816552; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16553; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s416554; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s616555; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s516556; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616557; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s416558; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16559; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v116560; GFX90A-NOTTGSPLIT-NEXT: s_endpgm16561;16562; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:16563; GFX90A-TGSPLIT: ; %bb.0: ; %entry16564; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x016565; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x416566; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x816567; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16568; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s416569; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s616570; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s516571; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616572; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s416573; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16574; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v116575; GFX90A-TGSPLIT-NEXT: s_endpgm16576;16577; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:16578; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry16579; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x016580; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x416581; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x816582; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16583; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s016584; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s216585; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s116586; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616587; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s016588; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16589; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v116590; GFX942-NOTTGSPLIT-NEXT: s_endpgm16591;16592; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:16593; GFX942-TGSPLIT: ; %bb.0: ; %entry16594; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x016595; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x416596; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x816597; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16598; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s016599; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s216600; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s116601; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616602; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s016603; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16604; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v116605; GFX942-TGSPLIT-NEXT: s_endpgm16606;16607; GFX11-WGP-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:16608; GFX11-WGP: ; %bb.0: ; %entry16609; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x016610; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x416611; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x816612; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)16613; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s016614; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s216615; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s116616; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1616617; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s016618; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)16619; GFX11-WGP-NEXT: ds_store_b32 v0, v116620; GFX11-WGP-NEXT: s_endpgm16621;16622; GFX11-CU-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:16623; GFX11-CU: ; %bb.0: ; %entry16624; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x016625; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x416626; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x816627; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)16628; GFX11-CU-NEXT: v_mov_b32_e32 v0, s016629; GFX11-CU-NEXT: v_mov_b32_e32 v1, s216630; GFX11-CU-NEXT: v_mov_b32_e32 v2, s116631; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1616632; GFX11-CU-NEXT: v_mov_b32_e32 v0, s016633; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)16634; GFX11-CU-NEXT: ds_store_b32 v0, v116635; GFX11-CU-NEXT: s_endpgm16636;16637; GFX12-WGP-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:16638; GFX12-WGP: ; %bb.0: ; %entry16639; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x016640; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x416641; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x816642; GFX12-WGP-NEXT: s_wait_kmcnt 0x016643; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s016644; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s216645; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s116646; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1616647; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s016648; GFX12-WGP-NEXT: s_wait_dscnt 0x016649; GFX12-WGP-NEXT: ds_store_b32 v0, v116650; GFX12-WGP-NEXT: s_endpgm16651;16652; GFX12-CU-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:16653; GFX12-CU: ; %bb.0: ; %entry16654; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x016655; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x416656; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x816657; GFX12-CU-NEXT: s_wait_kmcnt 0x016658; GFX12-CU-NEXT: v_mov_b32_e32 v0, s016659; GFX12-CU-NEXT: v_mov_b32_e32 v1, s216660; GFX12-CU-NEXT: v_mov_b32_e32 v2, s116661; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1616662; GFX12-CU-NEXT: v_mov_b32_e32 v0, s016663; GFX12-CU-NEXT: s_wait_dscnt 0x016664; GFX12-CU-NEXT: ds_store_b32 v0, v116665; GFX12-CU-NEXT: s_endpgm16666;16667; GFX1250-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:16668; GFX1250: ; %bb.0: ; %entry16669; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 116670; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x016671; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x416672; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x816673; GFX1250-NEXT: s_wait_kmcnt 0x016674; GFX1250-NEXT: v_mov_b32_e32 v0, s016675; GFX1250-NEXT: v_mov_b32_e32 v1, s216676; GFX1250-NEXT: v_mov_b32_e32 v2, s116677; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1616678; GFX1250-NEXT: v_mov_b32_e32 v0, s016679; GFX1250-NEXT: s_wait_dscnt 0x016680; GFX1250-NEXT: ds_store_b32 v0, v116681; GFX1250-NEXT: s_endpgm16682 ptr addrspace(3) %out, i32 %in, i32 %old) {16683entry:16684 %gep = getelementptr i32, ptr addrspace(3) %out, i32 416685 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") monotonic seq_cst16686 %val0 = extractvalue { i32, i1 } %val, 016687 store i32 %val0, ptr addrspace(3) %out, align 416688 ret void16689}16690 16691define amdgpu_kernel void @local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg(16692; GFX6-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:16693; GFX6: ; %bb.0: ; %entry16694; GFX6-NEXT: s_load_dword s4, s[8:9], 0x016695; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr416696; GFX6-NEXT: s_load_dword s5, s[8:9], 0x116697; GFX6-NEXT: s_load_dword s6, s[8:9], 0x216698; GFX6-NEXT: s_mov_b32 m0, -116699; GFX6-NEXT: s_waitcnt lgkmcnt(0)16700; GFX6-NEXT: v_mov_b32_e32 v0, s416701; GFX6-NEXT: v_mov_b32_e32 v1, s616702; GFX6-NEXT: v_mov_b32_e32 v2, s516703; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616704; GFX6-NEXT: s_mov_b32 m0, -116705; GFX6-NEXT: v_mov_b32_e32 v0, s416706; GFX6-NEXT: s_waitcnt lgkmcnt(0)16707; GFX6-NEXT: ds_write_b32 v0, v116708; GFX6-NEXT: s_endpgm16709;16710; GFX7-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:16711; GFX7: ; %bb.0: ; %entry16712; GFX7-NEXT: s_load_dword s4, s[8:9], 0x016713; GFX7-NEXT: s_load_dword s5, s[8:9], 0x116714; GFX7-NEXT: s_load_dword s6, s[8:9], 0x216715; GFX7-NEXT: s_mov_b32 m0, -116716; GFX7-NEXT: s_waitcnt lgkmcnt(0)16717; GFX7-NEXT: v_mov_b32_e32 v0, s416718; GFX7-NEXT: v_mov_b32_e32 v1, s616719; GFX7-NEXT: v_mov_b32_e32 v2, s516720; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616721; GFX7-NEXT: s_mov_b32 m0, -116722; GFX7-NEXT: v_mov_b32_e32 v0, s416723; GFX7-NEXT: s_waitcnt lgkmcnt(0)16724; GFX7-NEXT: ds_write_b32 v0, v116725; GFX7-NEXT: s_endpgm16726;16727; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:16728; GFX10-WGP: ; %bb.0: ; %entry16729; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x016730; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x416731; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x816732; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)16733; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s416734; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s616735; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s516736; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616737; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s416738; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)16739; GFX10-WGP-NEXT: ds_write_b32 v0, v116740; GFX10-WGP-NEXT: s_endpgm16741;16742; GFX10-CU-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:16743; GFX10-CU: ; %bb.0: ; %entry16744; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x016745; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x416746; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x816747; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)16748; GFX10-CU-NEXT: v_mov_b32_e32 v0, s416749; GFX10-CU-NEXT: v_mov_b32_e32 v1, s616750; GFX10-CU-NEXT: v_mov_b32_e32 v2, s516751; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616752; GFX10-CU-NEXT: v_mov_b32_e32 v0, s416753; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)16754; GFX10-CU-NEXT: ds_write_b32 v0, v116755; GFX10-CU-NEXT: s_endpgm16756;16757; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:16758; SKIP-CACHE-INV: ; %bb.0: ; %entry16759; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x016760; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x116761; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x216762; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -116763; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)16764; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s016765; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s216766; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s116767; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616768; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -116769; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s016770; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)16771; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v116772; SKIP-CACHE-INV-NEXT: s_endpgm16773;16774; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:16775; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry16776; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x016777; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x416778; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x816779; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16780; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s416781; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s616782; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s516783; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616784; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s416785; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16786; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v116787; GFX90A-NOTTGSPLIT-NEXT: s_endpgm16788;16789; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:16790; GFX90A-TGSPLIT: ; %bb.0: ; %entry16791; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x016792; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x416793; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x816794; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16795; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s416796; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s616797; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s516798; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616799; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s416800; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16801; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v116802; GFX90A-TGSPLIT-NEXT: s_endpgm16803;16804; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:16805; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry16806; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x016807; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x416808; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x816809; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16810; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s016811; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s216812; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s116813; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616814; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s016815; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16816; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v116817; GFX942-NOTTGSPLIT-NEXT: s_endpgm16818;16819; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:16820; GFX942-TGSPLIT: ; %bb.0: ; %entry16821; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x016822; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x416823; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x816824; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16825; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s016826; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s216827; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s116828; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616829; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s016830; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)16831; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v116832; GFX942-TGSPLIT-NEXT: s_endpgm16833;16834; GFX11-WGP-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:16835; GFX11-WGP: ; %bb.0: ; %entry16836; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x016837; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x416838; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x816839; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)16840; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s016841; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s216842; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s116843; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1616844; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s016845; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)16846; GFX11-WGP-NEXT: ds_store_b32 v0, v116847; GFX11-WGP-NEXT: s_endpgm16848;16849; GFX11-CU-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:16850; GFX11-CU: ; %bb.0: ; %entry16851; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x016852; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x416853; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x816854; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)16855; GFX11-CU-NEXT: v_mov_b32_e32 v0, s016856; GFX11-CU-NEXT: v_mov_b32_e32 v1, s216857; GFX11-CU-NEXT: v_mov_b32_e32 v2, s116858; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1616859; GFX11-CU-NEXT: v_mov_b32_e32 v0, s016860; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)16861; GFX11-CU-NEXT: ds_store_b32 v0, v116862; GFX11-CU-NEXT: s_endpgm16863;16864; GFX12-WGP-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:16865; GFX12-WGP: ; %bb.0: ; %entry16866; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x016867; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x416868; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x816869; GFX12-WGP-NEXT: s_wait_kmcnt 0x016870; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s016871; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s216872; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s116873; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1616874; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s016875; GFX12-WGP-NEXT: s_wait_dscnt 0x016876; GFX12-WGP-NEXT: ds_store_b32 v0, v116877; GFX12-WGP-NEXT: s_endpgm16878;16879; GFX12-CU-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:16880; GFX12-CU: ; %bb.0: ; %entry16881; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x016882; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x416883; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x816884; GFX12-CU-NEXT: s_wait_kmcnt 0x016885; GFX12-CU-NEXT: v_mov_b32_e32 v0, s016886; GFX12-CU-NEXT: v_mov_b32_e32 v1, s216887; GFX12-CU-NEXT: v_mov_b32_e32 v2, s116888; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1616889; GFX12-CU-NEXT: v_mov_b32_e32 v0, s016890; GFX12-CU-NEXT: s_wait_dscnt 0x016891; GFX12-CU-NEXT: ds_store_b32 v0, v116892; GFX12-CU-NEXT: s_endpgm16893;16894; GFX1250-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:16895; GFX1250: ; %bb.0: ; %entry16896; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 116897; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x016898; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x416899; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x816900; GFX1250-NEXT: s_wait_kmcnt 0x016901; GFX1250-NEXT: v_mov_b32_e32 v0, s016902; GFX1250-NEXT: v_mov_b32_e32 v1, s216903; GFX1250-NEXT: v_mov_b32_e32 v2, s116904; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1616905; GFX1250-NEXT: v_mov_b32_e32 v0, s016906; GFX1250-NEXT: s_wait_dscnt 0x016907; GFX1250-NEXT: ds_store_b32 v0, v116908; GFX1250-NEXT: s_endpgm16909 ptr addrspace(3) %out, i32 %in, i32 %old) {16910entry:16911 %gep = getelementptr i32, ptr addrspace(3) %out, i32 416912 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acquire seq_cst16913 %val0 = extractvalue { i32, i1 } %val, 016914 store i32 %val0, ptr addrspace(3) %out, align 416915 ret void16916}16917 16918define amdgpu_kernel void @local_singlethread_one_as_release_seq_cst_ret_cmpxchg(16919; GFX6-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:16920; GFX6: ; %bb.0: ; %entry16921; GFX6-NEXT: s_load_dword s4, s[8:9], 0x016922; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr416923; GFX6-NEXT: s_load_dword s5, s[8:9], 0x116924; GFX6-NEXT: s_load_dword s6, s[8:9], 0x216925; GFX6-NEXT: s_mov_b32 m0, -116926; GFX6-NEXT: s_waitcnt lgkmcnt(0)16927; GFX6-NEXT: v_mov_b32_e32 v0, s416928; GFX6-NEXT: v_mov_b32_e32 v1, s616929; GFX6-NEXT: v_mov_b32_e32 v2, s516930; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616931; GFX6-NEXT: s_mov_b32 m0, -116932; GFX6-NEXT: v_mov_b32_e32 v0, s416933; GFX6-NEXT: s_waitcnt lgkmcnt(0)16934; GFX6-NEXT: ds_write_b32 v0, v116935; GFX6-NEXT: s_endpgm16936;16937; GFX7-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:16938; GFX7: ; %bb.0: ; %entry16939; GFX7-NEXT: s_load_dword s4, s[8:9], 0x016940; GFX7-NEXT: s_load_dword s5, s[8:9], 0x116941; GFX7-NEXT: s_load_dword s6, s[8:9], 0x216942; GFX7-NEXT: s_mov_b32 m0, -116943; GFX7-NEXT: s_waitcnt lgkmcnt(0)16944; GFX7-NEXT: v_mov_b32_e32 v0, s416945; GFX7-NEXT: v_mov_b32_e32 v1, s616946; GFX7-NEXT: v_mov_b32_e32 v2, s516947; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616948; GFX7-NEXT: s_mov_b32 m0, -116949; GFX7-NEXT: v_mov_b32_e32 v0, s416950; GFX7-NEXT: s_waitcnt lgkmcnt(0)16951; GFX7-NEXT: ds_write_b32 v0, v116952; GFX7-NEXT: s_endpgm16953;16954; GFX10-WGP-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:16955; GFX10-WGP: ; %bb.0: ; %entry16956; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x016957; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x416958; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x816959; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)16960; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s416961; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s616962; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s516963; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616964; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s416965; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)16966; GFX10-WGP-NEXT: ds_write_b32 v0, v116967; GFX10-WGP-NEXT: s_endpgm16968;16969; GFX10-CU-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:16970; GFX10-CU: ; %bb.0: ; %entry16971; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x016972; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x416973; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x816974; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)16975; GFX10-CU-NEXT: v_mov_b32_e32 v0, s416976; GFX10-CU-NEXT: v_mov_b32_e32 v1, s616977; GFX10-CU-NEXT: v_mov_b32_e32 v2, s516978; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616979; GFX10-CU-NEXT: v_mov_b32_e32 v0, s416980; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)16981; GFX10-CU-NEXT: ds_write_b32 v0, v116982; GFX10-CU-NEXT: s_endpgm16983;16984; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:16985; SKIP-CACHE-INV: ; %bb.0: ; %entry16986; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x016987; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x116988; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x216989; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -116990; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)16991; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s016992; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s216993; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s116994; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1616995; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -116996; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s016997; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)16998; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v116999; SKIP-CACHE-INV-NEXT: s_endpgm17000;17001; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:17002; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry17003; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x017004; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x417005; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x817006; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17007; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s417008; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s617009; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s517010; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617011; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s417012; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17013; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v117014; GFX90A-NOTTGSPLIT-NEXT: s_endpgm17015;17016; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:17017; GFX90A-TGSPLIT: ; %bb.0: ; %entry17018; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x017019; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x417020; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x817021; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17022; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s417023; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s617024; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s517025; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617026; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s417027; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17028; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v117029; GFX90A-TGSPLIT-NEXT: s_endpgm17030;17031; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:17032; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry17033; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x017034; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x417035; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x817036; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17037; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s017038; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s217039; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s117040; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617041; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s017042; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17043; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v117044; GFX942-NOTTGSPLIT-NEXT: s_endpgm17045;17046; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:17047; GFX942-TGSPLIT: ; %bb.0: ; %entry17048; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x017049; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x417050; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x817051; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17052; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s017053; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s217054; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s117055; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617056; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s017057; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17058; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v117059; GFX942-TGSPLIT-NEXT: s_endpgm17060;17061; GFX11-WGP-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:17062; GFX11-WGP: ; %bb.0: ; %entry17063; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x017064; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x417065; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x817066; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)17067; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s017068; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s217069; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s117070; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1617071; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s017072; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)17073; GFX11-WGP-NEXT: ds_store_b32 v0, v117074; GFX11-WGP-NEXT: s_endpgm17075;17076; GFX11-CU-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:17077; GFX11-CU: ; %bb.0: ; %entry17078; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x017079; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x417080; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x817081; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)17082; GFX11-CU-NEXT: v_mov_b32_e32 v0, s017083; GFX11-CU-NEXT: v_mov_b32_e32 v1, s217084; GFX11-CU-NEXT: v_mov_b32_e32 v2, s117085; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1617086; GFX11-CU-NEXT: v_mov_b32_e32 v0, s017087; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)17088; GFX11-CU-NEXT: ds_store_b32 v0, v117089; GFX11-CU-NEXT: s_endpgm17090;17091; GFX12-WGP-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:17092; GFX12-WGP: ; %bb.0: ; %entry17093; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x017094; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x417095; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x817096; GFX12-WGP-NEXT: s_wait_kmcnt 0x017097; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s017098; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s217099; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s117100; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1617101; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s017102; GFX12-WGP-NEXT: s_wait_dscnt 0x017103; GFX12-WGP-NEXT: ds_store_b32 v0, v117104; GFX12-WGP-NEXT: s_endpgm17105;17106; GFX12-CU-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:17107; GFX12-CU: ; %bb.0: ; %entry17108; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x017109; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x417110; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x817111; GFX12-CU-NEXT: s_wait_kmcnt 0x017112; GFX12-CU-NEXT: v_mov_b32_e32 v0, s017113; GFX12-CU-NEXT: v_mov_b32_e32 v1, s217114; GFX12-CU-NEXT: v_mov_b32_e32 v2, s117115; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1617116; GFX12-CU-NEXT: v_mov_b32_e32 v0, s017117; GFX12-CU-NEXT: s_wait_dscnt 0x017118; GFX12-CU-NEXT: ds_store_b32 v0, v117119; GFX12-CU-NEXT: s_endpgm17120;17121; GFX1250-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:17122; GFX1250: ; %bb.0: ; %entry17123; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 117124; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x017125; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x417126; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x817127; GFX1250-NEXT: s_wait_kmcnt 0x017128; GFX1250-NEXT: v_mov_b32_e32 v0, s017129; GFX1250-NEXT: v_mov_b32_e32 v1, s217130; GFX1250-NEXT: v_mov_b32_e32 v2, s117131; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1617132; GFX1250-NEXT: v_mov_b32_e32 v0, s017133; GFX1250-NEXT: s_wait_dscnt 0x017134; GFX1250-NEXT: ds_store_b32 v0, v117135; GFX1250-NEXT: s_endpgm17136 ptr addrspace(3) %out, i32 %in, i32 %old) {17137entry:17138 %gep = getelementptr i32, ptr addrspace(3) %out, i32 417139 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") release seq_cst17140 %val0 = extractvalue { i32, i1 } %val, 017141 store i32 %val0, ptr addrspace(3) %out, align 417142 ret void17143}17144 17145define amdgpu_kernel void @local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg(17146; GFX6-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:17147; GFX6: ; %bb.0: ; %entry17148; GFX6-NEXT: s_load_dword s4, s[8:9], 0x017149; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr417150; GFX6-NEXT: s_load_dword s5, s[8:9], 0x117151; GFX6-NEXT: s_load_dword s6, s[8:9], 0x217152; GFX6-NEXT: s_mov_b32 m0, -117153; GFX6-NEXT: s_waitcnt lgkmcnt(0)17154; GFX6-NEXT: v_mov_b32_e32 v0, s417155; GFX6-NEXT: v_mov_b32_e32 v1, s617156; GFX6-NEXT: v_mov_b32_e32 v2, s517157; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617158; GFX6-NEXT: s_mov_b32 m0, -117159; GFX6-NEXT: v_mov_b32_e32 v0, s417160; GFX6-NEXT: s_waitcnt lgkmcnt(0)17161; GFX6-NEXT: ds_write_b32 v0, v117162; GFX6-NEXT: s_endpgm17163;17164; GFX7-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:17165; GFX7: ; %bb.0: ; %entry17166; GFX7-NEXT: s_load_dword s4, s[8:9], 0x017167; GFX7-NEXT: s_load_dword s5, s[8:9], 0x117168; GFX7-NEXT: s_load_dword s6, s[8:9], 0x217169; GFX7-NEXT: s_mov_b32 m0, -117170; GFX7-NEXT: s_waitcnt lgkmcnt(0)17171; GFX7-NEXT: v_mov_b32_e32 v0, s417172; GFX7-NEXT: v_mov_b32_e32 v1, s617173; GFX7-NEXT: v_mov_b32_e32 v2, s517174; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617175; GFX7-NEXT: s_mov_b32 m0, -117176; GFX7-NEXT: v_mov_b32_e32 v0, s417177; GFX7-NEXT: s_waitcnt lgkmcnt(0)17178; GFX7-NEXT: ds_write_b32 v0, v117179; GFX7-NEXT: s_endpgm17180;17181; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:17182; GFX10-WGP: ; %bb.0: ; %entry17183; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x017184; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x417185; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x817186; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)17187; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s417188; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s617189; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s517190; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617191; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s417192; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)17193; GFX10-WGP-NEXT: ds_write_b32 v0, v117194; GFX10-WGP-NEXT: s_endpgm17195;17196; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:17197; GFX10-CU: ; %bb.0: ; %entry17198; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x017199; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x417200; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x817201; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)17202; GFX10-CU-NEXT: v_mov_b32_e32 v0, s417203; GFX10-CU-NEXT: v_mov_b32_e32 v1, s617204; GFX10-CU-NEXT: v_mov_b32_e32 v2, s517205; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617206; GFX10-CU-NEXT: v_mov_b32_e32 v0, s417207; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)17208; GFX10-CU-NEXT: ds_write_b32 v0, v117209; GFX10-CU-NEXT: s_endpgm17210;17211; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:17212; SKIP-CACHE-INV: ; %bb.0: ; %entry17213; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x017214; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x117215; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x217216; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -117217; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)17218; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s017219; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s217220; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s117221; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617222; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -117223; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s017224; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)17225; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v117226; SKIP-CACHE-INV-NEXT: s_endpgm17227;17228; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:17229; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry17230; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x017231; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x417232; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x817233; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17234; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s417235; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s617236; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s517237; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617238; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s417239; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17240; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v117241; GFX90A-NOTTGSPLIT-NEXT: s_endpgm17242;17243; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:17244; GFX90A-TGSPLIT: ; %bb.0: ; %entry17245; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x017246; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x417247; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x817248; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17249; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s417250; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s617251; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s517252; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617253; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s417254; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17255; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v117256; GFX90A-TGSPLIT-NEXT: s_endpgm17257;17258; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:17259; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry17260; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x017261; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x417262; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x817263; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17264; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s017265; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s217266; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s117267; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617268; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s017269; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17270; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v117271; GFX942-NOTTGSPLIT-NEXT: s_endpgm17272;17273; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:17274; GFX942-TGSPLIT: ; %bb.0: ; %entry17275; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x017276; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x417277; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x817278; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17279; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s017280; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s217281; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s117282; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617283; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s017284; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17285; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v117286; GFX942-TGSPLIT-NEXT: s_endpgm17287;17288; GFX11-WGP-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:17289; GFX11-WGP: ; %bb.0: ; %entry17290; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x017291; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x417292; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x817293; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)17294; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s017295; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s217296; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s117297; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1617298; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s017299; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)17300; GFX11-WGP-NEXT: ds_store_b32 v0, v117301; GFX11-WGP-NEXT: s_endpgm17302;17303; GFX11-CU-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:17304; GFX11-CU: ; %bb.0: ; %entry17305; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x017306; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x417307; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x817308; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)17309; GFX11-CU-NEXT: v_mov_b32_e32 v0, s017310; GFX11-CU-NEXT: v_mov_b32_e32 v1, s217311; GFX11-CU-NEXT: v_mov_b32_e32 v2, s117312; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1617313; GFX11-CU-NEXT: v_mov_b32_e32 v0, s017314; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)17315; GFX11-CU-NEXT: ds_store_b32 v0, v117316; GFX11-CU-NEXT: s_endpgm17317;17318; GFX12-WGP-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:17319; GFX12-WGP: ; %bb.0: ; %entry17320; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x017321; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x417322; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x817323; GFX12-WGP-NEXT: s_wait_kmcnt 0x017324; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s017325; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s217326; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s117327; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1617328; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s017329; GFX12-WGP-NEXT: s_wait_dscnt 0x017330; GFX12-WGP-NEXT: ds_store_b32 v0, v117331; GFX12-WGP-NEXT: s_endpgm17332;17333; GFX12-CU-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:17334; GFX12-CU: ; %bb.0: ; %entry17335; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x017336; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x417337; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x817338; GFX12-CU-NEXT: s_wait_kmcnt 0x017339; GFX12-CU-NEXT: v_mov_b32_e32 v0, s017340; GFX12-CU-NEXT: v_mov_b32_e32 v1, s217341; GFX12-CU-NEXT: v_mov_b32_e32 v2, s117342; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1617343; GFX12-CU-NEXT: v_mov_b32_e32 v0, s017344; GFX12-CU-NEXT: s_wait_dscnt 0x017345; GFX12-CU-NEXT: ds_store_b32 v0, v117346; GFX12-CU-NEXT: s_endpgm17347;17348; GFX1250-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:17349; GFX1250: ; %bb.0: ; %entry17350; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 117351; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x017352; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x417353; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x817354; GFX1250-NEXT: s_wait_kmcnt 0x017355; GFX1250-NEXT: v_mov_b32_e32 v0, s017356; GFX1250-NEXT: v_mov_b32_e32 v1, s217357; GFX1250-NEXT: v_mov_b32_e32 v2, s117358; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1617359; GFX1250-NEXT: v_mov_b32_e32 v0, s017360; GFX1250-NEXT: s_wait_dscnt 0x017361; GFX1250-NEXT: ds_store_b32 v0, v117362; GFX1250-NEXT: s_endpgm17363 ptr addrspace(3) %out, i32 %in, i32 %old) {17364entry:17365 %gep = getelementptr i32, ptr addrspace(3) %out, i32 417366 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acq_rel seq_cst17367 %val0 = extractvalue { i32, i1 } %val, 017368 store i32 %val0, ptr addrspace(3) %out, align 417369 ret void17370}17371 17372define amdgpu_kernel void @local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg(17373; GFX6-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:17374; GFX6: ; %bb.0: ; %entry17375; GFX6-NEXT: s_load_dword s4, s[8:9], 0x017376; GFX6-NEXT: ; kill: def $sgpr5 killed $sgpr417377; GFX6-NEXT: s_load_dword s5, s[8:9], 0x117378; GFX6-NEXT: s_load_dword s6, s[8:9], 0x217379; GFX6-NEXT: s_mov_b32 m0, -117380; GFX6-NEXT: s_waitcnt lgkmcnt(0)17381; GFX6-NEXT: v_mov_b32_e32 v0, s417382; GFX6-NEXT: v_mov_b32_e32 v1, s617383; GFX6-NEXT: v_mov_b32_e32 v2, s517384; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617385; GFX6-NEXT: s_mov_b32 m0, -117386; GFX6-NEXT: v_mov_b32_e32 v0, s417387; GFX6-NEXT: s_waitcnt lgkmcnt(0)17388; GFX6-NEXT: ds_write_b32 v0, v117389; GFX6-NEXT: s_endpgm17390;17391; GFX7-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:17392; GFX7: ; %bb.0: ; %entry17393; GFX7-NEXT: s_load_dword s4, s[8:9], 0x017394; GFX7-NEXT: s_load_dword s5, s[8:9], 0x117395; GFX7-NEXT: s_load_dword s6, s[8:9], 0x217396; GFX7-NEXT: s_mov_b32 m0, -117397; GFX7-NEXT: s_waitcnt lgkmcnt(0)17398; GFX7-NEXT: v_mov_b32_e32 v0, s417399; GFX7-NEXT: v_mov_b32_e32 v1, s617400; GFX7-NEXT: v_mov_b32_e32 v2, s517401; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617402; GFX7-NEXT: s_mov_b32 m0, -117403; GFX7-NEXT: v_mov_b32_e32 v0, s417404; GFX7-NEXT: s_waitcnt lgkmcnt(0)17405; GFX7-NEXT: ds_write_b32 v0, v117406; GFX7-NEXT: s_endpgm17407;17408; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:17409; GFX10-WGP: ; %bb.0: ; %entry17410; GFX10-WGP-NEXT: s_load_dword s4, s[8:9], 0x017411; GFX10-WGP-NEXT: s_load_dword s5, s[8:9], 0x417412; GFX10-WGP-NEXT: s_load_dword s6, s[8:9], 0x817413; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)17414; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s417415; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s617416; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s517417; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617418; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s417419; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0)17420; GFX10-WGP-NEXT: ds_write_b32 v0, v117421; GFX10-WGP-NEXT: s_endpgm17422;17423; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:17424; GFX10-CU: ; %bb.0: ; %entry17425; GFX10-CU-NEXT: s_load_dword s4, s[8:9], 0x017426; GFX10-CU-NEXT: s_load_dword s5, s[8:9], 0x417427; GFX10-CU-NEXT: s_load_dword s6, s[8:9], 0x817428; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)17429; GFX10-CU-NEXT: v_mov_b32_e32 v0, s417430; GFX10-CU-NEXT: v_mov_b32_e32 v1, s617431; GFX10-CU-NEXT: v_mov_b32_e32 v2, s517432; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617433; GFX10-CU-NEXT: v_mov_b32_e32 v0, s417434; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0)17435; GFX10-CU-NEXT: ds_write_b32 v0, v117436; GFX10-CU-NEXT: s_endpgm17437;17438; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:17439; SKIP-CACHE-INV: ; %bb.0: ; %entry17440; SKIP-CACHE-INV-NEXT: s_load_dword s0, s[4:5], 0x017441; SKIP-CACHE-INV-NEXT: s_load_dword s1, s[4:5], 0x117442; SKIP-CACHE-INV-NEXT: s_load_dword s2, s[4:5], 0x217443; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -117444; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)17445; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s017446; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s217447; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s117448; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617449; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -117450; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s017451; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0)17452; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v117453; SKIP-CACHE-INV-NEXT: s_endpgm17454;17455; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:17456; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry17457; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x017458; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x417459; GFX90A-NOTTGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x817460; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17461; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s417462; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s617463; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s517464; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617465; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s417466; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17467; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v117468; GFX90A-NOTTGSPLIT-NEXT: s_endpgm17469;17470; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:17471; GFX90A-TGSPLIT: ; %bb.0: ; %entry17472; GFX90A-TGSPLIT-NEXT: s_load_dword s4, s[8:9], 0x017473; GFX90A-TGSPLIT-NEXT: s_load_dword s5, s[8:9], 0x417474; GFX90A-TGSPLIT-NEXT: s_load_dword s6, s[8:9], 0x817475; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17476; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s417477; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s617478; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s517479; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617480; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s417481; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17482; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v117483; GFX90A-TGSPLIT-NEXT: s_endpgm17484;17485; GFX942-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:17486; GFX942-NOTTGSPLIT: ; %bb.0: ; %entry17487; GFX942-NOTTGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x017488; GFX942-NOTTGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x417489; GFX942-NOTTGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x817490; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17491; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s017492; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s217493; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s117494; GFX942-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617495; GFX942-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s017496; GFX942-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17497; GFX942-NOTTGSPLIT-NEXT: ds_write_b32 v0, v117498; GFX942-NOTTGSPLIT-NEXT: s_endpgm17499;17500; GFX942-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:17501; GFX942-TGSPLIT: ; %bb.0: ; %entry17502; GFX942-TGSPLIT-NEXT: s_load_dword s0, s[4:5], 0x017503; GFX942-TGSPLIT-NEXT: s_load_dword s1, s[4:5], 0x417504; GFX942-TGSPLIT-NEXT: s_load_dword s2, s[4:5], 0x817505; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17506; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s017507; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v1, s217508; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v2, s117509; GFX942-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:1617510; GFX942-TGSPLIT-NEXT: v_mov_b32_e32 v0, s017511; GFX942-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0)17512; GFX942-TGSPLIT-NEXT: ds_write_b32 v0, v117513; GFX942-TGSPLIT-NEXT: s_endpgm17514;17515; GFX11-WGP-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:17516; GFX11-WGP: ; %bb.0: ; %entry17517; GFX11-WGP-NEXT: s_load_b32 s0, s[4:5], 0x017518; GFX11-WGP-NEXT: s_load_b32 s2, s[4:5], 0x417519; GFX11-WGP-NEXT: s_load_b32 s1, s[4:5], 0x817520; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)17521; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s017522; GFX11-WGP-NEXT: v_mov_b32_e32 v1, s217523; GFX11-WGP-NEXT: v_mov_b32_e32 v2, s117524; GFX11-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1617525; GFX11-WGP-NEXT: v_mov_b32_e32 v0, s017526; GFX11-WGP-NEXT: s_waitcnt lgkmcnt(0)17527; GFX11-WGP-NEXT: ds_store_b32 v0, v117528; GFX11-WGP-NEXT: s_endpgm17529;17530; GFX11-CU-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:17531; GFX11-CU: ; %bb.0: ; %entry17532; GFX11-CU-NEXT: s_load_b32 s0, s[4:5], 0x017533; GFX11-CU-NEXT: s_load_b32 s2, s[4:5], 0x417534; GFX11-CU-NEXT: s_load_b32 s1, s[4:5], 0x817535; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)17536; GFX11-CU-NEXT: v_mov_b32_e32 v0, s017537; GFX11-CU-NEXT: v_mov_b32_e32 v1, s217538; GFX11-CU-NEXT: v_mov_b32_e32 v2, s117539; GFX11-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1617540; GFX11-CU-NEXT: v_mov_b32_e32 v0, s017541; GFX11-CU-NEXT: s_waitcnt lgkmcnt(0)17542; GFX11-CU-NEXT: ds_store_b32 v0, v117543; GFX11-CU-NEXT: s_endpgm17544;17545; GFX12-WGP-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:17546; GFX12-WGP: ; %bb.0: ; %entry17547; GFX12-WGP-NEXT: s_load_b32 s0, s[4:5], 0x017548; GFX12-WGP-NEXT: s_load_b32 s2, s[4:5], 0x417549; GFX12-WGP-NEXT: s_load_b32 s1, s[4:5], 0x817550; GFX12-WGP-NEXT: s_wait_kmcnt 0x017551; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s017552; GFX12-WGP-NEXT: v_mov_b32_e32 v1, s217553; GFX12-WGP-NEXT: v_mov_b32_e32 v2, s117554; GFX12-WGP-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1617555; GFX12-WGP-NEXT: v_mov_b32_e32 v0, s017556; GFX12-WGP-NEXT: s_wait_dscnt 0x017557; GFX12-WGP-NEXT: ds_store_b32 v0, v117558; GFX12-WGP-NEXT: s_endpgm17559;17560; GFX12-CU-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:17561; GFX12-CU: ; %bb.0: ; %entry17562; GFX12-CU-NEXT: s_load_b32 s0, s[4:5], 0x017563; GFX12-CU-NEXT: s_load_b32 s2, s[4:5], 0x417564; GFX12-CU-NEXT: s_load_b32 s1, s[4:5], 0x817565; GFX12-CU-NEXT: s_wait_kmcnt 0x017566; GFX12-CU-NEXT: v_mov_b32_e32 v0, s017567; GFX12-CU-NEXT: v_mov_b32_e32 v1, s217568; GFX12-CU-NEXT: v_mov_b32_e32 v2, s117569; GFX12-CU-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1617570; GFX12-CU-NEXT: v_mov_b32_e32 v0, s017571; GFX12-CU-NEXT: s_wait_dscnt 0x017572; GFX12-CU-NEXT: ds_store_b32 v0, v117573; GFX12-CU-NEXT: s_endpgm17574;17575; GFX1250-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:17576; GFX1250: ; %bb.0: ; %entry17577; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 117578; GFX1250-NEXT: s_load_b32 s0, s[4:5], 0x017579; GFX1250-NEXT: s_load_b32 s2, s[4:5], 0x417580; GFX1250-NEXT: s_load_b32 s1, s[4:5], 0x817581; GFX1250-NEXT: s_wait_kmcnt 0x017582; GFX1250-NEXT: v_mov_b32_e32 v0, s017583; GFX1250-NEXT: v_mov_b32_e32 v1, s217584; GFX1250-NEXT: v_mov_b32_e32 v2, s117585; GFX1250-NEXT: ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:1617586; GFX1250-NEXT: v_mov_b32_e32 v0, s017587; GFX1250-NEXT: s_wait_dscnt 0x017588; GFX1250-NEXT: ds_store_b32 v0, v117589; GFX1250-NEXT: s_endpgm17590 ptr addrspace(3) %out, i32 %in, i32 %old) {17591entry:17592 %gep = getelementptr i32, ptr addrspace(3) %out, i32 417593 %val = cmpxchg volatile ptr addrspace(3) %gep, i32 %old, i32 %in syncscope("singlethread-one-as") seq_cst seq_cst17594 %val0 = extractvalue { i32, i1 } %val, 017595 store i32 %val0, ptr addrspace(3) %out, align 417596 ret void17597}17598