brintos

brintos / llvm-project-archived public Read only

0
0
Text · 40.0 KiB · 56de9dd Raw
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