1; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=kaveri -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,CI %s 2; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX9 %s 3 4; GCN-LABEL: {{^}}atomic_load_monotonic_i32: 5; GCN: s_waitcnt 6; GFX9-NOT: s_mov_b32 m0 7; CI-NEXT: s_mov_b32 m0 8; GCN-NEXT: ds_read_b32 v0, v0{{$}} 9; GCN-NEXT: s_waitcnt lgkmcnt(0) 10; GCN-NEXT: s_setpc_b64 11define i32 @atomic_load_monotonic_i32(i32 addrspace(3)* %ptr) { 12 %load = load atomic i32, i32 addrspace(3)* %ptr monotonic, align 4 13 ret i32 %load 14} 15 16; GCN-LABEL: {{^}}atomic_load_monotonic_i32_offset: 17; GCN: s_waitcnt 18; GFX9-NOT: s_mov_b32 m0 19; CI-NEXT: s_mov_b32 m0 20; GCN-NEXT: ds_read_b32 v0, v0 offset:64{{$}} 21; GCN-NEXT: s_waitcnt lgkmcnt(0) 22; GCN-NEXT: s_setpc_b64 23define i32 @atomic_load_monotonic_i32_offset(i32 addrspace(3)* %ptr) { 24 %gep = getelementptr inbounds i32, i32 addrspace(3)* %ptr, i32 16 25 %load = load atomic i32, i32 addrspace(3)* %gep monotonic, align 4 26 ret i32 %load 27} 28 29; GCN-LABEL: {{^}}atomic_load_monotonic_i64: 30; GCN: s_waitcnt 31; GFX9-NOT: s_mov_b32 m0 32; CI-NEXT: s_mov_b32 m0 33; GCN-NEXT: ds_read_b64 v[0:1], v0{{$}} 34; GCN-NEXT: s_waitcnt lgkmcnt(0) 35; GCN-NEXT: s_setpc_b64 36define i64 @atomic_load_monotonic_i64(i64 addrspace(3)* %ptr) { 37 %load = load atomic i64, i64 addrspace(3)* %ptr monotonic, align 8 38 ret i64 %load 39} 40 41; GCN-LABEL: {{^}}atomic_load_monotonic_i64_offset: 42; GCN: s_waitcnt 43; GFX9-NOT: s_mov_b32 m0 44; CI-NEXT: s_mov_b32 m0 45; GCN-NEXT: ds_read_b64 v[0:1], v0 offset:128{{$}} 46; GCN-NEXT: s_waitcnt lgkmcnt(0) 47; GCN-NEXT: s_setpc_b64 48define i64 @atomic_load_monotonic_i64_offset(i64 addrspace(3)* %ptr) { 49 %gep = getelementptr inbounds i64, i64 addrspace(3)* %ptr, i64 16 50 %load = load atomic i64, i64 addrspace(3)* %gep monotonic, align 8 51 ret i64 %load 52} 53