926 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn -mcpu=gfx90a -amdgpu-atomic-optimizer-strategy=None -o - %s | FileCheck %s3 4%S = type <{ float, double }>5 6; The result of that atomic ops should not be used as a uniform value.7 8define protected amdgpu_kernel void @add(ptr addrspace(1) %p, ptr addrspace(1) %q) {9; CHECK-LABEL: add:10; CHECK: ; %bb.0:11; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2412; CHECK-NEXT: v_mov_b32_e32 v0, 013; CHECK-NEXT: v_mov_b32_e32 v1, 114; CHECK-NEXT: s_waitcnt lgkmcnt(0)15; CHECK-NEXT: global_atomic_add v2, v0, v1, s[0:1] glc16; CHECK-NEXT: v_mov_b32_e32 v0, s217; CHECK-NEXT: v_mov_b32_e32 v1, s318; CHECK-NEXT: s_waitcnt vmcnt(0)19; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, 12, v[0:1]20; CHECK-NEXT: v_mov_b32_e32 v2, 1.021; CHECK-NEXT: global_store_dword v[0:1], v2, off22; CHECK-NEXT: s_endpgm23 %n32 = atomicrmw add ptr addrspace(1) %p, i32 1 syncscope("agent") monotonic24 %n64 = zext i32 %n32 to i6425 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 026 store float 1.0, ptr addrspace(1) %p127 ret void28}29 30define protected amdgpu_kernel void @sub(ptr addrspace(1) %p, ptr addrspace(1) %q) {31; CHECK-LABEL: sub:32; CHECK: ; %bb.0:33; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2434; CHECK-NEXT: v_mov_b32_e32 v0, 035; CHECK-NEXT: v_mov_b32_e32 v1, 136; CHECK-NEXT: s_waitcnt lgkmcnt(0)37; CHECK-NEXT: global_atomic_sub v2, v0, v1, s[0:1] glc38; CHECK-NEXT: v_mov_b32_e32 v0, s239; CHECK-NEXT: v_mov_b32_e32 v1, s340; CHECK-NEXT: s_waitcnt vmcnt(0)41; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, 12, v[0:1]42; CHECK-NEXT: v_mov_b32_e32 v2, 1.043; CHECK-NEXT: global_store_dword v[0:1], v2, off44; CHECK-NEXT: s_endpgm45 %n32 = atomicrmw sub ptr addrspace(1) %p, i32 1 syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !046 %n64 = zext i32 %n32 to i6447 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 048 store float 1.0, ptr addrspace(1) %p149 ret void50}51 52define protected amdgpu_kernel void @and(ptr addrspace(1) %p, ptr addrspace(1) %q) {53; CHECK-LABEL: and:54; CHECK: ; %bb.0:55; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2456; CHECK-NEXT: v_mov_b32_e32 v0, 057; CHECK-NEXT: v_mov_b32_e32 v1, 158; CHECK-NEXT: s_waitcnt lgkmcnt(0)59; CHECK-NEXT: global_atomic_and v2, v0, v1, s[0:1] glc60; CHECK-NEXT: v_mov_b32_e32 v0, s261; CHECK-NEXT: v_mov_b32_e32 v1, s362; CHECK-NEXT: s_waitcnt vmcnt(0)63; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, 12, v[0:1]64; CHECK-NEXT: v_mov_b32_e32 v2, 1.065; CHECK-NEXT: global_store_dword v[0:1], v2, off66; CHECK-NEXT: s_endpgm67 %n32 = atomicrmw and ptr addrspace(1) %p, i32 1 syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !068 %n64 = zext i32 %n32 to i6469 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 070 store float 1.0, ptr addrspace(1) %p171 ret void72}73 74define protected amdgpu_kernel void @or(ptr addrspace(1) %p, ptr addrspace(1) %q) {75; CHECK-LABEL: or:76; CHECK: ; %bb.0:77; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2478; CHECK-NEXT: v_mov_b32_e32 v0, 079; CHECK-NEXT: v_mov_b32_e32 v1, 180; CHECK-NEXT: s_waitcnt lgkmcnt(0)81; CHECK-NEXT: global_atomic_or v2, v0, v1, s[0:1] glc82; CHECK-NEXT: v_mov_b32_e32 v0, s283; CHECK-NEXT: v_mov_b32_e32 v1, s384; CHECK-NEXT: s_waitcnt vmcnt(0)85; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, 12, v[0:1]86; CHECK-NEXT: v_mov_b32_e32 v2, 1.087; CHECK-NEXT: global_store_dword v[0:1], v2, off88; CHECK-NEXT: s_endpgm89 %n32 = atomicrmw or ptr addrspace(1) %p, i32 1 syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !090 %n64 = zext i32 %n32 to i6491 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 092 store float 1.0, ptr addrspace(1) %p193 ret void94}95 96define protected amdgpu_kernel void @xor(ptr addrspace(1) %p, ptr addrspace(1) %q) {97; CHECK-LABEL: xor:98; CHECK: ; %bb.0:99; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24100; CHECK-NEXT: v_mov_b32_e32 v0, 0101; CHECK-NEXT: v_mov_b32_e32 v1, 1102; CHECK-NEXT: s_waitcnt lgkmcnt(0)103; CHECK-NEXT: global_atomic_xor v2, v0, v1, s[0:1] glc104; CHECK-NEXT: v_mov_b32_e32 v0, s2105; CHECK-NEXT: v_mov_b32_e32 v1, s3106; CHECK-NEXT: s_waitcnt vmcnt(0)107; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, 12, v[0:1]108; CHECK-NEXT: v_mov_b32_e32 v2, 1.0109; CHECK-NEXT: global_store_dword v[0:1], v2, off110; CHECK-NEXT: s_endpgm111 %n32 = atomicrmw xor ptr addrspace(1) %p, i32 1 syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !0112 %n64 = zext i32 %n32 to i64113 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0114 store float 1.0, ptr addrspace(1) %p1115 ret void116}117 118define protected amdgpu_kernel void @nand(ptr addrspace(1) %p, ptr addrspace(1) %q) {119; CHECK-LABEL: nand:120; CHECK: ; %bb.0:121; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24122; CHECK-NEXT: s_mov_b64 s[4:5], 0123; CHECK-NEXT: v_mov_b32_e32 v2, 0124; CHECK-NEXT: s_waitcnt lgkmcnt(0)125; CHECK-NEXT: s_load_dword s6, s[0:1], 0x0126; CHECK-NEXT: s_waitcnt lgkmcnt(0)127; CHECK-NEXT: v_mov_b32_e32 v1, s6128; CHECK-NEXT: .LBB5_1: ; %atomicrmw.start129; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1130; CHECK-NEXT: v_bfi_b32 v0, v1, -2, -1131; CHECK-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] glc132; CHECK-NEXT: s_waitcnt vmcnt(0)133; CHECK-NEXT: v_cmp_eq_u32_e32 vcc, v0, v1134; CHECK-NEXT: s_or_b64 s[4:5], vcc, s[4:5]135; CHECK-NEXT: v_mov_b32_e32 v1, v0136; CHECK-NEXT: s_andn2_b64 exec, exec, s[4:5]137; CHECK-NEXT: s_cbranch_execnz .LBB5_1138; CHECK-NEXT: ; %bb.2: ; %atomicrmw.end139; CHECK-NEXT: s_or_b64 exec, exec, s[4:5]140; CHECK-NEXT: v_mov_b32_e32 v2, s2141; CHECK-NEXT: v_mov_b32_e32 v3, s3142; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v0, 12, v[2:3]143; CHECK-NEXT: v_mov_b32_e32 v2, 1.0144; CHECK-NEXT: global_store_dword v[0:1], v2, off145; CHECK-NEXT: s_endpgm146 %n32 = atomicrmw nand ptr addrspace(1) %p, i32 1 syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !0147 %n64 = zext i32 %n32 to i64148 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0149 store float 1.0, ptr addrspace(1) %p1150 ret void151}152 153define protected amdgpu_kernel void @max_workgroup(ptr addrspace(1) %p, ptr addrspace(1) %q) {154; CHECK-LABEL: max_workgroup:155; CHECK: ; %bb.0:156; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24157; CHECK-NEXT: v_mov_b32_e32 v0, 0158; CHECK-NEXT: v_mov_b32_e32 v1, 1159; CHECK-NEXT: s_waitcnt lgkmcnt(0)160; CHECK-NEXT: global_atomic_smax v2, v0, v1, s[0:1] glc161; CHECK-NEXT: v_mov_b32_e32 v0, s2162; CHECK-NEXT: v_mov_b32_e32 v1, s3163; CHECK-NEXT: s_waitcnt vmcnt(0)164; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, 12, v[0:1]165; CHECK-NEXT: v_mov_b32_e32 v2, 1.0166; CHECK-NEXT: global_store_dword v[0:1], v2, off167; CHECK-NEXT: s_endpgm168 %n32 = atomicrmw max ptr addrspace(1) %p, i32 1 syncscope("workgroup") monotonic, !amdgpu.no.fine.grained.memory !0169 %n64 = zext i32 %n32 to i64170 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0171 store float 1.0, ptr addrspace(1) %p1172 ret void173}174 175define protected amdgpu_kernel void @max(ptr addrspace(1) %p, ptr addrspace(1) %q) {176; CHECK-LABEL: max:177; CHECK: ; %bb.0:178; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24179; CHECK-NEXT: v_mov_b32_e32 v0, 0180; CHECK-NEXT: v_mov_b32_e32 v1, 1181; CHECK-NEXT: s_waitcnt lgkmcnt(0)182; CHECK-NEXT: global_atomic_smax v2, v0, v1, s[0:1] glc183; CHECK-NEXT: v_mov_b32_e32 v0, s2184; CHECK-NEXT: v_mov_b32_e32 v1, s3185; CHECK-NEXT: s_waitcnt vmcnt(0)186; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, 12, v[0:1]187; CHECK-NEXT: v_mov_b32_e32 v2, 1.0188; CHECK-NEXT: global_store_dword v[0:1], v2, off189; CHECK-NEXT: s_endpgm190 %n32 = atomicrmw max ptr addrspace(1) %p, i32 1 syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !0191 %n64 = zext i32 %n32 to i64192 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0193 store float 1.0, ptr addrspace(1) %p1194 ret void195}196 197define protected amdgpu_kernel void @min_workgroup(ptr addrspace(1) %p, ptr addrspace(1) %q) {198; CHECK-LABEL: min_workgroup:199; CHECK: ; %bb.0:200; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24201; CHECK-NEXT: v_mov_b32_e32 v0, 0202; CHECK-NEXT: v_mov_b32_e32 v1, 1203; CHECK-NEXT: s_waitcnt lgkmcnt(0)204; CHECK-NEXT: global_atomic_smin v2, v0, v1, s[0:1] glc205; CHECK-NEXT: v_mov_b32_e32 v0, s2206; CHECK-NEXT: v_mov_b32_e32 v1, s3207; CHECK-NEXT: s_waitcnt vmcnt(0)208; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, 12, v[0:1]209; CHECK-NEXT: v_mov_b32_e32 v2, 1.0210; CHECK-NEXT: global_store_dword v[0:1], v2, off211; CHECK-NEXT: s_endpgm212 %n32 = atomicrmw min ptr addrspace(1) %p, i32 1 syncscope("workgroup") monotonic, !amdgpu.no.fine.grained.memory !0213 %n64 = zext i32 %n32 to i64214 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0215 store float 1.0, ptr addrspace(1) %p1216 ret void217}218 219define protected amdgpu_kernel void @min(ptr addrspace(1) %p, ptr addrspace(1) %q) {220; CHECK-LABEL: min:221; CHECK: ; %bb.0:222; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24223; CHECK-NEXT: v_mov_b32_e32 v0, 0224; CHECK-NEXT: v_mov_b32_e32 v1, 1225; CHECK-NEXT: s_waitcnt lgkmcnt(0)226; CHECK-NEXT: global_atomic_smin v2, v0, v1, s[0:1] glc227; CHECK-NEXT: v_mov_b32_e32 v0, s2228; CHECK-NEXT: v_mov_b32_e32 v1, s3229; CHECK-NEXT: s_waitcnt vmcnt(0)230; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, 12, v[0:1]231; CHECK-NEXT: v_mov_b32_e32 v2, 1.0232; CHECK-NEXT: global_store_dword v[0:1], v2, off233; CHECK-NEXT: s_endpgm234 %n32 = atomicrmw min ptr addrspace(1) %p, i32 1 syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !0235 %n64 = zext i32 %n32 to i64236 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0237 store float 1.0, ptr addrspace(1) %p1238 ret void239}240 241define protected amdgpu_kernel void @umax_workgroup(ptr addrspace(1) %p, ptr addrspace(1) %q) {242; CHECK-LABEL: umax_workgroup:243; CHECK: ; %bb.0:244; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24245; CHECK-NEXT: v_mov_b32_e32 v0, 0246; CHECK-NEXT: v_mov_b32_e32 v1, 1247; CHECK-NEXT: s_waitcnt lgkmcnt(0)248; CHECK-NEXT: global_atomic_umax v2, v0, v1, s[0:1] glc249; CHECK-NEXT: v_mov_b32_e32 v0, s2250; CHECK-NEXT: v_mov_b32_e32 v1, s3251; CHECK-NEXT: s_waitcnt vmcnt(0)252; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, 12, v[0:1]253; CHECK-NEXT: v_mov_b32_e32 v2, 1.0254; CHECK-NEXT: global_store_dword v[0:1], v2, off255; CHECK-NEXT: s_endpgm256 %n32 = atomicrmw umax ptr addrspace(1) %p, i32 1 syncscope("workgroup") monotonic, !amdgpu.no.fine.grained.memory !0257 %n64 = zext i32 %n32 to i64258 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0259 store float 1.0, ptr addrspace(1) %p1260 ret void261}262 263define protected amdgpu_kernel void @umax(ptr addrspace(1) %p, ptr addrspace(1) %q) {264; CHECK-LABEL: umax:265; CHECK: ; %bb.0:266; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24267; CHECK-NEXT: v_mov_b32_e32 v0, 0268; CHECK-NEXT: v_mov_b32_e32 v1, 1269; CHECK-NEXT: s_waitcnt lgkmcnt(0)270; CHECK-NEXT: global_atomic_umax v2, v0, v1, s[0:1] glc271; CHECK-NEXT: v_mov_b32_e32 v0, s2272; CHECK-NEXT: v_mov_b32_e32 v1, s3273; CHECK-NEXT: s_waitcnt vmcnt(0)274; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, 12, v[0:1]275; CHECK-NEXT: v_mov_b32_e32 v2, 1.0276; CHECK-NEXT: global_store_dword v[0:1], v2, off277; CHECK-NEXT: s_endpgm278 %n32 = atomicrmw umax ptr addrspace(1) %p, i32 1 syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !0279 %n64 = zext i32 %n32 to i64280 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0281 store float 1.0, ptr addrspace(1) %p1282 ret void283}284 285define protected amdgpu_kernel void @umin_workgroup(ptr addrspace(1) %p, ptr addrspace(1) %q) {286; CHECK-LABEL: umin_workgroup:287; CHECK: ; %bb.0:288; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24289; CHECK-NEXT: v_mov_b32_e32 v0, 0290; CHECK-NEXT: v_mov_b32_e32 v1, 1291; CHECK-NEXT: s_waitcnt lgkmcnt(0)292; CHECK-NEXT: global_atomic_umin v2, v0, v1, s[0:1] glc293; CHECK-NEXT: v_mov_b32_e32 v0, s2294; CHECK-NEXT: v_mov_b32_e32 v1, s3295; CHECK-NEXT: s_waitcnt vmcnt(0)296; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, 12, v[0:1]297; CHECK-NEXT: v_mov_b32_e32 v2, 1.0298; CHECK-NEXT: global_store_dword v[0:1], v2, off299; CHECK-NEXT: s_endpgm300 %n32 = atomicrmw umin ptr addrspace(1) %p, i32 1 syncscope("workgroup") monotonic, !amdgpu.no.fine.grained.memory !0301 %n64 = zext i32 %n32 to i64302 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0303 store float 1.0, ptr addrspace(1) %p1304 ret void305}306 307define protected amdgpu_kernel void @umin(ptr addrspace(1) %p, ptr addrspace(1) %q) {308; CHECK-LABEL: umin:309; CHECK: ; %bb.0:310; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24311; CHECK-NEXT: v_mov_b32_e32 v0, 0312; CHECK-NEXT: v_mov_b32_e32 v1, 1313; CHECK-NEXT: s_waitcnt lgkmcnt(0)314; CHECK-NEXT: global_atomic_umin v2, v0, v1, s[0:1] glc315; CHECK-NEXT: v_mov_b32_e32 v0, s2316; CHECK-NEXT: v_mov_b32_e32 v1, s3317; CHECK-NEXT: s_waitcnt vmcnt(0)318; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, 12, v[0:1]319; CHECK-NEXT: v_mov_b32_e32 v2, 1.0320; CHECK-NEXT: global_store_dword v[0:1], v2, off321; CHECK-NEXT: s_endpgm322 %n32 = atomicrmw umin ptr addrspace(1) %p, i32 1 syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !0323 %n64 = zext i32 %n32 to i64324 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0325 store float 1.0, ptr addrspace(1) %p1326 ret void327}328 329define protected amdgpu_kernel void @cmpxchg(ptr addrspace(1) %p, ptr addrspace(1) %q) {330; CHECK-LABEL: cmpxchg:331; CHECK: ; %bb.0:332; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24333; CHECK-NEXT: v_mov_b32_e32 v2, 0334; CHECK-NEXT: v_mov_b32_e32 v0, 2335; CHECK-NEXT: v_mov_b32_e32 v1, 1336; CHECK-NEXT: s_waitcnt lgkmcnt(0)337; CHECK-NEXT: global_atomic_cmpswap v2, v2, v[0:1], s[0:1] glc338; CHECK-NEXT: v_mov_b32_e32 v0, s2339; CHECK-NEXT: v_mov_b32_e32 v1, s3340; CHECK-NEXT: s_waitcnt vmcnt(0)341; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, 12, v[0:1]342; CHECK-NEXT: v_mov_b32_e32 v2, 1.0343; CHECK-NEXT: global_store_dword v[0:1], v2, off344; CHECK-NEXT: s_endpgm345 %agg = cmpxchg ptr addrspace(1) %p, i32 1, i32 2 monotonic monotonic346 %n32 = extractvalue {i32, i1} %agg, 0347 %n64 = zext i32 %n32 to i64348 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0349 store float 1.0, ptr addrspace(1) %p1350 ret void351}352 353define protected amdgpu_kernel void @xchg(ptr addrspace(1) %p, ptr addrspace(1) %q) {354; CHECK-LABEL: xchg:355; CHECK: ; %bb.0:356; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24357; CHECK-NEXT: v_mov_b32_e32 v0, 0358; CHECK-NEXT: v_mov_b32_e32 v1, 1359; CHECK-NEXT: s_waitcnt lgkmcnt(0)360; CHECK-NEXT: global_atomic_swap v2, v0, v1, s[0:1] glc361; CHECK-NEXT: v_mov_b32_e32 v0, s2362; CHECK-NEXT: v_mov_b32_e32 v1, s3363; CHECK-NEXT: s_waitcnt vmcnt(0)364; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, 12, v[0:1]365; CHECK-NEXT: v_mov_b32_e32 v2, 1.0366; CHECK-NEXT: global_store_dword v[0:1], v2, off367; CHECK-NEXT: s_endpgm368 %n32 = atomicrmw xchg ptr addrspace(1) %p, i32 1 syncscope("agent") monotonic369 %n64 = zext i32 %n32 to i64370 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0371 store float 1.0, ptr addrspace(1) %p1372 ret void373}374 375define protected amdgpu_kernel void @inc(ptr addrspace(1) %p, ptr addrspace(1) %q) {376; CHECK-LABEL: inc:377; CHECK: ; %bb.0:378; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24379; CHECK-NEXT: v_mov_b32_e32 v0, 0380; CHECK-NEXT: v_mov_b32_e32 v1, 1381; CHECK-NEXT: s_waitcnt lgkmcnt(0)382; CHECK-NEXT: global_atomic_inc v2, v0, v1, s[0:1] glc383; CHECK-NEXT: v_mov_b32_e32 v0, s2384; CHECK-NEXT: v_mov_b32_e32 v1, s3385; CHECK-NEXT: s_waitcnt vmcnt(0)386; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, 12, v[0:1]387; CHECK-NEXT: v_mov_b32_e32 v2, 1.0388; CHECK-NEXT: global_store_dword v[0:1], v2, off389; CHECK-NEXT: s_endpgm390 %n32 = atomicrmw uinc_wrap ptr addrspace(1) %p, i32 1 syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !0391 %n64 = zext i32 %n32 to i64392 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0393 store float 1.0, ptr addrspace(1) %p1394 ret void395}396 397define protected amdgpu_kernel void @dec(ptr addrspace(1) %p, ptr addrspace(1) %q) {398; CHECK-LABEL: dec:399; CHECK: ; %bb.0:400; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24401; CHECK-NEXT: v_mov_b32_e32 v0, 0402; CHECK-NEXT: v_mov_b32_e32 v1, 1403; CHECK-NEXT: s_waitcnt lgkmcnt(0)404; CHECK-NEXT: global_atomic_dec v2, v0, v1, s[0:1] glc405; CHECK-NEXT: v_mov_b32_e32 v0, s2406; CHECK-NEXT: v_mov_b32_e32 v1, s3407; CHECK-NEXT: s_waitcnt vmcnt(0)408; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, 12, v[0:1]409; CHECK-NEXT: v_mov_b32_e32 v2, 1.0410; CHECK-NEXT: global_store_dword v[0:1], v2, off411; CHECK-NEXT: s_endpgm412 %n32 = atomicrmw udec_wrap ptr addrspace(1) %p, i32 1 syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !0413 %n64 = zext i32 %n32 to i64414 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0415 store float 1.0, ptr addrspace(1) %p1416 ret void417}418 419define protected amdgpu_kernel void @fadd(ptr addrspace(1) %p, ptr addrspace(1) %q) {420; CHECK-LABEL: fadd:421; CHECK: ; %bb.0:422; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24423; CHECK-NEXT: s_mov_b64 s[4:5], 0424; CHECK-NEXT: v_mov_b32_e32 v2, 0425; CHECK-NEXT: s_waitcnt lgkmcnt(0)426; CHECK-NEXT: s_load_dword s6, s[0:1], 0x0427; CHECK-NEXT: s_waitcnt lgkmcnt(0)428; CHECK-NEXT: v_mov_b32_e32 v1, s6429; CHECK-NEXT: .LBB18_1: ; %atomicrmw.start430; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1431; CHECK-NEXT: v_add_f32_e32 v0, 1.0, v1432; CHECK-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] glc433; CHECK-NEXT: s_waitcnt vmcnt(0)434; CHECK-NEXT: v_cmp_eq_u32_e32 vcc, v0, v1435; CHECK-NEXT: s_or_b64 s[4:5], vcc, s[4:5]436; CHECK-NEXT: v_mov_b32_e32 v1, v0437; CHECK-NEXT: s_andn2_b64 exec, exec, s[4:5]438; CHECK-NEXT: s_cbranch_execnz .LBB18_1439; CHECK-NEXT: ; %bb.2: ; %atomicrmw.end440; CHECK-NEXT: s_or_b64 exec, exec, s[4:5]441; CHECK-NEXT: v_cvt_u32_f32_e32 v2, v0442; CHECK-NEXT: v_mov_b32_e32 v0, s2443; CHECK-NEXT: v_mov_b32_e32 v1, s3444; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, 12, v[0:1]445; CHECK-NEXT: v_mov_b32_e32 v2, 1.0446; CHECK-NEXT: global_store_dword v[0:1], v2, off447; CHECK-NEXT: s_endpgm448 %f32 = atomicrmw fadd ptr addrspace(1) %p, float 1.0 syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !0449 %n32 = fptoui float %f32 to i32450 %n64 = zext i32 %n32 to i64451 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0452 store float 1.0, ptr addrspace(1) %p1453 ret void454}455 456define protected amdgpu_kernel void @fsub(ptr addrspace(1) %p, ptr addrspace(1) %q) {457; CHECK-LABEL: fsub:458; CHECK: ; %bb.0:459; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24460; CHECK-NEXT: s_mov_b64 s[4:5], 0461; CHECK-NEXT: v_mov_b32_e32 v2, 0462; CHECK-NEXT: s_waitcnt lgkmcnt(0)463; CHECK-NEXT: s_load_dword s6, s[0:1], 0x0464; CHECK-NEXT: s_waitcnt lgkmcnt(0)465; CHECK-NEXT: v_mov_b32_e32 v1, s6466; CHECK-NEXT: .LBB19_1: ; %atomicrmw.start467; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1468; CHECK-NEXT: v_add_f32_e32 v0, -1.0, v1469; CHECK-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] glc470; CHECK-NEXT: s_waitcnt vmcnt(0)471; CHECK-NEXT: v_cmp_eq_u32_e32 vcc, v0, v1472; CHECK-NEXT: s_or_b64 s[4:5], vcc, s[4:5]473; CHECK-NEXT: v_mov_b32_e32 v1, v0474; CHECK-NEXT: s_andn2_b64 exec, exec, s[4:5]475; CHECK-NEXT: s_cbranch_execnz .LBB19_1476; CHECK-NEXT: ; %bb.2: ; %atomicrmw.end477; CHECK-NEXT: s_or_b64 exec, exec, s[4:5]478; CHECK-NEXT: v_cvt_u32_f32_e32 v2, v0479; CHECK-NEXT: v_mov_b32_e32 v0, s2480; CHECK-NEXT: v_mov_b32_e32 v1, s3481; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, 12, v[0:1]482; CHECK-NEXT: v_mov_b32_e32 v2, 1.0483; CHECK-NEXT: global_store_dword v[0:1], v2, off484; CHECK-NEXT: s_endpgm485 %f32 = atomicrmw fsub ptr addrspace(1) %p, float 1.0 syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !0486 %n32 = fptoui float %f32 to i32487 %n64 = zext i32 %n32 to i64488 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0489 store float 1.0, ptr addrspace(1) %p1490 ret void491}492 493define protected amdgpu_kernel void @fmin(ptr addrspace(1) %p, ptr addrspace(1) %q) {494; CHECK-LABEL: fmin:495; CHECK: ; %bb.0:496; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24497; CHECK-NEXT: v_mov_b32_e32 v0, 0498; CHECK-NEXT: v_mov_b32_e32 v2, 0499; CHECK-NEXT: v_mov_b32_e32 v1, 0x3ff00000500; CHECK-NEXT: s_waitcnt lgkmcnt(0)501; CHECK-NEXT: global_atomic_min_f64 v[0:1], v2, v[0:1], s[0:1] glc502; CHECK-NEXT: v_mov_b32_e32 v2, s2503; CHECK-NEXT: v_mov_b32_e32 v3, s3504; CHECK-NEXT: s_waitcnt vmcnt(0)505; CHECK-NEXT: v_cvt_u32_f64_e32 v0, v[0:1]506; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v0, 12, v[2:3]507; CHECK-NEXT: v_mov_b32_e32 v2, 1.0508; CHECK-NEXT: global_store_dword v[0:1], v2, off509; CHECK-NEXT: s_endpgm510 511 %f64 = atomicrmw fmin ptr addrspace(1) %p, double 1.0 syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !0512 %n32 = fptoui double %f64 to i32513 %n64 = zext i32 %n32 to i64514 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0515 store float 1.0, ptr addrspace(1) %p1516 ret void517}518 519define protected amdgpu_kernel void @fmax(ptr addrspace(1) %p, ptr addrspace(1) %q) {520; CHECK-LABEL: fmax:521; CHECK: ; %bb.0:522; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24523; CHECK-NEXT: v_mov_b32_e32 v0, 0524; CHECK-NEXT: v_mov_b32_e32 v2, 0525; CHECK-NEXT: v_mov_b32_e32 v1, 0x3ff00000526; CHECK-NEXT: s_waitcnt lgkmcnt(0)527; CHECK-NEXT: global_atomic_max_f64 v[0:1], v2, v[0:1], s[0:1] glc528; CHECK-NEXT: v_mov_b32_e32 v2, s2529; CHECK-NEXT: v_mov_b32_e32 v3, s3530; CHECK-NEXT: s_waitcnt vmcnt(0)531; CHECK-NEXT: v_cvt_u32_f64_e32 v0, v[0:1]532; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v0, 12, v[2:3]533; CHECK-NEXT: v_mov_b32_e32 v2, 1.0534; CHECK-NEXT: global_store_dword v[0:1], v2, off535; CHECK-NEXT: s_endpgm536 %f64 = atomicrmw fmax ptr addrspace(1) %p, double 1.0 syncscope("agent") monotonic, !amdgpu.no.fine.grained.memory !0537 %n32 = fptoui double %f64 to i32538 %n64 = zext i32 %n32 to i64539 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0540 store float 1.0, ptr addrspace(1) %p1541 ret void542}543 544define protected amdgpu_kernel void @buffer.ptr.atomic.swap(ptr addrspace(8) %rsrc, i32 %vindex, ptr addrspace(1) %q) {545; CHECK-LABEL: buffer.ptr.atomic.swap:546; CHECK: ; %bb.0:547; CHECK-NEXT: s_load_dword s6, s[4:5], 0x34548; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24549; CHECK-NEXT: v_mov_b32_e32 v0, 1550; CHECK-NEXT: v_mov_b32_e32 v2, 1.0551; CHECK-NEXT: s_waitcnt lgkmcnt(0)552; CHECK-NEXT: v_mov_b32_e32 v1, s6553; CHECK-NEXT: buffer_atomic_swap v0, v1, s[0:3], 0 offen glc554; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x3c555; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)556; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v0, 12, s[0:1]557; CHECK-NEXT: global_store_dword v[0:1], v2, off558; CHECK-NEXT: s_endpgm559 %n32 = call i32 @llvm.amdgcn.raw.ptr.buffer.atomic.swap.i32(i32 1, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)560 %n64 = zext i32 %n32 to i64561 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0562 store float 1.0, ptr addrspace(1) %p1563 ret void564}565 566define protected amdgpu_kernel void @buffer.ptr.atomic.add(ptr addrspace(8) %rsrc, i32 %vindex, ptr addrspace(1) %q) {567; CHECK-LABEL: buffer.ptr.atomic.add:568; CHECK: ; %bb.0:569; CHECK-NEXT: s_load_dword s6, s[4:5], 0x34570; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24571; CHECK-NEXT: v_mov_b32_e32 v0, 1572; CHECK-NEXT: v_mov_b32_e32 v2, 1.0573; CHECK-NEXT: s_waitcnt lgkmcnt(0)574; CHECK-NEXT: v_mov_b32_e32 v1, s6575; CHECK-NEXT: buffer_atomic_add v0, v1, s[0:3], 0 offen glc576; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x3c577; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)578; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v0, 12, s[0:1]579; CHECK-NEXT: global_store_dword v[0:1], v2, off580; CHECK-NEXT: s_endpgm581 %n32 = call i32 @llvm.amdgcn.raw.ptr.buffer.atomic.add.i32(i32 1, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)582 %n64 = zext i32 %n32 to i64583 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0584 store float 1.0, ptr addrspace(1) %p1585 ret void586}587 588define protected amdgpu_kernel void @buffer.ptr.atomic.sub(ptr addrspace(8) %rsrc, i32 %vindex, ptr addrspace(1) %q) {589; CHECK-LABEL: buffer.ptr.atomic.sub:590; CHECK: ; %bb.0:591; CHECK-NEXT: s_load_dword s6, s[4:5], 0x34592; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24593; CHECK-NEXT: v_mov_b32_e32 v0, 1594; CHECK-NEXT: v_mov_b32_e32 v2, 1.0595; CHECK-NEXT: s_waitcnt lgkmcnt(0)596; CHECK-NEXT: v_mov_b32_e32 v1, s6597; CHECK-NEXT: buffer_atomic_sub v0, v1, s[0:3], 0 offen glc598; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x3c599; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)600; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v0, 12, s[0:1]601; CHECK-NEXT: global_store_dword v[0:1], v2, off602; CHECK-NEXT: s_endpgm603 %n32 = call i32 @llvm.amdgcn.raw.ptr.buffer.atomic.sub.i32(i32 1, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)604 %n64 = zext i32 %n32 to i64605 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0606 store float 1.0, ptr addrspace(1) %p1607 ret void608}609 610define protected amdgpu_kernel void @buffer.ptr.atomic.smin(ptr addrspace(8) %rsrc, i32 %vindex, ptr addrspace(1) %q) {611; CHECK-LABEL: buffer.ptr.atomic.smin:612; CHECK: ; %bb.0:613; CHECK-NEXT: s_load_dword s6, s[4:5], 0x34614; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24615; CHECK-NEXT: v_mov_b32_e32 v0, 1616; CHECK-NEXT: v_mov_b32_e32 v2, 1.0617; CHECK-NEXT: s_waitcnt lgkmcnt(0)618; CHECK-NEXT: v_mov_b32_e32 v1, s6619; CHECK-NEXT: buffer_atomic_smin v0, v1, s[0:3], 0 offen glc620; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x3c621; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)622; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v0, 12, s[0:1]623; CHECK-NEXT: global_store_dword v[0:1], v2, off624; CHECK-NEXT: s_endpgm625 %n32 = call i32 @llvm.amdgcn.raw.ptr.buffer.atomic.smin.i32(i32 1, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)626 %n64 = zext i32 %n32 to i64627 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0628 store float 1.0, ptr addrspace(1) %p1629 ret void630}631 632define protected amdgpu_kernel void @buffer.ptr.atomic.smax(ptr addrspace(8) %rsrc, i32 %vindex, ptr addrspace(1) %q) {633; CHECK-LABEL: buffer.ptr.atomic.smax:634; CHECK: ; %bb.0:635; CHECK-NEXT: s_load_dword s6, s[4:5], 0x34636; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24637; CHECK-NEXT: v_mov_b32_e32 v0, 1638; CHECK-NEXT: v_mov_b32_e32 v2, 1.0639; CHECK-NEXT: s_waitcnt lgkmcnt(0)640; CHECK-NEXT: v_mov_b32_e32 v1, s6641; CHECK-NEXT: buffer_atomic_smax v0, v1, s[0:3], 0 offen glc642; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x3c643; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)644; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v0, 12, s[0:1]645; CHECK-NEXT: global_store_dword v[0:1], v2, off646; CHECK-NEXT: s_endpgm647 %n32 = call i32 @llvm.amdgcn.raw.ptr.buffer.atomic.smax.i32(i32 1, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)648 %n64 = zext i32 %n32 to i64649 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0650 store float 1.0, ptr addrspace(1) %p1651 ret void652}653 654define protected amdgpu_kernel void @buffer.ptr.atomic.umin(ptr addrspace(8) %rsrc, i32 %vindex, ptr addrspace(1) %q) {655; CHECK-LABEL: buffer.ptr.atomic.umin:656; CHECK: ; %bb.0:657; CHECK-NEXT: s_load_dword s6, s[4:5], 0x34658; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24659; CHECK-NEXT: v_mov_b32_e32 v0, 1660; CHECK-NEXT: v_mov_b32_e32 v2, 1.0661; CHECK-NEXT: s_waitcnt lgkmcnt(0)662; CHECK-NEXT: v_mov_b32_e32 v1, s6663; CHECK-NEXT: buffer_atomic_umin v0, v1, s[0:3], 0 offen glc664; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x3c665; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)666; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v0, 12, s[0:1]667; CHECK-NEXT: global_store_dword v[0:1], v2, off668; CHECK-NEXT: s_endpgm669 %n32 = call i32 @llvm.amdgcn.raw.ptr.buffer.atomic.umin.i32(i32 1, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)670 %n64 = zext i32 %n32 to i64671 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0672 store float 1.0, ptr addrspace(1) %p1673 ret void674}675 676define protected amdgpu_kernel void @buffer.ptr.atomic.umax(ptr addrspace(8) %rsrc, i32 %vindex, ptr addrspace(1) %q) {677; CHECK-LABEL: buffer.ptr.atomic.umax:678; CHECK: ; %bb.0:679; CHECK-NEXT: s_load_dword s6, s[4:5], 0x34680; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24681; CHECK-NEXT: v_mov_b32_e32 v0, 1682; CHECK-NEXT: v_mov_b32_e32 v2, 1.0683; CHECK-NEXT: s_waitcnt lgkmcnt(0)684; CHECK-NEXT: v_mov_b32_e32 v1, s6685; CHECK-NEXT: buffer_atomic_umax v0, v1, s[0:3], 0 offen glc686; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x3c687; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)688; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v0, 12, s[0:1]689; CHECK-NEXT: global_store_dword v[0:1], v2, off690; CHECK-NEXT: s_endpgm691 %n32 = call i32 @llvm.amdgcn.raw.ptr.buffer.atomic.umax.i32(i32 1, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)692 %n64 = zext i32 %n32 to i64693 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0694 store float 1.0, ptr addrspace(1) %p1695 ret void696}697 698define protected amdgpu_kernel void @buffer.ptr.atomic.and(ptr addrspace(8) %rsrc, i32 %vindex, ptr addrspace(1) %q) {699; CHECK-LABEL: buffer.ptr.atomic.and:700; CHECK: ; %bb.0:701; CHECK-NEXT: s_load_dword s6, s[4:5], 0x34702; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24703; CHECK-NEXT: v_mov_b32_e32 v0, 1704; CHECK-NEXT: v_mov_b32_e32 v2, 1.0705; CHECK-NEXT: s_waitcnt lgkmcnt(0)706; CHECK-NEXT: v_mov_b32_e32 v1, s6707; CHECK-NEXT: buffer_atomic_and v0, v1, s[0:3], 0 offen glc708; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x3c709; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)710; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v0, 12, s[0:1]711; CHECK-NEXT: global_store_dword v[0:1], v2, off712; CHECK-NEXT: s_endpgm713 %n32 = call i32 @llvm.amdgcn.raw.ptr.buffer.atomic.and.i32(i32 1, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)714 %n64 = zext i32 %n32 to i64715 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0716 store float 1.0, ptr addrspace(1) %p1717 ret void718}719 720define protected amdgpu_kernel void @buffer.ptr.atomic.or(ptr addrspace(8) %rsrc, i32 %vindex, ptr addrspace(1) %q) {721; CHECK-LABEL: buffer.ptr.atomic.or:722; CHECK: ; %bb.0:723; CHECK-NEXT: s_load_dword s6, s[4:5], 0x34724; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24725; CHECK-NEXT: v_mov_b32_e32 v0, 1726; CHECK-NEXT: v_mov_b32_e32 v2, 1.0727; CHECK-NEXT: s_waitcnt lgkmcnt(0)728; CHECK-NEXT: v_mov_b32_e32 v1, s6729; CHECK-NEXT: buffer_atomic_or v0, v1, s[0:3], 0 offen glc730; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x3c731; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)732; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v0, 12, s[0:1]733; CHECK-NEXT: global_store_dword v[0:1], v2, off734; CHECK-NEXT: s_endpgm735 %n32 = call i32 @llvm.amdgcn.raw.ptr.buffer.atomic.or.i32(i32 1, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)736 %n64 = zext i32 %n32 to i64737 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0738 store float 1.0, ptr addrspace(1) %p1739 ret void740}741 742define protected amdgpu_kernel void @buffer.ptr.atomic.xor(ptr addrspace(8) %rsrc, i32 %vindex, ptr addrspace(1) %q) {743; CHECK-LABEL: buffer.ptr.atomic.xor:744; CHECK: ; %bb.0:745; CHECK-NEXT: s_load_dword s6, s[4:5], 0x34746; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24747; CHECK-NEXT: v_mov_b32_e32 v0, 1748; CHECK-NEXT: v_mov_b32_e32 v2, 1.0749; CHECK-NEXT: s_waitcnt lgkmcnt(0)750; CHECK-NEXT: v_mov_b32_e32 v1, s6751; CHECK-NEXT: buffer_atomic_xor v0, v1, s[0:3], 0 offen glc752; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x3c753; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)754; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v0, 12, s[0:1]755; CHECK-NEXT: global_store_dword v[0:1], v2, off756; CHECK-NEXT: s_endpgm757 %n32 = call i32 @llvm.amdgcn.raw.ptr.buffer.atomic.xor.i32(i32 1, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)758 %n64 = zext i32 %n32 to i64759 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0760 store float 1.0, ptr addrspace(1) %p1761 ret void762}763 764define protected amdgpu_kernel void @buffer.ptr.atomic.inc(ptr addrspace(8) %rsrc, i32 %vindex, ptr addrspace(1) %q) {765; CHECK-LABEL: buffer.ptr.atomic.inc:766; CHECK: ; %bb.0:767; CHECK-NEXT: s_load_dword s6, s[4:5], 0x34768; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24769; CHECK-NEXT: v_mov_b32_e32 v0, 1770; CHECK-NEXT: v_mov_b32_e32 v2, 1.0771; CHECK-NEXT: s_waitcnt lgkmcnt(0)772; CHECK-NEXT: v_mov_b32_e32 v1, s6773; CHECK-NEXT: buffer_atomic_inc v0, v1, s[0:3], 0 offen glc774; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x3c775; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)776; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v0, 12, s[0:1]777; CHECK-NEXT: global_store_dword v[0:1], v2, off778; CHECK-NEXT: s_endpgm779 %n32 = call i32 @llvm.amdgcn.raw.ptr.buffer.atomic.inc.i32(i32 1, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)780 %n64 = zext i32 %n32 to i64781 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0782 store float 1.0, ptr addrspace(1) %p1783 ret void784}785 786define protected amdgpu_kernel void @buffer.ptr.atomic.dec(ptr addrspace(8) %rsrc, i32 %vindex, ptr addrspace(1) %q) {787; CHECK-LABEL: buffer.ptr.atomic.dec:788; CHECK: ; %bb.0:789; CHECK-NEXT: s_load_dword s6, s[4:5], 0x34790; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24791; CHECK-NEXT: v_mov_b32_e32 v0, 1792; CHECK-NEXT: v_mov_b32_e32 v2, 1.0793; CHECK-NEXT: s_waitcnt lgkmcnt(0)794; CHECK-NEXT: v_mov_b32_e32 v1, s6795; CHECK-NEXT: buffer_atomic_dec v0, v1, s[0:3], 0 offen glc796; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x3c797; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)798; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v0, 12, s[0:1]799; CHECK-NEXT: global_store_dword v[0:1], v2, off800; CHECK-NEXT: s_endpgm801 %n32 = call i32 @llvm.amdgcn.raw.ptr.buffer.atomic.dec.i32(i32 1, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)802 %n64 = zext i32 %n32 to i64803 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0804 store float 1.0, ptr addrspace(1) %p1805 ret void806}807 808define protected amdgpu_kernel void @buffer.ptr.atomic.cmpswap(ptr addrspace(8) %rsrc, i32 %vindex, ptr addrspace(1) %q) {809; CHECK-LABEL: buffer.ptr.atomic.cmpswap:810; CHECK: ; %bb.0:811; CHECK-NEXT: s_load_dword s6, s[4:5], 0x34812; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24813; CHECK-NEXT: v_mov_b32_e32 v1, 2814; CHECK-NEXT: v_mov_b32_e32 v0, 1815; CHECK-NEXT: s_waitcnt lgkmcnt(0)816; CHECK-NEXT: v_mov_b32_e32 v2, s6817; CHECK-NEXT: buffer_atomic_cmpswap v[0:1], v2, s[0:3], 0 offen glc818; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x3c819; CHECK-NEXT: v_mov_b32_e32 v2, 1.0820; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)821; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v0, 12, s[0:1]822; CHECK-NEXT: global_store_dword v[0:1], v2, off823; CHECK-NEXT: s_endpgm824 %n32 = call i32 @llvm.amdgcn.raw.ptr.buffer.atomic.cmpswap.i32(i32 1, i32 2, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)825 %n64 = zext i32 %n32 to i64826 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0827 store float 1.0, ptr addrspace(1) %p1828 ret void829}830 831define protected amdgpu_kernel void @buffer.ptr.atomic.fadd(ptr addrspace(8) %rsrc, i32 %vindex, ptr addrspace(1) %q) {832; CHECK-LABEL: buffer.ptr.atomic.fadd:833; CHECK: ; %bb.0:834; CHECK-NEXT: s_load_dword s6, s[4:5], 0x34835; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24836; CHECK-NEXT: v_mov_b32_e32 v1, 1.0837; CHECK-NEXT: v_mov_b32_e32 v2, 1.0838; CHECK-NEXT: s_waitcnt lgkmcnt(0)839; CHECK-NEXT: v_mov_b32_e32 v0, s6840; CHECK-NEXT: buffer_atomic_add_f32 v1, v0, s[0:3], 0 offen glc841; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x3c842; CHECK-NEXT: s_waitcnt vmcnt(0)843; CHECK-NEXT: v_cvt_u32_f32_e32 v0, v1844; CHECK-NEXT: s_waitcnt lgkmcnt(0)845; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v0, 12, s[0:1]846; CHECK-NEXT: global_store_dword v[0:1], v2, off847; CHECK-NEXT: s_endpgm848 %f32 = call float @llvm.amdgcn.raw.ptr.buffer.atomic.fadd.f32(float 1.0, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)849 %n32 = fptoui float %f32 to i32850 %n64 = zext i32 %n32 to i64851 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0852 store float 1.0, ptr addrspace(1) %p1853 ret void854}855 856define protected amdgpu_kernel void @buffer.ptr.atomic.fmin(ptr addrspace(8) %rsrc, i32 %vindex, ptr addrspace(1) %q) {857; CHECK-LABEL: buffer.ptr.atomic.fmin:858; CHECK: ; %bb.0:859; CHECK-NEXT: s_load_dword s6, s[4:5], 0x34860; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24861; CHECK-NEXT: v_mov_b32_e32 v0, 0862; CHECK-NEXT: v_mov_b32_e32 v1, 0x3ff00000863; CHECK-NEXT: s_waitcnt lgkmcnt(0)864; CHECK-NEXT: v_mov_b32_e32 v2, s6865; CHECK-NEXT: buffer_atomic_min_f64 v[0:1], v2, s[0:3], 0 offen glc866; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x3c867; CHECK-NEXT: v_mov_b32_e32 v2, 1.0868; CHECK-NEXT: s_waitcnt vmcnt(0)869; CHECK-NEXT: v_cvt_u32_f64_e32 v0, v[0:1]870; CHECK-NEXT: s_waitcnt lgkmcnt(0)871; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v0, 12, s[0:1]872; CHECK-NEXT: global_store_dword v[0:1], v2, off873; CHECK-NEXT: s_endpgm874 %f64 = call double @llvm.amdgcn.raw.ptr.buffer.atomic.fmin.f64(double 1.0, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)875 %n32 = fptoui double %f64 to i32876 %n64 = zext i32 %n32 to i64877 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0878 store float 1.0, ptr addrspace(1) %p1879 ret void880}881 882define protected amdgpu_kernel void @buffer.ptr.atomic.fmax(ptr addrspace(8) %rsrc, i32 %vindex, ptr addrspace(1) %q) {883; CHECK-LABEL: buffer.ptr.atomic.fmax:884; CHECK: ; %bb.0:885; CHECK-NEXT: s_load_dword s6, s[4:5], 0x34886; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24887; CHECK-NEXT: v_mov_b32_e32 v0, 0888; CHECK-NEXT: v_mov_b32_e32 v1, 0x3ff00000889; CHECK-NEXT: s_waitcnt lgkmcnt(0)890; CHECK-NEXT: v_mov_b32_e32 v2, s6891; CHECK-NEXT: buffer_atomic_max_f64 v[0:1], v2, s[0:3], 0 offen glc892; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x3c893; CHECK-NEXT: v_mov_b32_e32 v2, 1.0894; CHECK-NEXT: s_waitcnt vmcnt(0)895; CHECK-NEXT: v_cvt_u32_f64_e32 v0, v[0:1]896; CHECK-NEXT: s_waitcnt lgkmcnt(0)897; CHECK-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v0, 12, s[0:1]898; CHECK-NEXT: global_store_dword v[0:1], v2, off899; CHECK-NEXT: s_endpgm900 %f64 = call double @llvm.amdgcn.raw.ptr.buffer.atomic.fmax.f64(double 1.0, ptr addrspace(8) %rsrc, i32 %vindex, i32 0, i32 0)901 %n32 = fptoui double %f64 to i32902 %n64 = zext i32 %n32 to i64903 %p1 = getelementptr inbounds %S, ptr addrspace(1) %q, i64 %n64, i32 0904 store float 1.0, ptr addrspace(1) %p1905 ret void906}907 908declare i32 @llvm.amdgcn.raw.ptr.buffer.atomic.swap.i32(i32, ptr addrspace(8), i32, i32, i32)909declare i32 @llvm.amdgcn.raw.ptr.buffer.atomic.add.i32(i32, ptr addrspace(8), i32, i32, i32)910declare i32 @llvm.amdgcn.raw.ptr.buffer.atomic.sub.i32(i32, ptr addrspace(8), i32, i32, i32)911declare i32 @llvm.amdgcn.raw.ptr.buffer.atomic.smin.i32(i32, ptr addrspace(8), i32, i32, i32)912declare i32 @llvm.amdgcn.raw.ptr.buffer.atomic.smax.i32(i32, ptr addrspace(8), i32, i32, i32)913declare i32 @llvm.amdgcn.raw.ptr.buffer.atomic.umin.i32(i32, ptr addrspace(8), i32, i32, i32)914declare i32 @llvm.amdgcn.raw.ptr.buffer.atomic.umax.i32(i32, ptr addrspace(8), i32, i32, i32)915declare i32 @llvm.amdgcn.raw.ptr.buffer.atomic.and.i32(i32, ptr addrspace(8), i32, i32, i32)916declare i32 @llvm.amdgcn.raw.ptr.buffer.atomic.or.i32(i32, ptr addrspace(8), i32, i32, i32)917declare i32 @llvm.amdgcn.raw.ptr.buffer.atomic.xor.i32(i32, ptr addrspace(8), i32, i32, i32)918declare i32 @llvm.amdgcn.raw.ptr.buffer.atomic.inc.i32(i32, ptr addrspace(8), i32, i32, i32)919declare i32 @llvm.amdgcn.raw.ptr.buffer.atomic.dec.i32(i32, ptr addrspace(8), i32, i32, i32)920declare i32 @llvm.amdgcn.raw.ptr.buffer.atomic.cmpswap.i32(i32, i32, ptr addrspace(8), i32, i32, i32)921declare float @llvm.amdgcn.raw.ptr.buffer.atomic.fadd.f32(float, ptr addrspace(8), i32, i32, i32)922declare double @llvm.amdgcn.raw.ptr.buffer.atomic.fmin.f64(double, ptr addrspace(8), i32, i32, i32)923declare double @llvm.amdgcn.raw.ptr.buffer.atomic.fmax.f64(double, ptr addrspace(8), i32, i32, i32)924 925!0 = !{}926