4031 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX9 %s3; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 -mattr=+wavefrontsize64 < %s | FileCheck -check-prefixes=GCN,GFX10 %s4; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=+wavefrontsize64 < %s | FileCheck -check-prefixes=GFX11 %s5; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1200 -mattr=+wavefrontsize64 < %s | FileCheck -check-prefixes=GFX12 %s6 7; Test using saddr addressing mode of global_* flat atomic instructions.8 9define amdgpu_ps void @global_xchg_saddr_i32_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {10; GFX9-LABEL: global_xchg_saddr_i32_nortn:11; GFX9: ; %bb.0:12; GFX9-NEXT: global_atomic_swap v0, v1, s[2:3]13; GFX9-NEXT: s_waitcnt vmcnt(0)14; GFX9-NEXT: buffer_wbinvl115; GFX9-NEXT: s_endpgm16;17; GFX10-LABEL: global_xchg_saddr_i32_nortn:18; GFX10: ; %bb.0:19; GFX10-NEXT: global_atomic_swap v0, v1, s[2:3]20; GFX10-NEXT: s_waitcnt_vscnt null, 0x021; GFX10-NEXT: buffer_gl1_inv22; GFX10-NEXT: buffer_gl0_inv23; GFX10-NEXT: s_endpgm24;25; GFX11-LABEL: global_xchg_saddr_i32_nortn:26; GFX11: ; %bb.0:27; GFX11-NEXT: global_atomic_swap_b32 v0, v1, s[2:3]28; GFX11-NEXT: s_waitcnt_vscnt null, 0x029; GFX11-NEXT: buffer_gl1_inv30; GFX11-NEXT: buffer_gl0_inv31; GFX11-NEXT: s_endpgm32;33; GFX12-LABEL: global_xchg_saddr_i32_nortn:34; GFX12: ; %bb.0:35; GFX12-NEXT: global_atomic_swap_b32 v0, v1, s[2:3] scope:SCOPE_DEV36; GFX12-NEXT: s_wait_storecnt 0x037; GFX12-NEXT: global_inv scope:SCOPE_DEV38; GFX12-NEXT: s_endpgm39 %zext.offset = zext i32 %voffset to i6440 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset41 %unused = atomicrmw xchg ptr addrspace(1) %gep0, i32 %data syncscope("agent") seq_cst42 ret void43}44 45; Maximum positive offset on gfx1046define amdgpu_ps void @global_xchg_saddr_i32_nortn_offset_2047(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {47; GFX9-LABEL: global_xchg_saddr_i32_nortn_offset_2047:48; GFX9: ; %bb.0:49; GFX9-NEXT: global_atomic_swap v0, v1, s[2:3] offset:204750; GFX9-NEXT: s_waitcnt vmcnt(0)51; GFX9-NEXT: buffer_wbinvl152; GFX9-NEXT: s_endpgm53;54; GFX10-LABEL: global_xchg_saddr_i32_nortn_offset_2047:55; GFX10: ; %bb.0:56; GFX10-NEXT: global_atomic_swap v0, v1, s[2:3] offset:204757; GFX10-NEXT: s_waitcnt_vscnt null, 0x058; GFX10-NEXT: buffer_gl1_inv59; GFX10-NEXT: buffer_gl0_inv60; GFX10-NEXT: s_endpgm61;62; GFX11-LABEL: global_xchg_saddr_i32_nortn_offset_2047:63; GFX11: ; %bb.0:64; GFX11-NEXT: global_atomic_swap_b32 v0, v1, s[2:3] offset:204765; GFX11-NEXT: s_waitcnt_vscnt null, 0x066; GFX11-NEXT: buffer_gl1_inv67; GFX11-NEXT: buffer_gl0_inv68; GFX11-NEXT: s_endpgm69;70; GFX12-LABEL: global_xchg_saddr_i32_nortn_offset_2047:71; GFX12: ; %bb.0:72; GFX12-NEXT: global_atomic_swap_b32 v0, v1, s[2:3] offset:2047 scope:SCOPE_DEV73; GFX12-NEXT: s_wait_storecnt 0x074; GFX12-NEXT: global_inv scope:SCOPE_DEV75; GFX12-NEXT: s_endpgm76 %zext.offset = zext i32 %voffset to i6477 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset78 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 204779 %unused = atomicrmw xchg ptr addrspace(1) %gep1, i32 %data syncscope("agent") seq_cst80 ret void81}82 83; Maximum negative offset on gfx1084define amdgpu_ps void @global_xchg_saddr_i32_nortn_offset_neg2048(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {85; GFX9-LABEL: global_xchg_saddr_i32_nortn_offset_neg2048:86; GFX9: ; %bb.0:87; GFX9-NEXT: global_atomic_swap v0, v1, s[2:3] offset:-204888; GFX9-NEXT: s_waitcnt vmcnt(0)89; GFX9-NEXT: buffer_wbinvl190; GFX9-NEXT: s_endpgm91;92; GFX10-LABEL: global_xchg_saddr_i32_nortn_offset_neg2048:93; GFX10: ; %bb.0:94; GFX10-NEXT: global_atomic_swap v0, v1, s[2:3] offset:-204895; GFX10-NEXT: s_waitcnt_vscnt null, 0x096; GFX10-NEXT: buffer_gl1_inv97; GFX10-NEXT: buffer_gl0_inv98; GFX10-NEXT: s_endpgm99;100; GFX11-LABEL: global_xchg_saddr_i32_nortn_offset_neg2048:101; GFX11: ; %bb.0:102; GFX11-NEXT: global_atomic_swap_b32 v0, v1, s[2:3] offset:-2048103; GFX11-NEXT: s_waitcnt_vscnt null, 0x0104; GFX11-NEXT: buffer_gl1_inv105; GFX11-NEXT: buffer_gl0_inv106; GFX11-NEXT: s_endpgm107;108; GFX12-LABEL: global_xchg_saddr_i32_nortn_offset_neg2048:109; GFX12: ; %bb.0:110; GFX12-NEXT: global_atomic_swap_b32 v0, v1, s[2:3] offset:-2048 scope:SCOPE_DEV111; GFX12-NEXT: s_wait_storecnt 0x0112; GFX12-NEXT: global_inv scope:SCOPE_DEV113; GFX12-NEXT: s_endpgm114 %zext.offset = zext i32 %voffset to i64115 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset116 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -2048117 %unused = atomicrmw xchg ptr addrspace(1) %gep1, i32 %data syncscope("agent") seq_cst118 ret void119}120 121define amdgpu_ps float @global_xchg_saddr_i32_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {122; GFX9-LABEL: global_xchg_saddr_i32_rtn:123; GFX9: ; %bb.0:124; GFX9-NEXT: global_atomic_swap v0, v0, v1, s[2:3] glc125; GFX9-NEXT: s_waitcnt vmcnt(0)126; GFX9-NEXT: buffer_wbinvl1127; GFX9-NEXT: ; return to shader part epilog128;129; GFX10-LABEL: global_xchg_saddr_i32_rtn:130; GFX10: ; %bb.0:131; GFX10-NEXT: global_atomic_swap v0, v0, v1, s[2:3] glc132; GFX10-NEXT: s_waitcnt vmcnt(0)133; GFX10-NEXT: buffer_gl1_inv134; GFX10-NEXT: buffer_gl0_inv135; GFX10-NEXT: ; return to shader part epilog136;137; GFX11-LABEL: global_xchg_saddr_i32_rtn:138; GFX11: ; %bb.0:139; GFX11-NEXT: global_atomic_swap_b32 v0, v0, v1, s[2:3] glc140; GFX11-NEXT: s_waitcnt vmcnt(0)141; GFX11-NEXT: buffer_gl1_inv142; GFX11-NEXT: buffer_gl0_inv143; GFX11-NEXT: ; return to shader part epilog144;145; GFX12-LABEL: global_xchg_saddr_i32_rtn:146; GFX12: ; %bb.0:147; GFX12-NEXT: global_atomic_swap_b32 v0, v0, v1, s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_DEV148; GFX12-NEXT: s_wait_loadcnt 0x0149; GFX12-NEXT: global_inv scope:SCOPE_DEV150; GFX12-NEXT: s_wait_loadcnt 0x0151; GFX12-NEXT: ; return to shader part epilog152 %zext.offset = zext i32 %voffset to i64153 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset154 %rtn = atomicrmw xchg ptr addrspace(1) %gep0, i32 %data syncscope("agent") seq_cst155 %cast.rtn = bitcast i32 %rtn to float156 ret float %cast.rtn157}158 159define amdgpu_ps float @global_xchg_saddr_i32_rtn_2048(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {160; GFX9-LABEL: global_xchg_saddr_i32_rtn_2048:161; GFX9: ; %bb.0:162; GFX9-NEXT: global_atomic_swap v0, v0, v1, s[2:3] offset:2048 glc163; GFX9-NEXT: s_waitcnt vmcnt(0)164; GFX9-NEXT: buffer_wbinvl1165; GFX9-NEXT: ; return to shader part epilog166;167; GFX10-LABEL: global_xchg_saddr_i32_rtn_2048:168; GFX10: ; %bb.0:169; GFX10-NEXT: v_add_co_u32 v0, s[0:1], s2, v0170; GFX10-NEXT: v_add_co_ci_u32_e64 v3, s[0:1], s3, 0, s[0:1]171; GFX10-NEXT: v_add_co_u32 v2, vcc, 0x800, v0172; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc, 0, v3, vcc173; GFX10-NEXT: global_atomic_swap v0, v[2:3], v1, off glc174; GFX10-NEXT: s_waitcnt vmcnt(0)175; GFX10-NEXT: buffer_gl1_inv176; GFX10-NEXT: buffer_gl0_inv177; GFX10-NEXT: ; return to shader part epilog178;179; GFX11-LABEL: global_xchg_saddr_i32_rtn_2048:180; GFX11: ; %bb.0:181; GFX11-NEXT: global_atomic_swap_b32 v0, v0, v1, s[2:3] offset:2048 glc182; GFX11-NEXT: s_waitcnt vmcnt(0)183; GFX11-NEXT: buffer_gl1_inv184; GFX11-NEXT: buffer_gl0_inv185; GFX11-NEXT: ; return to shader part epilog186;187; GFX12-LABEL: global_xchg_saddr_i32_rtn_2048:188; GFX12: ; %bb.0:189; GFX12-NEXT: global_atomic_swap_b32 v0, v0, v1, s[2:3] offset:2048 th:TH_ATOMIC_RETURN scope:SCOPE_DEV190; GFX12-NEXT: s_wait_loadcnt 0x0191; GFX12-NEXT: global_inv scope:SCOPE_DEV192; GFX12-NEXT: s_wait_loadcnt 0x0193; GFX12-NEXT: ; return to shader part epilog194 %zext.offset = zext i32 %voffset to i64195 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset196 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 2048197 %rtn = atomicrmw xchg ptr addrspace(1) %gep1, i32 %data syncscope("agent") seq_cst198 %cast.rtn = bitcast i32 %rtn to float199 ret float %cast.rtn200}201 202define amdgpu_ps float @global_xchg_saddr_i32_rtn_neg2048(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {203; GFX9-LABEL: global_xchg_saddr_i32_rtn_neg2048:204; GFX9: ; %bb.0:205; GFX9-NEXT: global_atomic_swap v0, v0, v1, s[2:3] offset:-2048 glc206; GFX9-NEXT: s_waitcnt vmcnt(0)207; GFX9-NEXT: buffer_wbinvl1208; GFX9-NEXT: ; return to shader part epilog209;210; GFX10-LABEL: global_xchg_saddr_i32_rtn_neg2048:211; GFX10: ; %bb.0:212; GFX10-NEXT: global_atomic_swap v0, v0, v1, s[2:3] offset:-2048 glc213; GFX10-NEXT: s_waitcnt vmcnt(0)214; GFX10-NEXT: buffer_gl1_inv215; GFX10-NEXT: buffer_gl0_inv216; GFX10-NEXT: ; return to shader part epilog217;218; GFX11-LABEL: global_xchg_saddr_i32_rtn_neg2048:219; GFX11: ; %bb.0:220; GFX11-NEXT: global_atomic_swap_b32 v0, v0, v1, s[2:3] offset:-2048 glc221; GFX11-NEXT: s_waitcnt vmcnt(0)222; GFX11-NEXT: buffer_gl1_inv223; GFX11-NEXT: buffer_gl0_inv224; GFX11-NEXT: ; return to shader part epilog225;226; GFX12-LABEL: global_xchg_saddr_i32_rtn_neg2048:227; GFX12: ; %bb.0:228; GFX12-NEXT: global_atomic_swap_b32 v0, v0, v1, s[2:3] offset:-2048 th:TH_ATOMIC_RETURN scope:SCOPE_DEV229; GFX12-NEXT: s_wait_loadcnt 0x0230; GFX12-NEXT: global_inv scope:SCOPE_DEV231; GFX12-NEXT: s_wait_loadcnt 0x0232; GFX12-NEXT: ; return to shader part epilog233 %zext.offset = zext i32 %voffset to i64234 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset235 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -2048236 %rtn = atomicrmw xchg ptr addrspace(1) %gep1, i32 %data syncscope("agent") seq_cst237 %cast.rtn = bitcast i32 %rtn to float238 ret float %cast.rtn239}240 241; --------------------------------------------------------------------------------242; Uniformity edge cases243; --------------------------------------------------------------------------------244 245@ptr.in.lds = internal addrspace(3) global ptr addrspace(1) poison246 247; Base pointer is uniform, but also in VGPRs248define amdgpu_ps float @global_xchg_saddr_uniform_ptr_in_vgprs_rtn(i32 %voffset, i32 %data) {249; GFX9-LABEL: global_xchg_saddr_uniform_ptr_in_vgprs_rtn:250; GFX9: ; %bb.0:251; GFX9-NEXT: v_mov_b32_e32 v2, 0252; GFX9-NEXT: ds_read_b64 v[2:3], v2253; GFX9-NEXT: s_waitcnt lgkmcnt(0)254; GFX9-NEXT: v_readfirstlane_b32 s0, v2255; GFX9-NEXT: v_readfirstlane_b32 s1, v3256; GFX9-NEXT: s_nop 4257; GFX9-NEXT: global_atomic_swap v0, v0, v1, s[0:1] glc258; GFX9-NEXT: s_waitcnt vmcnt(0)259; GFX9-NEXT: buffer_wbinvl1260; GFX9-NEXT: ; return to shader part epilog261;262; GFX10-LABEL: global_xchg_saddr_uniform_ptr_in_vgprs_rtn:263; GFX10: ; %bb.0:264; GFX10-NEXT: v_mov_b32_e32 v2, 0265; GFX10-NEXT: ds_read_b64 v[2:3], v2266; GFX10-NEXT: s_waitcnt lgkmcnt(0)267; GFX10-NEXT: v_readfirstlane_b32 s0, v2268; GFX10-NEXT: v_readfirstlane_b32 s1, v3269; GFX10-NEXT: global_atomic_swap v0, v0, v1, s[0:1] glc270; GFX10-NEXT: s_waitcnt vmcnt(0)271; GFX10-NEXT: buffer_gl1_inv272; GFX10-NEXT: buffer_gl0_inv273; GFX10-NEXT: ; return to shader part epilog274;275; GFX11-LABEL: global_xchg_saddr_uniform_ptr_in_vgprs_rtn:276; GFX11: ; %bb.0:277; GFX11-NEXT: v_mov_b32_e32 v2, 0278; GFX11-NEXT: ds_load_b64 v[2:3], v2279; GFX11-NEXT: s_waitcnt lgkmcnt(0)280; GFX11-NEXT: v_readfirstlane_b32 s0, v2281; GFX11-NEXT: v_readfirstlane_b32 s1, v3282; GFX11-NEXT: global_atomic_swap_b32 v0, v0, v1, s[0:1] glc283; GFX11-NEXT: s_waitcnt vmcnt(0)284; GFX11-NEXT: buffer_gl1_inv285; GFX11-NEXT: buffer_gl0_inv286; GFX11-NEXT: ; return to shader part epilog287;288; GFX12-LABEL: global_xchg_saddr_uniform_ptr_in_vgprs_rtn:289; GFX12: ; %bb.0:290; GFX12-NEXT: v_mov_b32_e32 v2, 0291; GFX12-NEXT: ds_load_b64 v[2:3], v2292; GFX12-NEXT: s_wait_dscnt 0x0293; GFX12-NEXT: v_readfirstlane_b32 s0, v2294; GFX12-NEXT: v_readfirstlane_b32 s1, v3295; GFX12-NEXT: global_atomic_swap_b32 v0, v0, v1, s[0:1] th:TH_ATOMIC_RETURN scope:SCOPE_DEV296; GFX12-NEXT: s_wait_loadcnt 0x0297; GFX12-NEXT: global_inv scope:SCOPE_DEV298; GFX12-NEXT: s_wait_loadcnt 0x0299; GFX12-NEXT: ; return to shader part epilog300 %sbase = load ptr addrspace(1), ptr addrspace(3) @ptr.in.lds301 %zext.offset = zext i32 %voffset to i64302 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset303 %rtn = atomicrmw xchg ptr addrspace(1) %gep0, i32 %data syncscope("agent") seq_cst304 %cast.rtn = bitcast i32 %rtn to float305 ret float %cast.rtn306}307 308; Base pointer is uniform, but also in VGPRs, with imm offset309define amdgpu_ps float @global_xchg_saddr_uniform_ptr_in_vgprs_rtn_immoffset(i32 %voffset, i32 %data) {310; GFX9-LABEL: global_xchg_saddr_uniform_ptr_in_vgprs_rtn_immoffset:311; GFX9: ; %bb.0:312; GFX9-NEXT: v_mov_b32_e32 v2, 0313; GFX9-NEXT: ds_read_b64 v[2:3], v2314; GFX9-NEXT: s_waitcnt lgkmcnt(0)315; GFX9-NEXT: v_readfirstlane_b32 s0, v2316; GFX9-NEXT: v_readfirstlane_b32 s1, v3317; GFX9-NEXT: s_nop 4318; GFX9-NEXT: global_atomic_swap v0, v0, v1, s[0:1] offset:42 glc319; GFX9-NEXT: s_waitcnt vmcnt(0)320; GFX9-NEXT: buffer_wbinvl1321; GFX9-NEXT: ; return to shader part epilog322;323; GFX10-LABEL: global_xchg_saddr_uniform_ptr_in_vgprs_rtn_immoffset:324; GFX10: ; %bb.0:325; GFX10-NEXT: v_mov_b32_e32 v2, 0326; GFX10-NEXT: ds_read_b64 v[2:3], v2327; GFX10-NEXT: s_waitcnt lgkmcnt(0)328; GFX10-NEXT: v_readfirstlane_b32 s0, v2329; GFX10-NEXT: v_readfirstlane_b32 s1, v3330; GFX10-NEXT: global_atomic_swap v0, v0, v1, s[0:1] offset:42 glc331; GFX10-NEXT: s_waitcnt vmcnt(0)332; GFX10-NEXT: buffer_gl1_inv333; GFX10-NEXT: buffer_gl0_inv334; GFX10-NEXT: ; return to shader part epilog335;336; GFX11-LABEL: global_xchg_saddr_uniform_ptr_in_vgprs_rtn_immoffset:337; GFX11: ; %bb.0:338; GFX11-NEXT: v_mov_b32_e32 v2, 0339; GFX11-NEXT: ds_load_b64 v[2:3], v2340; GFX11-NEXT: s_waitcnt lgkmcnt(0)341; GFX11-NEXT: v_readfirstlane_b32 s0, v2342; GFX11-NEXT: v_readfirstlane_b32 s1, v3343; GFX11-NEXT: global_atomic_swap_b32 v0, v0, v1, s[0:1] offset:42 glc344; GFX11-NEXT: s_waitcnt vmcnt(0)345; GFX11-NEXT: buffer_gl1_inv346; GFX11-NEXT: buffer_gl0_inv347; GFX11-NEXT: ; return to shader part epilog348;349; GFX12-LABEL: global_xchg_saddr_uniform_ptr_in_vgprs_rtn_immoffset:350; GFX12: ; %bb.0:351; GFX12-NEXT: v_mov_b32_e32 v2, 0352; GFX12-NEXT: ds_load_b64 v[2:3], v2353; GFX12-NEXT: s_wait_dscnt 0x0354; GFX12-NEXT: v_readfirstlane_b32 s0, v2355; GFX12-NEXT: v_readfirstlane_b32 s1, v3356; GFX12-NEXT: global_atomic_swap_b32 v0, v0, v1, s[0:1] offset:42 th:TH_ATOMIC_RETURN scope:SCOPE_DEV357; GFX12-NEXT: s_wait_loadcnt 0x0358; GFX12-NEXT: global_inv scope:SCOPE_DEV359; GFX12-NEXT: s_wait_loadcnt 0x0360; GFX12-NEXT: ; return to shader part epilog361 %sbase = load ptr addrspace(1), ptr addrspace(3) @ptr.in.lds362 %zext.offset = zext i32 %voffset to i64363 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset364 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 42365 %rtn = atomicrmw xchg ptr addrspace(1) %gep1, i32 %data syncscope("agent") seq_cst366 %cast.rtn = bitcast i32 %rtn to float367 ret float %cast.rtn368}369 370; Base pointer is uniform, but also in VGPRs371define amdgpu_ps void @global_xchg_saddr_uniform_ptr_in_vgprs_nortn(i32 %voffset, i32 %data) {372; GFX9-LABEL: global_xchg_saddr_uniform_ptr_in_vgprs_nortn:373; GFX9: ; %bb.0:374; GFX9-NEXT: v_mov_b32_e32 v2, 0375; GFX9-NEXT: ds_read_b64 v[2:3], v2376; GFX9-NEXT: s_waitcnt lgkmcnt(0)377; GFX9-NEXT: v_readfirstlane_b32 s0, v2378; GFX9-NEXT: v_readfirstlane_b32 s1, v3379; GFX9-NEXT: s_nop 4380; GFX9-NEXT: global_atomic_swap v0, v1, s[0:1]381; GFX9-NEXT: s_waitcnt vmcnt(0)382; GFX9-NEXT: buffer_wbinvl1383; GFX9-NEXT: s_endpgm384;385; GFX10-LABEL: global_xchg_saddr_uniform_ptr_in_vgprs_nortn:386; GFX10: ; %bb.0:387; GFX10-NEXT: v_mov_b32_e32 v2, 0388; GFX10-NEXT: ds_read_b64 v[2:3], v2389; GFX10-NEXT: s_waitcnt lgkmcnt(0)390; GFX10-NEXT: v_readfirstlane_b32 s0, v2391; GFX10-NEXT: v_readfirstlane_b32 s1, v3392; GFX10-NEXT: global_atomic_swap v0, v1, s[0:1]393; GFX10-NEXT: s_waitcnt_vscnt null, 0x0394; GFX10-NEXT: buffer_gl1_inv395; GFX10-NEXT: buffer_gl0_inv396; GFX10-NEXT: s_endpgm397;398; GFX11-LABEL: global_xchg_saddr_uniform_ptr_in_vgprs_nortn:399; GFX11: ; %bb.0:400; GFX11-NEXT: v_mov_b32_e32 v2, 0401; GFX11-NEXT: ds_load_b64 v[2:3], v2402; GFX11-NEXT: s_waitcnt lgkmcnt(0)403; GFX11-NEXT: v_readfirstlane_b32 s0, v2404; GFX11-NEXT: v_readfirstlane_b32 s1, v3405; GFX11-NEXT: global_atomic_swap_b32 v0, v1, s[0:1]406; GFX11-NEXT: s_waitcnt_vscnt null, 0x0407; GFX11-NEXT: buffer_gl1_inv408; GFX11-NEXT: buffer_gl0_inv409; GFX11-NEXT: s_endpgm410;411; GFX12-LABEL: global_xchg_saddr_uniform_ptr_in_vgprs_nortn:412; GFX12: ; %bb.0:413; GFX12-NEXT: v_mov_b32_e32 v2, 0414; GFX12-NEXT: ds_load_b64 v[2:3], v2415; GFX12-NEXT: s_wait_dscnt 0x0416; GFX12-NEXT: v_readfirstlane_b32 s0, v2417; GFX12-NEXT: v_readfirstlane_b32 s1, v3418; GFX12-NEXT: global_atomic_swap_b32 v0, v1, s[0:1] scope:SCOPE_DEV419; GFX12-NEXT: s_wait_storecnt 0x0420; GFX12-NEXT: global_inv scope:SCOPE_DEV421; GFX12-NEXT: s_endpgm422 %sbase = load ptr addrspace(1), ptr addrspace(3) @ptr.in.lds423 %zext.offset = zext i32 %voffset to i64424 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset425 %unused = atomicrmw xchg ptr addrspace(1) %gep0, i32 %data syncscope("agent") seq_cst426 ret void427}428 429; Base pointer is uniform, but also in VGPRs, with imm offset430define amdgpu_ps void @global_xchg_saddr_uniform_ptr_in_vgprs_nortn_immoffset(i32 %voffset, i32 %data) {431; GFX9-LABEL: global_xchg_saddr_uniform_ptr_in_vgprs_nortn_immoffset:432; GFX9: ; %bb.0:433; GFX9-NEXT: v_mov_b32_e32 v2, 0434; GFX9-NEXT: ds_read_b64 v[2:3], v2435; GFX9-NEXT: s_waitcnt lgkmcnt(0)436; GFX9-NEXT: v_readfirstlane_b32 s0, v2437; GFX9-NEXT: v_readfirstlane_b32 s1, v3438; GFX9-NEXT: s_nop 4439; GFX9-NEXT: global_atomic_swap v0, v1, s[0:1] offset:42440; GFX9-NEXT: s_waitcnt vmcnt(0)441; GFX9-NEXT: buffer_wbinvl1442; GFX9-NEXT: s_endpgm443;444; GFX10-LABEL: global_xchg_saddr_uniform_ptr_in_vgprs_nortn_immoffset:445; GFX10: ; %bb.0:446; GFX10-NEXT: v_mov_b32_e32 v2, 0447; GFX10-NEXT: ds_read_b64 v[2:3], v2448; GFX10-NEXT: s_waitcnt lgkmcnt(0)449; GFX10-NEXT: v_readfirstlane_b32 s0, v2450; GFX10-NEXT: v_readfirstlane_b32 s1, v3451; GFX10-NEXT: global_atomic_swap v0, v1, s[0:1] offset:42452; GFX10-NEXT: s_waitcnt_vscnt null, 0x0453; GFX10-NEXT: buffer_gl1_inv454; GFX10-NEXT: buffer_gl0_inv455; GFX10-NEXT: s_endpgm456;457; GFX11-LABEL: global_xchg_saddr_uniform_ptr_in_vgprs_nortn_immoffset:458; GFX11: ; %bb.0:459; GFX11-NEXT: v_mov_b32_e32 v2, 0460; GFX11-NEXT: ds_load_b64 v[2:3], v2461; GFX11-NEXT: s_waitcnt lgkmcnt(0)462; GFX11-NEXT: v_readfirstlane_b32 s0, v2463; GFX11-NEXT: v_readfirstlane_b32 s1, v3464; GFX11-NEXT: global_atomic_swap_b32 v0, v1, s[0:1] offset:42465; GFX11-NEXT: s_waitcnt_vscnt null, 0x0466; GFX11-NEXT: buffer_gl1_inv467; GFX11-NEXT: buffer_gl0_inv468; GFX11-NEXT: s_endpgm469;470; GFX12-LABEL: global_xchg_saddr_uniform_ptr_in_vgprs_nortn_immoffset:471; GFX12: ; %bb.0:472; GFX12-NEXT: v_mov_b32_e32 v2, 0473; GFX12-NEXT: ds_load_b64 v[2:3], v2474; GFX12-NEXT: s_wait_dscnt 0x0475; GFX12-NEXT: v_readfirstlane_b32 s0, v2476; GFX12-NEXT: v_readfirstlane_b32 s1, v3477; GFX12-NEXT: global_atomic_swap_b32 v0, v1, s[0:1] offset:42 scope:SCOPE_DEV478; GFX12-NEXT: s_wait_storecnt 0x0479; GFX12-NEXT: global_inv scope:SCOPE_DEV480; GFX12-NEXT: s_endpgm481 %sbase = load ptr addrspace(1), ptr addrspace(3) @ptr.in.lds482 %zext.offset = zext i32 %voffset to i64483 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset484 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 42485 %unused = atomicrmw xchg ptr addrspace(1) %gep1, i32 %data syncscope("agent") seq_cst486 ret void487}488 489; --------------------------------------------------------------------------------490; All atomicrmw ops491; --------------------------------------------------------------------------------492 493; --------------------------------------------------------------------------------494; atomicrmw xchg495; --------------------------------------------------------------------------------496 497define amdgpu_ps <2 x float> @global_xchg_saddr_i64_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {498; GFX9-LABEL: global_xchg_saddr_i64_rtn:499; GFX9: ; %bb.0:500; GFX9-NEXT: global_atomic_swap_x2 v[0:1], v0, v[1:2], s[2:3] glc501; GFX9-NEXT: s_waitcnt vmcnt(0)502; GFX9-NEXT: buffer_wbinvl1503; GFX9-NEXT: ; return to shader part epilog504;505; GFX10-LABEL: global_xchg_saddr_i64_rtn:506; GFX10: ; %bb.0:507; GFX10-NEXT: global_atomic_swap_x2 v[0:1], v0, v[1:2], s[2:3] glc508; GFX10-NEXT: s_waitcnt vmcnt(0)509; GFX10-NEXT: buffer_gl1_inv510; GFX10-NEXT: buffer_gl0_inv511; GFX10-NEXT: ; return to shader part epilog512;513; GFX11-LABEL: global_xchg_saddr_i64_rtn:514; GFX11: ; %bb.0:515; GFX11-NEXT: global_atomic_swap_b64 v[0:1], v0, v[1:2], s[2:3] glc516; GFX11-NEXT: s_waitcnt vmcnt(0)517; GFX11-NEXT: buffer_gl1_inv518; GFX11-NEXT: buffer_gl0_inv519; GFX11-NEXT: ; return to shader part epilog520;521; GFX12-LABEL: global_xchg_saddr_i64_rtn:522; GFX12: ; %bb.0:523; GFX12-NEXT: global_atomic_swap_b64 v[0:1], v0, v[1:2], s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_DEV524; GFX12-NEXT: s_wait_loadcnt 0x0525; GFX12-NEXT: global_inv scope:SCOPE_DEV526; GFX12-NEXT: s_wait_loadcnt 0x0527; GFX12-NEXT: ; return to shader part epilog528 %zext.offset = zext i32 %voffset to i64529 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset530 %rtn = atomicrmw xchg ptr addrspace(1) %gep0, i64 %data syncscope("agent") seq_cst531 %cast.rtn = bitcast i64 %rtn to <2 x float>532 ret <2 x float> %cast.rtn533}534 535define amdgpu_ps <2 x float> @global_xchg_saddr_i64_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {536; GFX9-LABEL: global_xchg_saddr_i64_rtn_neg128:537; GFX9: ; %bb.0:538; GFX9-NEXT: global_atomic_swap_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc539; GFX9-NEXT: s_waitcnt vmcnt(0)540; GFX9-NEXT: buffer_wbinvl1541; GFX9-NEXT: ; return to shader part epilog542;543; GFX10-LABEL: global_xchg_saddr_i64_rtn_neg128:544; GFX10: ; %bb.0:545; GFX10-NEXT: global_atomic_swap_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc546; GFX10-NEXT: s_waitcnt vmcnt(0)547; GFX10-NEXT: buffer_gl1_inv548; GFX10-NEXT: buffer_gl0_inv549; GFX10-NEXT: ; return to shader part epilog550;551; GFX11-LABEL: global_xchg_saddr_i64_rtn_neg128:552; GFX11: ; %bb.0:553; GFX11-NEXT: global_atomic_swap_b64 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc554; GFX11-NEXT: s_waitcnt vmcnt(0)555; GFX11-NEXT: buffer_gl1_inv556; GFX11-NEXT: buffer_gl0_inv557; GFX11-NEXT: ; return to shader part epilog558;559; GFX12-LABEL: global_xchg_saddr_i64_rtn_neg128:560; GFX12: ; %bb.0:561; GFX12-NEXT: global_atomic_swap_b64 v[0:1], v0, v[1:2], s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_DEV562; GFX12-NEXT: s_wait_loadcnt 0x0563; GFX12-NEXT: global_inv scope:SCOPE_DEV564; GFX12-NEXT: s_wait_loadcnt 0x0565; GFX12-NEXT: ; return to shader part epilog566 %zext.offset = zext i32 %voffset to i64567 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset568 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128569 %rtn = atomicrmw xchg ptr addrspace(1) %gep1, i64 %data syncscope("agent") seq_cst570 %cast.rtn = bitcast i64 %rtn to <2 x float>571 ret <2 x float> %cast.rtn572}573 574define amdgpu_ps void @global_xchg_saddr_i64_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {575; GFX9-LABEL: global_xchg_saddr_i64_nortn:576; GFX9: ; %bb.0:577; GFX9-NEXT: global_atomic_swap_x2 v0, v[1:2], s[2:3]578; GFX9-NEXT: s_waitcnt vmcnt(0)579; GFX9-NEXT: buffer_wbinvl1580; GFX9-NEXT: s_endpgm581;582; GFX10-LABEL: global_xchg_saddr_i64_nortn:583; GFX10: ; %bb.0:584; GFX10-NEXT: global_atomic_swap_x2 v0, v[1:2], s[2:3]585; GFX10-NEXT: s_waitcnt_vscnt null, 0x0586; GFX10-NEXT: buffer_gl1_inv587; GFX10-NEXT: buffer_gl0_inv588; GFX10-NEXT: s_endpgm589;590; GFX11-LABEL: global_xchg_saddr_i64_nortn:591; GFX11: ; %bb.0:592; GFX11-NEXT: global_atomic_swap_b64 v0, v[1:2], s[2:3]593; GFX11-NEXT: s_waitcnt_vscnt null, 0x0594; GFX11-NEXT: buffer_gl1_inv595; GFX11-NEXT: buffer_gl0_inv596; GFX11-NEXT: s_endpgm597;598; GFX12-LABEL: global_xchg_saddr_i64_nortn:599; GFX12: ; %bb.0:600; GFX12-NEXT: global_atomic_swap_b64 v0, v[1:2], s[2:3] scope:SCOPE_DEV601; GFX12-NEXT: s_wait_storecnt 0x0602; GFX12-NEXT: global_inv scope:SCOPE_DEV603; GFX12-NEXT: s_endpgm604 %zext.offset = zext i32 %voffset to i64605 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset606 %unused = atomicrmw xchg ptr addrspace(1) %gep0, i64 %data syncscope("agent") seq_cst607 ret void608}609 610define amdgpu_ps void @global_xchg_saddr_i64_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {611; GFX9-LABEL: global_xchg_saddr_i64_nortn_neg128:612; GFX9: ; %bb.0:613; GFX9-NEXT: global_atomic_swap_x2 v0, v[1:2], s[2:3] offset:-128614; GFX9-NEXT: s_waitcnt vmcnt(0)615; GFX9-NEXT: buffer_wbinvl1616; GFX9-NEXT: s_endpgm617;618; GFX10-LABEL: global_xchg_saddr_i64_nortn_neg128:619; GFX10: ; %bb.0:620; GFX10-NEXT: global_atomic_swap_x2 v0, v[1:2], s[2:3] offset:-128621; GFX10-NEXT: s_waitcnt_vscnt null, 0x0622; GFX10-NEXT: buffer_gl1_inv623; GFX10-NEXT: buffer_gl0_inv624; GFX10-NEXT: s_endpgm625;626; GFX11-LABEL: global_xchg_saddr_i64_nortn_neg128:627; GFX11: ; %bb.0:628; GFX11-NEXT: global_atomic_swap_b64 v0, v[1:2], s[2:3] offset:-128629; GFX11-NEXT: s_waitcnt_vscnt null, 0x0630; GFX11-NEXT: buffer_gl1_inv631; GFX11-NEXT: buffer_gl0_inv632; GFX11-NEXT: s_endpgm633;634; GFX12-LABEL: global_xchg_saddr_i64_nortn_neg128:635; GFX12: ; %bb.0:636; GFX12-NEXT: global_atomic_swap_b64 v0, v[1:2], s[2:3] offset:-128 scope:SCOPE_DEV637; GFX12-NEXT: s_wait_storecnt 0x0638; GFX12-NEXT: global_inv scope:SCOPE_DEV639; GFX12-NEXT: s_endpgm640 %zext.offset = zext i32 %voffset to i64641 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset642 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128643 %unused = atomicrmw xchg ptr addrspace(1) %gep1, i64 %data syncscope("agent") seq_cst644 ret void645}646 647; --------------------------------------------------------------------------------648; atomicrmw add649; --------------------------------------------------------------------------------650 651define amdgpu_ps float @global_add_saddr_i32_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {652; GFX9-LABEL: global_add_saddr_i32_rtn:653; GFX9: ; %bb.0:654; GFX9-NEXT: global_atomic_add v0, v0, v1, s[2:3] glc655; GFX9-NEXT: s_waitcnt vmcnt(0)656; GFX9-NEXT: buffer_wbinvl1657; GFX9-NEXT: ; return to shader part epilog658;659; GFX10-LABEL: global_add_saddr_i32_rtn:660; GFX10: ; %bb.0:661; GFX10-NEXT: global_atomic_add v0, v0, v1, s[2:3] glc662; GFX10-NEXT: s_waitcnt vmcnt(0)663; GFX10-NEXT: buffer_gl1_inv664; GFX10-NEXT: buffer_gl0_inv665; GFX10-NEXT: ; return to shader part epilog666;667; GFX11-LABEL: global_add_saddr_i32_rtn:668; GFX11: ; %bb.0:669; GFX11-NEXT: global_atomic_add_u32 v0, v0, v1, s[2:3] glc670; GFX11-NEXT: s_waitcnt vmcnt(0)671; GFX11-NEXT: buffer_gl1_inv672; GFX11-NEXT: buffer_gl0_inv673; GFX11-NEXT: ; return to shader part epilog674;675; GFX12-LABEL: global_add_saddr_i32_rtn:676; GFX12: ; %bb.0:677; GFX12-NEXT: global_atomic_add_u32 v0, v0, v1, s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_DEV678; GFX12-NEXT: s_wait_loadcnt 0x0679; GFX12-NEXT: global_inv scope:SCOPE_DEV680; GFX12-NEXT: s_wait_loadcnt 0x0681; GFX12-NEXT: ; return to shader part epilog682 %zext.offset = zext i32 %voffset to i64683 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset684 %rtn = atomicrmw add ptr addrspace(1) %gep0, i32 %data syncscope("agent") seq_cst685 %cast.rtn = bitcast i32 %rtn to float686 ret float %cast.rtn687}688 689define amdgpu_ps float @global_add_saddr_i32_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {690; GFX9-LABEL: global_add_saddr_i32_rtn_neg128:691; GFX9: ; %bb.0:692; GFX9-NEXT: global_atomic_add v0, v0, v1, s[2:3] offset:-128 glc693; GFX9-NEXT: s_waitcnt vmcnt(0)694; GFX9-NEXT: buffer_wbinvl1695; GFX9-NEXT: ; return to shader part epilog696;697; GFX10-LABEL: global_add_saddr_i32_rtn_neg128:698; GFX10: ; %bb.0:699; GFX10-NEXT: global_atomic_add v0, v0, v1, s[2:3] offset:-128 glc700; GFX10-NEXT: s_waitcnt vmcnt(0)701; GFX10-NEXT: buffer_gl1_inv702; GFX10-NEXT: buffer_gl0_inv703; GFX10-NEXT: ; return to shader part epilog704;705; GFX11-LABEL: global_add_saddr_i32_rtn_neg128:706; GFX11: ; %bb.0:707; GFX11-NEXT: global_atomic_add_u32 v0, v0, v1, s[2:3] offset:-128 glc708; GFX11-NEXT: s_waitcnt vmcnt(0)709; GFX11-NEXT: buffer_gl1_inv710; GFX11-NEXT: buffer_gl0_inv711; GFX11-NEXT: ; return to shader part epilog712;713; GFX12-LABEL: global_add_saddr_i32_rtn_neg128:714; GFX12: ; %bb.0:715; GFX12-NEXT: global_atomic_add_u32 v0, v0, v1, s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_DEV716; GFX12-NEXT: s_wait_loadcnt 0x0717; GFX12-NEXT: global_inv scope:SCOPE_DEV718; GFX12-NEXT: s_wait_loadcnt 0x0719; GFX12-NEXT: ; return to shader part epilog720 %zext.offset = zext i32 %voffset to i64721 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset722 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128723 %rtn = atomicrmw add ptr addrspace(1) %gep1, i32 %data syncscope("agent") seq_cst724 %cast.rtn = bitcast i32 %rtn to float725 ret float %cast.rtn726}727 728define amdgpu_ps void @global_add_saddr_i32_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {729; GFX9-LABEL: global_add_saddr_i32_nortn:730; GFX9: ; %bb.0:731; GFX9-NEXT: global_atomic_add v0, v1, s[2:3]732; GFX9-NEXT: s_waitcnt vmcnt(0)733; GFX9-NEXT: buffer_wbinvl1734; GFX9-NEXT: s_endpgm735;736; GFX10-LABEL: global_add_saddr_i32_nortn:737; GFX10: ; %bb.0:738; GFX10-NEXT: global_atomic_add v0, v1, s[2:3]739; GFX10-NEXT: s_waitcnt_vscnt null, 0x0740; GFX10-NEXT: buffer_gl1_inv741; GFX10-NEXT: buffer_gl0_inv742; GFX10-NEXT: s_endpgm743;744; GFX11-LABEL: global_add_saddr_i32_nortn:745; GFX11: ; %bb.0:746; GFX11-NEXT: global_atomic_add_u32 v0, v1, s[2:3]747; GFX11-NEXT: s_waitcnt_vscnt null, 0x0748; GFX11-NEXT: buffer_gl1_inv749; GFX11-NEXT: buffer_gl0_inv750; GFX11-NEXT: s_endpgm751;752; GFX12-LABEL: global_add_saddr_i32_nortn:753; GFX12: ; %bb.0:754; GFX12-NEXT: global_atomic_add_u32 v0, v1, s[2:3] scope:SCOPE_DEV755; GFX12-NEXT: s_wait_storecnt 0x0756; GFX12-NEXT: global_inv scope:SCOPE_DEV757; GFX12-NEXT: s_endpgm758 %zext.offset = zext i32 %voffset to i64759 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset760 %unused = atomicrmw add ptr addrspace(1) %gep0, i32 %data syncscope("agent") seq_cst761 ret void762}763 764define amdgpu_ps void @global_add_saddr_i32_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {765; GFX9-LABEL: global_add_saddr_i32_nortn_neg128:766; GFX9: ; %bb.0:767; GFX9-NEXT: global_atomic_add v0, v1, s[2:3] offset:-128768; GFX9-NEXT: s_waitcnt vmcnt(0)769; GFX9-NEXT: buffer_wbinvl1770; GFX9-NEXT: s_endpgm771;772; GFX10-LABEL: global_add_saddr_i32_nortn_neg128:773; GFX10: ; %bb.0:774; GFX10-NEXT: global_atomic_add v0, v1, s[2:3] offset:-128775; GFX10-NEXT: s_waitcnt_vscnt null, 0x0776; GFX10-NEXT: buffer_gl1_inv777; GFX10-NEXT: buffer_gl0_inv778; GFX10-NEXT: s_endpgm779;780; GFX11-LABEL: global_add_saddr_i32_nortn_neg128:781; GFX11: ; %bb.0:782; GFX11-NEXT: global_atomic_add_u32 v0, v1, s[2:3] offset:-128783; GFX11-NEXT: s_waitcnt_vscnt null, 0x0784; GFX11-NEXT: buffer_gl1_inv785; GFX11-NEXT: buffer_gl0_inv786; GFX11-NEXT: s_endpgm787;788; GFX12-LABEL: global_add_saddr_i32_nortn_neg128:789; GFX12: ; %bb.0:790; GFX12-NEXT: global_atomic_add_u32 v0, v1, s[2:3] offset:-128 scope:SCOPE_DEV791; GFX12-NEXT: s_wait_storecnt 0x0792; GFX12-NEXT: global_inv scope:SCOPE_DEV793; GFX12-NEXT: s_endpgm794 %zext.offset = zext i32 %voffset to i64795 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset796 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128797 %unused = atomicrmw add ptr addrspace(1) %gep1, i32 %data syncscope("agent") seq_cst798 ret void799}800 801define amdgpu_ps <2 x float> @global_add_saddr_i64_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {802; GFX9-LABEL: global_add_saddr_i64_rtn:803; GFX9: ; %bb.0:804; GFX9-NEXT: global_atomic_add_x2 v[0:1], v0, v[1:2], s[2:3] glc805; GFX9-NEXT: s_waitcnt vmcnt(0)806; GFX9-NEXT: buffer_wbinvl1807; GFX9-NEXT: ; return to shader part epilog808;809; GFX10-LABEL: global_add_saddr_i64_rtn:810; GFX10: ; %bb.0:811; GFX10-NEXT: global_atomic_add_x2 v[0:1], v0, v[1:2], s[2:3] glc812; GFX10-NEXT: s_waitcnt vmcnt(0)813; GFX10-NEXT: buffer_gl1_inv814; GFX10-NEXT: buffer_gl0_inv815; GFX10-NEXT: ; return to shader part epilog816;817; GFX11-LABEL: global_add_saddr_i64_rtn:818; GFX11: ; %bb.0:819; GFX11-NEXT: global_atomic_add_u64 v[0:1], v0, v[1:2], s[2:3] glc820; GFX11-NEXT: s_waitcnt vmcnt(0)821; GFX11-NEXT: buffer_gl1_inv822; GFX11-NEXT: buffer_gl0_inv823; GFX11-NEXT: ; return to shader part epilog824;825; GFX12-LABEL: global_add_saddr_i64_rtn:826; GFX12: ; %bb.0:827; GFX12-NEXT: global_atomic_add_u64 v[0:1], v0, v[1:2], s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_DEV828; GFX12-NEXT: s_wait_loadcnt 0x0829; GFX12-NEXT: global_inv scope:SCOPE_DEV830; GFX12-NEXT: s_wait_loadcnt 0x0831; GFX12-NEXT: ; return to shader part epilog832 %zext.offset = zext i32 %voffset to i64833 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset834 %rtn = atomicrmw add ptr addrspace(1) %gep0, i64 %data syncscope("agent") seq_cst835 %cast.rtn = bitcast i64 %rtn to <2 x float>836 ret <2 x float> %cast.rtn837}838 839define amdgpu_ps <2 x float> @global_add_saddr_i64_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {840; GFX9-LABEL: global_add_saddr_i64_rtn_neg128:841; GFX9: ; %bb.0:842; GFX9-NEXT: global_atomic_add_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc843; GFX9-NEXT: s_waitcnt vmcnt(0)844; GFX9-NEXT: buffer_wbinvl1845; GFX9-NEXT: ; return to shader part epilog846;847; GFX10-LABEL: global_add_saddr_i64_rtn_neg128:848; GFX10: ; %bb.0:849; GFX10-NEXT: global_atomic_add_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc850; GFX10-NEXT: s_waitcnt vmcnt(0)851; GFX10-NEXT: buffer_gl1_inv852; GFX10-NEXT: buffer_gl0_inv853; GFX10-NEXT: ; return to shader part epilog854;855; GFX11-LABEL: global_add_saddr_i64_rtn_neg128:856; GFX11: ; %bb.0:857; GFX11-NEXT: global_atomic_add_u64 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc858; GFX11-NEXT: s_waitcnt vmcnt(0)859; GFX11-NEXT: buffer_gl1_inv860; GFX11-NEXT: buffer_gl0_inv861; GFX11-NEXT: ; return to shader part epilog862;863; GFX12-LABEL: global_add_saddr_i64_rtn_neg128:864; GFX12: ; %bb.0:865; GFX12-NEXT: global_atomic_add_u64 v[0:1], v0, v[1:2], s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_DEV866; GFX12-NEXT: s_wait_loadcnt 0x0867; GFX12-NEXT: global_inv scope:SCOPE_DEV868; GFX12-NEXT: s_wait_loadcnt 0x0869; GFX12-NEXT: ; return to shader part epilog870 %zext.offset = zext i32 %voffset to i64871 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset872 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128873 %rtn = atomicrmw add ptr addrspace(1) %gep1, i64 %data syncscope("agent") seq_cst874 %cast.rtn = bitcast i64 %rtn to <2 x float>875 ret <2 x float> %cast.rtn876}877 878define amdgpu_ps void @global_add_saddr_i64_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {879; GFX9-LABEL: global_add_saddr_i64_nortn:880; GFX9: ; %bb.0:881; GFX9-NEXT: global_atomic_add_x2 v0, v[1:2], s[2:3]882; GFX9-NEXT: s_waitcnt vmcnt(0)883; GFX9-NEXT: buffer_wbinvl1884; GFX9-NEXT: s_endpgm885;886; GFX10-LABEL: global_add_saddr_i64_nortn:887; GFX10: ; %bb.0:888; GFX10-NEXT: global_atomic_add_x2 v0, v[1:2], s[2:3]889; GFX10-NEXT: s_waitcnt_vscnt null, 0x0890; GFX10-NEXT: buffer_gl1_inv891; GFX10-NEXT: buffer_gl0_inv892; GFX10-NEXT: s_endpgm893;894; GFX11-LABEL: global_add_saddr_i64_nortn:895; GFX11: ; %bb.0:896; GFX11-NEXT: global_atomic_add_u64 v0, v[1:2], s[2:3]897; GFX11-NEXT: s_waitcnt_vscnt null, 0x0898; GFX11-NEXT: buffer_gl1_inv899; GFX11-NEXT: buffer_gl0_inv900; GFX11-NEXT: s_endpgm901;902; GFX12-LABEL: global_add_saddr_i64_nortn:903; GFX12: ; %bb.0:904; GFX12-NEXT: global_atomic_add_u64 v0, v[1:2], s[2:3] scope:SCOPE_DEV905; GFX12-NEXT: s_wait_storecnt 0x0906; GFX12-NEXT: global_inv scope:SCOPE_DEV907; GFX12-NEXT: s_endpgm908 %zext.offset = zext i32 %voffset to i64909 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset910 %unused = atomicrmw add ptr addrspace(1) %gep0, i64 %data syncscope("agent") seq_cst911 ret void912}913 914define amdgpu_ps void @global_add_saddr_i64_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {915; GFX9-LABEL: global_add_saddr_i64_nortn_neg128:916; GFX9: ; %bb.0:917; GFX9-NEXT: global_atomic_add_x2 v0, v[1:2], s[2:3] offset:-128918; GFX9-NEXT: s_waitcnt vmcnt(0)919; GFX9-NEXT: buffer_wbinvl1920; GFX9-NEXT: s_endpgm921;922; GFX10-LABEL: global_add_saddr_i64_nortn_neg128:923; GFX10: ; %bb.0:924; GFX10-NEXT: global_atomic_add_x2 v0, v[1:2], s[2:3] offset:-128925; GFX10-NEXT: s_waitcnt_vscnt null, 0x0926; GFX10-NEXT: buffer_gl1_inv927; GFX10-NEXT: buffer_gl0_inv928; GFX10-NEXT: s_endpgm929;930; GFX11-LABEL: global_add_saddr_i64_nortn_neg128:931; GFX11: ; %bb.0:932; GFX11-NEXT: global_atomic_add_u64 v0, v[1:2], s[2:3] offset:-128933; GFX11-NEXT: s_waitcnt_vscnt null, 0x0934; GFX11-NEXT: buffer_gl1_inv935; GFX11-NEXT: buffer_gl0_inv936; GFX11-NEXT: s_endpgm937;938; GFX12-LABEL: global_add_saddr_i64_nortn_neg128:939; GFX12: ; %bb.0:940; GFX12-NEXT: global_atomic_add_u64 v0, v[1:2], s[2:3] offset:-128 scope:SCOPE_DEV941; GFX12-NEXT: s_wait_storecnt 0x0942; GFX12-NEXT: global_inv scope:SCOPE_DEV943; GFX12-NEXT: s_endpgm944 %zext.offset = zext i32 %voffset to i64945 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset946 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128947 %unused = atomicrmw add ptr addrspace(1) %gep1, i64 %data syncscope("agent") seq_cst948 ret void949}950 951; --------------------------------------------------------------------------------952; atomicrmw sub953; --------------------------------------------------------------------------------954 955define amdgpu_ps float @global_sub_saddr_i32_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {956; GFX9-LABEL: global_sub_saddr_i32_rtn:957; GFX9: ; %bb.0:958; GFX9-NEXT: global_atomic_sub v0, v0, v1, s[2:3] glc959; GFX9-NEXT: s_waitcnt vmcnt(0)960; GFX9-NEXT: buffer_wbinvl1961; GFX9-NEXT: ; return to shader part epilog962;963; GFX10-LABEL: global_sub_saddr_i32_rtn:964; GFX10: ; %bb.0:965; GFX10-NEXT: global_atomic_sub v0, v0, v1, s[2:3] glc966; GFX10-NEXT: s_waitcnt vmcnt(0)967; GFX10-NEXT: buffer_gl1_inv968; GFX10-NEXT: buffer_gl0_inv969; GFX10-NEXT: ; return to shader part epilog970;971; GFX11-LABEL: global_sub_saddr_i32_rtn:972; GFX11: ; %bb.0:973; GFX11-NEXT: global_atomic_sub_u32 v0, v0, v1, s[2:3] glc974; GFX11-NEXT: s_waitcnt vmcnt(0)975; GFX11-NEXT: buffer_gl1_inv976; GFX11-NEXT: buffer_gl0_inv977; GFX11-NEXT: ; return to shader part epilog978;979; GFX12-LABEL: global_sub_saddr_i32_rtn:980; GFX12: ; %bb.0:981; GFX12-NEXT: global_atomic_sub_u32 v0, v0, v1, s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_DEV982; GFX12-NEXT: s_wait_loadcnt 0x0983; GFX12-NEXT: global_inv scope:SCOPE_DEV984; GFX12-NEXT: s_wait_loadcnt 0x0985; GFX12-NEXT: ; return to shader part epilog986 %zext.offset = zext i32 %voffset to i64987 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset988 %rtn = atomicrmw sub ptr addrspace(1) %gep0, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0989 %cast.rtn = bitcast i32 %rtn to float990 ret float %cast.rtn991}992 993define amdgpu_ps float @global_sub_saddr_i32_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {994; GFX9-LABEL: global_sub_saddr_i32_rtn_neg128:995; GFX9: ; %bb.0:996; GFX9-NEXT: global_atomic_sub v0, v0, v1, s[2:3] offset:-128 glc997; GFX9-NEXT: s_waitcnt vmcnt(0)998; GFX9-NEXT: buffer_wbinvl1999; GFX9-NEXT: ; return to shader part epilog1000;1001; GFX10-LABEL: global_sub_saddr_i32_rtn_neg128:1002; GFX10: ; %bb.0:1003; GFX10-NEXT: global_atomic_sub v0, v0, v1, s[2:3] offset:-128 glc1004; GFX10-NEXT: s_waitcnt vmcnt(0)1005; GFX10-NEXT: buffer_gl1_inv1006; GFX10-NEXT: buffer_gl0_inv1007; GFX10-NEXT: ; return to shader part epilog1008;1009; GFX11-LABEL: global_sub_saddr_i32_rtn_neg128:1010; GFX11: ; %bb.0:1011; GFX11-NEXT: global_atomic_sub_u32 v0, v0, v1, s[2:3] offset:-128 glc1012; GFX11-NEXT: s_waitcnt vmcnt(0)1013; GFX11-NEXT: buffer_gl1_inv1014; GFX11-NEXT: buffer_gl0_inv1015; GFX11-NEXT: ; return to shader part epilog1016;1017; GFX12-LABEL: global_sub_saddr_i32_rtn_neg128:1018; GFX12: ; %bb.0:1019; GFX12-NEXT: global_atomic_sub_u32 v0, v0, v1, s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_DEV1020; GFX12-NEXT: s_wait_loadcnt 0x01021; GFX12-NEXT: global_inv scope:SCOPE_DEV1022; GFX12-NEXT: s_wait_loadcnt 0x01023; GFX12-NEXT: ; return to shader part epilog1024 %zext.offset = zext i32 %voffset to i641025 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1026 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1281027 %rtn = atomicrmw sub ptr addrspace(1) %gep1, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01028 %cast.rtn = bitcast i32 %rtn to float1029 ret float %cast.rtn1030}1031 1032define amdgpu_ps void @global_sub_saddr_i32_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {1033; GFX9-LABEL: global_sub_saddr_i32_nortn:1034; GFX9: ; %bb.0:1035; GFX9-NEXT: global_atomic_sub v0, v1, s[2:3]1036; GFX9-NEXT: s_waitcnt vmcnt(0)1037; GFX9-NEXT: buffer_wbinvl11038; GFX9-NEXT: s_endpgm1039;1040; GFX10-LABEL: global_sub_saddr_i32_nortn:1041; GFX10: ; %bb.0:1042; GFX10-NEXT: global_atomic_sub v0, v1, s[2:3]1043; GFX10-NEXT: s_waitcnt_vscnt null, 0x01044; GFX10-NEXT: buffer_gl1_inv1045; GFX10-NEXT: buffer_gl0_inv1046; GFX10-NEXT: s_endpgm1047;1048; GFX11-LABEL: global_sub_saddr_i32_nortn:1049; GFX11: ; %bb.0:1050; GFX11-NEXT: global_atomic_sub_u32 v0, v1, s[2:3]1051; GFX11-NEXT: s_waitcnt_vscnt null, 0x01052; GFX11-NEXT: buffer_gl1_inv1053; GFX11-NEXT: buffer_gl0_inv1054; GFX11-NEXT: s_endpgm1055;1056; GFX12-LABEL: global_sub_saddr_i32_nortn:1057; GFX12: ; %bb.0:1058; GFX12-NEXT: global_atomic_sub_u32 v0, v1, s[2:3] scope:SCOPE_DEV1059; GFX12-NEXT: s_wait_storecnt 0x01060; GFX12-NEXT: global_inv scope:SCOPE_DEV1061; GFX12-NEXT: s_endpgm1062 %zext.offset = zext i32 %voffset to i641063 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1064 %unused = atomicrmw sub ptr addrspace(1) %gep0, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01065 ret void1066}1067 1068define amdgpu_ps void @global_sub_saddr_i32_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {1069; GFX9-LABEL: global_sub_saddr_i32_nortn_neg128:1070; GFX9: ; %bb.0:1071; GFX9-NEXT: global_atomic_sub v0, v1, s[2:3] offset:-1281072; GFX9-NEXT: s_waitcnt vmcnt(0)1073; GFX9-NEXT: buffer_wbinvl11074; GFX9-NEXT: s_endpgm1075;1076; GFX10-LABEL: global_sub_saddr_i32_nortn_neg128:1077; GFX10: ; %bb.0:1078; GFX10-NEXT: global_atomic_sub v0, v1, s[2:3] offset:-1281079; GFX10-NEXT: s_waitcnt_vscnt null, 0x01080; GFX10-NEXT: buffer_gl1_inv1081; GFX10-NEXT: buffer_gl0_inv1082; GFX10-NEXT: s_endpgm1083;1084; GFX11-LABEL: global_sub_saddr_i32_nortn_neg128:1085; GFX11: ; %bb.0:1086; GFX11-NEXT: global_atomic_sub_u32 v0, v1, s[2:3] offset:-1281087; GFX11-NEXT: s_waitcnt_vscnt null, 0x01088; GFX11-NEXT: buffer_gl1_inv1089; GFX11-NEXT: buffer_gl0_inv1090; GFX11-NEXT: s_endpgm1091;1092; GFX12-LABEL: global_sub_saddr_i32_nortn_neg128:1093; GFX12: ; %bb.0:1094; GFX12-NEXT: global_atomic_sub_u32 v0, v1, s[2:3] offset:-128 scope:SCOPE_DEV1095; GFX12-NEXT: s_wait_storecnt 0x01096; GFX12-NEXT: global_inv scope:SCOPE_DEV1097; GFX12-NEXT: s_endpgm1098 %zext.offset = zext i32 %voffset to i641099 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1100 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1281101 %unused = atomicrmw sub ptr addrspace(1) %gep1, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01102 ret void1103}1104 1105define amdgpu_ps <2 x float> @global_sub_saddr_i64_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {1106; GFX9-LABEL: global_sub_saddr_i64_rtn:1107; GFX9: ; %bb.0:1108; GFX9-NEXT: global_atomic_sub_x2 v[0:1], v0, v[1:2], s[2:3] glc1109; GFX9-NEXT: s_waitcnt vmcnt(0)1110; GFX9-NEXT: buffer_wbinvl11111; GFX9-NEXT: ; return to shader part epilog1112;1113; GFX10-LABEL: global_sub_saddr_i64_rtn:1114; GFX10: ; %bb.0:1115; GFX10-NEXT: global_atomic_sub_x2 v[0:1], v0, v[1:2], s[2:3] glc1116; GFX10-NEXT: s_waitcnt vmcnt(0)1117; GFX10-NEXT: buffer_gl1_inv1118; GFX10-NEXT: buffer_gl0_inv1119; GFX10-NEXT: ; return to shader part epilog1120;1121; GFX11-LABEL: global_sub_saddr_i64_rtn:1122; GFX11: ; %bb.0:1123; GFX11-NEXT: global_atomic_sub_u64 v[0:1], v0, v[1:2], s[2:3] glc1124; GFX11-NEXT: s_waitcnt vmcnt(0)1125; GFX11-NEXT: buffer_gl1_inv1126; GFX11-NEXT: buffer_gl0_inv1127; GFX11-NEXT: ; return to shader part epilog1128;1129; GFX12-LABEL: global_sub_saddr_i64_rtn:1130; GFX12: ; %bb.0:1131; GFX12-NEXT: global_atomic_sub_u64 v[0:1], v0, v[1:2], s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_DEV1132; GFX12-NEXT: s_wait_loadcnt 0x01133; GFX12-NEXT: global_inv scope:SCOPE_DEV1134; GFX12-NEXT: s_wait_loadcnt 0x01135; GFX12-NEXT: ; return to shader part epilog1136 %zext.offset = zext i32 %voffset to i641137 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1138 %rtn = atomicrmw sub ptr addrspace(1) %gep0, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01139 %cast.rtn = bitcast i64 %rtn to <2 x float>1140 ret <2 x float> %cast.rtn1141}1142 1143define amdgpu_ps <2 x float> @global_sub_saddr_i64_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {1144; GFX9-LABEL: global_sub_saddr_i64_rtn_neg128:1145; GFX9: ; %bb.0:1146; GFX9-NEXT: global_atomic_sub_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc1147; GFX9-NEXT: s_waitcnt vmcnt(0)1148; GFX9-NEXT: buffer_wbinvl11149; GFX9-NEXT: ; return to shader part epilog1150;1151; GFX10-LABEL: global_sub_saddr_i64_rtn_neg128:1152; GFX10: ; %bb.0:1153; GFX10-NEXT: global_atomic_sub_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc1154; GFX10-NEXT: s_waitcnt vmcnt(0)1155; GFX10-NEXT: buffer_gl1_inv1156; GFX10-NEXT: buffer_gl0_inv1157; GFX10-NEXT: ; return to shader part epilog1158;1159; GFX11-LABEL: global_sub_saddr_i64_rtn_neg128:1160; GFX11: ; %bb.0:1161; GFX11-NEXT: global_atomic_sub_u64 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc1162; GFX11-NEXT: s_waitcnt vmcnt(0)1163; GFX11-NEXT: buffer_gl1_inv1164; GFX11-NEXT: buffer_gl0_inv1165; GFX11-NEXT: ; return to shader part epilog1166;1167; GFX12-LABEL: global_sub_saddr_i64_rtn_neg128:1168; GFX12: ; %bb.0:1169; GFX12-NEXT: global_atomic_sub_u64 v[0:1], v0, v[1:2], s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_DEV1170; GFX12-NEXT: s_wait_loadcnt 0x01171; GFX12-NEXT: global_inv scope:SCOPE_DEV1172; GFX12-NEXT: s_wait_loadcnt 0x01173; GFX12-NEXT: ; return to shader part epilog1174 %zext.offset = zext i32 %voffset to i641175 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1176 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1281177 %rtn = atomicrmw sub ptr addrspace(1) %gep1, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01178 %cast.rtn = bitcast i64 %rtn to <2 x float>1179 ret <2 x float> %cast.rtn1180}1181 1182define amdgpu_ps void @global_sub_saddr_i64_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {1183; GFX9-LABEL: global_sub_saddr_i64_nortn:1184; GFX9: ; %bb.0:1185; GFX9-NEXT: global_atomic_sub_x2 v0, v[1:2], s[2:3]1186; GFX9-NEXT: s_waitcnt vmcnt(0)1187; GFX9-NEXT: buffer_wbinvl11188; GFX9-NEXT: s_endpgm1189;1190; GFX10-LABEL: global_sub_saddr_i64_nortn:1191; GFX10: ; %bb.0:1192; GFX10-NEXT: global_atomic_sub_x2 v0, v[1:2], s[2:3]1193; GFX10-NEXT: s_waitcnt_vscnt null, 0x01194; GFX10-NEXT: buffer_gl1_inv1195; GFX10-NEXT: buffer_gl0_inv1196; GFX10-NEXT: s_endpgm1197;1198; GFX11-LABEL: global_sub_saddr_i64_nortn:1199; GFX11: ; %bb.0:1200; GFX11-NEXT: global_atomic_sub_u64 v0, v[1:2], s[2:3]1201; GFX11-NEXT: s_waitcnt_vscnt null, 0x01202; GFX11-NEXT: buffer_gl1_inv1203; GFX11-NEXT: buffer_gl0_inv1204; GFX11-NEXT: s_endpgm1205;1206; GFX12-LABEL: global_sub_saddr_i64_nortn:1207; GFX12: ; %bb.0:1208; GFX12-NEXT: global_atomic_sub_u64 v0, v[1:2], s[2:3] scope:SCOPE_DEV1209; GFX12-NEXT: s_wait_storecnt 0x01210; GFX12-NEXT: global_inv scope:SCOPE_DEV1211; GFX12-NEXT: s_endpgm1212 %zext.offset = zext i32 %voffset to i641213 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1214 %unused = atomicrmw sub ptr addrspace(1) %gep0, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01215 ret void1216}1217 1218define amdgpu_ps void @global_sub_saddr_i64_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {1219; GFX9-LABEL: global_sub_saddr_i64_nortn_neg128:1220; GFX9: ; %bb.0:1221; GFX9-NEXT: global_atomic_sub_x2 v0, v[1:2], s[2:3] offset:-1281222; GFX9-NEXT: s_waitcnt vmcnt(0)1223; GFX9-NEXT: buffer_wbinvl11224; GFX9-NEXT: s_endpgm1225;1226; GFX10-LABEL: global_sub_saddr_i64_nortn_neg128:1227; GFX10: ; %bb.0:1228; GFX10-NEXT: global_atomic_sub_x2 v0, v[1:2], s[2:3] offset:-1281229; GFX10-NEXT: s_waitcnt_vscnt null, 0x01230; GFX10-NEXT: buffer_gl1_inv1231; GFX10-NEXT: buffer_gl0_inv1232; GFX10-NEXT: s_endpgm1233;1234; GFX11-LABEL: global_sub_saddr_i64_nortn_neg128:1235; GFX11: ; %bb.0:1236; GFX11-NEXT: global_atomic_sub_u64 v0, v[1:2], s[2:3] offset:-1281237; GFX11-NEXT: s_waitcnt_vscnt null, 0x01238; GFX11-NEXT: buffer_gl1_inv1239; GFX11-NEXT: buffer_gl0_inv1240; GFX11-NEXT: s_endpgm1241;1242; GFX12-LABEL: global_sub_saddr_i64_nortn_neg128:1243; GFX12: ; %bb.0:1244; GFX12-NEXT: global_atomic_sub_u64 v0, v[1:2], s[2:3] offset:-128 scope:SCOPE_DEV1245; GFX12-NEXT: s_wait_storecnt 0x01246; GFX12-NEXT: global_inv scope:SCOPE_DEV1247; GFX12-NEXT: s_endpgm1248 %zext.offset = zext i32 %voffset to i641249 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1250 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1281251 %unused = atomicrmw sub ptr addrspace(1) %gep1, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01252 ret void1253}1254 1255; --------------------------------------------------------------------------------1256; atomicrmw and1257; --------------------------------------------------------------------------------1258 1259define amdgpu_ps float @global_and_saddr_i32_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {1260; GFX9-LABEL: global_and_saddr_i32_rtn:1261; GFX9: ; %bb.0:1262; GFX9-NEXT: global_atomic_and v0, v0, v1, s[2:3] glc1263; GFX9-NEXT: s_waitcnt vmcnt(0)1264; GFX9-NEXT: buffer_wbinvl11265; GFX9-NEXT: ; return to shader part epilog1266;1267; GFX10-LABEL: global_and_saddr_i32_rtn:1268; GFX10: ; %bb.0:1269; GFX10-NEXT: global_atomic_and v0, v0, v1, s[2:3] glc1270; GFX10-NEXT: s_waitcnt vmcnt(0)1271; GFX10-NEXT: buffer_gl1_inv1272; GFX10-NEXT: buffer_gl0_inv1273; GFX10-NEXT: ; return to shader part epilog1274;1275; GFX11-LABEL: global_and_saddr_i32_rtn:1276; GFX11: ; %bb.0:1277; GFX11-NEXT: global_atomic_and_b32 v0, v0, v1, s[2:3] glc1278; GFX11-NEXT: s_waitcnt vmcnt(0)1279; GFX11-NEXT: buffer_gl1_inv1280; GFX11-NEXT: buffer_gl0_inv1281; GFX11-NEXT: ; return to shader part epilog1282;1283; GFX12-LABEL: global_and_saddr_i32_rtn:1284; GFX12: ; %bb.0:1285; GFX12-NEXT: global_atomic_and_b32 v0, v0, v1, s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_DEV1286; GFX12-NEXT: s_wait_loadcnt 0x01287; GFX12-NEXT: global_inv scope:SCOPE_DEV1288; GFX12-NEXT: s_wait_loadcnt 0x01289; GFX12-NEXT: ; return to shader part epilog1290 %zext.offset = zext i32 %voffset to i641291 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1292 %rtn = atomicrmw and ptr addrspace(1) %gep0, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01293 %cast.rtn = bitcast i32 %rtn to float1294 ret float %cast.rtn1295}1296 1297define amdgpu_ps float @global_and_saddr_i32_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {1298; GFX9-LABEL: global_and_saddr_i32_rtn_neg128:1299; GFX9: ; %bb.0:1300; GFX9-NEXT: global_atomic_and v0, v0, v1, s[2:3] offset:-128 glc1301; GFX9-NEXT: s_waitcnt vmcnt(0)1302; GFX9-NEXT: buffer_wbinvl11303; GFX9-NEXT: ; return to shader part epilog1304;1305; GFX10-LABEL: global_and_saddr_i32_rtn_neg128:1306; GFX10: ; %bb.0:1307; GFX10-NEXT: global_atomic_and v0, v0, v1, s[2:3] offset:-128 glc1308; GFX10-NEXT: s_waitcnt vmcnt(0)1309; GFX10-NEXT: buffer_gl1_inv1310; GFX10-NEXT: buffer_gl0_inv1311; GFX10-NEXT: ; return to shader part epilog1312;1313; GFX11-LABEL: global_and_saddr_i32_rtn_neg128:1314; GFX11: ; %bb.0:1315; GFX11-NEXT: global_atomic_and_b32 v0, v0, v1, s[2:3] offset:-128 glc1316; GFX11-NEXT: s_waitcnt vmcnt(0)1317; GFX11-NEXT: buffer_gl1_inv1318; GFX11-NEXT: buffer_gl0_inv1319; GFX11-NEXT: ; return to shader part epilog1320;1321; GFX12-LABEL: global_and_saddr_i32_rtn_neg128:1322; GFX12: ; %bb.0:1323; GFX12-NEXT: global_atomic_and_b32 v0, v0, v1, s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_DEV1324; GFX12-NEXT: s_wait_loadcnt 0x01325; GFX12-NEXT: global_inv scope:SCOPE_DEV1326; GFX12-NEXT: s_wait_loadcnt 0x01327; GFX12-NEXT: ; return to shader part epilog1328 %zext.offset = zext i32 %voffset to i641329 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1330 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1281331 %rtn = atomicrmw and ptr addrspace(1) %gep1, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01332 %cast.rtn = bitcast i32 %rtn to float1333 ret float %cast.rtn1334}1335 1336define amdgpu_ps void @global_and_saddr_i32_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {1337; GFX9-LABEL: global_and_saddr_i32_nortn:1338; GFX9: ; %bb.0:1339; GFX9-NEXT: global_atomic_and v0, v1, s[2:3]1340; GFX9-NEXT: s_waitcnt vmcnt(0)1341; GFX9-NEXT: buffer_wbinvl11342; GFX9-NEXT: s_endpgm1343;1344; GFX10-LABEL: global_and_saddr_i32_nortn:1345; GFX10: ; %bb.0:1346; GFX10-NEXT: global_atomic_and v0, v1, s[2:3]1347; GFX10-NEXT: s_waitcnt_vscnt null, 0x01348; GFX10-NEXT: buffer_gl1_inv1349; GFX10-NEXT: buffer_gl0_inv1350; GFX10-NEXT: s_endpgm1351;1352; GFX11-LABEL: global_and_saddr_i32_nortn:1353; GFX11: ; %bb.0:1354; GFX11-NEXT: global_atomic_and_b32 v0, v1, s[2:3]1355; GFX11-NEXT: s_waitcnt_vscnt null, 0x01356; GFX11-NEXT: buffer_gl1_inv1357; GFX11-NEXT: buffer_gl0_inv1358; GFX11-NEXT: s_endpgm1359;1360; GFX12-LABEL: global_and_saddr_i32_nortn:1361; GFX12: ; %bb.0:1362; GFX12-NEXT: global_atomic_and_b32 v0, v1, s[2:3] scope:SCOPE_DEV1363; GFX12-NEXT: s_wait_storecnt 0x01364; GFX12-NEXT: global_inv scope:SCOPE_DEV1365; GFX12-NEXT: s_endpgm1366 %zext.offset = zext i32 %voffset to i641367 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1368 %unused = atomicrmw and ptr addrspace(1) %gep0, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01369 ret void1370}1371 1372define amdgpu_ps void @global_and_saddr_i32_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {1373; GFX9-LABEL: global_and_saddr_i32_nortn_neg128:1374; GFX9: ; %bb.0:1375; GFX9-NEXT: global_atomic_and v0, v1, s[2:3] offset:-1281376; GFX9-NEXT: s_waitcnt vmcnt(0)1377; GFX9-NEXT: buffer_wbinvl11378; GFX9-NEXT: s_endpgm1379;1380; GFX10-LABEL: global_and_saddr_i32_nortn_neg128:1381; GFX10: ; %bb.0:1382; GFX10-NEXT: global_atomic_and v0, v1, s[2:3] offset:-1281383; GFX10-NEXT: s_waitcnt_vscnt null, 0x01384; GFX10-NEXT: buffer_gl1_inv1385; GFX10-NEXT: buffer_gl0_inv1386; GFX10-NEXT: s_endpgm1387;1388; GFX11-LABEL: global_and_saddr_i32_nortn_neg128:1389; GFX11: ; %bb.0:1390; GFX11-NEXT: global_atomic_and_b32 v0, v1, s[2:3] offset:-1281391; GFX11-NEXT: s_waitcnt_vscnt null, 0x01392; GFX11-NEXT: buffer_gl1_inv1393; GFX11-NEXT: buffer_gl0_inv1394; GFX11-NEXT: s_endpgm1395;1396; GFX12-LABEL: global_and_saddr_i32_nortn_neg128:1397; GFX12: ; %bb.0:1398; GFX12-NEXT: global_atomic_and_b32 v0, v1, s[2:3] offset:-128 scope:SCOPE_DEV1399; GFX12-NEXT: s_wait_storecnt 0x01400; GFX12-NEXT: global_inv scope:SCOPE_DEV1401; GFX12-NEXT: s_endpgm1402 %zext.offset = zext i32 %voffset to i641403 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1404 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1281405 %unused = atomicrmw and ptr addrspace(1) %gep1, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01406 ret void1407}1408 1409define amdgpu_ps <2 x float> @global_and_saddr_i64_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {1410; GFX9-LABEL: global_and_saddr_i64_rtn:1411; GFX9: ; %bb.0:1412; GFX9-NEXT: global_atomic_and_x2 v[0:1], v0, v[1:2], s[2:3] glc1413; GFX9-NEXT: s_waitcnt vmcnt(0)1414; GFX9-NEXT: buffer_wbinvl11415; GFX9-NEXT: ; return to shader part epilog1416;1417; GFX10-LABEL: global_and_saddr_i64_rtn:1418; GFX10: ; %bb.0:1419; GFX10-NEXT: global_atomic_and_x2 v[0:1], v0, v[1:2], s[2:3] glc1420; GFX10-NEXT: s_waitcnt vmcnt(0)1421; GFX10-NEXT: buffer_gl1_inv1422; GFX10-NEXT: buffer_gl0_inv1423; GFX10-NEXT: ; return to shader part epilog1424;1425; GFX11-LABEL: global_and_saddr_i64_rtn:1426; GFX11: ; %bb.0:1427; GFX11-NEXT: global_atomic_and_b64 v[0:1], v0, v[1:2], s[2:3] glc1428; GFX11-NEXT: s_waitcnt vmcnt(0)1429; GFX11-NEXT: buffer_gl1_inv1430; GFX11-NEXT: buffer_gl0_inv1431; GFX11-NEXT: ; return to shader part epilog1432;1433; GFX12-LABEL: global_and_saddr_i64_rtn:1434; GFX12: ; %bb.0:1435; GFX12-NEXT: global_atomic_and_b64 v[0:1], v0, v[1:2], s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_DEV1436; GFX12-NEXT: s_wait_loadcnt 0x01437; GFX12-NEXT: global_inv scope:SCOPE_DEV1438; GFX12-NEXT: s_wait_loadcnt 0x01439; GFX12-NEXT: ; return to shader part epilog1440 %zext.offset = zext i32 %voffset to i641441 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1442 %rtn = atomicrmw and ptr addrspace(1) %gep0, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01443 %cast.rtn = bitcast i64 %rtn to <2 x float>1444 ret <2 x float> %cast.rtn1445}1446 1447define amdgpu_ps <2 x float> @global_and_saddr_i64_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {1448; GFX9-LABEL: global_and_saddr_i64_rtn_neg128:1449; GFX9: ; %bb.0:1450; GFX9-NEXT: global_atomic_and_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc1451; GFX9-NEXT: s_waitcnt vmcnt(0)1452; GFX9-NEXT: buffer_wbinvl11453; GFX9-NEXT: ; return to shader part epilog1454;1455; GFX10-LABEL: global_and_saddr_i64_rtn_neg128:1456; GFX10: ; %bb.0:1457; GFX10-NEXT: global_atomic_and_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc1458; GFX10-NEXT: s_waitcnt vmcnt(0)1459; GFX10-NEXT: buffer_gl1_inv1460; GFX10-NEXT: buffer_gl0_inv1461; GFX10-NEXT: ; return to shader part epilog1462;1463; GFX11-LABEL: global_and_saddr_i64_rtn_neg128:1464; GFX11: ; %bb.0:1465; GFX11-NEXT: global_atomic_and_b64 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc1466; GFX11-NEXT: s_waitcnt vmcnt(0)1467; GFX11-NEXT: buffer_gl1_inv1468; GFX11-NEXT: buffer_gl0_inv1469; GFX11-NEXT: ; return to shader part epilog1470;1471; GFX12-LABEL: global_and_saddr_i64_rtn_neg128:1472; GFX12: ; %bb.0:1473; GFX12-NEXT: global_atomic_and_b64 v[0:1], v0, v[1:2], s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_DEV1474; GFX12-NEXT: s_wait_loadcnt 0x01475; GFX12-NEXT: global_inv scope:SCOPE_DEV1476; GFX12-NEXT: s_wait_loadcnt 0x01477; GFX12-NEXT: ; return to shader part epilog1478 %zext.offset = zext i32 %voffset to i641479 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1480 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1281481 %rtn = atomicrmw and ptr addrspace(1) %gep1, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01482 %cast.rtn = bitcast i64 %rtn to <2 x float>1483 ret <2 x float> %cast.rtn1484}1485 1486define amdgpu_ps void @global_and_saddr_i64_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {1487; GFX9-LABEL: global_and_saddr_i64_nortn:1488; GFX9: ; %bb.0:1489; GFX9-NEXT: global_atomic_and_x2 v0, v[1:2], s[2:3]1490; GFX9-NEXT: s_waitcnt vmcnt(0)1491; GFX9-NEXT: buffer_wbinvl11492; GFX9-NEXT: s_endpgm1493;1494; GFX10-LABEL: global_and_saddr_i64_nortn:1495; GFX10: ; %bb.0:1496; GFX10-NEXT: global_atomic_and_x2 v0, v[1:2], s[2:3]1497; GFX10-NEXT: s_waitcnt_vscnt null, 0x01498; GFX10-NEXT: buffer_gl1_inv1499; GFX10-NEXT: buffer_gl0_inv1500; GFX10-NEXT: s_endpgm1501;1502; GFX11-LABEL: global_and_saddr_i64_nortn:1503; GFX11: ; %bb.0:1504; GFX11-NEXT: global_atomic_and_b64 v0, v[1:2], s[2:3]1505; GFX11-NEXT: s_waitcnt_vscnt null, 0x01506; GFX11-NEXT: buffer_gl1_inv1507; GFX11-NEXT: buffer_gl0_inv1508; GFX11-NEXT: s_endpgm1509;1510; GFX12-LABEL: global_and_saddr_i64_nortn:1511; GFX12: ; %bb.0:1512; GFX12-NEXT: global_atomic_and_b64 v0, v[1:2], s[2:3] scope:SCOPE_DEV1513; GFX12-NEXT: s_wait_storecnt 0x01514; GFX12-NEXT: global_inv scope:SCOPE_DEV1515; GFX12-NEXT: s_endpgm1516 %zext.offset = zext i32 %voffset to i641517 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1518 %unused = atomicrmw and ptr addrspace(1) %gep0, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01519 ret void1520}1521 1522define amdgpu_ps void @global_and_saddr_i64_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {1523; GFX9-LABEL: global_and_saddr_i64_nortn_neg128:1524; GFX9: ; %bb.0:1525; GFX9-NEXT: global_atomic_and_x2 v0, v[1:2], s[2:3] offset:-1281526; GFX9-NEXT: s_waitcnt vmcnt(0)1527; GFX9-NEXT: buffer_wbinvl11528; GFX9-NEXT: s_endpgm1529;1530; GFX10-LABEL: global_and_saddr_i64_nortn_neg128:1531; GFX10: ; %bb.0:1532; GFX10-NEXT: global_atomic_and_x2 v0, v[1:2], s[2:3] offset:-1281533; GFX10-NEXT: s_waitcnt_vscnt null, 0x01534; GFX10-NEXT: buffer_gl1_inv1535; GFX10-NEXT: buffer_gl0_inv1536; GFX10-NEXT: s_endpgm1537;1538; GFX11-LABEL: global_and_saddr_i64_nortn_neg128:1539; GFX11: ; %bb.0:1540; GFX11-NEXT: global_atomic_and_b64 v0, v[1:2], s[2:3] offset:-1281541; GFX11-NEXT: s_waitcnt_vscnt null, 0x01542; GFX11-NEXT: buffer_gl1_inv1543; GFX11-NEXT: buffer_gl0_inv1544; GFX11-NEXT: s_endpgm1545;1546; GFX12-LABEL: global_and_saddr_i64_nortn_neg128:1547; GFX12: ; %bb.0:1548; GFX12-NEXT: global_atomic_and_b64 v0, v[1:2], s[2:3] offset:-128 scope:SCOPE_DEV1549; GFX12-NEXT: s_wait_storecnt 0x01550; GFX12-NEXT: global_inv scope:SCOPE_DEV1551; GFX12-NEXT: s_endpgm1552 %zext.offset = zext i32 %voffset to i641553 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1554 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1281555 %unused = atomicrmw and ptr addrspace(1) %gep1, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01556 ret void1557}1558 1559; --------------------------------------------------------------------------------1560; atomicrmw or1561; --------------------------------------------------------------------------------1562 1563define amdgpu_ps float @global_or_saddr_i32_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {1564; GFX9-LABEL: global_or_saddr_i32_rtn:1565; GFX9: ; %bb.0:1566; GFX9-NEXT: global_atomic_or v0, v0, v1, s[2:3] glc1567; GFX9-NEXT: s_waitcnt vmcnt(0)1568; GFX9-NEXT: buffer_wbinvl11569; GFX9-NEXT: ; return to shader part epilog1570;1571; GFX10-LABEL: global_or_saddr_i32_rtn:1572; GFX10: ; %bb.0:1573; GFX10-NEXT: global_atomic_or v0, v0, v1, s[2:3] glc1574; GFX10-NEXT: s_waitcnt vmcnt(0)1575; GFX10-NEXT: buffer_gl1_inv1576; GFX10-NEXT: buffer_gl0_inv1577; GFX10-NEXT: ; return to shader part epilog1578;1579; GFX11-LABEL: global_or_saddr_i32_rtn:1580; GFX11: ; %bb.0:1581; GFX11-NEXT: global_atomic_or_b32 v0, v0, v1, s[2:3] glc1582; GFX11-NEXT: s_waitcnt vmcnt(0)1583; GFX11-NEXT: buffer_gl1_inv1584; GFX11-NEXT: buffer_gl0_inv1585; GFX11-NEXT: ; return to shader part epilog1586;1587; GFX12-LABEL: global_or_saddr_i32_rtn:1588; GFX12: ; %bb.0:1589; GFX12-NEXT: global_atomic_or_b32 v0, v0, v1, s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_DEV1590; GFX12-NEXT: s_wait_loadcnt 0x01591; GFX12-NEXT: global_inv scope:SCOPE_DEV1592; GFX12-NEXT: s_wait_loadcnt 0x01593; GFX12-NEXT: ; return to shader part epilog1594 %zext.offset = zext i32 %voffset to i641595 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1596 %rtn = atomicrmw or ptr addrspace(1) %gep0, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01597 %cast.rtn = bitcast i32 %rtn to float1598 ret float %cast.rtn1599}1600 1601define amdgpu_ps float @global_or_saddr_i32_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {1602; GFX9-LABEL: global_or_saddr_i32_rtn_neg128:1603; GFX9: ; %bb.0:1604; GFX9-NEXT: global_atomic_or v0, v0, v1, s[2:3] offset:-128 glc1605; GFX9-NEXT: s_waitcnt vmcnt(0)1606; GFX9-NEXT: buffer_wbinvl11607; GFX9-NEXT: ; return to shader part epilog1608;1609; GFX10-LABEL: global_or_saddr_i32_rtn_neg128:1610; GFX10: ; %bb.0:1611; GFX10-NEXT: global_atomic_or v0, v0, v1, s[2:3] offset:-128 glc1612; GFX10-NEXT: s_waitcnt vmcnt(0)1613; GFX10-NEXT: buffer_gl1_inv1614; GFX10-NEXT: buffer_gl0_inv1615; GFX10-NEXT: ; return to shader part epilog1616;1617; GFX11-LABEL: global_or_saddr_i32_rtn_neg128:1618; GFX11: ; %bb.0:1619; GFX11-NEXT: global_atomic_or_b32 v0, v0, v1, s[2:3] offset:-128 glc1620; GFX11-NEXT: s_waitcnt vmcnt(0)1621; GFX11-NEXT: buffer_gl1_inv1622; GFX11-NEXT: buffer_gl0_inv1623; GFX11-NEXT: ; return to shader part epilog1624;1625; GFX12-LABEL: global_or_saddr_i32_rtn_neg128:1626; GFX12: ; %bb.0:1627; GFX12-NEXT: global_atomic_or_b32 v0, v0, v1, s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_DEV1628; GFX12-NEXT: s_wait_loadcnt 0x01629; GFX12-NEXT: global_inv scope:SCOPE_DEV1630; GFX12-NEXT: s_wait_loadcnt 0x01631; GFX12-NEXT: ; return to shader part epilog1632 %zext.offset = zext i32 %voffset to i641633 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1634 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1281635 %rtn = atomicrmw or ptr addrspace(1) %gep1, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01636 %cast.rtn = bitcast i32 %rtn to float1637 ret float %cast.rtn1638}1639 1640define amdgpu_ps void @global_or_saddr_i32_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {1641; GFX9-LABEL: global_or_saddr_i32_nortn:1642; GFX9: ; %bb.0:1643; GFX9-NEXT: global_atomic_or v0, v1, s[2:3]1644; GFX9-NEXT: s_waitcnt vmcnt(0)1645; GFX9-NEXT: buffer_wbinvl11646; GFX9-NEXT: s_endpgm1647;1648; GFX10-LABEL: global_or_saddr_i32_nortn:1649; GFX10: ; %bb.0:1650; GFX10-NEXT: global_atomic_or v0, v1, s[2:3]1651; GFX10-NEXT: s_waitcnt_vscnt null, 0x01652; GFX10-NEXT: buffer_gl1_inv1653; GFX10-NEXT: buffer_gl0_inv1654; GFX10-NEXT: s_endpgm1655;1656; GFX11-LABEL: global_or_saddr_i32_nortn:1657; GFX11: ; %bb.0:1658; GFX11-NEXT: global_atomic_or_b32 v0, v1, s[2:3]1659; GFX11-NEXT: s_waitcnt_vscnt null, 0x01660; GFX11-NEXT: buffer_gl1_inv1661; GFX11-NEXT: buffer_gl0_inv1662; GFX11-NEXT: s_endpgm1663;1664; GFX12-LABEL: global_or_saddr_i32_nortn:1665; GFX12: ; %bb.0:1666; GFX12-NEXT: global_atomic_or_b32 v0, v1, s[2:3] scope:SCOPE_DEV1667; GFX12-NEXT: s_wait_storecnt 0x01668; GFX12-NEXT: global_inv scope:SCOPE_DEV1669; GFX12-NEXT: s_endpgm1670 %zext.offset = zext i32 %voffset to i641671 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1672 %unused = atomicrmw or ptr addrspace(1) %gep0, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01673 ret void1674}1675 1676define amdgpu_ps void @global_or_saddr_i32_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {1677; GFX9-LABEL: global_or_saddr_i32_nortn_neg128:1678; GFX9: ; %bb.0:1679; GFX9-NEXT: global_atomic_or v0, v1, s[2:3] offset:-1281680; GFX9-NEXT: s_waitcnt vmcnt(0)1681; GFX9-NEXT: buffer_wbinvl11682; GFX9-NEXT: s_endpgm1683;1684; GFX10-LABEL: global_or_saddr_i32_nortn_neg128:1685; GFX10: ; %bb.0:1686; GFX10-NEXT: global_atomic_or v0, v1, s[2:3] offset:-1281687; GFX10-NEXT: s_waitcnt_vscnt null, 0x01688; GFX10-NEXT: buffer_gl1_inv1689; GFX10-NEXT: buffer_gl0_inv1690; GFX10-NEXT: s_endpgm1691;1692; GFX11-LABEL: global_or_saddr_i32_nortn_neg128:1693; GFX11: ; %bb.0:1694; GFX11-NEXT: global_atomic_or_b32 v0, v1, s[2:3] offset:-1281695; GFX11-NEXT: s_waitcnt_vscnt null, 0x01696; GFX11-NEXT: buffer_gl1_inv1697; GFX11-NEXT: buffer_gl0_inv1698; GFX11-NEXT: s_endpgm1699;1700; GFX12-LABEL: global_or_saddr_i32_nortn_neg128:1701; GFX12: ; %bb.0:1702; GFX12-NEXT: global_atomic_or_b32 v0, v1, s[2:3] offset:-128 scope:SCOPE_DEV1703; GFX12-NEXT: s_wait_storecnt 0x01704; GFX12-NEXT: global_inv scope:SCOPE_DEV1705; GFX12-NEXT: s_endpgm1706 %zext.offset = zext i32 %voffset to i641707 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1708 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1281709 %unused = atomicrmw or ptr addrspace(1) %gep1, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01710 ret void1711}1712 1713define amdgpu_ps <2 x float> @global_or_saddr_i64_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {1714; GFX9-LABEL: global_or_saddr_i64_rtn:1715; GFX9: ; %bb.0:1716; GFX9-NEXT: global_atomic_or_x2 v[0:1], v0, v[1:2], s[2:3] glc1717; GFX9-NEXT: s_waitcnt vmcnt(0)1718; GFX9-NEXT: buffer_wbinvl11719; GFX9-NEXT: ; return to shader part epilog1720;1721; GFX10-LABEL: global_or_saddr_i64_rtn:1722; GFX10: ; %bb.0:1723; GFX10-NEXT: global_atomic_or_x2 v[0:1], v0, v[1:2], s[2:3] glc1724; GFX10-NEXT: s_waitcnt vmcnt(0)1725; GFX10-NEXT: buffer_gl1_inv1726; GFX10-NEXT: buffer_gl0_inv1727; GFX10-NEXT: ; return to shader part epilog1728;1729; GFX11-LABEL: global_or_saddr_i64_rtn:1730; GFX11: ; %bb.0:1731; GFX11-NEXT: global_atomic_or_b64 v[0:1], v0, v[1:2], s[2:3] glc1732; GFX11-NEXT: s_waitcnt vmcnt(0)1733; GFX11-NEXT: buffer_gl1_inv1734; GFX11-NEXT: buffer_gl0_inv1735; GFX11-NEXT: ; return to shader part epilog1736;1737; GFX12-LABEL: global_or_saddr_i64_rtn:1738; GFX12: ; %bb.0:1739; GFX12-NEXT: global_atomic_or_b64 v[0:1], v0, v[1:2], s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_DEV1740; GFX12-NEXT: s_wait_loadcnt 0x01741; GFX12-NEXT: global_inv scope:SCOPE_DEV1742; GFX12-NEXT: s_wait_loadcnt 0x01743; GFX12-NEXT: ; return to shader part epilog1744 %zext.offset = zext i32 %voffset to i641745 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1746 %rtn = atomicrmw or ptr addrspace(1) %gep0, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01747 %cast.rtn = bitcast i64 %rtn to <2 x float>1748 ret <2 x float> %cast.rtn1749}1750 1751define amdgpu_ps <2 x float> @global_or_saddr_i64_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {1752; GFX9-LABEL: global_or_saddr_i64_rtn_neg128:1753; GFX9: ; %bb.0:1754; GFX9-NEXT: global_atomic_or_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc1755; GFX9-NEXT: s_waitcnt vmcnt(0)1756; GFX9-NEXT: buffer_wbinvl11757; GFX9-NEXT: ; return to shader part epilog1758;1759; GFX10-LABEL: global_or_saddr_i64_rtn_neg128:1760; GFX10: ; %bb.0:1761; GFX10-NEXT: global_atomic_or_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc1762; GFX10-NEXT: s_waitcnt vmcnt(0)1763; GFX10-NEXT: buffer_gl1_inv1764; GFX10-NEXT: buffer_gl0_inv1765; GFX10-NEXT: ; return to shader part epilog1766;1767; GFX11-LABEL: global_or_saddr_i64_rtn_neg128:1768; GFX11: ; %bb.0:1769; GFX11-NEXT: global_atomic_or_b64 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc1770; GFX11-NEXT: s_waitcnt vmcnt(0)1771; GFX11-NEXT: buffer_gl1_inv1772; GFX11-NEXT: buffer_gl0_inv1773; GFX11-NEXT: ; return to shader part epilog1774;1775; GFX12-LABEL: global_or_saddr_i64_rtn_neg128:1776; GFX12: ; %bb.0:1777; GFX12-NEXT: global_atomic_or_b64 v[0:1], v0, v[1:2], s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_DEV1778; GFX12-NEXT: s_wait_loadcnt 0x01779; GFX12-NEXT: global_inv scope:SCOPE_DEV1780; GFX12-NEXT: s_wait_loadcnt 0x01781; GFX12-NEXT: ; return to shader part epilog1782 %zext.offset = zext i32 %voffset to i641783 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1784 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1281785 %rtn = atomicrmw or ptr addrspace(1) %gep1, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01786 %cast.rtn = bitcast i64 %rtn to <2 x float>1787 ret <2 x float> %cast.rtn1788}1789 1790define amdgpu_ps void @global_or_saddr_i64_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {1791; GFX9-LABEL: global_or_saddr_i64_nortn:1792; GFX9: ; %bb.0:1793; GFX9-NEXT: global_atomic_or_x2 v0, v[1:2], s[2:3]1794; GFX9-NEXT: s_waitcnt vmcnt(0)1795; GFX9-NEXT: buffer_wbinvl11796; GFX9-NEXT: s_endpgm1797;1798; GFX10-LABEL: global_or_saddr_i64_nortn:1799; GFX10: ; %bb.0:1800; GFX10-NEXT: global_atomic_or_x2 v0, v[1:2], s[2:3]1801; GFX10-NEXT: s_waitcnt_vscnt null, 0x01802; GFX10-NEXT: buffer_gl1_inv1803; GFX10-NEXT: buffer_gl0_inv1804; GFX10-NEXT: s_endpgm1805;1806; GFX11-LABEL: global_or_saddr_i64_nortn:1807; GFX11: ; %bb.0:1808; GFX11-NEXT: global_atomic_or_b64 v0, v[1:2], s[2:3]1809; GFX11-NEXT: s_waitcnt_vscnt null, 0x01810; GFX11-NEXT: buffer_gl1_inv1811; GFX11-NEXT: buffer_gl0_inv1812; GFX11-NEXT: s_endpgm1813;1814; GFX12-LABEL: global_or_saddr_i64_nortn:1815; GFX12: ; %bb.0:1816; GFX12-NEXT: global_atomic_or_b64 v0, v[1:2], s[2:3] scope:SCOPE_DEV1817; GFX12-NEXT: s_wait_storecnt 0x01818; GFX12-NEXT: global_inv scope:SCOPE_DEV1819; GFX12-NEXT: s_endpgm1820 %zext.offset = zext i32 %voffset to i641821 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1822 %unused = atomicrmw or ptr addrspace(1) %gep0, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01823 ret void1824}1825 1826define amdgpu_ps void @global_or_saddr_i64_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {1827; GFX9-LABEL: global_or_saddr_i64_nortn_neg128:1828; GFX9: ; %bb.0:1829; GFX9-NEXT: global_atomic_or_x2 v0, v[1:2], s[2:3] offset:-1281830; GFX9-NEXT: s_waitcnt vmcnt(0)1831; GFX9-NEXT: buffer_wbinvl11832; GFX9-NEXT: s_endpgm1833;1834; GFX10-LABEL: global_or_saddr_i64_nortn_neg128:1835; GFX10: ; %bb.0:1836; GFX10-NEXT: global_atomic_or_x2 v0, v[1:2], s[2:3] offset:-1281837; GFX10-NEXT: s_waitcnt_vscnt null, 0x01838; GFX10-NEXT: buffer_gl1_inv1839; GFX10-NEXT: buffer_gl0_inv1840; GFX10-NEXT: s_endpgm1841;1842; GFX11-LABEL: global_or_saddr_i64_nortn_neg128:1843; GFX11: ; %bb.0:1844; GFX11-NEXT: global_atomic_or_b64 v0, v[1:2], s[2:3] offset:-1281845; GFX11-NEXT: s_waitcnt_vscnt null, 0x01846; GFX11-NEXT: buffer_gl1_inv1847; GFX11-NEXT: buffer_gl0_inv1848; GFX11-NEXT: s_endpgm1849;1850; GFX12-LABEL: global_or_saddr_i64_nortn_neg128:1851; GFX12: ; %bb.0:1852; GFX12-NEXT: global_atomic_or_b64 v0, v[1:2], s[2:3] offset:-128 scope:SCOPE_DEV1853; GFX12-NEXT: s_wait_storecnt 0x01854; GFX12-NEXT: global_inv scope:SCOPE_DEV1855; GFX12-NEXT: s_endpgm1856 %zext.offset = zext i32 %voffset to i641857 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1858 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1281859 %unused = atomicrmw or ptr addrspace(1) %gep1, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01860 ret void1861}1862 1863; --------------------------------------------------------------------------------1864; atomicrmw xor1865; --------------------------------------------------------------------------------1866 1867define amdgpu_ps float @global_xor_saddr_i32_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {1868; GFX9-LABEL: global_xor_saddr_i32_rtn:1869; GFX9: ; %bb.0:1870; GFX9-NEXT: global_atomic_xor v0, v0, v1, s[2:3] glc1871; GFX9-NEXT: s_waitcnt vmcnt(0)1872; GFX9-NEXT: buffer_wbinvl11873; GFX9-NEXT: ; return to shader part epilog1874;1875; GFX10-LABEL: global_xor_saddr_i32_rtn:1876; GFX10: ; %bb.0:1877; GFX10-NEXT: global_atomic_xor v0, v0, v1, s[2:3] glc1878; GFX10-NEXT: s_waitcnt vmcnt(0)1879; GFX10-NEXT: buffer_gl1_inv1880; GFX10-NEXT: buffer_gl0_inv1881; GFX10-NEXT: ; return to shader part epilog1882;1883; GFX11-LABEL: global_xor_saddr_i32_rtn:1884; GFX11: ; %bb.0:1885; GFX11-NEXT: global_atomic_xor_b32 v0, v0, v1, s[2:3] glc1886; GFX11-NEXT: s_waitcnt vmcnt(0)1887; GFX11-NEXT: buffer_gl1_inv1888; GFX11-NEXT: buffer_gl0_inv1889; GFX11-NEXT: ; return to shader part epilog1890;1891; GFX12-LABEL: global_xor_saddr_i32_rtn:1892; GFX12: ; %bb.0:1893; GFX12-NEXT: global_atomic_xor_b32 v0, v0, v1, s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_DEV1894; GFX12-NEXT: s_wait_loadcnt 0x01895; GFX12-NEXT: global_inv scope:SCOPE_DEV1896; GFX12-NEXT: s_wait_loadcnt 0x01897; GFX12-NEXT: ; return to shader part epilog1898 %zext.offset = zext i32 %voffset to i641899 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1900 %rtn = atomicrmw xor ptr addrspace(1) %gep0, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01901 %cast.rtn = bitcast i32 %rtn to float1902 ret float %cast.rtn1903}1904 1905define amdgpu_ps float @global_xor_saddr_i32_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {1906; GFX9-LABEL: global_xor_saddr_i32_rtn_neg128:1907; GFX9: ; %bb.0:1908; GFX9-NEXT: global_atomic_xor v0, v0, v1, s[2:3] offset:-128 glc1909; GFX9-NEXT: s_waitcnt vmcnt(0)1910; GFX9-NEXT: buffer_wbinvl11911; GFX9-NEXT: ; return to shader part epilog1912;1913; GFX10-LABEL: global_xor_saddr_i32_rtn_neg128:1914; GFX10: ; %bb.0:1915; GFX10-NEXT: global_atomic_xor v0, v0, v1, s[2:3] offset:-128 glc1916; GFX10-NEXT: s_waitcnt vmcnt(0)1917; GFX10-NEXT: buffer_gl1_inv1918; GFX10-NEXT: buffer_gl0_inv1919; GFX10-NEXT: ; return to shader part epilog1920;1921; GFX11-LABEL: global_xor_saddr_i32_rtn_neg128:1922; GFX11: ; %bb.0:1923; GFX11-NEXT: global_atomic_xor_b32 v0, v0, v1, s[2:3] offset:-128 glc1924; GFX11-NEXT: s_waitcnt vmcnt(0)1925; GFX11-NEXT: buffer_gl1_inv1926; GFX11-NEXT: buffer_gl0_inv1927; GFX11-NEXT: ; return to shader part epilog1928;1929; GFX12-LABEL: global_xor_saddr_i32_rtn_neg128:1930; GFX12: ; %bb.0:1931; GFX12-NEXT: global_atomic_xor_b32 v0, v0, v1, s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_DEV1932; GFX12-NEXT: s_wait_loadcnt 0x01933; GFX12-NEXT: global_inv scope:SCOPE_DEV1934; GFX12-NEXT: s_wait_loadcnt 0x01935; GFX12-NEXT: ; return to shader part epilog1936 %zext.offset = zext i32 %voffset to i641937 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1938 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1281939 %rtn = atomicrmw xor ptr addrspace(1) %gep1, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01940 %cast.rtn = bitcast i32 %rtn to float1941 ret float %cast.rtn1942}1943 1944define amdgpu_ps void @global_xor_saddr_i32_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {1945; GFX9-LABEL: global_xor_saddr_i32_nortn:1946; GFX9: ; %bb.0:1947; GFX9-NEXT: global_atomic_xor v0, v1, s[2:3]1948; GFX9-NEXT: s_waitcnt vmcnt(0)1949; GFX9-NEXT: buffer_wbinvl11950; GFX9-NEXT: s_endpgm1951;1952; GFX10-LABEL: global_xor_saddr_i32_nortn:1953; GFX10: ; %bb.0:1954; GFX10-NEXT: global_atomic_xor v0, v1, s[2:3]1955; GFX10-NEXT: s_waitcnt_vscnt null, 0x01956; GFX10-NEXT: buffer_gl1_inv1957; GFX10-NEXT: buffer_gl0_inv1958; GFX10-NEXT: s_endpgm1959;1960; GFX11-LABEL: global_xor_saddr_i32_nortn:1961; GFX11: ; %bb.0:1962; GFX11-NEXT: global_atomic_xor_b32 v0, v1, s[2:3]1963; GFX11-NEXT: s_waitcnt_vscnt null, 0x01964; GFX11-NEXT: buffer_gl1_inv1965; GFX11-NEXT: buffer_gl0_inv1966; GFX11-NEXT: s_endpgm1967;1968; GFX12-LABEL: global_xor_saddr_i32_nortn:1969; GFX12: ; %bb.0:1970; GFX12-NEXT: global_atomic_xor_b32 v0, v1, s[2:3] scope:SCOPE_DEV1971; GFX12-NEXT: s_wait_storecnt 0x01972; GFX12-NEXT: global_inv scope:SCOPE_DEV1973; GFX12-NEXT: s_endpgm1974 %zext.offset = zext i32 %voffset to i641975 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1976 %unused = atomicrmw xor ptr addrspace(1) %gep0, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01977 ret void1978}1979 1980define amdgpu_ps void @global_xor_saddr_i32_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {1981; GFX9-LABEL: global_xor_saddr_i32_nortn_neg128:1982; GFX9: ; %bb.0:1983; GFX9-NEXT: global_atomic_xor v0, v1, s[2:3] offset:-1281984; GFX9-NEXT: s_waitcnt vmcnt(0)1985; GFX9-NEXT: buffer_wbinvl11986; GFX9-NEXT: s_endpgm1987;1988; GFX10-LABEL: global_xor_saddr_i32_nortn_neg128:1989; GFX10: ; %bb.0:1990; GFX10-NEXT: global_atomic_xor v0, v1, s[2:3] offset:-1281991; GFX10-NEXT: s_waitcnt_vscnt null, 0x01992; GFX10-NEXT: buffer_gl1_inv1993; GFX10-NEXT: buffer_gl0_inv1994; GFX10-NEXT: s_endpgm1995;1996; GFX11-LABEL: global_xor_saddr_i32_nortn_neg128:1997; GFX11: ; %bb.0:1998; GFX11-NEXT: global_atomic_xor_b32 v0, v1, s[2:3] offset:-1281999; GFX11-NEXT: s_waitcnt_vscnt null, 0x02000; GFX11-NEXT: buffer_gl1_inv2001; GFX11-NEXT: buffer_gl0_inv2002; GFX11-NEXT: s_endpgm2003;2004; GFX12-LABEL: global_xor_saddr_i32_nortn_neg128:2005; GFX12: ; %bb.0:2006; GFX12-NEXT: global_atomic_xor_b32 v0, v1, s[2:3] offset:-128 scope:SCOPE_DEV2007; GFX12-NEXT: s_wait_storecnt 0x02008; GFX12-NEXT: global_inv scope:SCOPE_DEV2009; GFX12-NEXT: s_endpgm2010 %zext.offset = zext i32 %voffset to i642011 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2012 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282013 %unused = atomicrmw xor ptr addrspace(1) %gep1, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !02014 ret void2015}2016 2017define amdgpu_ps <2 x float> @global_xor_saddr_i64_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {2018; GFX9-LABEL: global_xor_saddr_i64_rtn:2019; GFX9: ; %bb.0:2020; GFX9-NEXT: global_atomic_xor_x2 v[0:1], v0, v[1:2], s[2:3] glc2021; GFX9-NEXT: s_waitcnt vmcnt(0)2022; GFX9-NEXT: buffer_wbinvl12023; GFX9-NEXT: ; return to shader part epilog2024;2025; GFX10-LABEL: global_xor_saddr_i64_rtn:2026; GFX10: ; %bb.0:2027; GFX10-NEXT: global_atomic_xor_x2 v[0:1], v0, v[1:2], s[2:3] glc2028; GFX10-NEXT: s_waitcnt vmcnt(0)2029; GFX10-NEXT: buffer_gl1_inv2030; GFX10-NEXT: buffer_gl0_inv2031; GFX10-NEXT: ; return to shader part epilog2032;2033; GFX11-LABEL: global_xor_saddr_i64_rtn:2034; GFX11: ; %bb.0:2035; GFX11-NEXT: global_atomic_xor_b64 v[0:1], v0, v[1:2], s[2:3] glc2036; GFX11-NEXT: s_waitcnt vmcnt(0)2037; GFX11-NEXT: buffer_gl1_inv2038; GFX11-NEXT: buffer_gl0_inv2039; GFX11-NEXT: ; return to shader part epilog2040;2041; GFX12-LABEL: global_xor_saddr_i64_rtn:2042; GFX12: ; %bb.0:2043; GFX12-NEXT: global_atomic_xor_b64 v[0:1], v0, v[1:2], s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_DEV2044; GFX12-NEXT: s_wait_loadcnt 0x02045; GFX12-NEXT: global_inv scope:SCOPE_DEV2046; GFX12-NEXT: s_wait_loadcnt 0x02047; GFX12-NEXT: ; return to shader part epilog2048 %zext.offset = zext i32 %voffset to i642049 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2050 %rtn = atomicrmw xor ptr addrspace(1) %gep0, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !02051 %cast.rtn = bitcast i64 %rtn to <2 x float>2052 ret <2 x float> %cast.rtn2053}2054 2055define amdgpu_ps <2 x float> @global_xor_saddr_i64_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {2056; GFX9-LABEL: global_xor_saddr_i64_rtn_neg128:2057; GFX9: ; %bb.0:2058; GFX9-NEXT: global_atomic_xor_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc2059; GFX9-NEXT: s_waitcnt vmcnt(0)2060; GFX9-NEXT: buffer_wbinvl12061; GFX9-NEXT: ; return to shader part epilog2062;2063; GFX10-LABEL: global_xor_saddr_i64_rtn_neg128:2064; GFX10: ; %bb.0:2065; GFX10-NEXT: global_atomic_xor_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc2066; GFX10-NEXT: s_waitcnt vmcnt(0)2067; GFX10-NEXT: buffer_gl1_inv2068; GFX10-NEXT: buffer_gl0_inv2069; GFX10-NEXT: ; return to shader part epilog2070;2071; GFX11-LABEL: global_xor_saddr_i64_rtn_neg128:2072; GFX11: ; %bb.0:2073; GFX11-NEXT: global_atomic_xor_b64 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc2074; GFX11-NEXT: s_waitcnt vmcnt(0)2075; GFX11-NEXT: buffer_gl1_inv2076; GFX11-NEXT: buffer_gl0_inv2077; GFX11-NEXT: ; return to shader part epilog2078;2079; GFX12-LABEL: global_xor_saddr_i64_rtn_neg128:2080; GFX12: ; %bb.0:2081; GFX12-NEXT: global_atomic_xor_b64 v[0:1], v0, v[1:2], s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_DEV2082; GFX12-NEXT: s_wait_loadcnt 0x02083; GFX12-NEXT: global_inv scope:SCOPE_DEV2084; GFX12-NEXT: s_wait_loadcnt 0x02085; GFX12-NEXT: ; return to shader part epilog2086 %zext.offset = zext i32 %voffset to i642087 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2088 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282089 %rtn = atomicrmw xor ptr addrspace(1) %gep1, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !02090 %cast.rtn = bitcast i64 %rtn to <2 x float>2091 ret <2 x float> %cast.rtn2092}2093 2094define amdgpu_ps void @global_xor_saddr_i64_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {2095; GFX9-LABEL: global_xor_saddr_i64_nortn:2096; GFX9: ; %bb.0:2097; GFX9-NEXT: global_atomic_xor_x2 v0, v[1:2], s[2:3]2098; GFX9-NEXT: s_waitcnt vmcnt(0)2099; GFX9-NEXT: buffer_wbinvl12100; GFX9-NEXT: s_endpgm2101;2102; GFX10-LABEL: global_xor_saddr_i64_nortn:2103; GFX10: ; %bb.0:2104; GFX10-NEXT: global_atomic_xor_x2 v0, v[1:2], s[2:3]2105; GFX10-NEXT: s_waitcnt_vscnt null, 0x02106; GFX10-NEXT: buffer_gl1_inv2107; GFX10-NEXT: buffer_gl0_inv2108; GFX10-NEXT: s_endpgm2109;2110; GFX11-LABEL: global_xor_saddr_i64_nortn:2111; GFX11: ; %bb.0:2112; GFX11-NEXT: global_atomic_xor_b64 v0, v[1:2], s[2:3]2113; GFX11-NEXT: s_waitcnt_vscnt null, 0x02114; GFX11-NEXT: buffer_gl1_inv2115; GFX11-NEXT: buffer_gl0_inv2116; GFX11-NEXT: s_endpgm2117;2118; GFX12-LABEL: global_xor_saddr_i64_nortn:2119; GFX12: ; %bb.0:2120; GFX12-NEXT: global_atomic_xor_b64 v0, v[1:2], s[2:3] scope:SCOPE_DEV2121; GFX12-NEXT: s_wait_storecnt 0x02122; GFX12-NEXT: global_inv scope:SCOPE_DEV2123; GFX12-NEXT: s_endpgm2124 %zext.offset = zext i32 %voffset to i642125 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2126 %unused = atomicrmw xor ptr addrspace(1) %gep0, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !02127 ret void2128}2129 2130define amdgpu_ps void @global_xor_saddr_i64_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {2131; GFX9-LABEL: global_xor_saddr_i64_nortn_neg128:2132; GFX9: ; %bb.0:2133; GFX9-NEXT: global_atomic_xor_x2 v0, v[1:2], s[2:3] offset:-1282134; GFX9-NEXT: s_waitcnt vmcnt(0)2135; GFX9-NEXT: buffer_wbinvl12136; GFX9-NEXT: s_endpgm2137;2138; GFX10-LABEL: global_xor_saddr_i64_nortn_neg128:2139; GFX10: ; %bb.0:2140; GFX10-NEXT: global_atomic_xor_x2 v0, v[1:2], s[2:3] offset:-1282141; GFX10-NEXT: s_waitcnt_vscnt null, 0x02142; GFX10-NEXT: buffer_gl1_inv2143; GFX10-NEXT: buffer_gl0_inv2144; GFX10-NEXT: s_endpgm2145;2146; GFX11-LABEL: global_xor_saddr_i64_nortn_neg128:2147; GFX11: ; %bb.0:2148; GFX11-NEXT: global_atomic_xor_b64 v0, v[1:2], s[2:3] offset:-1282149; GFX11-NEXT: s_waitcnt_vscnt null, 0x02150; GFX11-NEXT: buffer_gl1_inv2151; GFX11-NEXT: buffer_gl0_inv2152; GFX11-NEXT: s_endpgm2153;2154; GFX12-LABEL: global_xor_saddr_i64_nortn_neg128:2155; GFX12: ; %bb.0:2156; GFX12-NEXT: global_atomic_xor_b64 v0, v[1:2], s[2:3] offset:-128 scope:SCOPE_DEV2157; GFX12-NEXT: s_wait_storecnt 0x02158; GFX12-NEXT: global_inv scope:SCOPE_DEV2159; GFX12-NEXT: s_endpgm2160 %zext.offset = zext i32 %voffset to i642161 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2162 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282163 %unused = atomicrmw xor ptr addrspace(1) %gep1, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !02164 ret void2165}2166 2167; --------------------------------------------------------------------------------2168; atomicrmw max2169; --------------------------------------------------------------------------------2170 2171define amdgpu_ps float @global_max_saddr_i32_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {2172; GFX9-LABEL: global_max_saddr_i32_rtn:2173; GFX9: ; %bb.0:2174; GFX9-NEXT: global_atomic_smax v0, v0, v1, s[2:3] glc2175; GFX9-NEXT: s_waitcnt vmcnt(0)2176; GFX9-NEXT: ; return to shader part epilog2177;2178; GFX10-LABEL: global_max_saddr_i32_rtn:2179; GFX10: ; %bb.0:2180; GFX10-NEXT: global_atomic_smax v0, v0, v1, s[2:3] glc2181; GFX10-NEXT: s_waitcnt vmcnt(0)2182; GFX10-NEXT: buffer_gl0_inv2183; GFX10-NEXT: ; return to shader part epilog2184;2185; GFX11-LABEL: global_max_saddr_i32_rtn:2186; GFX11: ; %bb.0:2187; GFX11-NEXT: global_atomic_max_i32 v0, v0, v1, s[2:3] glc2188; GFX11-NEXT: s_waitcnt vmcnt(0)2189; GFX11-NEXT: buffer_gl0_inv2190; GFX11-NEXT: ; return to shader part epilog2191;2192; GFX12-LABEL: global_max_saddr_i32_rtn:2193; GFX12: ; %bb.0:2194; GFX12-NEXT: global_atomic_max_i32 v0, v0, v1, s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_SE2195; GFX12-NEXT: s_wait_loadcnt 0x02196; GFX12-NEXT: global_inv scope:SCOPE_SE2197; GFX12-NEXT: s_wait_loadcnt 0x02198; GFX12-NEXT: ; return to shader part epilog2199 %zext.offset = zext i32 %voffset to i642200 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2201 %rtn = atomicrmw max ptr addrspace(1) %gep0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02202 %cast.rtn = bitcast i32 %rtn to float2203 ret float %cast.rtn2204}2205 2206define amdgpu_ps float @global_max_saddr_i32_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {2207; GFX9-LABEL: global_max_saddr_i32_rtn_neg128:2208; GFX9: ; %bb.0:2209; GFX9-NEXT: global_atomic_smax v0, v0, v1, s[2:3] offset:-128 glc2210; GFX9-NEXT: s_waitcnt vmcnt(0)2211; GFX9-NEXT: ; return to shader part epilog2212;2213; GFX10-LABEL: global_max_saddr_i32_rtn_neg128:2214; GFX10: ; %bb.0:2215; GFX10-NEXT: global_atomic_smax v0, v0, v1, s[2:3] offset:-128 glc2216; GFX10-NEXT: s_waitcnt vmcnt(0)2217; GFX10-NEXT: buffer_gl0_inv2218; GFX10-NEXT: ; return to shader part epilog2219;2220; GFX11-LABEL: global_max_saddr_i32_rtn_neg128:2221; GFX11: ; %bb.0:2222; GFX11-NEXT: global_atomic_max_i32 v0, v0, v1, s[2:3] offset:-128 glc2223; GFX11-NEXT: s_waitcnt vmcnt(0)2224; GFX11-NEXT: buffer_gl0_inv2225; GFX11-NEXT: ; return to shader part epilog2226;2227; GFX12-LABEL: global_max_saddr_i32_rtn_neg128:2228; GFX12: ; %bb.0:2229; GFX12-NEXT: global_atomic_max_i32 v0, v0, v1, s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_SE2230; GFX12-NEXT: s_wait_loadcnt 0x02231; GFX12-NEXT: global_inv scope:SCOPE_SE2232; GFX12-NEXT: s_wait_loadcnt 0x02233; GFX12-NEXT: ; return to shader part epilog2234 %zext.offset = zext i32 %voffset to i642235 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2236 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282237 %rtn = atomicrmw max ptr addrspace(1) %gep1, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02238 %cast.rtn = bitcast i32 %rtn to float2239 ret float %cast.rtn2240}2241 2242define amdgpu_ps void @global_max_saddr_i32_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {2243; GFX9-LABEL: global_max_saddr_i32_nortn:2244; GFX9: ; %bb.0:2245; GFX9-NEXT: global_atomic_smax v0, v1, s[2:3]2246; GFX9-NEXT: s_endpgm2247;2248; GFX10-LABEL: global_max_saddr_i32_nortn:2249; GFX10: ; %bb.0:2250; GFX10-NEXT: global_atomic_smax v0, v1, s[2:3]2251; GFX10-NEXT: s_waitcnt_vscnt null, 0x02252; GFX10-NEXT: buffer_gl0_inv2253; GFX10-NEXT: s_endpgm2254;2255; GFX11-LABEL: global_max_saddr_i32_nortn:2256; GFX11: ; %bb.0:2257; GFX11-NEXT: global_atomic_max_i32 v0, v1, s[2:3]2258; GFX11-NEXT: s_waitcnt_vscnt null, 0x02259; GFX11-NEXT: buffer_gl0_inv2260; GFX11-NEXT: s_endpgm2261;2262; GFX12-LABEL: global_max_saddr_i32_nortn:2263; GFX12: ; %bb.0:2264; GFX12-NEXT: global_atomic_max_i32 v0, v1, s[2:3] scope:SCOPE_SE2265; GFX12-NEXT: s_wait_storecnt 0x02266; GFX12-NEXT: global_inv scope:SCOPE_SE2267; GFX12-NEXT: s_endpgm2268 %zext.offset = zext i32 %voffset to i642269 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2270 %unused = atomicrmw max ptr addrspace(1) %gep0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02271 ret void2272}2273 2274define amdgpu_ps void @global_max_saddr_i32_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {2275; GFX9-LABEL: global_max_saddr_i32_nortn_neg128:2276; GFX9: ; %bb.0:2277; GFX9-NEXT: global_atomic_smax v0, v1, s[2:3] offset:-1282278; GFX9-NEXT: s_endpgm2279;2280; GFX10-LABEL: global_max_saddr_i32_nortn_neg128:2281; GFX10: ; %bb.0:2282; GFX10-NEXT: global_atomic_smax v0, v1, s[2:3] offset:-1282283; GFX10-NEXT: s_waitcnt_vscnt null, 0x02284; GFX10-NEXT: buffer_gl0_inv2285; GFX10-NEXT: s_endpgm2286;2287; GFX11-LABEL: global_max_saddr_i32_nortn_neg128:2288; GFX11: ; %bb.0:2289; GFX11-NEXT: global_atomic_max_i32 v0, v1, s[2:3] offset:-1282290; GFX11-NEXT: s_waitcnt_vscnt null, 0x02291; GFX11-NEXT: buffer_gl0_inv2292; GFX11-NEXT: s_endpgm2293;2294; GFX12-LABEL: global_max_saddr_i32_nortn_neg128:2295; GFX12: ; %bb.0:2296; GFX12-NEXT: global_atomic_max_i32 v0, v1, s[2:3] offset:-128 scope:SCOPE_SE2297; GFX12-NEXT: s_wait_storecnt 0x02298; GFX12-NEXT: global_inv scope:SCOPE_SE2299; GFX12-NEXT: s_endpgm2300 %zext.offset = zext i32 %voffset to i642301 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2302 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282303 %unused = atomicrmw max ptr addrspace(1) %gep1, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02304 ret void2305}2306 2307define amdgpu_ps <2 x float> @global_max_saddr_i64_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {2308; GFX9-LABEL: global_max_saddr_i64_rtn:2309; GFX9: ; %bb.0:2310; GFX9-NEXT: global_atomic_smax_x2 v[0:1], v0, v[1:2], s[2:3] glc2311; GFX9-NEXT: s_waitcnt vmcnt(0)2312; GFX9-NEXT: ; return to shader part epilog2313;2314; GFX10-LABEL: global_max_saddr_i64_rtn:2315; GFX10: ; %bb.0:2316; GFX10-NEXT: global_atomic_smax_x2 v[0:1], v0, v[1:2], s[2:3] glc2317; GFX10-NEXT: s_waitcnt vmcnt(0)2318; GFX10-NEXT: buffer_gl0_inv2319; GFX10-NEXT: ; return to shader part epilog2320;2321; GFX11-LABEL: global_max_saddr_i64_rtn:2322; GFX11: ; %bb.0:2323; GFX11-NEXT: global_atomic_max_i64 v[0:1], v0, v[1:2], s[2:3] glc2324; GFX11-NEXT: s_waitcnt vmcnt(0)2325; GFX11-NEXT: buffer_gl0_inv2326; GFX11-NEXT: ; return to shader part epilog2327;2328; GFX12-LABEL: global_max_saddr_i64_rtn:2329; GFX12: ; %bb.0:2330; GFX12-NEXT: global_atomic_max_i64 v[0:1], v0, v[1:2], s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_SE2331; GFX12-NEXT: s_wait_loadcnt 0x02332; GFX12-NEXT: global_inv scope:SCOPE_SE2333; GFX12-NEXT: s_wait_loadcnt 0x02334; GFX12-NEXT: ; return to shader part epilog2335 %zext.offset = zext i32 %voffset to i642336 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2337 %rtn = atomicrmw max ptr addrspace(1) %gep0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02338 %cast.rtn = bitcast i64 %rtn to <2 x float>2339 ret <2 x float> %cast.rtn2340}2341 2342define amdgpu_ps <2 x float> @global_max_saddr_i64_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {2343; GFX9-LABEL: global_max_saddr_i64_rtn_neg128:2344; GFX9: ; %bb.0:2345; GFX9-NEXT: global_atomic_smax_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc2346; GFX9-NEXT: s_waitcnt vmcnt(0)2347; GFX9-NEXT: ; return to shader part epilog2348;2349; GFX10-LABEL: global_max_saddr_i64_rtn_neg128:2350; GFX10: ; %bb.0:2351; GFX10-NEXT: global_atomic_smax_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc2352; GFX10-NEXT: s_waitcnt vmcnt(0)2353; GFX10-NEXT: buffer_gl0_inv2354; GFX10-NEXT: ; return to shader part epilog2355;2356; GFX11-LABEL: global_max_saddr_i64_rtn_neg128:2357; GFX11: ; %bb.0:2358; GFX11-NEXT: global_atomic_max_i64 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc2359; GFX11-NEXT: s_waitcnt vmcnt(0)2360; GFX11-NEXT: buffer_gl0_inv2361; GFX11-NEXT: ; return to shader part epilog2362;2363; GFX12-LABEL: global_max_saddr_i64_rtn_neg128:2364; GFX12: ; %bb.0:2365; GFX12-NEXT: global_atomic_max_i64 v[0:1], v0, v[1:2], s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_SE2366; GFX12-NEXT: s_wait_loadcnt 0x02367; GFX12-NEXT: global_inv scope:SCOPE_SE2368; GFX12-NEXT: s_wait_loadcnt 0x02369; GFX12-NEXT: ; return to shader part epilog2370 %zext.offset = zext i32 %voffset to i642371 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2372 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282373 %rtn = atomicrmw max ptr addrspace(1) %gep1, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02374 %cast.rtn = bitcast i64 %rtn to <2 x float>2375 ret <2 x float> %cast.rtn2376}2377 2378define amdgpu_ps void @global_max_saddr_i64_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {2379; GFX9-LABEL: global_max_saddr_i64_nortn:2380; GFX9: ; %bb.0:2381; GFX9-NEXT: global_atomic_smax_x2 v0, v[1:2], s[2:3]2382; GFX9-NEXT: s_endpgm2383;2384; GFX10-LABEL: global_max_saddr_i64_nortn:2385; GFX10: ; %bb.0:2386; GFX10-NEXT: global_atomic_smax_x2 v0, v[1:2], s[2:3]2387; GFX10-NEXT: s_waitcnt_vscnt null, 0x02388; GFX10-NEXT: buffer_gl0_inv2389; GFX10-NEXT: s_endpgm2390;2391; GFX11-LABEL: global_max_saddr_i64_nortn:2392; GFX11: ; %bb.0:2393; GFX11-NEXT: global_atomic_max_i64 v0, v[1:2], s[2:3]2394; GFX11-NEXT: s_waitcnt_vscnt null, 0x02395; GFX11-NEXT: buffer_gl0_inv2396; GFX11-NEXT: s_endpgm2397;2398; GFX12-LABEL: global_max_saddr_i64_nortn:2399; GFX12: ; %bb.0:2400; GFX12-NEXT: global_atomic_max_i64 v0, v[1:2], s[2:3] scope:SCOPE_SE2401; GFX12-NEXT: s_wait_storecnt 0x02402; GFX12-NEXT: global_inv scope:SCOPE_SE2403; GFX12-NEXT: s_endpgm2404 %zext.offset = zext i32 %voffset to i642405 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2406 %unused = atomicrmw max ptr addrspace(1) %gep0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02407 ret void2408}2409 2410define amdgpu_ps void @global_max_saddr_i64_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {2411; GFX9-LABEL: global_max_saddr_i64_nortn_neg128:2412; GFX9: ; %bb.0:2413; GFX9-NEXT: global_atomic_smax_x2 v0, v[1:2], s[2:3] offset:-1282414; GFX9-NEXT: s_endpgm2415;2416; GFX10-LABEL: global_max_saddr_i64_nortn_neg128:2417; GFX10: ; %bb.0:2418; GFX10-NEXT: global_atomic_smax_x2 v0, v[1:2], s[2:3] offset:-1282419; GFX10-NEXT: s_waitcnt_vscnt null, 0x02420; GFX10-NEXT: buffer_gl0_inv2421; GFX10-NEXT: s_endpgm2422;2423; GFX11-LABEL: global_max_saddr_i64_nortn_neg128:2424; GFX11: ; %bb.0:2425; GFX11-NEXT: global_atomic_max_i64 v0, v[1:2], s[2:3] offset:-1282426; GFX11-NEXT: s_waitcnt_vscnt null, 0x02427; GFX11-NEXT: buffer_gl0_inv2428; GFX11-NEXT: s_endpgm2429;2430; GFX12-LABEL: global_max_saddr_i64_nortn_neg128:2431; GFX12: ; %bb.0:2432; GFX12-NEXT: global_atomic_max_i64 v0, v[1:2], s[2:3] offset:-128 scope:SCOPE_SE2433; GFX12-NEXT: s_wait_storecnt 0x02434; GFX12-NEXT: global_inv scope:SCOPE_SE2435; GFX12-NEXT: s_endpgm2436 %zext.offset = zext i32 %voffset to i642437 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2438 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282439 %unused = atomicrmw max ptr addrspace(1) %gep1, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02440 ret void2441}2442 2443; --------------------------------------------------------------------------------2444; atomicrmw min2445; --------------------------------------------------------------------------------2446 2447define amdgpu_ps float @global_min_saddr_i32_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {2448; GFX9-LABEL: global_min_saddr_i32_rtn:2449; GFX9: ; %bb.0:2450; GFX9-NEXT: global_atomic_smin v0, v0, v1, s[2:3] glc2451; GFX9-NEXT: s_waitcnt vmcnt(0)2452; GFX9-NEXT: ; return to shader part epilog2453;2454; GFX10-LABEL: global_min_saddr_i32_rtn:2455; GFX10: ; %bb.0:2456; GFX10-NEXT: global_atomic_smin v0, v0, v1, s[2:3] glc2457; GFX10-NEXT: s_waitcnt vmcnt(0)2458; GFX10-NEXT: buffer_gl0_inv2459; GFX10-NEXT: ; return to shader part epilog2460;2461; GFX11-LABEL: global_min_saddr_i32_rtn:2462; GFX11: ; %bb.0:2463; GFX11-NEXT: global_atomic_min_i32 v0, v0, v1, s[2:3] glc2464; GFX11-NEXT: s_waitcnt vmcnt(0)2465; GFX11-NEXT: buffer_gl0_inv2466; GFX11-NEXT: ; return to shader part epilog2467;2468; GFX12-LABEL: global_min_saddr_i32_rtn:2469; GFX12: ; %bb.0:2470; GFX12-NEXT: global_atomic_min_i32 v0, v0, v1, s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_SE2471; GFX12-NEXT: s_wait_loadcnt 0x02472; GFX12-NEXT: global_inv scope:SCOPE_SE2473; GFX12-NEXT: s_wait_loadcnt 0x02474; GFX12-NEXT: ; return to shader part epilog2475 %zext.offset = zext i32 %voffset to i642476 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2477 %rtn = atomicrmw min ptr addrspace(1) %gep0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02478 %cast.rtn = bitcast i32 %rtn to float2479 ret float %cast.rtn2480}2481 2482define amdgpu_ps float @global_min_saddr_i32_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {2483; GFX9-LABEL: global_min_saddr_i32_rtn_neg128:2484; GFX9: ; %bb.0:2485; GFX9-NEXT: global_atomic_smin v0, v0, v1, s[2:3] offset:-128 glc2486; GFX9-NEXT: s_waitcnt vmcnt(0)2487; GFX9-NEXT: ; return to shader part epilog2488;2489; GFX10-LABEL: global_min_saddr_i32_rtn_neg128:2490; GFX10: ; %bb.0:2491; GFX10-NEXT: global_atomic_smin v0, v0, v1, s[2:3] offset:-128 glc2492; GFX10-NEXT: s_waitcnt vmcnt(0)2493; GFX10-NEXT: buffer_gl0_inv2494; GFX10-NEXT: ; return to shader part epilog2495;2496; GFX11-LABEL: global_min_saddr_i32_rtn_neg128:2497; GFX11: ; %bb.0:2498; GFX11-NEXT: global_atomic_min_i32 v0, v0, v1, s[2:3] offset:-128 glc2499; GFX11-NEXT: s_waitcnt vmcnt(0)2500; GFX11-NEXT: buffer_gl0_inv2501; GFX11-NEXT: ; return to shader part epilog2502;2503; GFX12-LABEL: global_min_saddr_i32_rtn_neg128:2504; GFX12: ; %bb.0:2505; GFX12-NEXT: global_atomic_min_i32 v0, v0, v1, s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_SE2506; GFX12-NEXT: s_wait_loadcnt 0x02507; GFX12-NEXT: global_inv scope:SCOPE_SE2508; GFX12-NEXT: s_wait_loadcnt 0x02509; GFX12-NEXT: ; return to shader part epilog2510 %zext.offset = zext i32 %voffset to i642511 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2512 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282513 %rtn = atomicrmw min ptr addrspace(1) %gep1, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02514 %cast.rtn = bitcast i32 %rtn to float2515 ret float %cast.rtn2516}2517 2518define amdgpu_ps void @global_min_saddr_i32_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {2519; GFX9-LABEL: global_min_saddr_i32_nortn:2520; GFX9: ; %bb.0:2521; GFX9-NEXT: global_atomic_smin v0, v1, s[2:3]2522; GFX9-NEXT: s_endpgm2523;2524; GFX10-LABEL: global_min_saddr_i32_nortn:2525; GFX10: ; %bb.0:2526; GFX10-NEXT: global_atomic_smin v0, v1, s[2:3]2527; GFX10-NEXT: s_waitcnt_vscnt null, 0x02528; GFX10-NEXT: buffer_gl0_inv2529; GFX10-NEXT: s_endpgm2530;2531; GFX11-LABEL: global_min_saddr_i32_nortn:2532; GFX11: ; %bb.0:2533; GFX11-NEXT: global_atomic_min_i32 v0, v1, s[2:3]2534; GFX11-NEXT: s_waitcnt_vscnt null, 0x02535; GFX11-NEXT: buffer_gl0_inv2536; GFX11-NEXT: s_endpgm2537;2538; GFX12-LABEL: global_min_saddr_i32_nortn:2539; GFX12: ; %bb.0:2540; GFX12-NEXT: global_atomic_min_i32 v0, v1, s[2:3] scope:SCOPE_SE2541; GFX12-NEXT: s_wait_storecnt 0x02542; GFX12-NEXT: global_inv scope:SCOPE_SE2543; GFX12-NEXT: s_endpgm2544 %zext.offset = zext i32 %voffset to i642545 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2546 %unused = atomicrmw min ptr addrspace(1) %gep0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02547 ret void2548}2549 2550define amdgpu_ps void @global_min_saddr_i32_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {2551; GFX9-LABEL: global_min_saddr_i32_nortn_neg128:2552; GFX9: ; %bb.0:2553; GFX9-NEXT: global_atomic_smin v0, v1, s[2:3] offset:-1282554; GFX9-NEXT: s_endpgm2555;2556; GFX10-LABEL: global_min_saddr_i32_nortn_neg128:2557; GFX10: ; %bb.0:2558; GFX10-NEXT: global_atomic_smin v0, v1, s[2:3] offset:-1282559; GFX10-NEXT: s_waitcnt_vscnt null, 0x02560; GFX10-NEXT: buffer_gl0_inv2561; GFX10-NEXT: s_endpgm2562;2563; GFX11-LABEL: global_min_saddr_i32_nortn_neg128:2564; GFX11: ; %bb.0:2565; GFX11-NEXT: global_atomic_min_i32 v0, v1, s[2:3] offset:-1282566; GFX11-NEXT: s_waitcnt_vscnt null, 0x02567; GFX11-NEXT: buffer_gl0_inv2568; GFX11-NEXT: s_endpgm2569;2570; GFX12-LABEL: global_min_saddr_i32_nortn_neg128:2571; GFX12: ; %bb.0:2572; GFX12-NEXT: global_atomic_min_i32 v0, v1, s[2:3] offset:-128 scope:SCOPE_SE2573; GFX12-NEXT: s_wait_storecnt 0x02574; GFX12-NEXT: global_inv scope:SCOPE_SE2575; GFX12-NEXT: s_endpgm2576 %zext.offset = zext i32 %voffset to i642577 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2578 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282579 %unused = atomicrmw min ptr addrspace(1) %gep1, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02580 ret void2581}2582 2583define amdgpu_ps <2 x float> @global_min_saddr_i64_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {2584; GFX9-LABEL: global_min_saddr_i64_rtn:2585; GFX9: ; %bb.0:2586; GFX9-NEXT: global_atomic_smin_x2 v[0:1], v0, v[1:2], s[2:3] glc2587; GFX9-NEXT: s_waitcnt vmcnt(0)2588; GFX9-NEXT: ; return to shader part epilog2589;2590; GFX10-LABEL: global_min_saddr_i64_rtn:2591; GFX10: ; %bb.0:2592; GFX10-NEXT: global_atomic_smin_x2 v[0:1], v0, v[1:2], s[2:3] glc2593; GFX10-NEXT: s_waitcnt vmcnt(0)2594; GFX10-NEXT: buffer_gl0_inv2595; GFX10-NEXT: ; return to shader part epilog2596;2597; GFX11-LABEL: global_min_saddr_i64_rtn:2598; GFX11: ; %bb.0:2599; GFX11-NEXT: global_atomic_min_i64 v[0:1], v0, v[1:2], s[2:3] glc2600; GFX11-NEXT: s_waitcnt vmcnt(0)2601; GFX11-NEXT: buffer_gl0_inv2602; GFX11-NEXT: ; return to shader part epilog2603;2604; GFX12-LABEL: global_min_saddr_i64_rtn:2605; GFX12: ; %bb.0:2606; GFX12-NEXT: global_atomic_min_i64 v[0:1], v0, v[1:2], s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_SE2607; GFX12-NEXT: s_wait_loadcnt 0x02608; GFX12-NEXT: global_inv scope:SCOPE_SE2609; GFX12-NEXT: s_wait_loadcnt 0x02610; GFX12-NEXT: ; return to shader part epilog2611 %zext.offset = zext i32 %voffset to i642612 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2613 %rtn = atomicrmw min ptr addrspace(1) %gep0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02614 %cast.rtn = bitcast i64 %rtn to <2 x float>2615 ret <2 x float> %cast.rtn2616}2617 2618define amdgpu_ps <2 x float> @global_min_saddr_i64_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {2619; GFX9-LABEL: global_min_saddr_i64_rtn_neg128:2620; GFX9: ; %bb.0:2621; GFX9-NEXT: global_atomic_smin_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc2622; GFX9-NEXT: s_waitcnt vmcnt(0)2623; GFX9-NEXT: ; return to shader part epilog2624;2625; GFX10-LABEL: global_min_saddr_i64_rtn_neg128:2626; GFX10: ; %bb.0:2627; GFX10-NEXT: global_atomic_smin_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc2628; GFX10-NEXT: s_waitcnt vmcnt(0)2629; GFX10-NEXT: buffer_gl0_inv2630; GFX10-NEXT: ; return to shader part epilog2631;2632; GFX11-LABEL: global_min_saddr_i64_rtn_neg128:2633; GFX11: ; %bb.0:2634; GFX11-NEXT: global_atomic_min_i64 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc2635; GFX11-NEXT: s_waitcnt vmcnt(0)2636; GFX11-NEXT: buffer_gl0_inv2637; GFX11-NEXT: ; return to shader part epilog2638;2639; GFX12-LABEL: global_min_saddr_i64_rtn_neg128:2640; GFX12: ; %bb.0:2641; GFX12-NEXT: global_atomic_min_i64 v[0:1], v0, v[1:2], s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_SE2642; GFX12-NEXT: s_wait_loadcnt 0x02643; GFX12-NEXT: global_inv scope:SCOPE_SE2644; GFX12-NEXT: s_wait_loadcnt 0x02645; GFX12-NEXT: ; return to shader part epilog2646 %zext.offset = zext i32 %voffset to i642647 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2648 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282649 %rtn = atomicrmw min ptr addrspace(1) %gep1, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02650 %cast.rtn = bitcast i64 %rtn to <2 x float>2651 ret <2 x float> %cast.rtn2652}2653 2654define amdgpu_ps void @global_min_saddr_i64_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {2655; GFX9-LABEL: global_min_saddr_i64_nortn:2656; GFX9: ; %bb.0:2657; GFX9-NEXT: global_atomic_smin_x2 v0, v[1:2], s[2:3]2658; GFX9-NEXT: s_endpgm2659;2660; GFX10-LABEL: global_min_saddr_i64_nortn:2661; GFX10: ; %bb.0:2662; GFX10-NEXT: global_atomic_smin_x2 v0, v[1:2], s[2:3]2663; GFX10-NEXT: s_waitcnt_vscnt null, 0x02664; GFX10-NEXT: buffer_gl0_inv2665; GFX10-NEXT: s_endpgm2666;2667; GFX11-LABEL: global_min_saddr_i64_nortn:2668; GFX11: ; %bb.0:2669; GFX11-NEXT: global_atomic_min_i64 v0, v[1:2], s[2:3]2670; GFX11-NEXT: s_waitcnt_vscnt null, 0x02671; GFX11-NEXT: buffer_gl0_inv2672; GFX11-NEXT: s_endpgm2673;2674; GFX12-LABEL: global_min_saddr_i64_nortn:2675; GFX12: ; %bb.0:2676; GFX12-NEXT: global_atomic_min_i64 v0, v[1:2], s[2:3] scope:SCOPE_SE2677; GFX12-NEXT: s_wait_storecnt 0x02678; GFX12-NEXT: global_inv scope:SCOPE_SE2679; GFX12-NEXT: s_endpgm2680 %zext.offset = zext i32 %voffset to i642681 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2682 %unused = atomicrmw min ptr addrspace(1) %gep0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02683 ret void2684}2685 2686define amdgpu_ps void @global_min_saddr_i64_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {2687; GFX9-LABEL: global_min_saddr_i64_nortn_neg128:2688; GFX9: ; %bb.0:2689; GFX9-NEXT: global_atomic_smin_x2 v0, v[1:2], s[2:3] offset:-1282690; GFX9-NEXT: s_endpgm2691;2692; GFX10-LABEL: global_min_saddr_i64_nortn_neg128:2693; GFX10: ; %bb.0:2694; GFX10-NEXT: global_atomic_smin_x2 v0, v[1:2], s[2:3] offset:-1282695; GFX10-NEXT: s_waitcnt_vscnt null, 0x02696; GFX10-NEXT: buffer_gl0_inv2697; GFX10-NEXT: s_endpgm2698;2699; GFX11-LABEL: global_min_saddr_i64_nortn_neg128:2700; GFX11: ; %bb.0:2701; GFX11-NEXT: global_atomic_min_i64 v0, v[1:2], s[2:3] offset:-1282702; GFX11-NEXT: s_waitcnt_vscnt null, 0x02703; GFX11-NEXT: buffer_gl0_inv2704; GFX11-NEXT: s_endpgm2705;2706; GFX12-LABEL: global_min_saddr_i64_nortn_neg128:2707; GFX12: ; %bb.0:2708; GFX12-NEXT: global_atomic_min_i64 v0, v[1:2], s[2:3] offset:-128 scope:SCOPE_SE2709; GFX12-NEXT: s_wait_storecnt 0x02710; GFX12-NEXT: global_inv scope:SCOPE_SE2711; GFX12-NEXT: s_endpgm2712 %zext.offset = zext i32 %voffset to i642713 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2714 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282715 %unused = atomicrmw min ptr addrspace(1) %gep1, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02716 ret void2717}2718 2719; --------------------------------------------------------------------------------2720; atomicrmw umax2721; --------------------------------------------------------------------------------2722 2723define amdgpu_ps float @global_umax_saddr_i32_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {2724; GFX9-LABEL: global_umax_saddr_i32_rtn:2725; GFX9: ; %bb.0:2726; GFX9-NEXT: global_atomic_umax v0, v0, v1, s[2:3] glc2727; GFX9-NEXT: s_waitcnt vmcnt(0)2728; GFX9-NEXT: ; return to shader part epilog2729;2730; GFX10-LABEL: global_umax_saddr_i32_rtn:2731; GFX10: ; %bb.0:2732; GFX10-NEXT: global_atomic_umax v0, v0, v1, s[2:3] glc2733; GFX10-NEXT: s_waitcnt vmcnt(0)2734; GFX10-NEXT: buffer_gl0_inv2735; GFX10-NEXT: ; return to shader part epilog2736;2737; GFX11-LABEL: global_umax_saddr_i32_rtn:2738; GFX11: ; %bb.0:2739; GFX11-NEXT: global_atomic_max_u32 v0, v0, v1, s[2:3] glc2740; GFX11-NEXT: s_waitcnt vmcnt(0)2741; GFX11-NEXT: buffer_gl0_inv2742; GFX11-NEXT: ; return to shader part epilog2743;2744; GFX12-LABEL: global_umax_saddr_i32_rtn:2745; GFX12: ; %bb.0:2746; GFX12-NEXT: global_atomic_max_u32 v0, v0, v1, s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_SE2747; GFX12-NEXT: s_wait_loadcnt 0x02748; GFX12-NEXT: global_inv scope:SCOPE_SE2749; GFX12-NEXT: s_wait_loadcnt 0x02750; GFX12-NEXT: ; return to shader part epilog2751 %zext.offset = zext i32 %voffset to i642752 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2753 %rtn = atomicrmw umax ptr addrspace(1) %gep0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02754 %cast.rtn = bitcast i32 %rtn to float2755 ret float %cast.rtn2756}2757 2758define amdgpu_ps float @global_umax_saddr_i32_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {2759; GFX9-LABEL: global_umax_saddr_i32_rtn_neg128:2760; GFX9: ; %bb.0:2761; GFX9-NEXT: global_atomic_umax v0, v0, v1, s[2:3] offset:-128 glc2762; GFX9-NEXT: s_waitcnt vmcnt(0)2763; GFX9-NEXT: ; return to shader part epilog2764;2765; GFX10-LABEL: global_umax_saddr_i32_rtn_neg128:2766; GFX10: ; %bb.0:2767; GFX10-NEXT: global_atomic_umax v0, v0, v1, s[2:3] offset:-128 glc2768; GFX10-NEXT: s_waitcnt vmcnt(0)2769; GFX10-NEXT: buffer_gl0_inv2770; GFX10-NEXT: ; return to shader part epilog2771;2772; GFX11-LABEL: global_umax_saddr_i32_rtn_neg128:2773; GFX11: ; %bb.0:2774; GFX11-NEXT: global_atomic_max_u32 v0, v0, v1, s[2:3] offset:-128 glc2775; GFX11-NEXT: s_waitcnt vmcnt(0)2776; GFX11-NEXT: buffer_gl0_inv2777; GFX11-NEXT: ; return to shader part epilog2778;2779; GFX12-LABEL: global_umax_saddr_i32_rtn_neg128:2780; GFX12: ; %bb.0:2781; GFX12-NEXT: global_atomic_max_u32 v0, v0, v1, s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_SE2782; GFX12-NEXT: s_wait_loadcnt 0x02783; GFX12-NEXT: global_inv scope:SCOPE_SE2784; GFX12-NEXT: s_wait_loadcnt 0x02785; GFX12-NEXT: ; return to shader part epilog2786 %zext.offset = zext i32 %voffset to i642787 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2788 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282789 %rtn = atomicrmw umax ptr addrspace(1) %gep1, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02790 %cast.rtn = bitcast i32 %rtn to float2791 ret float %cast.rtn2792}2793 2794define amdgpu_ps void @global_umax_saddr_i32_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {2795; GFX9-LABEL: global_umax_saddr_i32_nortn:2796; GFX9: ; %bb.0:2797; GFX9-NEXT: global_atomic_umax v0, v1, s[2:3]2798; GFX9-NEXT: s_endpgm2799;2800; GFX10-LABEL: global_umax_saddr_i32_nortn:2801; GFX10: ; %bb.0:2802; GFX10-NEXT: global_atomic_umax v0, v1, s[2:3]2803; GFX10-NEXT: s_waitcnt_vscnt null, 0x02804; GFX10-NEXT: buffer_gl0_inv2805; GFX10-NEXT: s_endpgm2806;2807; GFX11-LABEL: global_umax_saddr_i32_nortn:2808; GFX11: ; %bb.0:2809; GFX11-NEXT: global_atomic_max_u32 v0, v1, s[2:3]2810; GFX11-NEXT: s_waitcnt_vscnt null, 0x02811; GFX11-NEXT: buffer_gl0_inv2812; GFX11-NEXT: s_endpgm2813;2814; GFX12-LABEL: global_umax_saddr_i32_nortn:2815; GFX12: ; %bb.0:2816; GFX12-NEXT: global_atomic_max_u32 v0, v1, s[2:3] scope:SCOPE_SE2817; GFX12-NEXT: s_wait_storecnt 0x02818; GFX12-NEXT: global_inv scope:SCOPE_SE2819; GFX12-NEXT: s_endpgm2820 %zext.offset = zext i32 %voffset to i642821 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2822 %unused = atomicrmw umax ptr addrspace(1) %gep0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02823 ret void2824}2825 2826define amdgpu_ps void @global_umax_saddr_i32_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {2827; GFX9-LABEL: global_umax_saddr_i32_nortn_neg128:2828; GFX9: ; %bb.0:2829; GFX9-NEXT: global_atomic_umax v0, v1, s[2:3] offset:-1282830; GFX9-NEXT: s_endpgm2831;2832; GFX10-LABEL: global_umax_saddr_i32_nortn_neg128:2833; GFX10: ; %bb.0:2834; GFX10-NEXT: global_atomic_umax v0, v1, s[2:3] offset:-1282835; GFX10-NEXT: s_waitcnt_vscnt null, 0x02836; GFX10-NEXT: buffer_gl0_inv2837; GFX10-NEXT: s_endpgm2838;2839; GFX11-LABEL: global_umax_saddr_i32_nortn_neg128:2840; GFX11: ; %bb.0:2841; GFX11-NEXT: global_atomic_max_u32 v0, v1, s[2:3] offset:-1282842; GFX11-NEXT: s_waitcnt_vscnt null, 0x02843; GFX11-NEXT: buffer_gl0_inv2844; GFX11-NEXT: s_endpgm2845;2846; GFX12-LABEL: global_umax_saddr_i32_nortn_neg128:2847; GFX12: ; %bb.0:2848; GFX12-NEXT: global_atomic_max_u32 v0, v1, s[2:3] offset:-128 scope:SCOPE_SE2849; GFX12-NEXT: s_wait_storecnt 0x02850; GFX12-NEXT: global_inv scope:SCOPE_SE2851; GFX12-NEXT: s_endpgm2852 %zext.offset = zext i32 %voffset to i642853 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2854 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282855 %unused = atomicrmw umax ptr addrspace(1) %gep1, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02856 ret void2857}2858 2859define amdgpu_ps <2 x float> @global_umax_saddr_i64_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {2860; GFX9-LABEL: global_umax_saddr_i64_rtn:2861; GFX9: ; %bb.0:2862; GFX9-NEXT: global_atomic_umax_x2 v[0:1], v0, v[1:2], s[2:3] glc2863; GFX9-NEXT: s_waitcnt vmcnt(0)2864; GFX9-NEXT: ; return to shader part epilog2865;2866; GFX10-LABEL: global_umax_saddr_i64_rtn:2867; GFX10: ; %bb.0:2868; GFX10-NEXT: global_atomic_umax_x2 v[0:1], v0, v[1:2], s[2:3] glc2869; GFX10-NEXT: s_waitcnt vmcnt(0)2870; GFX10-NEXT: buffer_gl0_inv2871; GFX10-NEXT: ; return to shader part epilog2872;2873; GFX11-LABEL: global_umax_saddr_i64_rtn:2874; GFX11: ; %bb.0:2875; GFX11-NEXT: global_atomic_max_u64 v[0:1], v0, v[1:2], s[2:3] glc2876; GFX11-NEXT: s_waitcnt vmcnt(0)2877; GFX11-NEXT: buffer_gl0_inv2878; GFX11-NEXT: ; return to shader part epilog2879;2880; GFX12-LABEL: global_umax_saddr_i64_rtn:2881; GFX12: ; %bb.0:2882; GFX12-NEXT: global_atomic_max_u64 v[0:1], v0, v[1:2], s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_SE2883; GFX12-NEXT: s_wait_loadcnt 0x02884; GFX12-NEXT: global_inv scope:SCOPE_SE2885; GFX12-NEXT: s_wait_loadcnt 0x02886; GFX12-NEXT: ; return to shader part epilog2887 %zext.offset = zext i32 %voffset to i642888 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2889 %rtn = atomicrmw umax ptr addrspace(1) %gep0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02890 %cast.rtn = bitcast i64 %rtn to <2 x float>2891 ret <2 x float> %cast.rtn2892}2893 2894define amdgpu_ps <2 x float> @global_umax_saddr_i64_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {2895; GFX9-LABEL: global_umax_saddr_i64_rtn_neg128:2896; GFX9: ; %bb.0:2897; GFX9-NEXT: global_atomic_umax_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc2898; GFX9-NEXT: s_waitcnt vmcnt(0)2899; GFX9-NEXT: ; return to shader part epilog2900;2901; GFX10-LABEL: global_umax_saddr_i64_rtn_neg128:2902; GFX10: ; %bb.0:2903; GFX10-NEXT: global_atomic_umax_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc2904; GFX10-NEXT: s_waitcnt vmcnt(0)2905; GFX10-NEXT: buffer_gl0_inv2906; GFX10-NEXT: ; return to shader part epilog2907;2908; GFX11-LABEL: global_umax_saddr_i64_rtn_neg128:2909; GFX11: ; %bb.0:2910; GFX11-NEXT: global_atomic_max_u64 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc2911; GFX11-NEXT: s_waitcnt vmcnt(0)2912; GFX11-NEXT: buffer_gl0_inv2913; GFX11-NEXT: ; return to shader part epilog2914;2915; GFX12-LABEL: global_umax_saddr_i64_rtn_neg128:2916; GFX12: ; %bb.0:2917; GFX12-NEXT: global_atomic_max_u64 v[0:1], v0, v[1:2], s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_SE2918; GFX12-NEXT: s_wait_loadcnt 0x02919; GFX12-NEXT: global_inv scope:SCOPE_SE2920; GFX12-NEXT: s_wait_loadcnt 0x02921; GFX12-NEXT: ; return to shader part epilog2922 %zext.offset = zext i32 %voffset to i642923 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2924 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282925 %rtn = atomicrmw umax ptr addrspace(1) %gep1, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02926 %cast.rtn = bitcast i64 %rtn to <2 x float>2927 ret <2 x float> %cast.rtn2928}2929 2930define amdgpu_ps void @global_umax_saddr_i64_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {2931; GFX9-LABEL: global_umax_saddr_i64_nortn:2932; GFX9: ; %bb.0:2933; GFX9-NEXT: global_atomic_umax_x2 v0, v[1:2], s[2:3]2934; GFX9-NEXT: s_endpgm2935;2936; GFX10-LABEL: global_umax_saddr_i64_nortn:2937; GFX10: ; %bb.0:2938; GFX10-NEXT: global_atomic_umax_x2 v0, v[1:2], s[2:3]2939; GFX10-NEXT: s_waitcnt_vscnt null, 0x02940; GFX10-NEXT: buffer_gl0_inv2941; GFX10-NEXT: s_endpgm2942;2943; GFX11-LABEL: global_umax_saddr_i64_nortn:2944; GFX11: ; %bb.0:2945; GFX11-NEXT: global_atomic_max_u64 v0, v[1:2], s[2:3]2946; GFX11-NEXT: s_waitcnt_vscnt null, 0x02947; GFX11-NEXT: buffer_gl0_inv2948; GFX11-NEXT: s_endpgm2949;2950; GFX12-LABEL: global_umax_saddr_i64_nortn:2951; GFX12: ; %bb.0:2952; GFX12-NEXT: global_atomic_max_u64 v0, v[1:2], s[2:3] scope:SCOPE_SE2953; GFX12-NEXT: s_wait_storecnt 0x02954; GFX12-NEXT: global_inv scope:SCOPE_SE2955; GFX12-NEXT: s_endpgm2956 %zext.offset = zext i32 %voffset to i642957 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2958 %unused = atomicrmw umax ptr addrspace(1) %gep0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02959 ret void2960}2961 2962define amdgpu_ps void @global_umax_saddr_i64_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {2963; GFX9-LABEL: global_umax_saddr_i64_nortn_neg128:2964; GFX9: ; %bb.0:2965; GFX9-NEXT: global_atomic_umax_x2 v0, v[1:2], s[2:3] offset:-1282966; GFX9-NEXT: s_endpgm2967;2968; GFX10-LABEL: global_umax_saddr_i64_nortn_neg128:2969; GFX10: ; %bb.0:2970; GFX10-NEXT: global_atomic_umax_x2 v0, v[1:2], s[2:3] offset:-1282971; GFX10-NEXT: s_waitcnt_vscnt null, 0x02972; GFX10-NEXT: buffer_gl0_inv2973; GFX10-NEXT: s_endpgm2974;2975; GFX11-LABEL: global_umax_saddr_i64_nortn_neg128:2976; GFX11: ; %bb.0:2977; GFX11-NEXT: global_atomic_max_u64 v0, v[1:2], s[2:3] offset:-1282978; GFX11-NEXT: s_waitcnt_vscnt null, 0x02979; GFX11-NEXT: buffer_gl0_inv2980; GFX11-NEXT: s_endpgm2981;2982; GFX12-LABEL: global_umax_saddr_i64_nortn_neg128:2983; GFX12: ; %bb.0:2984; GFX12-NEXT: global_atomic_max_u64 v0, v[1:2], s[2:3] offset:-128 scope:SCOPE_SE2985; GFX12-NEXT: s_wait_storecnt 0x02986; GFX12-NEXT: global_inv scope:SCOPE_SE2987; GFX12-NEXT: s_endpgm2988 %zext.offset = zext i32 %voffset to i642989 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2990 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282991 %unused = atomicrmw umax ptr addrspace(1) %gep1, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !02992 ret void2993}2994 2995; --------------------------------------------------------------------------------2996; atomicrmw umin2997; --------------------------------------------------------------------------------2998 2999define amdgpu_ps float @global_umin_saddr_i32_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {3000; GFX9-LABEL: global_umin_saddr_i32_rtn:3001; GFX9: ; %bb.0:3002; GFX9-NEXT: global_atomic_umin v0, v0, v1, s[2:3] glc3003; GFX9-NEXT: s_waitcnt vmcnt(0)3004; GFX9-NEXT: ; return to shader part epilog3005;3006; GFX10-LABEL: global_umin_saddr_i32_rtn:3007; GFX10: ; %bb.0:3008; GFX10-NEXT: global_atomic_umin v0, v0, v1, s[2:3] glc3009; GFX10-NEXT: s_waitcnt vmcnt(0)3010; GFX10-NEXT: buffer_gl0_inv3011; GFX10-NEXT: ; return to shader part epilog3012;3013; GFX11-LABEL: global_umin_saddr_i32_rtn:3014; GFX11: ; %bb.0:3015; GFX11-NEXT: global_atomic_min_u32 v0, v0, v1, s[2:3] glc3016; GFX11-NEXT: s_waitcnt vmcnt(0)3017; GFX11-NEXT: buffer_gl0_inv3018; GFX11-NEXT: ; return to shader part epilog3019;3020; GFX12-LABEL: global_umin_saddr_i32_rtn:3021; GFX12: ; %bb.0:3022; GFX12-NEXT: global_atomic_min_u32 v0, v0, v1, s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_SE3023; GFX12-NEXT: s_wait_loadcnt 0x03024; GFX12-NEXT: global_inv scope:SCOPE_SE3025; GFX12-NEXT: s_wait_loadcnt 0x03026; GFX12-NEXT: ; return to shader part epilog3027 %zext.offset = zext i32 %voffset to i643028 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3029 %rtn = atomicrmw umin ptr addrspace(1) %gep0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !03030 %cast.rtn = bitcast i32 %rtn to float3031 ret float %cast.rtn3032}3033 3034define amdgpu_ps float @global_umin_saddr_i32_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {3035; GFX9-LABEL: global_umin_saddr_i32_rtn_neg128:3036; GFX9: ; %bb.0:3037; GFX9-NEXT: global_atomic_umin v0, v0, v1, s[2:3] offset:-128 glc3038; GFX9-NEXT: s_waitcnt vmcnt(0)3039; GFX9-NEXT: ; return to shader part epilog3040;3041; GFX10-LABEL: global_umin_saddr_i32_rtn_neg128:3042; GFX10: ; %bb.0:3043; GFX10-NEXT: global_atomic_umin v0, v0, v1, s[2:3] offset:-128 glc3044; GFX10-NEXT: s_waitcnt vmcnt(0)3045; GFX10-NEXT: buffer_gl0_inv3046; GFX10-NEXT: ; return to shader part epilog3047;3048; GFX11-LABEL: global_umin_saddr_i32_rtn_neg128:3049; GFX11: ; %bb.0:3050; GFX11-NEXT: global_atomic_min_u32 v0, v0, v1, s[2:3] offset:-128 glc3051; GFX11-NEXT: s_waitcnt vmcnt(0)3052; GFX11-NEXT: buffer_gl0_inv3053; GFX11-NEXT: ; return to shader part epilog3054;3055; GFX12-LABEL: global_umin_saddr_i32_rtn_neg128:3056; GFX12: ; %bb.0:3057; GFX12-NEXT: global_atomic_min_u32 v0, v0, v1, s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_SE3058; GFX12-NEXT: s_wait_loadcnt 0x03059; GFX12-NEXT: global_inv scope:SCOPE_SE3060; GFX12-NEXT: s_wait_loadcnt 0x03061; GFX12-NEXT: ; return to shader part epilog3062 %zext.offset = zext i32 %voffset to i643063 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3064 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283065 %rtn = atomicrmw umin ptr addrspace(1) %gep1, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !03066 %cast.rtn = bitcast i32 %rtn to float3067 ret float %cast.rtn3068}3069 3070define amdgpu_ps void @global_umin_saddr_i32_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {3071; GFX9-LABEL: global_umin_saddr_i32_nortn:3072; GFX9: ; %bb.0:3073; GFX9-NEXT: global_atomic_umin v0, v1, s[2:3]3074; GFX9-NEXT: s_endpgm3075;3076; GFX10-LABEL: global_umin_saddr_i32_nortn:3077; GFX10: ; %bb.0:3078; GFX10-NEXT: global_atomic_umin v0, v1, s[2:3]3079; GFX10-NEXT: s_waitcnt_vscnt null, 0x03080; GFX10-NEXT: buffer_gl0_inv3081; GFX10-NEXT: s_endpgm3082;3083; GFX11-LABEL: global_umin_saddr_i32_nortn:3084; GFX11: ; %bb.0:3085; GFX11-NEXT: global_atomic_min_u32 v0, v1, s[2:3]3086; GFX11-NEXT: s_waitcnt_vscnt null, 0x03087; GFX11-NEXT: buffer_gl0_inv3088; GFX11-NEXT: s_endpgm3089;3090; GFX12-LABEL: global_umin_saddr_i32_nortn:3091; GFX12: ; %bb.0:3092; GFX12-NEXT: global_atomic_min_u32 v0, v1, s[2:3] scope:SCOPE_SE3093; GFX12-NEXT: s_wait_storecnt 0x03094; GFX12-NEXT: global_inv scope:SCOPE_SE3095; GFX12-NEXT: s_endpgm3096 %zext.offset = zext i32 %voffset to i643097 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3098 %unused = atomicrmw umin ptr addrspace(1) %gep0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !03099 ret void3100}3101 3102define amdgpu_ps void @global_umin_saddr_i32_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {3103; GFX9-LABEL: global_umin_saddr_i32_nortn_neg128:3104; GFX9: ; %bb.0:3105; GFX9-NEXT: global_atomic_umin v0, v1, s[2:3] offset:-1283106; GFX9-NEXT: s_endpgm3107;3108; GFX10-LABEL: global_umin_saddr_i32_nortn_neg128:3109; GFX10: ; %bb.0:3110; GFX10-NEXT: global_atomic_umin v0, v1, s[2:3] offset:-1283111; GFX10-NEXT: s_waitcnt_vscnt null, 0x03112; GFX10-NEXT: buffer_gl0_inv3113; GFX10-NEXT: s_endpgm3114;3115; GFX11-LABEL: global_umin_saddr_i32_nortn_neg128:3116; GFX11: ; %bb.0:3117; GFX11-NEXT: global_atomic_min_u32 v0, v1, s[2:3] offset:-1283118; GFX11-NEXT: s_waitcnt_vscnt null, 0x03119; GFX11-NEXT: buffer_gl0_inv3120; GFX11-NEXT: s_endpgm3121;3122; GFX12-LABEL: global_umin_saddr_i32_nortn_neg128:3123; GFX12: ; %bb.0:3124; GFX12-NEXT: global_atomic_min_u32 v0, v1, s[2:3] offset:-128 scope:SCOPE_SE3125; GFX12-NEXT: s_wait_storecnt 0x03126; GFX12-NEXT: global_inv scope:SCOPE_SE3127; GFX12-NEXT: s_endpgm3128 %zext.offset = zext i32 %voffset to i643129 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3130 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283131 %unused = atomicrmw umin ptr addrspace(1) %gep1, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !03132 ret void3133}3134 3135define amdgpu_ps <2 x float> @global_umin_saddr_i64_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {3136; GFX9-LABEL: global_umin_saddr_i64_rtn:3137; GFX9: ; %bb.0:3138; GFX9-NEXT: global_atomic_umin_x2 v[0:1], v0, v[1:2], s[2:3] glc3139; GFX9-NEXT: s_waitcnt vmcnt(0)3140; GFX9-NEXT: ; return to shader part epilog3141;3142; GFX10-LABEL: global_umin_saddr_i64_rtn:3143; GFX10: ; %bb.0:3144; GFX10-NEXT: global_atomic_umin_x2 v[0:1], v0, v[1:2], s[2:3] glc3145; GFX10-NEXT: s_waitcnt vmcnt(0)3146; GFX10-NEXT: buffer_gl0_inv3147; GFX10-NEXT: ; return to shader part epilog3148;3149; GFX11-LABEL: global_umin_saddr_i64_rtn:3150; GFX11: ; %bb.0:3151; GFX11-NEXT: global_atomic_min_u64 v[0:1], v0, v[1:2], s[2:3] glc3152; GFX11-NEXT: s_waitcnt vmcnt(0)3153; GFX11-NEXT: buffer_gl0_inv3154; GFX11-NEXT: ; return to shader part epilog3155;3156; GFX12-LABEL: global_umin_saddr_i64_rtn:3157; GFX12: ; %bb.0:3158; GFX12-NEXT: global_atomic_min_u64 v[0:1], v0, v[1:2], s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_SE3159; GFX12-NEXT: s_wait_loadcnt 0x03160; GFX12-NEXT: global_inv scope:SCOPE_SE3161; GFX12-NEXT: s_wait_loadcnt 0x03162; GFX12-NEXT: ; return to shader part epilog3163 %zext.offset = zext i32 %voffset to i643164 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3165 %rtn = atomicrmw umin ptr addrspace(1) %gep0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !03166 %cast.rtn = bitcast i64 %rtn to <2 x float>3167 ret <2 x float> %cast.rtn3168}3169 3170define amdgpu_ps <2 x float> @global_umin_saddr_i64_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {3171; GFX9-LABEL: global_umin_saddr_i64_rtn_neg128:3172; GFX9: ; %bb.0:3173; GFX9-NEXT: global_atomic_umin_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc3174; GFX9-NEXT: s_waitcnt vmcnt(0)3175; GFX9-NEXT: ; return to shader part epilog3176;3177; GFX10-LABEL: global_umin_saddr_i64_rtn_neg128:3178; GFX10: ; %bb.0:3179; GFX10-NEXT: global_atomic_umin_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc3180; GFX10-NEXT: s_waitcnt vmcnt(0)3181; GFX10-NEXT: buffer_gl0_inv3182; GFX10-NEXT: ; return to shader part epilog3183;3184; GFX11-LABEL: global_umin_saddr_i64_rtn_neg128:3185; GFX11: ; %bb.0:3186; GFX11-NEXT: global_atomic_min_u64 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc3187; GFX11-NEXT: s_waitcnt vmcnt(0)3188; GFX11-NEXT: buffer_gl0_inv3189; GFX11-NEXT: ; return to shader part epilog3190;3191; GFX12-LABEL: global_umin_saddr_i64_rtn_neg128:3192; GFX12: ; %bb.0:3193; GFX12-NEXT: global_atomic_min_u64 v[0:1], v0, v[1:2], s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_SE3194; GFX12-NEXT: s_wait_loadcnt 0x03195; GFX12-NEXT: global_inv scope:SCOPE_SE3196; GFX12-NEXT: s_wait_loadcnt 0x03197; GFX12-NEXT: ; return to shader part epilog3198 %zext.offset = zext i32 %voffset to i643199 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3200 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283201 %rtn = atomicrmw umin ptr addrspace(1) %gep1, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !03202 %cast.rtn = bitcast i64 %rtn to <2 x float>3203 ret <2 x float> %cast.rtn3204}3205 3206define amdgpu_ps void @global_umin_saddr_i64_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {3207; GFX9-LABEL: global_umin_saddr_i64_nortn:3208; GFX9: ; %bb.0:3209; GFX9-NEXT: global_atomic_umin_x2 v0, v[1:2], s[2:3]3210; GFX9-NEXT: s_endpgm3211;3212; GFX10-LABEL: global_umin_saddr_i64_nortn:3213; GFX10: ; %bb.0:3214; GFX10-NEXT: global_atomic_umin_x2 v0, v[1:2], s[2:3]3215; GFX10-NEXT: s_waitcnt_vscnt null, 0x03216; GFX10-NEXT: buffer_gl0_inv3217; GFX10-NEXT: s_endpgm3218;3219; GFX11-LABEL: global_umin_saddr_i64_nortn:3220; GFX11: ; %bb.0:3221; GFX11-NEXT: global_atomic_min_u64 v0, v[1:2], s[2:3]3222; GFX11-NEXT: s_waitcnt_vscnt null, 0x03223; GFX11-NEXT: buffer_gl0_inv3224; GFX11-NEXT: s_endpgm3225;3226; GFX12-LABEL: global_umin_saddr_i64_nortn:3227; GFX12: ; %bb.0:3228; GFX12-NEXT: global_atomic_min_u64 v0, v[1:2], s[2:3] scope:SCOPE_SE3229; GFX12-NEXT: s_wait_storecnt 0x03230; GFX12-NEXT: global_inv scope:SCOPE_SE3231; GFX12-NEXT: s_endpgm3232 %zext.offset = zext i32 %voffset to i643233 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3234 %unused = atomicrmw umin ptr addrspace(1) %gep0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !03235 ret void3236}3237 3238define amdgpu_ps void @global_umin_saddr_i64_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {3239; GFX9-LABEL: global_umin_saddr_i64_nortn_neg128:3240; GFX9: ; %bb.0:3241; GFX9-NEXT: global_atomic_umin_x2 v0, v[1:2], s[2:3] offset:-1283242; GFX9-NEXT: s_endpgm3243;3244; GFX10-LABEL: global_umin_saddr_i64_nortn_neg128:3245; GFX10: ; %bb.0:3246; GFX10-NEXT: global_atomic_umin_x2 v0, v[1:2], s[2:3] offset:-1283247; GFX10-NEXT: s_waitcnt_vscnt null, 0x03248; GFX10-NEXT: buffer_gl0_inv3249; GFX10-NEXT: s_endpgm3250;3251; GFX11-LABEL: global_umin_saddr_i64_nortn_neg128:3252; GFX11: ; %bb.0:3253; GFX11-NEXT: global_atomic_min_u64 v0, v[1:2], s[2:3] offset:-1283254; GFX11-NEXT: s_waitcnt_vscnt null, 0x03255; GFX11-NEXT: buffer_gl0_inv3256; GFX11-NEXT: s_endpgm3257;3258; GFX12-LABEL: global_umin_saddr_i64_nortn_neg128:3259; GFX12: ; %bb.0:3260; GFX12-NEXT: global_atomic_min_u64 v0, v[1:2], s[2:3] offset:-128 scope:SCOPE_SE3261; GFX12-NEXT: s_wait_storecnt 0x03262; GFX12-NEXT: global_inv scope:SCOPE_SE3263; GFX12-NEXT: s_endpgm3264 %zext.offset = zext i32 %voffset to i643265 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3266 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283267 %unused = atomicrmw umin ptr addrspace(1) %gep1, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !03268 ret void3269}3270 3271; --------------------------------------------------------------------------------3272; cmpxchg3273; --------------------------------------------------------------------------------3274 3275define amdgpu_ps float @global_cmpxchg_saddr_i32_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %cmp, i32 %data) {3276; GFX9-LABEL: global_cmpxchg_saddr_i32_rtn:3277; GFX9: ; %bb.0:3278; GFX9-NEXT: v_mov_b32_e32 v3, v13279; GFX9-NEXT: global_atomic_cmpswap v0, v0, v[2:3], s[2:3] glc3280; GFX9-NEXT: s_waitcnt vmcnt(0)3281; GFX9-NEXT: buffer_wbinvl13282; GFX9-NEXT: ; return to shader part epilog3283;3284; GFX10-LABEL: global_cmpxchg_saddr_i32_rtn:3285; GFX10: ; %bb.0:3286; GFX10-NEXT: v_mov_b32_e32 v3, v13287; GFX10-NEXT: global_atomic_cmpswap v0, v0, v[2:3], s[2:3] glc3288; GFX10-NEXT: s_waitcnt vmcnt(0)3289; GFX10-NEXT: buffer_gl1_inv3290; GFX10-NEXT: buffer_gl0_inv3291; GFX10-NEXT: ; return to shader part epilog3292;3293; GFX11-LABEL: global_cmpxchg_saddr_i32_rtn:3294; GFX11: ; %bb.0:3295; GFX11-NEXT: v_mov_b32_e32 v3, v13296; GFX11-NEXT: global_atomic_cmpswap_b32 v0, v0, v[2:3], s[2:3] glc3297; GFX11-NEXT: s_waitcnt vmcnt(0)3298; GFX11-NEXT: buffer_gl1_inv3299; GFX11-NEXT: buffer_gl0_inv3300; GFX11-NEXT: ; return to shader part epilog3301;3302; GFX12-LABEL: global_cmpxchg_saddr_i32_rtn:3303; GFX12: ; %bb.0:3304; GFX12-NEXT: v_mov_b32_e32 v3, v13305; GFX12-NEXT: global_wb scope:SCOPE_SYS3306; GFX12-NEXT: s_wait_storecnt 0x03307; GFX12-NEXT: global_atomic_cmpswap_b32 v0, v0, v[2:3], s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_SYS3308; GFX12-NEXT: s_wait_loadcnt 0x03309; GFX12-NEXT: global_inv scope:SCOPE_SYS3310; GFX12-NEXT: s_wait_loadcnt 0x03311; GFX12-NEXT: ; return to shader part epilog3312 %zext.offset = zext i32 %voffset to i643313 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3314 %cmpxchg = cmpxchg ptr addrspace(1) %gep0, i32 %cmp, i32 %data seq_cst seq_cst3315 %rtn = extractvalue { i32, i1 } %cmpxchg, 03316 %cast.rtn = bitcast i32 %rtn to float3317 ret float %cast.rtn3318}3319 3320define amdgpu_ps float @global_cmpxchg_saddr_i32_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %cmp, i32 %data) {3321; GFX9-LABEL: global_cmpxchg_saddr_i32_rtn_neg128:3322; GFX9: ; %bb.0:3323; GFX9-NEXT: v_mov_b32_e32 v3, v13324; GFX9-NEXT: global_atomic_cmpswap v0, v0, v[2:3], s[2:3] offset:-128 glc3325; GFX9-NEXT: s_waitcnt vmcnt(0)3326; GFX9-NEXT: buffer_wbinvl13327; GFX9-NEXT: ; return to shader part epilog3328;3329; GFX10-LABEL: global_cmpxchg_saddr_i32_rtn_neg128:3330; GFX10: ; %bb.0:3331; GFX10-NEXT: v_mov_b32_e32 v3, v13332; GFX10-NEXT: global_atomic_cmpswap v0, v0, v[2:3], s[2:3] offset:-128 glc3333; GFX10-NEXT: s_waitcnt vmcnt(0)3334; GFX10-NEXT: buffer_gl1_inv3335; GFX10-NEXT: buffer_gl0_inv3336; GFX10-NEXT: ; return to shader part epilog3337;3338; GFX11-LABEL: global_cmpxchg_saddr_i32_rtn_neg128:3339; GFX11: ; %bb.0:3340; GFX11-NEXT: v_mov_b32_e32 v3, v13341; GFX11-NEXT: global_atomic_cmpswap_b32 v0, v0, v[2:3], s[2:3] offset:-128 glc3342; GFX11-NEXT: s_waitcnt vmcnt(0)3343; GFX11-NEXT: buffer_gl1_inv3344; GFX11-NEXT: buffer_gl0_inv3345; GFX11-NEXT: ; return to shader part epilog3346;3347; GFX12-LABEL: global_cmpxchg_saddr_i32_rtn_neg128:3348; GFX12: ; %bb.0:3349; GFX12-NEXT: v_mov_b32_e32 v3, v13350; GFX12-NEXT: global_wb scope:SCOPE_SYS3351; GFX12-NEXT: s_wait_storecnt 0x03352; GFX12-NEXT: global_atomic_cmpswap_b32 v0, v0, v[2:3], s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_SYS3353; GFX12-NEXT: s_wait_loadcnt 0x03354; GFX12-NEXT: global_inv scope:SCOPE_SYS3355; GFX12-NEXT: s_wait_loadcnt 0x03356; GFX12-NEXT: ; return to shader part epilog3357 %zext.offset = zext i32 %voffset to i643358 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3359 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283360 %cmpxchg = cmpxchg ptr addrspace(1) %gep1, i32 %cmp, i32 %data seq_cst seq_cst3361 %rtn = extractvalue { i32, i1 } %cmpxchg, 03362 %cast.rtn = bitcast i32 %rtn to float3363 ret float %cast.rtn3364}3365 3366define amdgpu_ps void @global_cmpxchg_saddr_i32_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %cmp, i32 %data) {3367; GFX9-LABEL: global_cmpxchg_saddr_i32_nortn:3368; GFX9: ; %bb.0:3369; GFX9-NEXT: v_mov_b32_e32 v3, v13370; GFX9-NEXT: global_atomic_cmpswap v0, v[2:3], s[2:3]3371; GFX9-NEXT: s_waitcnt vmcnt(0)3372; GFX9-NEXT: buffer_wbinvl13373; GFX9-NEXT: s_endpgm3374;3375; GFX10-LABEL: global_cmpxchg_saddr_i32_nortn:3376; GFX10: ; %bb.0:3377; GFX10-NEXT: v_mov_b32_e32 v3, v13378; GFX10-NEXT: global_atomic_cmpswap v0, v[2:3], s[2:3]3379; GFX10-NEXT: s_waitcnt_vscnt null, 0x03380; GFX10-NEXT: buffer_gl1_inv3381; GFX10-NEXT: buffer_gl0_inv3382; GFX10-NEXT: s_endpgm3383;3384; GFX11-LABEL: global_cmpxchg_saddr_i32_nortn:3385; GFX11: ; %bb.0:3386; GFX11-NEXT: v_mov_b32_e32 v3, v13387; GFX11-NEXT: global_atomic_cmpswap_b32 v0, v[2:3], s[2:3]3388; GFX11-NEXT: s_waitcnt_vscnt null, 0x03389; GFX11-NEXT: buffer_gl1_inv3390; GFX11-NEXT: buffer_gl0_inv3391; GFX11-NEXT: s_endpgm3392;3393; GFX12-LABEL: global_cmpxchg_saddr_i32_nortn:3394; GFX12: ; %bb.0:3395; GFX12-NEXT: v_mov_b32_e32 v3, v13396; GFX12-NEXT: global_wb scope:SCOPE_SYS3397; GFX12-NEXT: s_wait_storecnt 0x03398; GFX12-NEXT: global_atomic_cmpswap_b32 v0, v[2:3], s[2:3] scope:SCOPE_SYS3399; GFX12-NEXT: s_wait_storecnt 0x03400; GFX12-NEXT: global_inv scope:SCOPE_SYS3401; GFX12-NEXT: s_endpgm3402 %zext.offset = zext i32 %voffset to i643403 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3404 %unused = cmpxchg ptr addrspace(1) %gep0, i32 %cmp, i32 %data seq_cst seq_cst3405 ret void3406}3407 3408define amdgpu_ps void @global_cmpxchg_saddr_i32_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %cmp, i32 %data) {3409; GFX9-LABEL: global_cmpxchg_saddr_i32_nortn_neg128:3410; GFX9: ; %bb.0:3411; GFX9-NEXT: v_mov_b32_e32 v3, v13412; GFX9-NEXT: global_atomic_cmpswap v0, v[2:3], s[2:3] offset:-1283413; GFX9-NEXT: s_waitcnt vmcnt(0)3414; GFX9-NEXT: buffer_wbinvl13415; GFX9-NEXT: s_endpgm3416;3417; GFX10-LABEL: global_cmpxchg_saddr_i32_nortn_neg128:3418; GFX10: ; %bb.0:3419; GFX10-NEXT: v_mov_b32_e32 v3, v13420; GFX10-NEXT: global_atomic_cmpswap v0, v[2:3], s[2:3] offset:-1283421; GFX10-NEXT: s_waitcnt_vscnt null, 0x03422; GFX10-NEXT: buffer_gl1_inv3423; GFX10-NEXT: buffer_gl0_inv3424; GFX10-NEXT: s_endpgm3425;3426; GFX11-LABEL: global_cmpxchg_saddr_i32_nortn_neg128:3427; GFX11: ; %bb.0:3428; GFX11-NEXT: v_mov_b32_e32 v3, v13429; GFX11-NEXT: global_atomic_cmpswap_b32 v0, v[2:3], s[2:3] offset:-1283430; GFX11-NEXT: s_waitcnt_vscnt null, 0x03431; GFX11-NEXT: buffer_gl1_inv3432; GFX11-NEXT: buffer_gl0_inv3433; GFX11-NEXT: s_endpgm3434;3435; GFX12-LABEL: global_cmpxchg_saddr_i32_nortn_neg128:3436; GFX12: ; %bb.0:3437; GFX12-NEXT: v_mov_b32_e32 v3, v13438; GFX12-NEXT: global_wb scope:SCOPE_SYS3439; GFX12-NEXT: s_wait_storecnt 0x03440; GFX12-NEXT: global_atomic_cmpswap_b32 v0, v[2:3], s[2:3] offset:-128 scope:SCOPE_SYS3441; GFX12-NEXT: s_wait_storecnt 0x03442; GFX12-NEXT: global_inv scope:SCOPE_SYS3443; GFX12-NEXT: s_endpgm3444 %zext.offset = zext i32 %voffset to i643445 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3446 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283447 %unused = cmpxchg ptr addrspace(1) %gep1, i32 %cmp, i32 %data seq_cst seq_cst3448 ret void3449}3450 3451define amdgpu_ps <2 x float> @global_cmpxchg_saddr_i64_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %cmp, i64 %data) {3452; GFX9-LABEL: global_cmpxchg_saddr_i64_rtn:3453; GFX9: ; %bb.0:3454; GFX9-NEXT: v_mov_b32_e32 v6, v23455; GFX9-NEXT: v_mov_b32_e32 v5, v13456; GFX9-NEXT: global_atomic_cmpswap_x2 v[0:1], v0, v[3:6], s[2:3] glc3457; GFX9-NEXT: s_waitcnt vmcnt(0)3458; GFX9-NEXT: buffer_wbinvl13459; GFX9-NEXT: ; return to shader part epilog3460;3461; GFX10-LABEL: global_cmpxchg_saddr_i64_rtn:3462; GFX10: ; %bb.0:3463; GFX10-NEXT: v_mov_b32_e32 v6, v23464; GFX10-NEXT: v_mov_b32_e32 v5, v13465; GFX10-NEXT: global_atomic_cmpswap_x2 v[0:1], v0, v[3:6], s[2:3] glc3466; GFX10-NEXT: s_waitcnt vmcnt(0)3467; GFX10-NEXT: buffer_gl1_inv3468; GFX10-NEXT: buffer_gl0_inv3469; GFX10-NEXT: ; return to shader part epilog3470;3471; GFX11-LABEL: global_cmpxchg_saddr_i64_rtn:3472; GFX11: ; %bb.0:3473; GFX11-NEXT: v_mov_b32_e32 v6, v23474; GFX11-NEXT: v_mov_b32_e32 v5, v13475; GFX11-NEXT: global_atomic_cmpswap_b64 v[0:1], v0, v[3:6], s[2:3] glc3476; GFX11-NEXT: s_waitcnt vmcnt(0)3477; GFX11-NEXT: buffer_gl1_inv3478; GFX11-NEXT: buffer_gl0_inv3479; GFX11-NEXT: ; return to shader part epilog3480;3481; GFX12-LABEL: global_cmpxchg_saddr_i64_rtn:3482; GFX12: ; %bb.0:3483; GFX12-NEXT: v_mov_b32_e32 v6, v23484; GFX12-NEXT: v_mov_b32_e32 v5, v13485; GFX12-NEXT: global_wb scope:SCOPE_SYS3486; GFX12-NEXT: s_wait_storecnt 0x03487; GFX12-NEXT: global_atomic_cmpswap_b64 v[0:1], v0, v[3:6], s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_SYS3488; GFX12-NEXT: s_wait_loadcnt 0x03489; GFX12-NEXT: global_inv scope:SCOPE_SYS3490; GFX12-NEXT: s_wait_loadcnt 0x03491; GFX12-NEXT: ; return to shader part epilog3492 %zext.offset = zext i32 %voffset to i643493 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3494 %cmpxchg = cmpxchg ptr addrspace(1) %gep0, i64 %cmp, i64 %data seq_cst seq_cst3495 %rtn = extractvalue { i64, i1 } %cmpxchg, 03496 %cast.rtn = bitcast i64 %rtn to <2 x float>3497 ret <2 x float> %cast.rtn3498}3499 3500define amdgpu_ps <2 x float> @global_cmpxchg_saddr_i64_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %cmp, i64 %data) {3501; GFX9-LABEL: global_cmpxchg_saddr_i64_rtn_neg128:3502; GFX9: ; %bb.0:3503; GFX9-NEXT: v_mov_b32_e32 v6, v23504; GFX9-NEXT: v_mov_b32_e32 v5, v13505; GFX9-NEXT: global_atomic_cmpswap_x2 v[0:1], v0, v[3:6], s[2:3] offset:-128 glc3506; GFX9-NEXT: s_waitcnt vmcnt(0)3507; GFX9-NEXT: buffer_wbinvl13508; GFX9-NEXT: ; return to shader part epilog3509;3510; GFX10-LABEL: global_cmpxchg_saddr_i64_rtn_neg128:3511; GFX10: ; %bb.0:3512; GFX10-NEXT: v_mov_b32_e32 v6, v23513; GFX10-NEXT: v_mov_b32_e32 v5, v13514; GFX10-NEXT: global_atomic_cmpswap_x2 v[0:1], v0, v[3:6], s[2:3] offset:-128 glc3515; GFX10-NEXT: s_waitcnt vmcnt(0)3516; GFX10-NEXT: buffer_gl1_inv3517; GFX10-NEXT: buffer_gl0_inv3518; GFX10-NEXT: ; return to shader part epilog3519;3520; GFX11-LABEL: global_cmpxchg_saddr_i64_rtn_neg128:3521; GFX11: ; %bb.0:3522; GFX11-NEXT: v_mov_b32_e32 v6, v23523; GFX11-NEXT: v_mov_b32_e32 v5, v13524; GFX11-NEXT: global_atomic_cmpswap_b64 v[0:1], v0, v[3:6], s[2:3] offset:-128 glc3525; GFX11-NEXT: s_waitcnt vmcnt(0)3526; GFX11-NEXT: buffer_gl1_inv3527; GFX11-NEXT: buffer_gl0_inv3528; GFX11-NEXT: ; return to shader part epilog3529;3530; GFX12-LABEL: global_cmpxchg_saddr_i64_rtn_neg128:3531; GFX12: ; %bb.0:3532; GFX12-NEXT: v_mov_b32_e32 v6, v23533; GFX12-NEXT: v_mov_b32_e32 v5, v13534; GFX12-NEXT: global_wb scope:SCOPE_SYS3535; GFX12-NEXT: s_wait_storecnt 0x03536; GFX12-NEXT: global_atomic_cmpswap_b64 v[0:1], v0, v[3:6], s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_SYS3537; GFX12-NEXT: s_wait_loadcnt 0x03538; GFX12-NEXT: global_inv scope:SCOPE_SYS3539; GFX12-NEXT: s_wait_loadcnt 0x03540; GFX12-NEXT: ; return to shader part epilog3541 %zext.offset = zext i32 %voffset to i643542 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3543 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283544 %cmpxchg = cmpxchg ptr addrspace(1) %gep1, i64 %cmp, i64 %data seq_cst seq_cst3545 %rtn = extractvalue { i64, i1 } %cmpxchg, 03546 %cast.rtn = bitcast i64 %rtn to <2 x float>3547 ret <2 x float> %cast.rtn3548}3549 3550define amdgpu_ps void @global_cmpxchg_saddr_i64_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %cmp, i64 %data) {3551; GFX9-LABEL: global_cmpxchg_saddr_i64_nortn:3552; GFX9: ; %bb.0:3553; GFX9-NEXT: v_mov_b32_e32 v6, v23554; GFX9-NEXT: v_mov_b32_e32 v5, v13555; GFX9-NEXT: global_atomic_cmpswap_x2 v0, v[3:6], s[2:3]3556; GFX9-NEXT: s_waitcnt vmcnt(0)3557; GFX9-NEXT: buffer_wbinvl13558; GFX9-NEXT: s_endpgm3559;3560; GFX10-LABEL: global_cmpxchg_saddr_i64_nortn:3561; GFX10: ; %bb.0:3562; GFX10-NEXT: v_mov_b32_e32 v6, v23563; GFX10-NEXT: v_mov_b32_e32 v5, v13564; GFX10-NEXT: global_atomic_cmpswap_x2 v0, v[3:6], s[2:3]3565; GFX10-NEXT: s_waitcnt_vscnt null, 0x03566; GFX10-NEXT: buffer_gl1_inv3567; GFX10-NEXT: buffer_gl0_inv3568; GFX10-NEXT: s_endpgm3569;3570; GFX11-LABEL: global_cmpxchg_saddr_i64_nortn:3571; GFX11: ; %bb.0:3572; GFX11-NEXT: v_mov_b32_e32 v6, v23573; GFX11-NEXT: v_mov_b32_e32 v5, v13574; GFX11-NEXT: global_atomic_cmpswap_b64 v0, v[3:6], s[2:3]3575; GFX11-NEXT: s_waitcnt_vscnt null, 0x03576; GFX11-NEXT: buffer_gl1_inv3577; GFX11-NEXT: buffer_gl0_inv3578; GFX11-NEXT: s_endpgm3579;3580; GFX12-LABEL: global_cmpxchg_saddr_i64_nortn:3581; GFX12: ; %bb.0:3582; GFX12-NEXT: v_mov_b32_e32 v6, v23583; GFX12-NEXT: v_mov_b32_e32 v5, v13584; GFX12-NEXT: global_wb scope:SCOPE_SYS3585; GFX12-NEXT: s_wait_storecnt 0x03586; GFX12-NEXT: global_atomic_cmpswap_b64 v0, v[3:6], s[2:3] scope:SCOPE_SYS3587; GFX12-NEXT: s_wait_storecnt 0x03588; GFX12-NEXT: global_inv scope:SCOPE_SYS3589; GFX12-NEXT: s_endpgm3590 %zext.offset = zext i32 %voffset to i643591 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3592 %unused = cmpxchg ptr addrspace(1) %gep0, i64 %cmp, i64 %data seq_cst seq_cst3593 ret void3594}3595 3596define amdgpu_ps void @global_cmpxchg_saddr_i64_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %cmp, i64 %data) {3597; GFX9-LABEL: global_cmpxchg_saddr_i64_nortn_neg128:3598; GFX9: ; %bb.0:3599; GFX9-NEXT: v_mov_b32_e32 v6, v23600; GFX9-NEXT: v_mov_b32_e32 v5, v13601; GFX9-NEXT: global_atomic_cmpswap_x2 v0, v[3:6], s[2:3] offset:-1283602; GFX9-NEXT: s_waitcnt vmcnt(0)3603; GFX9-NEXT: buffer_wbinvl13604; GFX9-NEXT: s_endpgm3605;3606; GFX10-LABEL: global_cmpxchg_saddr_i64_nortn_neg128:3607; GFX10: ; %bb.0:3608; GFX10-NEXT: v_mov_b32_e32 v6, v23609; GFX10-NEXT: v_mov_b32_e32 v5, v13610; GFX10-NEXT: global_atomic_cmpswap_x2 v0, v[3:6], s[2:3] offset:-1283611; GFX10-NEXT: s_waitcnt_vscnt null, 0x03612; GFX10-NEXT: buffer_gl1_inv3613; GFX10-NEXT: buffer_gl0_inv3614; GFX10-NEXT: s_endpgm3615;3616; GFX11-LABEL: global_cmpxchg_saddr_i64_nortn_neg128:3617; GFX11: ; %bb.0:3618; GFX11-NEXT: v_mov_b32_e32 v6, v23619; GFX11-NEXT: v_mov_b32_e32 v5, v13620; GFX11-NEXT: global_atomic_cmpswap_b64 v0, v[3:6], s[2:3] offset:-1283621; GFX11-NEXT: s_waitcnt_vscnt null, 0x03622; GFX11-NEXT: buffer_gl1_inv3623; GFX11-NEXT: buffer_gl0_inv3624; GFX11-NEXT: s_endpgm3625;3626; GFX12-LABEL: global_cmpxchg_saddr_i64_nortn_neg128:3627; GFX12: ; %bb.0:3628; GFX12-NEXT: v_mov_b32_e32 v6, v23629; GFX12-NEXT: v_mov_b32_e32 v5, v13630; GFX12-NEXT: global_wb scope:SCOPE_SYS3631; GFX12-NEXT: s_wait_storecnt 0x03632; GFX12-NEXT: global_atomic_cmpswap_b64 v0, v[3:6], s[2:3] offset:-128 scope:SCOPE_SYS3633; GFX12-NEXT: s_wait_storecnt 0x03634; GFX12-NEXT: global_inv scope:SCOPE_SYS3635; GFX12-NEXT: s_endpgm3636 %zext.offset = zext i32 %voffset to i643637 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3638 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283639 %unused = cmpxchg ptr addrspace(1) %gep1, i64 %cmp, i64 %data seq_cst seq_cst3640 ret void3641}3642 3643; --------------------------------------------------------------------------------3644; amdgcn atomic inc3645; --------------------------------------------------------------------------------3646 3647define amdgpu_ps float @global_inc_saddr_i32_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {3648; GCN-LABEL: global_inc_saddr_i32_rtn:3649; GCN: ; %bb.0:3650; GCN-NEXT: global_atomic_inc v0, v0, v1, s[2:3] glc3651; GCN-NEXT: s_waitcnt vmcnt(0)3652; GCN-NEXT: ; return to shader part epilog3653;3654; GFX11-LABEL: global_inc_saddr_i32_rtn:3655; GFX11: ; %bb.0:3656; GFX11-NEXT: global_atomic_inc_u32 v0, v0, v1, s[2:3] glc3657; GFX11-NEXT: s_waitcnt vmcnt(0)3658; GFX11-NEXT: ; return to shader part epilog3659;3660; GFX12-LABEL: global_inc_saddr_i32_rtn:3661; GFX12: ; %bb.0:3662; GFX12-NEXT: global_atomic_inc_u32 v0, v0, v1, s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_DEV3663; GFX12-NEXT: s_wait_loadcnt 0x03664; GFX12-NEXT: ; return to shader part epilog3665 %zext.offset = zext i32 %voffset to i643666 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3667 %rtn = atomicrmw uinc_wrap ptr addrspace(1) %gep0, i32 %data syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !03668 %cast.rtn = bitcast i32 %rtn to float3669 ret float %cast.rtn3670}3671 3672define amdgpu_ps float @global_inc_saddr_i32_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {3673; GCN-LABEL: global_inc_saddr_i32_rtn_neg128:3674; GCN: ; %bb.0:3675; GCN-NEXT: global_atomic_inc v0, v0, v1, s[2:3] offset:-128 glc3676; GCN-NEXT: s_waitcnt vmcnt(0)3677; GCN-NEXT: ; return to shader part epilog3678;3679; GFX11-LABEL: global_inc_saddr_i32_rtn_neg128:3680; GFX11: ; %bb.0:3681; GFX11-NEXT: global_atomic_inc_u32 v0, v0, v1, s[2:3] offset:-128 glc3682; GFX11-NEXT: s_waitcnt vmcnt(0)3683; GFX11-NEXT: ; return to shader part epilog3684;3685; GFX12-LABEL: global_inc_saddr_i32_rtn_neg128:3686; GFX12: ; %bb.0:3687; GFX12-NEXT: global_atomic_inc_u32 v0, v0, v1, s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_DEV3688; GFX12-NEXT: s_wait_loadcnt 0x03689; GFX12-NEXT: ; return to shader part epilog3690 %zext.offset = zext i32 %voffset to i643691 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3692 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283693 %rtn = atomicrmw uinc_wrap ptr addrspace(1) %gep1, i32 %data syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !03694 %cast.rtn = bitcast i32 %rtn to float3695 ret float %cast.rtn3696}3697 3698define amdgpu_ps void @global_inc_saddr_i32_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {3699; GCN-LABEL: global_inc_saddr_i32_nortn:3700; GCN: ; %bb.0:3701; GCN-NEXT: global_atomic_inc v0, v1, s[2:3]3702; GCN-NEXT: s_endpgm3703;3704; GFX11-LABEL: global_inc_saddr_i32_nortn:3705; GFX11: ; %bb.0:3706; GFX11-NEXT: global_atomic_inc_u32 v0, v1, s[2:3]3707; GFX11-NEXT: s_endpgm3708;3709; GFX12-LABEL: global_inc_saddr_i32_nortn:3710; GFX12: ; %bb.0:3711; GFX12-NEXT: global_atomic_inc_u32 v0, v1, s[2:3] scope:SCOPE_DEV3712; GFX12-NEXT: s_endpgm3713 %zext.offset = zext i32 %voffset to i643714 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3715 %unused = atomicrmw uinc_wrap ptr addrspace(1) %gep0, i32 %data syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !03716 ret void3717}3718 3719define amdgpu_ps void @global_inc_saddr_i32_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {3720; GCN-LABEL: global_inc_saddr_i32_nortn_neg128:3721; GCN: ; %bb.0:3722; GCN-NEXT: global_atomic_inc v0, v1, s[2:3] offset:-1283723; GCN-NEXT: s_endpgm3724;3725; GFX11-LABEL: global_inc_saddr_i32_nortn_neg128:3726; GFX11: ; %bb.0:3727; GFX11-NEXT: global_atomic_inc_u32 v0, v1, s[2:3] offset:-1283728; GFX11-NEXT: s_endpgm3729;3730; GFX12-LABEL: global_inc_saddr_i32_nortn_neg128:3731; GFX12: ; %bb.0:3732; GFX12-NEXT: global_atomic_inc_u32 v0, v1, s[2:3] offset:-128 scope:SCOPE_DEV3733; GFX12-NEXT: s_endpgm3734 %zext.offset = zext i32 %voffset to i643735 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3736 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283737 %unused = atomicrmw uinc_wrap ptr addrspace(1) %gep1, i32 %data syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !03738 ret void3739}3740 3741define amdgpu_ps <2 x float> @global_inc_saddr_i64_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {3742; GCN-LABEL: global_inc_saddr_i64_rtn:3743; GCN: ; %bb.0:3744; GCN-NEXT: global_atomic_inc_x2 v[0:1], v0, v[1:2], s[2:3] glc3745; GCN-NEXT: s_waitcnt vmcnt(0)3746; GCN-NEXT: ; return to shader part epilog3747;3748; GFX11-LABEL: global_inc_saddr_i64_rtn:3749; GFX11: ; %bb.0:3750; GFX11-NEXT: global_atomic_inc_u64 v[0:1], v0, v[1:2], s[2:3] glc3751; GFX11-NEXT: s_waitcnt vmcnt(0)3752; GFX11-NEXT: ; return to shader part epilog3753;3754; GFX12-LABEL: global_inc_saddr_i64_rtn:3755; GFX12: ; %bb.0:3756; GFX12-NEXT: global_atomic_inc_u64 v[0:1], v0, v[1:2], s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_DEV3757; GFX12-NEXT: s_wait_loadcnt 0x03758; GFX12-NEXT: ; return to shader part epilog3759 %zext.offset = zext i32 %voffset to i643760 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3761 %rtn = atomicrmw uinc_wrap ptr addrspace(1) %gep0, i64 %data syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !03762 %cast.rtn = bitcast i64 %rtn to <2 x float>3763 ret <2 x float> %cast.rtn3764}3765 3766define amdgpu_ps <2 x float> @global_inc_saddr_i64_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {3767; GCN-LABEL: global_inc_saddr_i64_rtn_neg128:3768; GCN: ; %bb.0:3769; GCN-NEXT: global_atomic_inc_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc3770; GCN-NEXT: s_waitcnt vmcnt(0)3771; GCN-NEXT: ; return to shader part epilog3772;3773; GFX11-LABEL: global_inc_saddr_i64_rtn_neg128:3774; GFX11: ; %bb.0:3775; GFX11-NEXT: global_atomic_inc_u64 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc3776; GFX11-NEXT: s_waitcnt vmcnt(0)3777; GFX11-NEXT: ; return to shader part epilog3778;3779; GFX12-LABEL: global_inc_saddr_i64_rtn_neg128:3780; GFX12: ; %bb.0:3781; GFX12-NEXT: global_atomic_inc_u64 v[0:1], v0, v[1:2], s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_DEV3782; GFX12-NEXT: s_wait_loadcnt 0x03783; GFX12-NEXT: ; return to shader part epilog3784 %zext.offset = zext i32 %voffset to i643785 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3786 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283787 %rtn = atomicrmw uinc_wrap ptr addrspace(1) %gep1, i64 %data syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !03788 %cast.rtn = bitcast i64 %rtn to <2 x float>3789 ret <2 x float> %cast.rtn3790}3791 3792define amdgpu_ps void @global_inc_saddr_i64_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {3793; GCN-LABEL: global_inc_saddr_i64_nortn:3794; GCN: ; %bb.0:3795; GCN-NEXT: global_atomic_inc_x2 v0, v[1:2], s[2:3]3796; GCN-NEXT: s_endpgm3797;3798; GFX11-LABEL: global_inc_saddr_i64_nortn:3799; GFX11: ; %bb.0:3800; GFX11-NEXT: global_atomic_inc_u64 v0, v[1:2], s[2:3]3801; GFX11-NEXT: s_endpgm3802;3803; GFX12-LABEL: global_inc_saddr_i64_nortn:3804; GFX12: ; %bb.0:3805; GFX12-NEXT: global_atomic_inc_u64 v0, v[1:2], s[2:3] scope:SCOPE_DEV3806; GFX12-NEXT: s_endpgm3807 %zext.offset = zext i32 %voffset to i643808 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3809 %unused = atomicrmw uinc_wrap ptr addrspace(1) %gep0, i64 %data syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !03810 ret void3811}3812 3813define amdgpu_ps void @global_inc_saddr_i64_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {3814; GCN-LABEL: global_inc_saddr_i64_nortn_neg128:3815; GCN: ; %bb.0:3816; GCN-NEXT: global_atomic_inc_x2 v0, v[1:2], s[2:3] offset:-1283817; GCN-NEXT: s_endpgm3818;3819; GFX11-LABEL: global_inc_saddr_i64_nortn_neg128:3820; GFX11: ; %bb.0:3821; GFX11-NEXT: global_atomic_inc_u64 v0, v[1:2], s[2:3] offset:-1283822; GFX11-NEXT: s_endpgm3823;3824; GFX12-LABEL: global_inc_saddr_i64_nortn_neg128:3825; GFX12: ; %bb.0:3826; GFX12-NEXT: global_atomic_inc_u64 v0, v[1:2], s[2:3] offset:-128 scope:SCOPE_DEV3827; GFX12-NEXT: s_endpgm3828 %zext.offset = zext i32 %voffset to i643829 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3830 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283831 %unused = atomicrmw uinc_wrap ptr addrspace(1) %gep1, i64 %data syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !03832 ret void3833}3834 3835; --------------------------------------------------------------------------------3836; amdgcn atomic dec3837; --------------------------------------------------------------------------------3838 3839 3840define amdgpu_ps float @global_dec_saddr_i32_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {3841; GCN-LABEL: global_dec_saddr_i32_rtn:3842; GCN: ; %bb.0:3843; GCN-NEXT: global_atomic_dec v0, v0, v1, s[2:3] glc3844; GCN-NEXT: s_waitcnt vmcnt(0)3845; GCN-NEXT: ; return to shader part epilog3846;3847; GFX11-LABEL: global_dec_saddr_i32_rtn:3848; GFX11: ; %bb.0:3849; GFX11-NEXT: global_atomic_dec_u32 v0, v0, v1, s[2:3] glc3850; GFX11-NEXT: s_waitcnt vmcnt(0)3851; GFX11-NEXT: ; return to shader part epilog3852;3853; GFX12-LABEL: global_dec_saddr_i32_rtn:3854; GFX12: ; %bb.0:3855; GFX12-NEXT: global_atomic_dec_u32 v0, v0, v1, s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_DEV3856; GFX12-NEXT: s_wait_loadcnt 0x03857; GFX12-NEXT: ; return to shader part epilog3858 %zext.offset = zext i32 %voffset to i643859 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3860 %rtn = atomicrmw udec_wrap ptr addrspace(1) %gep0, i32 %data syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !03861 %cast.rtn = bitcast i32 %rtn to float3862 ret float %cast.rtn3863}3864 3865define amdgpu_ps float @global_dec_saddr_i32_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {3866; GCN-LABEL: global_dec_saddr_i32_rtn_neg128:3867; GCN: ; %bb.0:3868; GCN-NEXT: global_atomic_dec v0, v0, v1, s[2:3] offset:-128 glc3869; GCN-NEXT: s_waitcnt vmcnt(0)3870; GCN-NEXT: ; return to shader part epilog3871;3872; GFX11-LABEL: global_dec_saddr_i32_rtn_neg128:3873; GFX11: ; %bb.0:3874; GFX11-NEXT: global_atomic_dec_u32 v0, v0, v1, s[2:3] offset:-128 glc3875; GFX11-NEXT: s_waitcnt vmcnt(0)3876; GFX11-NEXT: ; return to shader part epilog3877;3878; GFX12-LABEL: global_dec_saddr_i32_rtn_neg128:3879; GFX12: ; %bb.0:3880; GFX12-NEXT: global_atomic_dec_u32 v0, v0, v1, s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_DEV3881; GFX12-NEXT: s_wait_loadcnt 0x03882; GFX12-NEXT: ; return to shader part epilog3883 %zext.offset = zext i32 %voffset to i643884 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3885 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283886 %rtn = atomicrmw udec_wrap ptr addrspace(1) %gep1, i32 %data syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !03887 %cast.rtn = bitcast i32 %rtn to float3888 ret float %cast.rtn3889}3890 3891define amdgpu_ps void @global_dec_saddr_i32_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {3892; GCN-LABEL: global_dec_saddr_i32_nortn:3893; GCN: ; %bb.0:3894; GCN-NEXT: global_atomic_dec v0, v1, s[2:3]3895; GCN-NEXT: s_endpgm3896;3897; GFX11-LABEL: global_dec_saddr_i32_nortn:3898; GFX11: ; %bb.0:3899; GFX11-NEXT: global_atomic_dec_u32 v0, v1, s[2:3]3900; GFX11-NEXT: s_endpgm3901;3902; GFX12-LABEL: global_dec_saddr_i32_nortn:3903; GFX12: ; %bb.0:3904; GFX12-NEXT: global_atomic_dec_u32 v0, v1, s[2:3] scope:SCOPE_DEV3905; GFX12-NEXT: s_endpgm3906 %zext.offset = zext i32 %voffset to i643907 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3908 %unused = atomicrmw udec_wrap ptr addrspace(1) %gep0, i32 %data syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !03909 ret void3910}3911 3912define amdgpu_ps void @global_dec_saddr_i32_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {3913; GCN-LABEL: global_dec_saddr_i32_nortn_neg128:3914; GCN: ; %bb.0:3915; GCN-NEXT: global_atomic_dec v0, v1, s[2:3] offset:-1283916; GCN-NEXT: s_endpgm3917;3918; GFX11-LABEL: global_dec_saddr_i32_nortn_neg128:3919; GFX11: ; %bb.0:3920; GFX11-NEXT: global_atomic_dec_u32 v0, v1, s[2:3] offset:-1283921; GFX11-NEXT: s_endpgm3922;3923; GFX12-LABEL: global_dec_saddr_i32_nortn_neg128:3924; GFX12: ; %bb.0:3925; GFX12-NEXT: global_atomic_dec_u32 v0, v1, s[2:3] offset:-128 scope:SCOPE_DEV3926; GFX12-NEXT: s_endpgm3927 %zext.offset = zext i32 %voffset to i643928 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3929 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283930 %unused = atomicrmw udec_wrap ptr addrspace(1) %gep1, i32 %data syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !03931 ret void3932}3933 3934define amdgpu_ps <2 x float> @global_dec_saddr_i64_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {3935; GCN-LABEL: global_dec_saddr_i64_rtn:3936; GCN: ; %bb.0:3937; GCN-NEXT: global_atomic_dec_x2 v[0:1], v0, v[1:2], s[2:3] glc3938; GCN-NEXT: s_waitcnt vmcnt(0)3939; GCN-NEXT: ; return to shader part epilog3940;3941; GFX11-LABEL: global_dec_saddr_i64_rtn:3942; GFX11: ; %bb.0:3943; GFX11-NEXT: global_atomic_dec_u64 v[0:1], v0, v[1:2], s[2:3] glc3944; GFX11-NEXT: s_waitcnt vmcnt(0)3945; GFX11-NEXT: ; return to shader part epilog3946;3947; GFX12-LABEL: global_dec_saddr_i64_rtn:3948; GFX12: ; %bb.0:3949; GFX12-NEXT: global_atomic_dec_u64 v[0:1], v0, v[1:2], s[2:3] th:TH_ATOMIC_RETURN scope:SCOPE_DEV3950; GFX12-NEXT: s_wait_loadcnt 0x03951; GFX12-NEXT: ; return to shader part epilog3952 %zext.offset = zext i32 %voffset to i643953 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3954 %rtn = atomicrmw udec_wrap ptr addrspace(1) %gep0, i64 %data syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !03955 %cast.rtn = bitcast i64 %rtn to <2 x float>3956 ret <2 x float> %cast.rtn3957}3958 3959define amdgpu_ps <2 x float> @global_dec_saddr_i64_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {3960; GCN-LABEL: global_dec_saddr_i64_rtn_neg128:3961; GCN: ; %bb.0:3962; GCN-NEXT: global_atomic_dec_x2 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc3963; GCN-NEXT: s_waitcnt vmcnt(0)3964; GCN-NEXT: ; return to shader part epilog3965;3966; GFX11-LABEL: global_dec_saddr_i64_rtn_neg128:3967; GFX11: ; %bb.0:3968; GFX11-NEXT: global_atomic_dec_u64 v[0:1], v0, v[1:2], s[2:3] offset:-128 glc3969; GFX11-NEXT: s_waitcnt vmcnt(0)3970; GFX11-NEXT: ; return to shader part epilog3971;3972; GFX12-LABEL: global_dec_saddr_i64_rtn_neg128:3973; GFX12: ; %bb.0:3974; GFX12-NEXT: global_atomic_dec_u64 v[0:1], v0, v[1:2], s[2:3] offset:-128 th:TH_ATOMIC_RETURN scope:SCOPE_DEV3975; GFX12-NEXT: s_wait_loadcnt 0x03976; GFX12-NEXT: ; return to shader part epilog3977 %zext.offset = zext i32 %voffset to i643978 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3979 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283980 %rtn = atomicrmw udec_wrap ptr addrspace(1) %gep1, i64 %data syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !03981 %cast.rtn = bitcast i64 %rtn to <2 x float>3982 ret <2 x float> %cast.rtn3983}3984 3985define amdgpu_ps void @global_dec_saddr_i64_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {3986; GCN-LABEL: global_dec_saddr_i64_nortn:3987; GCN: ; %bb.0:3988; GCN-NEXT: global_atomic_dec_x2 v0, v[1:2], s[2:3]3989; GCN-NEXT: s_endpgm3990;3991; GFX11-LABEL: global_dec_saddr_i64_nortn:3992; GFX11: ; %bb.0:3993; GFX11-NEXT: global_atomic_dec_u64 v0, v[1:2], s[2:3]3994; GFX11-NEXT: s_endpgm3995;3996; GFX12-LABEL: global_dec_saddr_i64_nortn:3997; GFX12: ; %bb.0:3998; GFX12-NEXT: global_atomic_dec_u64 v0, v[1:2], s[2:3] scope:SCOPE_DEV3999; GFX12-NEXT: s_endpgm4000 %zext.offset = zext i32 %voffset to i644001 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset4002 %unused = atomicrmw udec_wrap ptr addrspace(1) %gep0, i64 %data syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !04003 ret void4004}4005 4006define amdgpu_ps void @global_dec_saddr_i64_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {4007; GCN-LABEL: global_dec_saddr_i64_nortn_neg128:4008; GCN: ; %bb.0:4009; GCN-NEXT: global_atomic_dec_x2 v0, v[1:2], s[2:3] offset:-1284010; GCN-NEXT: s_endpgm4011;4012; GFX11-LABEL: global_dec_saddr_i64_nortn_neg128:4013; GFX11: ; %bb.0:4014; GFX11-NEXT: global_atomic_dec_u64 v0, v[1:2], s[2:3] offset:-1284015; GFX11-NEXT: s_endpgm4016;4017; GFX12-LABEL: global_dec_saddr_i64_nortn_neg128:4018; GFX12: ; %bb.0:4019; GFX12-NEXT: global_atomic_dec_u64 v0, v[1:2], s[2:3] offset:-128 scope:SCOPE_DEV4020; GFX12-NEXT: s_endpgm4021 %zext.offset = zext i32 %voffset to i644022 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset4023 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1284024 %unused = atomicrmw udec_wrap ptr addrspace(1) %gep1, i64 %data syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !04025 ret void4026}4027 4028attributes #0 = { argmemonly nounwind willreturn }4029 4030!0 = !{}4031