brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.8 KiB · b2b2343 Raw
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