274 lines · plain
1; RUN: opt -S -mtriple=amdgcn-unknown-unknown -passes=amdgpu-promote-alloca -disable-promote-alloca-to-vector < %s | FileCheck --check-prefixes=SI,SICI,ALL %s2; RUN: opt -S -mcpu=tonga -mtriple=amdgcn-unknown-unknown -passes=amdgpu-promote-alloca -disable-promote-alloca-to-vector < %s | FileCheck --check-prefixes=CI,SICI,ALL %s3; RUN: opt -S -mcpu=gfx1010 -mtriple=amdgcn-unknown-unknown -passes=amdgpu-promote-alloca -disable-promote-alloca-to-vector < %s | FileCheck --check-prefixes=GFX10PLUS,ALL %s4; RUN: opt -S -mcpu=gfx1100 -mtriple=amdgcn-unknown-unknown -passes=amdgpu-promote-alloca -disable-promote-alloca-to-vector < %s | FileCheck --check-prefixes=GFX10PLUS,ALL %s5 6; SI-NOT: @promote_alloca_size_63.stack = internal unnamed_addr addrspace(3) global [63 x [5 x i32]] poison, align 47; CI: @promote_alloca_size_63.stack = internal unnamed_addr addrspace(3) global [63 x [5 x i32]] poison, align 48 9define amdgpu_kernel void @promote_alloca_size_63(ptr addrspace(1) nocapture %out, ptr addrspace(1) nocapture %in) #0 {10entry:11 %stack = alloca [5 x i32], align 4, addrspace(5)12 %0 = load i32, ptr addrspace(1) %in, align 413 %arrayidx1 = getelementptr inbounds [5 x i32], ptr addrspace(5) %stack, i32 0, i32 %014 store i32 4, ptr addrspace(5) %arrayidx1, align 415 %arrayidx2 = getelementptr inbounds i32, ptr addrspace(1) %in, i32 116 %1 = load i32, ptr addrspace(1) %arrayidx2, align 417 %arrayidx3 = getelementptr inbounds [5 x i32], ptr addrspace(5) %stack, i32 0, i32 %118 store i32 5, ptr addrspace(5) %arrayidx3, align 419 %2 = load i32, ptr addrspace(5) %stack, align 420 store i32 %2, ptr addrspace(1) %out, align 421 %arrayidx12 = getelementptr inbounds [5 x i32], ptr addrspace(5) %stack, i32 0, i32 122 %3 = load i32, ptr addrspace(5) %arrayidx1223 %arrayidx13 = getelementptr inbounds i32, ptr addrspace(1) %out, i32 124 store i32 %3, ptr addrspace(1) %arrayidx1325 ret void26}27 28; ALL: @promote_alloca_size_256.stack = internal unnamed_addr addrspace(3) global [256 x [5 x i32]] poison, align 429 30define amdgpu_kernel void @promote_alloca_size_256(ptr addrspace(1) nocapture %out, ptr addrspace(1) nocapture %in) #1 {31entry:32 %stack = alloca [5 x i32], align 4, addrspace(5)33 %0 = load i32, ptr addrspace(1) %in, align 434 %arrayidx1 = getelementptr inbounds [5 x i32], ptr addrspace(5) %stack, i32 0, i32 %035 store i32 4, ptr addrspace(5) %arrayidx1, align 436 %arrayidx2 = getelementptr inbounds i32, ptr addrspace(1) %in, i32 137 %1 = load i32, ptr addrspace(1) %arrayidx2, align 438 %arrayidx3 = getelementptr inbounds [5 x i32], ptr addrspace(5) %stack, i32 0, i32 %139 store i32 5, ptr addrspace(5) %arrayidx3, align 440 %2 = load i32, ptr addrspace(5) %stack, align 441 store i32 %2, ptr addrspace(1) %out, align 442 %arrayidx12 = getelementptr inbounds [5 x i32], ptr addrspace(5) %stack, i32 0, i32 143 %3 = load i32, ptr addrspace(5) %arrayidx1244 %arrayidx13 = getelementptr inbounds i32, ptr addrspace(1) %out, i32 145 store i32 %3, ptr addrspace(1) %arrayidx1346 ret void47}48 49; SI-NOT: @promote_alloca_size_1600.stack50; CI: @promote_alloca_size_1600.stack = internal unnamed_addr addrspace(3) global [1024 x [5 x i32]] poison, align 451; GFX10PLUS: @promote_alloca_size_1600.stack = internal unnamed_addr addrspace(3) global [1024 x [5 x i32]] poison, align 452 53define amdgpu_kernel void @promote_alloca_size_1600(ptr addrspace(1) nocapture %out, ptr addrspace(1) nocapture %in) #2 {54entry:55 %stack = alloca [5 x i32], align 4, addrspace(5)56 %0 = load i32, ptr addrspace(1) %in, align 457 %arrayidx1 = getelementptr inbounds [5 x i32], ptr addrspace(5) %stack, i32 0, i32 %058 store i32 4, ptr addrspace(5) %arrayidx1, align 459 %arrayidx2 = getelementptr inbounds i32, ptr addrspace(1) %in, i32 160 %1 = load i32, ptr addrspace(1) %arrayidx2, align 461 %arrayidx3 = getelementptr inbounds [5 x i32], ptr addrspace(5) %stack, i32 0, i32 %162 store i32 5, ptr addrspace(5) %arrayidx3, align 463 %2 = load i32, ptr addrspace(5) %stack, align 464 store i32 %2, ptr addrspace(1) %out, align 465 %arrayidx12 = getelementptr inbounds [5 x i32], ptr addrspace(5) %stack, i32 0, i32 166 %3 = load i32, ptr addrspace(5) %arrayidx1267 %arrayidx13 = getelementptr inbounds i32, ptr addrspace(1) %out, i32 168 store i32 %3, ptr addrspace(1) %arrayidx1369 ret void70}71 72; ALL-LABEL: @occupancy_0(73; CI-NOT: alloca [5 x i32]74; SI: alloca [5 x i32]75define amdgpu_kernel void @occupancy_0(ptr addrspace(1) nocapture %out, ptr addrspace(1) nocapture %in) #3 {76entry:77 %stack = alloca [5 x i32], align 4, addrspace(5)78 %0 = load i32, ptr addrspace(1) %in, align 479 %arrayidx1 = getelementptr inbounds [5 x i32], ptr addrspace(5) %stack, i32 0, i32 %080 store i32 4, ptr addrspace(5) %arrayidx1, align 481 %arrayidx2 = getelementptr inbounds i32, ptr addrspace(1) %in, i32 182 %1 = load i32, ptr addrspace(1) %arrayidx2, align 483 %arrayidx3 = getelementptr inbounds [5 x i32], ptr addrspace(5) %stack, i32 0, i32 %184 store i32 5, ptr addrspace(5) %arrayidx3, align 485 %2 = load i32, ptr addrspace(5) %stack, align 486 store i32 %2, ptr addrspace(1) %out, align 487 %arrayidx12 = getelementptr inbounds [5 x i32], ptr addrspace(5) %stack, i32 0, i32 188 %3 = load i32, ptr addrspace(5) %arrayidx1289 %arrayidx13 = getelementptr inbounds i32, ptr addrspace(1) %out, i32 190 store i32 %3, ptr addrspace(1) %arrayidx1391 ret void92}93 94; ALL-LABEL: @occupancy_max(95; CI-NOT: alloca [5 x i32]96; SI: alloca [5 x i32]97define amdgpu_kernel void @occupancy_max(ptr addrspace(1) nocapture %out, ptr addrspace(1) nocapture %in) #4 {98entry:99 %stack = alloca [5 x i32], align 4, addrspace(5)100 %0 = load i32, ptr addrspace(1) %in, align 4101 %arrayidx1 = getelementptr inbounds [5 x i32], ptr addrspace(5) %stack, i32 0, i32 %0102 store i32 4, ptr addrspace(5) %arrayidx1, align 4103 %arrayidx2 = getelementptr inbounds i32, ptr addrspace(1) %in, i32 1104 %1 = load i32, ptr addrspace(1) %arrayidx2, align 4105 %arrayidx3 = getelementptr inbounds [5 x i32], ptr addrspace(5) %stack, i32 0, i32 %1106 store i32 5, ptr addrspace(5) %arrayidx3, align 4107 %2 = load i32, ptr addrspace(5) %stack, align 4108 store i32 %2, ptr addrspace(1) %out, align 4109 %arrayidx12 = getelementptr inbounds [5 x i32], ptr addrspace(5) %stack, i32 0, i32 1110 %3 = load i32, ptr addrspace(5) %arrayidx12111 %arrayidx13 = getelementptr inbounds i32, ptr addrspace(1) %out, i32 1112 store i32 %3, ptr addrspace(1) %arrayidx13113 ret void114}115 116; SI-LABEL: @occupancy_6(117; CI-LABEL: @occupancy_6(118; SI: alloca119; CI-NOT: alloca120define amdgpu_kernel void @occupancy_6(ptr addrspace(1) nocapture %out, ptr addrspace(1) nocapture %in) #5 {121entry:122 %stack = alloca [42 x i8], align 4, addrspace(5)123 %tmp = load i8, ptr addrspace(1) %in, align 1124 %tmp4 = sext i8 %tmp to i64125 %arrayidx1 = getelementptr inbounds [42 x i8], ptr addrspace(5) %stack, i64 0, i64 %tmp4126 store i8 4, ptr addrspace(5) %arrayidx1, align 1127 %arrayidx2 = getelementptr inbounds i8, ptr addrspace(1) %in, i64 1128 %tmp1 = load i8, ptr addrspace(1) %arrayidx2, align 1129 %tmp5 = sext i8 %tmp1 to i64130 %arrayidx3 = getelementptr inbounds [42 x i8], ptr addrspace(5) %stack, i64 0, i64 %tmp5131 store i8 5, ptr addrspace(5) %arrayidx3, align 1132 %tmp2 = load i8, ptr addrspace(5) %stack, align 1133 store i8 %tmp2, ptr addrspace(1) %out, align 1134 %arrayidx12 = getelementptr inbounds [42 x i8], ptr addrspace(5) %stack, i64 0, i64 1135 %tmp3 = load i8, ptr addrspace(5) %arrayidx12, align 1136 %arrayidx13 = getelementptr inbounds i8, ptr addrspace(1) %out, i64 1137 store i8 %tmp3, ptr addrspace(1) %arrayidx13, align 1138 ret void139}140 141; ALL-LABEL: @occupancy_6_over(142; SICI: alloca [43 x i8]143; GFX10PLUS-NOT: alloca144 145define amdgpu_kernel void @occupancy_6_over(ptr addrspace(1) nocapture %out, ptr addrspace(1) nocapture %in) #5 {146entry:147 %stack = alloca [43 x i8], align 4, addrspace(5)148 %tmp = load i8, ptr addrspace(1) %in, align 1149 %tmp4 = sext i8 %tmp to i64150 %arrayidx1 = getelementptr inbounds [43 x i8], ptr addrspace(5) %stack, i64 0, i64 %tmp4151 store i8 4, ptr addrspace(5) %arrayidx1, align 1152 %arrayidx2 = getelementptr inbounds i8, ptr addrspace(1) %in, i64 1153 %tmp1 = load i8, ptr addrspace(1) %arrayidx2, align 1154 %tmp5 = sext i8 %tmp1 to i64155 %arrayidx3 = getelementptr inbounds [43 x i8], ptr addrspace(5) %stack, i64 0, i64 %tmp5156 store i8 5, ptr addrspace(5) %arrayidx3, align 1157 %tmp2 = load i8, ptr addrspace(5) %stack, align 1158 store i8 %tmp2, ptr addrspace(1) %out, align 1159 %arrayidx12 = getelementptr inbounds [43 x i8], ptr addrspace(5) %stack, i64 0, i64 1160 %tmp3 = load i8, ptr addrspace(5) %arrayidx12, align 1161 %arrayidx13 = getelementptr inbounds i8, ptr addrspace(1) %out, i64 1162 store i8 %tmp3, ptr addrspace(1) %arrayidx13, align 1163 ret void164}165 166; SI-LABEL: @occupancy_8(167; CI-LABEL: @occupancy_8(168; SI: alloca169; CI-NOT: alloca170define amdgpu_kernel void @occupancy_8(ptr addrspace(1) nocapture %out, ptr addrspace(1) nocapture %in) #6 {171entry:172 %stack = alloca [32 x i8], align 4, addrspace(5)173 %tmp = load i8, ptr addrspace(1) %in, align 1174 %tmp4 = sext i8 %tmp to i64175 %arrayidx1 = getelementptr inbounds [32 x i8], ptr addrspace(5) %stack, i64 0, i64 %tmp4176 store i8 4, ptr addrspace(5) %arrayidx1, align 1177 %arrayidx2 = getelementptr inbounds i8, ptr addrspace(1) %in, i64 1178 %tmp1 = load i8, ptr addrspace(1) %arrayidx2, align 1179 %tmp5 = sext i8 %tmp1 to i64180 %arrayidx3 = getelementptr inbounds [32 x i8], ptr addrspace(5) %stack, i64 0, i64 %tmp5181 store i8 5, ptr addrspace(5) %arrayidx3, align 1182 %tmp2 = load i8, ptr addrspace(5) %stack, align 1183 store i8 %tmp2, ptr addrspace(1) %out, align 1184 %arrayidx12 = getelementptr inbounds [32 x i8], ptr addrspace(5) %stack, i64 0, i64 1185 %tmp3 = load i8, ptr addrspace(5) %arrayidx12, align 1186 %arrayidx13 = getelementptr inbounds i8, ptr addrspace(1) %out, i64 1187 store i8 %tmp3, ptr addrspace(1) %arrayidx13, align 1188 ret void189}190 191; ALL-LABEL: @occupancy_8_over(192; SICI: alloca [33 x i8]193; GFX10PLUS-NOT: alloca194 195define amdgpu_kernel void @occupancy_8_over(ptr addrspace(1) nocapture %out, ptr addrspace(1) nocapture %in) #6 {196entry:197 %stack = alloca [33 x i8], align 4, addrspace(5)198 %tmp = load i8, ptr addrspace(1) %in, align 1199 %tmp4 = sext i8 %tmp to i64200 %arrayidx1 = getelementptr inbounds [33 x i8], ptr addrspace(5) %stack, i64 0, i64 %tmp4201 store i8 4, ptr addrspace(5) %arrayidx1, align 1202 %arrayidx2 = getelementptr inbounds i8, ptr addrspace(1) %in, i64 1203 %tmp1 = load i8, ptr addrspace(1) %arrayidx2, align 1204 %tmp5 = sext i8 %tmp1 to i64205 %arrayidx3 = getelementptr inbounds [33 x i8], ptr addrspace(5) %stack, i64 0, i64 %tmp5206 store i8 5, ptr addrspace(5) %arrayidx3, align 1207 %tmp2 = load i8, ptr addrspace(5) %stack, align 1208 store i8 %tmp2, ptr addrspace(1) %out, align 1209 %arrayidx12 = getelementptr inbounds [33 x i8], ptr addrspace(5) %stack, i64 0, i64 1210 %tmp3 = load i8, ptr addrspace(5) %arrayidx12, align 1211 %arrayidx13 = getelementptr inbounds i8, ptr addrspace(1) %out, i64 1212 store i8 %tmp3, ptr addrspace(1) %arrayidx13, align 1213 ret void214}215 216; SI-LABEL: @occupancy_9(217; CI-LABEL: @occupancy_9(218; SI: alloca219; CI-NOT: alloca220define amdgpu_kernel void @occupancy_9(ptr addrspace(1) nocapture %out, ptr addrspace(1) nocapture %in) #7 {221entry:222 %stack = alloca [28 x i8], align 4, addrspace(5)223 %tmp = load i8, ptr addrspace(1) %in, align 1224 %tmp4 = sext i8 %tmp to i64225 %arrayidx1 = getelementptr inbounds [28 x i8], ptr addrspace(5) %stack, i64 0, i64 %tmp4226 store i8 4, ptr addrspace(5) %arrayidx1, align 1227 %arrayidx2 = getelementptr inbounds i8, ptr addrspace(1) %in, i64 1228 %tmp1 = load i8, ptr addrspace(1) %arrayidx2, align 1229 %tmp5 = sext i8 %tmp1 to i64230 %arrayidx3 = getelementptr inbounds [28 x i8], ptr addrspace(5) %stack, i64 0, i64 %tmp5231 store i8 5, ptr addrspace(5) %arrayidx3, align 1232 %tmp2 = load i8, ptr addrspace(5) %stack, align 1233 store i8 %tmp2, ptr addrspace(1) %out, align 1234 %arrayidx12 = getelementptr inbounds [28 x i8], ptr addrspace(5) %stack, i64 0, i64 1235 %tmp3 = load i8, ptr addrspace(5) %arrayidx12, align 1236 %arrayidx13 = getelementptr inbounds i8, ptr addrspace(1) %out, i64 1237 store i8 %tmp3, ptr addrspace(1) %arrayidx13, align 1238 ret void239}240 241; ALL-LABEL: @occupancy_9_over(242; SICI: alloca [29 x i8]243; GFX10PLUS-NOT: alloca244 245define amdgpu_kernel void @occupancy_9_over(ptr addrspace(1) nocapture %out, ptr addrspace(1) nocapture %in) #7 {246entry:247 %stack = alloca [29 x i8], align 4, addrspace(5)248 %tmp = load i8, ptr addrspace(1) %in, align 1249 %tmp4 = sext i8 %tmp to i64250 %arrayidx1 = getelementptr inbounds [29 x i8], ptr addrspace(5) %stack, i64 0, i64 %tmp4251 store i8 4, ptr addrspace(5) %arrayidx1, align 1252 %arrayidx2 = getelementptr inbounds i8, ptr addrspace(1) %in, i64 1253 %tmp1 = load i8, ptr addrspace(1) %arrayidx2, align 1254 %tmp5 = sext i8 %tmp1 to i64255 %arrayidx3 = getelementptr inbounds [29 x i8], ptr addrspace(5) %stack, i64 0, i64 %tmp5256 store i8 5, ptr addrspace(5) %arrayidx3, align 1257 %tmp2 = load i8, ptr addrspace(5) %stack, align 1258 store i8 %tmp2, ptr addrspace(1) %out, align 1259 %arrayidx12 = getelementptr inbounds [29 x i8], ptr addrspace(5) %stack, i64 0, i64 1260 %tmp3 = load i8, ptr addrspace(5) %arrayidx12, align 1261 %arrayidx13 = getelementptr inbounds i8, ptr addrspace(1) %out, i64 1262 store i8 %tmp3, ptr addrspace(1) %arrayidx13, align 1263 ret void264}265 266attributes #0 = { nounwind "amdgpu-flat-work-group-size"="63,63" }267attributes #1 = { nounwind "amdgpu-waves-per-eu"="1,3" "amdgpu-flat-work-group-size"="256,256" }268attributes #2 = { nounwind "amdgpu-waves-per-eu"="1,9" "amdgpu-flat-work-group-size"="1024,1024" }269attributes #3 = { nounwind "amdgpu-waves-per-eu"="1,10" }270attributes #4 = { nounwind "amdgpu-waves-per-eu"="1,10" }271attributes #5 = { nounwind "amdgpu-waves-per-eu"="1,6" "amdgpu-flat-work-group-size"="64,64" }272attributes #6 = { nounwind "amdgpu-waves-per-eu"="1,8" "amdgpu-flat-work-group-size"="64,64" }273attributes #7 = { nounwind "amdgpu-waves-per-eu"="1,9" "amdgpu-flat-work-group-size"="64,64" }274