1; RUN: llc -march=amdgcn -mcpu=SI -mattr=-promote-alloca -verify-machineinstrs < %s | FileCheck -check-prefix=SI-ALLOCA -check-prefix=SI %s 2; RUN: llc -march=amdgcn -mcpu=SI -mattr=+promote-alloca -verify-machineinstrs < %s | FileCheck -check-prefix=SI-PROMOTE -check-prefix=SI %s 3; RUN: llc -march=amdgcn -mcpu=tonga -mattr=-promote-alloca -verify-machineinstrs < %s | FileCheck -check-prefix=SI-ALLOCA -check-prefix=SI %s 4; RUN: llc -march=amdgcn -mcpu=tonga -mattr=+promote-alloca -verify-machineinstrs < %s | FileCheck -check-prefix=SI-PROMOTE -check-prefix=SI %s 5 6declare void @llvm.amdgcn.s.barrier() #1 7 8; SI-LABEL: {{^}}private_access_f64_alloca: 9 10; SI-ALLOCA: buffer_store_dwordx2 11; SI-ALLOCA: buffer_load_dwordx2 12 13; SI-PROMOTE: ds_write_b64 14; SI-PROMOTE: ds_read_b64 15define void @private_access_f64_alloca(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in, i32 %b) #1 { 16 %val = load double, double addrspace(1)* %in, align 8 17 %array = alloca double, i32 16, align 8 18 %ptr = getelementptr inbounds double, double* %array, i32 %b 19 store double %val, double* %ptr, align 8 20 call void @llvm.amdgcn.s.barrier() 21 %result = load double, double* %ptr, align 8 22 store double %result, double addrspace(1)* %out, align 8 23 ret void 24} 25 26; SI-LABEL: {{^}}private_access_v2f64_alloca: 27 28; SI-ALLOCA: buffer_store_dwordx4 29; SI-ALLOCA: buffer_load_dwordx4 30 31; SI-PROMOTE: ds_write_b64 32; SI-PROMOTE: ds_write_b64 33; SI-PROMOTE: ds_read_b64 34; SI-PROMOTE: ds_read_b64 35define void @private_access_v2f64_alloca(<2 x double> addrspace(1)* noalias %out, <2 x double> addrspace(1)* noalias %in, i32 %b) #1 { 36 %val = load <2 x double>, <2 x double> addrspace(1)* %in, align 16 37 %array = alloca <2 x double>, i32 16, align 16 38 %ptr = getelementptr inbounds <2 x double>, <2 x double>* %array, i32 %b 39 store <2 x double> %val, <2 x double>* %ptr, align 16 40 call void @llvm.amdgcn.s.barrier() 41 %result = load <2 x double>, <2 x double>* %ptr, align 16 42 store <2 x double> %result, <2 x double> addrspace(1)* %out, align 16 43 ret void 44} 45 46; SI-LABEL: {{^}}private_access_i64_alloca: 47 48; SI-ALLOCA: buffer_store_dwordx2 49; SI-ALLOCA: buffer_load_dwordx2 50 51; SI-PROMOTE: ds_write_b64 52; SI-PROMOTE: ds_read_b64 53define void @private_access_i64_alloca(i64 addrspace(1)* noalias %out, i64 addrspace(1)* noalias %in, i32 %b) #1 { 54 %val = load i64, i64 addrspace(1)* %in, align 8 55 %array = alloca i64, i32 16, align 8 56 %ptr = getelementptr inbounds i64, i64* %array, i32 %b 57 store i64 %val, i64* %ptr, align 8 58 call void @llvm.amdgcn.s.barrier() 59 %result = load i64, i64* %ptr, align 8 60 store i64 %result, i64 addrspace(1)* %out, align 8 61 ret void 62} 63 64; SI-LABEL: {{^}}private_access_v2i64_alloca: 65 66; SI-ALLOCA: buffer_store_dwordx4 67; SI-ALLOCA: buffer_load_dwordx4 68 69; SI-PROMOTE: ds_write_b64 70; SI-PROMOTE: ds_write_b64 71; SI-PROMOTE: ds_read_b64 72; SI-PROMOTE: ds_read_b64 73define void @private_access_v2i64_alloca(<2 x i64> addrspace(1)* noalias %out, <2 x i64> addrspace(1)* noalias %in, i32 %b) #1 { 74 %val = load <2 x i64>, <2 x i64> addrspace(1)* %in, align 16 75 %array = alloca <2 x i64>, i32 16, align 16 76 %ptr = getelementptr inbounds <2 x i64>, <2 x i64>* %array, i32 %b 77 store <2 x i64> %val, <2 x i64>* %ptr, align 16 78 call void @llvm.amdgcn.s.barrier() 79 %result = load <2 x i64>, <2 x i64>* %ptr, align 16 80 store <2 x i64> %result, <2 x i64> addrspace(1)* %out, align 16 81 ret void 82} 83 84attributes #0 = { nounwind } 85attributes #1 = { nounwind convergent } 86