428 lines · plain
1; RUN: llc -mtriple=spirv-unknown-vulkan-compute -O0 %s -o - | FileCheck %s2; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan-compute %s -o - -filetype=obj | spirv-val %}3 4;5; int process() {6; int a = 0;7; int b = 1;8; int val = 0;9;10; for (int i = 0; a && b; ++i) {11; val += 1;12; }13;14; for (int i = 0; a || b; ++i) {15; val += 1;16; b = 0;17; }18;19; b = 1;20; for (int i = 0; a && ((a || b) && b); ++i) {21; val += 4;22; b = 0;23; }24;25; b = 1;26; for (int i = 0; a ? a : b; ++i) {27; val += 8;28; b = 0;29; }30;31; int x = 0;32; int y = 0;33; for (int i = 0; x + (x && y); ++i) {34; val += 16;35; }36;37; return val;38; }39;40; [numthreads(1, 1, 1)]41; void main() {42; process();43; }44 45; CHECK: %[[#process:]] = OpFunction %[[#uint:]] DontInline %[[#]]46; CHECK: %[[#bb86:]] = OpLabel47; CHECK: OpBranch %[[#bb87:]]48 ; CHECK: %[[#bb87]] = OpLabel49 ; CHECK: OpLoopMerge %[[#bb89:]] %[[#bb90:]] None50 ; CHECK: OpBranch %[[#bb91:]]51 ; CHECK: %[[#bb91]] = OpLabel52 ; CHECK: OpSelectionMerge %[[#bb92:]] None53 ; CHECK: OpBranchConditional %[[#]] %[[#bb93:]] %[[#bb94:]]54 ; CHECK: %[[#bb94]] = OpLabel55 ; CHECK: OpBranch %[[#bb92]]56 57 ; CHECK: %[[#bb93]] = OpLabel58 ; CHECK: OpBranch %[[#bb92]]59 ; CHECK: %[[#bb92]] = OpLabel60 ; CHECK: OpBranchConditional %[[#]] %[[#bb96:]] %[[#bb89]]61 ; CHECK: %[[#bb89]] = OpLabel62 ; CHECK: OpBranch %[[#bb97:]]63 ; CHECK: %[[#bb97]] = OpLabel64 ; CHECK: OpLoopMerge %[[#bb99:]] %[[#bb100:]] None65 ; CHECK: OpBranch %[[#bb101:]]66 ; CHECK: %[[#bb101]] = OpLabel67 ; CHECK: OpSelectionMerge %[[#bb102:]] None68 ; CHECK: OpBranchConditional %[[#]] %[[#bb103:]] %[[#bb104:]]69 ; CHECK: %[[#bb104]] = OpLabel70 ; CHECK: OpBranch %[[#bb102]]71 72 ; CHECK: %[[#bb103]] = OpLabel73 ; CHECK: OpBranch %[[#bb102]]74 ; CHECK: %[[#bb102]] = OpLabel75 ; CHECK: OpBranchConditional %[[#]] %[[#bb106:]] %[[#bb99]]76 ; CHECK: %[[#bb99]] = OpLabel77 ; CHECK: OpBranch %[[#bb107:]]78 ; CHECK: %[[#bb107]] = OpLabel79 ; CHECK: OpLoopMerge %[[#bb109:]] %[[#bb110:]] None80 ; CHECK: OpBranch %[[#bb111:]]81 ; CHECK: %[[#bb111]] = OpLabel82 ; CHECK: OpSelectionMerge %[[#bb112:]] None83 ; CHECK: OpBranchConditional %[[#]] %[[#bb113:]] %[[#bb114:]]84 ; CHECK: %[[#bb114]] = OpLabel85 ; CHECK: OpBranch %[[#bb112]]86 87 ; CHECK: %[[#bb113]] = OpLabel88 ; CHECK: OpSelectionMerge %[[#bb116:]] None89 ; CHECK: OpBranchConditional %[[#]] %[[#bb117:]] %[[#bb116]]90 ; CHECK: %[[#bb117]] = OpLabel91 ; CHECK: OpSelectionMerge %[[#bb118:]] None92 ; CHECK: OpBranchConditional %[[#]] %[[#bb119:]] %[[#bb120:]]93 ; CHECK: %[[#bb120]] = OpLabel94 ; CHECK: OpSelectionMerge %[[#bb122:]] None95 ; CHECK: OpBranchConditional %[[#]] %[[#bb122]] %[[#bb123:]]96 ; CHECK: %[[#bb123]] = OpLabel97 ; CHECK: OpBranch %[[#bb122]]98 ; CHECK: %[[#bb122]] = OpLabel99 ; CHECK: OpBranchConditional %[[#]] %[[#bb126:]] %[[#bb118]]100 ; CHECK: %[[#bb126]] = OpLabel101 ; CHECK: OpBranch %[[#bb118]]102 103 ; CHECK: %[[#bb119]] = OpLabel104 ; CHECK: OpBranch %[[#bb118]]105 ; CHECK: %[[#bb118]] = OpLabel106 ; CHECK: OpBranchConditional %[[#]] %[[#bb116]] %[[#bb129:]]107 ; CHECK: %[[#bb129]] = OpLabel108 ; CHECK: OpBranch %[[#bb116]]109 ; CHECK: %[[#bb116]] = OpLabel110 ; CHECK: OpBranchConditional %[[#]] %[[#bb112]] %[[#bb133:]]111 ; CHECK: %[[#bb133]] = OpLabel112 ; CHECK: OpBranch %[[#bb112]]113 ; CHECK: %[[#bb112]] = OpLabel114 ; CHECK: OpSelectionMerge %[[#bb136:]] None115 ; CHECK: OpBranchConditional %[[#]] %[[#bb136]] %[[#bb137:]]116 ; CHECK: %[[#bb137]] = OpLabel117 ; CHECK-NEXT: OpUnreachable118 119 ; CHECK: %[[#bb136]] = OpLabel120 ; CHECK: OpBranchConditional %[[#]] %[[#bb138:]] %[[#bb109]]121 ; CHECK: %[[#bb109]] = OpLabel122 ; CHECK: OpBranch %[[#bb139:]]123 ; CHECK: %[[#bb139]] = OpLabel124 ; CHECK: OpLoopMerge %[[#bb141:]] %[[#bb142:]] None125 ; CHECK: OpBranch %[[#bb143:]]126 ; CHECK: %[[#bb143]] = OpLabel127 ; CHECK: OpSelectionMerge %[[#bb144:]] None128 ; CHECK: OpBranchConditional %[[#]] %[[#bb145:]] %[[#bb146:]]129 ; CHECK: %[[#bb146]] = OpLabel130 ; CHECK: OpBranch %[[#bb144]]131 132 ; CHECK: %[[#bb145]] = OpLabel133 ; CHECK: OpBranch %[[#bb144]]134 ; CHECK: %[[#bb144]] = OpLabel135 ; CHECK: OpBranchConditional %[[#]] %[[#bb149:]] %[[#bb141]]136 ; CHECK: %[[#bb141]] = OpLabel137 ; CHECK: OpBranch %[[#bb150:]]138 ; CHECK: %[[#bb150]] = OpLabel139 ; CHECK: OpLoopMerge %[[#bb153:]] %[[#bb154:]] None140 ; CHECK: OpBranch %[[#bb155:]]141 ; CHECK: %[[#bb155]] = OpLabel142 ; CHECK: OpSelectionMerge %[[#bb156:]] None143 ; CHECK: OpBranchConditional %[[#]] %[[#bb157:]] %[[#bb158:]]144 ; CHECK: %[[#bb158]] = OpLabel145 ; CHECK: OpBranch %[[#bb156]]146 147 ; CHECK: %[[#bb157]] = OpLabel148 ; CHECK: OpBranch %[[#bb156]]149 ; CHECK: %[[#bb156]] = OpLabel150 ; CHECK: OpBranchConditional %[[#]] %[[#bb160:]] %[[#bb153]]151 ; CHECK: %[[#bb153]] = OpLabel152 ; CHECK: OpReturnValue %[[#]]153 154 ; CHECK: %[[#bb160]] = OpLabel155 ; CHECK: OpBranch %[[#bb154]]156 ; CHECK: %[[#bb154]] = OpLabel157 ; CHECK: OpBranch %[[#bb150]]158 ; CHECK: %[[#bb149]] = OpLabel159 ; CHECK: OpBranch %[[#bb142]]160 ; CHECK: %[[#bb142]] = OpLabel161 ; CHECK: OpBranch %[[#bb139]]162 ; CHECK: %[[#bb138]] = OpLabel163 ; CHECK: OpBranch %[[#bb110]]164 ; CHECK: %[[#bb110]] = OpLabel165 ; CHECK: OpBranch %[[#bb107]]166 ; CHECK: %[[#bb106]] = OpLabel167 ; CHECK: OpBranch %[[#bb100]]168 ; CHECK: %[[#bb100]] = OpLabel169 ; CHECK: OpBranch %[[#bb97]]170 ; CHECK: %[[#bb96]] = OpLabel171 ; CHECK: OpBranch %[[#bb90]]172 ; CHECK: %[[#bb90]] = OpLabel173 ; CHECK: OpBranch %[[#bb87]]174; CHECK: OpFunctionEnd175 176; CHECK: %[[#func_main:]] = OpFunction %[[#void:]] DontInline %[[#]]177; CHECK: %[[#bb172:]] = OpLabel178; CHECK: OpReturn179; CHECK: OpFunctionEnd180 181; CHECK: %[[#func_main_1:]] = OpFunction %[[#void]] None %[[#]]182; CHECK: %[[#bb173:]] = OpLabel183; CHECK: OpReturn184; CHECK: OpFunctionEnd185 186target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-G1"187target triple = "spirv-unknown-vulkan1.3-compute"188 189; Function Attrs: convergent noinline norecurse nounwind optnone190define spir_func noundef i32 @_Z7processv() #0 {191entry:192 %0 = call token @llvm.experimental.convergence.entry()193 %a = alloca i32, align 4194 %b = alloca i32, align 4195 %val = alloca i32, align 4196 %i = alloca i32, align 4197 %i2 = alloca i32, align 4198 %i11 = alloca i32, align 4199 %i26 = alloca i32, align 4200 %x = alloca i32, align 4201 %y = alloca i32, align 4202 %i35 = alloca i32, align 4203 store i32 0, ptr %a, align 4204 store i32 1, ptr %b, align 4205 store i32 0, ptr %val, align 4206 store i32 0, ptr %i, align 4207 br label %for.cond208 209for.cond: ; preds = %for.inc, %entry210 %1 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %0) ]211 %2 = load i32, ptr %a, align 4212 %tobool = icmp ne i32 %2, 0213 br i1 %tobool, label %land.rhs, label %land.end214 215land.rhs: ; preds = %for.cond216 %3 = load i32, ptr %b, align 4217 %tobool1 = icmp ne i32 %3, 0218 br label %land.end219 220land.end: ; preds = %land.rhs, %for.cond221 %4 = phi i1 [ false, %for.cond ], [ %tobool1, %land.rhs ]222 br i1 %4, label %for.body, label %for.end223 224for.body: ; preds = %land.end225 %5 = load i32, ptr %val, align 4226 %add = add nsw i32 %5, 1227 store i32 %add, ptr %val, align 4228 br label %for.inc229 230for.inc: ; preds = %for.body231 %6 = load i32, ptr %i, align 4232 %inc = add nsw i32 %6, 1233 store i32 %inc, ptr %i, align 4234 br label %for.cond235 236for.end: ; preds = %land.end237 store i32 0, ptr %i2, align 4238 br label %for.cond3239 240for.cond3: ; preds = %for.inc8, %for.end241 %7 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %0) ]242 %8 = load i32, ptr %a, align 4243 %tobool4 = icmp ne i32 %8, 0244 br i1 %tobool4, label %lor.end, label %lor.rhs245 246lor.rhs: ; preds = %for.cond3247 %9 = load i32, ptr %b, align 4248 %tobool5 = icmp ne i32 %9, 0249 br label %lor.end250 251lor.end: ; preds = %lor.rhs, %for.cond3252 %10 = phi i1 [ true, %for.cond3 ], [ %tobool5, %lor.rhs ]253 br i1 %10, label %for.body6, label %for.end10254 255for.body6: ; preds = %lor.end256 %11 = load i32, ptr %val, align 4257 %add7 = add nsw i32 %11, 1258 store i32 %add7, ptr %val, align 4259 store i32 0, ptr %b, align 4260 br label %for.inc8261 262for.inc8: ; preds = %for.body6263 %12 = load i32, ptr %i2, align 4264 %inc9 = add nsw i32 %12, 1265 store i32 %inc9, ptr %i2, align 4266 br label %for.cond3267 268for.end10: ; preds = %lor.end269 store i32 1, ptr %b, align 4270 store i32 0, ptr %i11, align 4271 br label %for.cond12272 273for.cond12: ; preds = %for.inc23, %for.end10274 %13 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %0) ]275 %14 = load i32, ptr %a, align 4276 %tobool13 = icmp ne i32 %14, 0277 br i1 %tobool13, label %land.rhs14, label %land.end20278 279land.rhs14: ; preds = %for.cond12280 %15 = load i32, ptr %a, align 4281 %tobool15 = icmp ne i32 %15, 0282 br i1 %tobool15, label %land.rhs17, label %lor.lhs.false283 284lor.lhs.false: ; preds = %land.rhs14285 %16 = load i32, ptr %b, align 4286 %tobool16 = icmp ne i32 %16, 0287 br i1 %tobool16, label %land.rhs17, label %land.end19288 289land.rhs17: ; preds = %lor.lhs.false, %land.rhs14290 %17 = load i32, ptr %b, align 4291 %tobool18 = icmp ne i32 %17, 0292 br label %land.end19293 294land.end19: ; preds = %land.rhs17, %lor.lhs.false295 %18 = phi i1 [ false, %lor.lhs.false ], [ %tobool18, %land.rhs17 ]296 br label %land.end20297 298land.end20: ; preds = %land.end19, %for.cond12299 %19 = phi i1 [ false, %for.cond12 ], [ %18, %land.end19 ]300 br i1 %19, label %for.body21, label %for.end25301 302for.body21: ; preds = %land.end20303 %20 = load i32, ptr %val, align 4304 %add22 = add nsw i32 %20, 4305 store i32 %add22, ptr %val, align 4306 store i32 0, ptr %b, align 4307 br label %for.inc23308 309for.inc23: ; preds = %for.body21310 %21 = load i32, ptr %i11, align 4311 %inc24 = add nsw i32 %21, 1312 store i32 %inc24, ptr %i11, align 4313 br label %for.cond12314 315for.end25: ; preds = %land.end20316 store i32 1, ptr %b, align 4317 store i32 0, ptr %i26, align 4318 br label %for.cond27319 320for.cond27: ; preds = %for.inc32, %for.end25321 %22 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %0) ]322 %23 = load i32, ptr %a, align 4323 %tobool28 = icmp ne i32 %23, 0324 br i1 %tobool28, label %cond.true, label %cond.false325 326cond.true: ; preds = %for.cond27327 %24 = load i32, ptr %a, align 4328 br label %cond.end329 330cond.false: ; preds = %for.cond27331 %25 = load i32, ptr %b, align 4332 br label %cond.end333 334cond.end: ; preds = %cond.false, %cond.true335 %cond = phi i32 [ %24, %cond.true ], [ %25, %cond.false ]336 %tobool29 = icmp ne i32 %cond, 0337 br i1 %tobool29, label %for.body30, label %for.end34338 339for.body30: ; preds = %cond.end340 %26 = load i32, ptr %val, align 4341 %add31 = add nsw i32 %26, 8342 store i32 %add31, ptr %val, align 4343 store i32 0, ptr %b, align 4344 br label %for.inc32345 346for.inc32: ; preds = %for.body30347 %27 = load i32, ptr %i26, align 4348 %inc33 = add nsw i32 %27, 1349 store i32 %inc33, ptr %i26, align 4350 br label %for.cond27351 352for.end34: ; preds = %cond.end353 store i32 0, ptr %x, align 4354 store i32 0, ptr %y, align 4355 store i32 0, ptr %i35, align 4356 br label %for.cond36357 358for.cond36: ; preds = %for.inc45, %for.end34359 %28 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %0) ]360 %29 = load i32, ptr %x, align 4361 %30 = load i32, ptr %x, align 4362 %tobool37 = icmp ne i32 %30, 0363 br i1 %tobool37, label %land.rhs38, label %land.end40364 365land.rhs38: ; preds = %for.cond36366 %31 = load i32, ptr %y, align 4367 %tobool39 = icmp ne i32 %31, 0368 br label %land.end40369 370land.end40: ; preds = %land.rhs38, %for.cond36371 %32 = phi i1 [ false, %for.cond36 ], [ %tobool39, %land.rhs38 ]372 %conv = zext i1 %32 to i32373 %add41 = add nsw i32 %29, %conv374 %tobool42 = icmp ne i32 %add41, 0375 br i1 %tobool42, label %for.body43, label %for.end47376 377for.body43: ; preds = %land.end40378 %33 = load i32, ptr %val, align 4379 %add44 = add nsw i32 %33, 16380 store i32 %add44, ptr %val, align 4381 br label %for.inc45382 383for.inc45: ; preds = %for.body43384 %34 = load i32, ptr %i35, align 4385 %inc46 = add nsw i32 %34, 1386 store i32 %inc46, ptr %i35, align 4387 br label %for.cond36388 389for.end47: ; preds = %land.end40390 %35 = load i32, ptr %val, align 4391 ret i32 %35392}393 394; Function Attrs: convergent nocallback nofree nosync nounwind willreturn memory(none)395declare token @llvm.experimental.convergence.entry() #1396 397; Function Attrs: convergent nocallback nofree nosync nounwind willreturn memory(none)398declare token @llvm.experimental.convergence.loop() #1399 400; Function Attrs: convergent noinline norecurse nounwind optnone401define internal spir_func void @main() #0 {402entry:403 %0 = call token @llvm.experimental.convergence.entry()404 %call1 = call spir_func noundef i32 @_Z7processv() #3 [ "convergencectrl"(token %0) ]405 ret void406}407 408; Function Attrs: convergent norecurse409define void @main.1() #2 {410entry:411 call void @main()412 ret void413}414 415attributes #0 = { convergent noinline norecurse nounwind optnone "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }416attributes #1 = { convergent nocallback nofree nosync nounwind willreturn memory(none) }417attributes #2 = { convergent norecurse "frame-pointer"="all" "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }418attributes #3 = { convergent }419 420!llvm.module.flags = !{!0, !1, !2}421 422 423!0 = !{i32 1, !"wchar_size", i32 4}424!1 = !{i32 4, !"dx.disable_optimizations", i32 1}425!2 = !{i32 7, !"frame-pointer", i32 2}426 427 428