206 lines · plain
1; RUN: opt -S -disable-promote-alloca-to-vector -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -passes=amdgpu-promote-alloca < %s | FileCheck -check-prefix=IR %s2; RUN: llc -disable-promote-alloca-to-vector -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -amdgpu-enable-lower-module-lds=false < %s | FileCheck -check-prefix=ASM %s3 4@all_lds = internal unnamed_addr addrspace(3) global [16384 x i32] poison, align 45@some_lds = internal unnamed_addr addrspace(3) global [32 x i32] poison, align 46@some_dynamic_lds = external hidden addrspace(3) global [0 x i32], align 47 8@initializer_user_some = addrspace(1) global i32 ptrtoint (ptr addrspace(3) @some_lds to i32), align 49@initializer_user_all = addrspace(1) global i32 ptrtoint (ptr addrspace(3) @all_lds to i32), align 410 11; This function cannot promote to using LDS because of the size of the12; constant expression use in the function, which was previously not13; detected.14; IR-LABEL: @constant_expression_uses_all_lds(15; IR: alloca16 17; ASM-LABEL: constant_expression_uses_all_lds:18; ASM: .amdhsa_group_segment_fixed_size 6553619define amdgpu_kernel void @constant_expression_uses_all_lds(ptr addrspace(1) nocapture %out, i32 %idx) #0 {20entry:21 %stack = alloca [4 x i32], align 4, addrspace(5)22 %gep1 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 123 %gep2 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 224 %gep3 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 325 store i32 9, ptr addrspace(5) %stack26 store i32 10, ptr addrspace(5) %gep127 store i32 99, ptr addrspace(5) %gep228 store i32 43, ptr addrspace(5) %gep329 %arrayidx = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 %idx30 %load = load i32, ptr addrspace(5) %arrayidx, align 431 store i32 %load, ptr addrspace(1) %out32 33 store volatile i32 ptrtoint (ptr addrspace(3) @all_lds to i32), ptr addrspace(1) poison34 ret void35}36 37; Has a constant expression use through a single level of constant38; expression, but not enough LDS to block promotion39 40; IR-LABEL: @constant_expression_uses_some_lds(41; IR-NOT: alloca42 43; ASM-LABEL: {{^}}constant_expression_uses_some_lds:44; ASM: .amdhsa_group_segment_fixed_size 4224{{$}}45define amdgpu_kernel void @constant_expression_uses_some_lds(ptr addrspace(1) nocapture %out, i32 %idx) #0 {46entry:47 %stack = alloca [4 x i32], align 4, addrspace(5)48 %gep1 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 149 %gep2 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 250 %gep3 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 351 store i32 9, ptr addrspace(5) %stack52 store i32 10, ptr addrspace(5) %gep153 store i32 99, ptr addrspace(5) %gep254 store i32 43, ptr addrspace(5) %gep355 %arrayidx = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 %idx56 %load = load i32, ptr addrspace(5) %arrayidx, align 457 store i32 %load, ptr addrspace(1) %out58 store volatile i32 ptrtoint (ptr addrspace(3) @some_lds to i32), ptr addrspace(1) poison59 ret void60}61 62; Has a constant expression use through a single level of constant63; expression, but usage of dynamic LDS should block promotion64 65; IR-LABEL: @constant_expression_uses_some_dynamic_lds(66; IR: alloca67 68; ASM-LABEL: {{^}}constant_expression_uses_some_dynamic_lds:69; ASM: .amdhsa_group_segment_fixed_size 0{{$}}70define amdgpu_kernel void @constant_expression_uses_some_dynamic_lds(ptr addrspace(1) nocapture %out, i32 %idx) #0 {71entry:72 %stack = alloca [4 x i32], align 4, addrspace(5)73 %gep1 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 174 %gep2 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 275 %gep3 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 376 store i32 9, ptr addrspace(5) %stack77 store i32 10, ptr addrspace(5) %gep178 store i32 99, ptr addrspace(5) %gep279 store i32 43, ptr addrspace(5) %gep380 %arrayidx = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 %idx81 %load = load i32, ptr addrspace(5) %arrayidx, align 482 store i32 %load, ptr addrspace(1) %out83 store i32 1234, ptr addrspacecast (ptr addrspace(3) @some_dynamic_lds to ptr), align 484 ret void85}86 87declare void @callee(ptr)88 89; IR-LABEL: @constant_expression_uses_all_lds_multi_level(90; IR: alloca91 92; ASM-LABEL: {{^}}constant_expression_uses_all_lds_multi_level:93; ASM: .amdhsa_group_segment_fixed_size 65536{{$}}94define amdgpu_kernel void @constant_expression_uses_all_lds_multi_level(ptr addrspace(1) nocapture %out, i32 %idx) #0 {95entry:96 %stack = alloca [4 x i32], align 4, addrspace(5)97 %gep1 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 198 %gep2 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 299 %gep3 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 3100 store i32 9, ptr addrspace(5) %stack101 store i32 10, ptr addrspace(5) %gep1102 store i32 99, ptr addrspace(5) %gep2103 store i32 43, ptr addrspace(5) %gep3104 %arrayidx = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 %idx105 %load = load i32, ptr addrspace(5) %arrayidx, align 4106 store i32 %load, ptr addrspace(1) %out107 call void @callee(ptr addrspacecast (ptr addrspace(3) getelementptr inbounds ([16384 x i32], ptr addrspace(3) @all_lds, i32 0, i32 8) to ptr))108 ret void109}110 111; IR-LABEL: @constant_expression_uses_some_lds_multi_level(112; IR-NOT: alloca113; IR: llvm.amdgcn.workitem.id114 115; ASM-LABEL: {{^}}constant_expression_uses_some_lds_multi_level:116; ASM: .amdhsa_group_segment_fixed_size 4224{{$}}117define amdgpu_kernel void @constant_expression_uses_some_lds_multi_level(ptr addrspace(1) nocapture %out, i32 %idx) #0 {118entry:119 %stack = alloca [4 x i32], align 4, addrspace(5)120 %gep1 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 1121 %gep2 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 2122 %gep3 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 3123 store i32 9, ptr addrspace(5) %stack124 store i32 10, ptr addrspace(5) %gep1125 store i32 99, ptr addrspace(5) %gep2126 store i32 43, ptr addrspace(5) %gep3127 %arrayidx = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 %idx128 %load = load i32, ptr addrspace(5) %arrayidx, align 4129 store i32 %load, ptr addrspace(1) %out130 call void @callee(ptr addrspacecast (ptr addrspace(3) getelementptr inbounds ([32 x i32], ptr addrspace(3) @some_lds, i32 0, i32 8) to ptr))131 ret void132}133 134; IR-LABEL: @constant_expression_uses_some_dynamic_lds_multi_level(135; IR: alloca136 137; ASM-LABEL: {{^}}constant_expression_uses_some_dynamic_lds_multi_level:138; ASM: .amdhsa_group_segment_fixed_size 0{{$}}139define amdgpu_kernel void @constant_expression_uses_some_dynamic_lds_multi_level(ptr addrspace(1) nocapture %out, i32 %idx) #0 {140entry:141 %stack = alloca [4 x i32], align 4, addrspace(5)142 %gep1 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 1143 %gep2 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 2144 %gep3 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 3145 store i32 9, ptr addrspace(5) %stack146 store i32 10, ptr addrspace(5) %gep1147 store i32 99, ptr addrspace(5) %gep2148 store i32 43, ptr addrspace(5) %gep3149 %arrayidx = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 %idx150 %load = load i32, ptr addrspace(5) %arrayidx, align 4151 store i32 %load, ptr addrspace(1) %out152 call void @callee(ptr addrspacecast (ptr addrspace(3) @some_dynamic_lds to ptr))153 ret void154}155 156; IR-LABEL: @constant_expression_uses_some_lds_global_initializer(157; IR-NOT: alloca158; IR: llvm.amdgcn.workitem.id159 160; ASM-LABEL: {{^}}constant_expression_uses_some_lds_global_initializer:161; ASM: .amdhsa_group_segment_fixed_size 4096{{$}}162define amdgpu_kernel void @constant_expression_uses_some_lds_global_initializer(ptr addrspace(1) nocapture %out, i32 %idx) #0 {163entry:164 %stack = alloca [4 x i32], align 4, addrspace(5)165 %gep1 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 1166 %gep2 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 2167 %gep3 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 3168 store i32 9, ptr addrspace(5) %stack169 store i32 10, ptr addrspace(5) %gep1170 store i32 99, ptr addrspace(5) %gep2171 store i32 43, ptr addrspace(5) %gep3172 %arrayidx = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 %idx173 %load = load i32, ptr addrspace(5) %arrayidx, align 4174 store i32 %load, ptr addrspace(1) %out175 176 store volatile i32 ptrtoint (ptr addrspace(1) @initializer_user_some to i32), ptr addrspace(1) poison177 ret void178}179 180; We can't actually handle LDS initializers in global initializers,181; but this should count as usage.182 183; IR-LABEL: @constant_expression_uses_all_lds_global_initializer(184; IR: alloca185 186; ASM-LABEL: {{^}}constant_expression_uses_all_lds_global_initializer:187; ASM: .group_segment_fixed_size: 65536188define amdgpu_kernel void @constant_expression_uses_all_lds_global_initializer(ptr addrspace(1) nocapture %out, i32 %idx) #0 {189entry:190 %stack = alloca [4 x i32], align 4, addrspace(5)191 %gep1 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 1192 %gep2 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 2193 %gep3 = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 3194 store i32 9, ptr addrspace(5) %stack195 store i32 10, ptr addrspace(5) %gep1196 store i32 99, ptr addrspace(5) %gep2197 store i32 43, ptr addrspace(5) %gep3198 %arrayidx = getelementptr inbounds [4 x i32], ptr addrspace(5) %stack, i32 0, i32 %idx199 %load = load i32, ptr addrspace(5) %arrayidx, align 4200 store i32 %load, ptr addrspace(1) %out201 store volatile i32 ptrtoint (ptr addrspace(1) @initializer_user_all to i32), ptr addrspace(1) poison202 ret void203}204 205attributes #0 = { "amdgpu-waves-per-eu"="1,5" "amdgpu-flat-work-group-size"="256,256" }206