147 lines · plain
1; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck -check-prefixes=GCN,SI,NOTGFX9 %s2; XUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck -check-prefixes=GCN,SI,NOTGFX9 %s3; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=bonaire < %s | FileCheck -check-prefixes=GCN,CIPLUS,NOTGFX9 %s4; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=bonaire < %s | FileCheck -check-prefixes=GCN,CIPLUS,NOTGFX9 %s5; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=tonga < %s | FileCheck -check-prefixes=GCN,CIPLUS,NOTGFX9 %s6; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=tonga < %s | FileCheck -check-prefixes=GCN,CIPLUS,NOTGFX9 %s7; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,CIPLUS,GFX9 %s8; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,CIPLUS,GFX9 %s9 10; GCN-LABEL: {{^}}ds_consume_lds:11; GCN: s_load_dword [[PTR:s[0-9]+]]12; GCN: s_mov_b32 m0, [[PTR]]13; GCN: ds_consume [[RESULT:v[0-9]+]]{{$}}14; GCN-NOT: buffer_wbinvl115; GCN: {{.*}}store{{.*}} [[RESULT]]16define amdgpu_kernel void @ds_consume_lds(ptr addrspace(3) %lds, ptr addrspace(1) %out) #0 {17 %val = call i32 @llvm.amdgcn.ds.consume.p3(ptr addrspace(3) %lds, i1 false)18 store i32 %val, ptr addrspace(1) %out19 ret void20}21 22; GCN-LABEL: {{^}}ds_consume_lds_max_offset:23; GCN: s_load_dword [[PTR:s[0-9]+]]24; GCN: s_mov_b32 m0, [[PTR]]25; GCN: ds_consume [[RESULT:v[0-9]+]] offset:65532{{$}}26; GCN-NOT: buffer_wbinvl127; GCN: {{.*}}store{{.*}} [[RESULT]]28define amdgpu_kernel void @ds_consume_lds_max_offset(ptr addrspace(3) %lds, ptr addrspace(1) %out) #0 {29 %gep = getelementptr inbounds i32, ptr addrspace(3) %lds, i32 1638330 %val = call i32 @llvm.amdgcn.ds.consume.p3(ptr addrspace(3) %gep, i1 false)31 store i32 %val, ptr addrspace(1) %out32 ret void33}34 35; GCN-LABEL: {{^}}ds_consume_no_fold_offset_si:36; GCN: s_load_dword [[PTR:s[0-9]+]]37 38; SI: s_add_i32 m0, [[PTR]], 1639; SI: ds_consume [[RESULT:v[0-9]+]]{{$}}40 41; CIPLUS: s_mov_b32 m0, [[PTR]]42; CIPLUS: ds_consume [[RESULT:v[0-9]+]] offset:16{{$}}43 44; GCN-NOT: buffer_wbinvl145; GCN: {{.*}}store{{.*}} [[RESULT]]46define amdgpu_kernel void @ds_consume_no_fold_offset_si(ptr addrspace(4) %lds.ptr, ptr addrspace(1) %out) #0 {47 %lds = load ptr addrspace(3), ptr addrspace(4) %lds.ptr, align 448 %gep = getelementptr inbounds i32, ptr addrspace(3) %lds, i32 449 %val = call i32 @llvm.amdgcn.ds.consume.p3(ptr addrspace(3) %gep, i1 false)50 store i32 %val, ptr addrspace(1) %out51 ret void52}53 54; GCN-LABEL: {{^}}ds_consume_lds_over_max_offset:55; GCN: s_load_dword [[PTR:s[0-9]+]]56 57; SI: s_or_b32 m0, [[PTR]], 0x1000058; CIPLUS: s_add_{{i|u}}32 m0, [[PTR]], 0x1000059; GCN: ds_consume [[RESULT:v[0-9]+]]{{$}}60; GCN-NOT: buffer_wbinvl161; GCN: {{.*}}store{{.*}} [[RESULT]]62define amdgpu_kernel void @ds_consume_lds_over_max_offset(ptr addrspace(3) %lds, ptr addrspace(1) %out) #0 {63 %gep = getelementptr inbounds i32, ptr addrspace(3) %lds, i32 1638464 %val = call i32 @llvm.amdgcn.ds.consume.p3(ptr addrspace(3) %gep, i1 false)65 store i32 %val, ptr addrspace(1) %out66 ret void67}68 69; GCN-LABEL: {{^}}ds_consume_lds_vgpr_addr:70; GCN: v_readfirstlane_b32 [[READLANE:s[0-9]+]], v071; GCN: s_mov_b32 m0, [[READLANE]]72; GCN: ds_consume [[RESULT:v[0-9]+]]{{$}}73; GCN-NOT: buffer_wbinvl174; GCN: {{.*}}store{{.*}} [[RESULT]]75define void @ds_consume_lds_vgpr_addr(ptr addrspace(3) %lds, ptr addrspace(1) %out) #0 {76 %val = call i32 @llvm.amdgcn.ds.consume.p3(ptr addrspace(3) %lds, i1 false)77 store i32 %val, ptr addrspace(1) %out78 ret void79}80 81; GCN-LABEL: {{^}}ds_consume_gds:82; GCN: s_load_dword [[PTR:s[0-9]+]]83; GCN: s_mov_b32 m0, [[PTR]]84; GCN: ds_consume [[RESULT:v[0-9]+]] gds{{$}}85; GCN-NOT: buffer_wbinvl186; GCN: {{.*}}store{{.*}} [[RESULT]]87define amdgpu_kernel void @ds_consume_gds(ptr addrspace(2) %gds, ptr addrspace(1) %out) #0 {88 %val = call i32 @llvm.amdgcn.ds.consume.p2(ptr addrspace(2) %gds, i1 false)89 store i32 %val, ptr addrspace(1) %out90 ret void91}92 93; GCN-LABEL: {{^}}ds_consume_gds_max_offset:94; GCN: s_load_dword [[PTR:s[0-9]+]]95; GCN: s_mov_b32 m0, [[PTR]]96; GCN: ds_consume [[RESULT:v[0-9]+]] offset:65532 gds{{$}}97; GCN-NOT: buffer_wbinvl198; GCN: {{.*}}store{{.*}} [[RESULT]]99define amdgpu_kernel void @ds_consume_gds_max_offset(ptr addrspace(2) %gds, ptr addrspace(1) %out) #0 {100 %gep = getelementptr inbounds i32, ptr addrspace(2) %gds, i32 16383101 %val = call i32 @llvm.amdgcn.ds.consume.p2(ptr addrspace(2) %gep, i1 false)102 store i32 %val, ptr addrspace(1) %out103 ret void104}105 106; GCN-LABEL: {{^}}ds_consume_gds_over_max_offset:107; GCN-NOT: buffer_wbinvl1108define amdgpu_kernel void @ds_consume_gds_over_max_offset(ptr addrspace(2) %gds, ptr addrspace(1) %out) #0 {109 %gep = getelementptr inbounds i32, ptr addrspace(2) %gds, i32 16384110 %val = call i32 @llvm.amdgcn.ds.consume.p2(ptr addrspace(2) %gep, i1 false)111 store i32 %val, ptr addrspace(1) %out112 ret void113}114 115; GCN-LABEL: {{^}}ds_consume_lds_m0_restore:116; GCN: s_load_dword [[PTR:s[0-9]+]]117; GCN: s_mov_b32 m0, [[PTR]]118; GCN: ds_consume [[RESULT:v[0-9]+]]{{$}}119; GCN-NOT: buffer_wbinvl1120; NOTGFX9: s_mov_b32 m0, -1121; GFX9-NOT: m0122; GCN: _store_dword123; GCN: ds_read_b32124define amdgpu_kernel void @ds_consume_lds_m0_restore(ptr addrspace(3) %lds, ptr addrspace(1) %out) #0 {125 %val0 = call i32 @llvm.amdgcn.ds.consume.p3(ptr addrspace(3) %lds, i1 false)126 store i32 %val0, ptr addrspace(1) %out127 %val1 = load volatile i32, ptr addrspace(3) %lds128 ret void129}130 131; Make sure this selects successfully with no use. The result register needs to be constrained.132; GCN-LABEL: {{^}}ds_consume_lds_no_use:133; GCN: s_load_dword [[PTR:s[0-9]+]]134; GCN: s_mov_b32 m0, [[PTR]]135; GCN: ds_consume [[RESULT:v[0-9]+]] offset:65532{{$}}136define amdgpu_kernel void @ds_consume_lds_no_use(ptr addrspace(3) %lds, ptr addrspace(1) %out) #0 {137 %gep = getelementptr inbounds i32, ptr addrspace(3) %lds, i32 16383138 %val = call i32 @llvm.amdgcn.ds.consume.p3(ptr addrspace(3) %gep, i1 false)139 ret void140}141 142declare i32 @llvm.amdgcn.ds.consume.p3(ptr addrspace(3) nocapture, i1 immarg) #1143declare i32 @llvm.amdgcn.ds.consume.p2(ptr addrspace(2) nocapture, i1 immarg) #1144 145attributes #0 = { nounwind }146attributes #1 = { argmemonly convergent nounwind }147