11ed65febSNathan Gauër; RUN: llc -mtriple=spirv-unknown-vulkan-compute -O0 %s -o - | FileCheck %s 21ed65febSNathan Gauër; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan-compute %s -o - -filetype=obj | spirv-val %} 31ed65febSNathan Gauër 41ed65febSNathan Gauër 51ed65febSNathan Gauër; 61ed65febSNathan Gauër; int process() { 71ed65febSNathan Gauër; int c1 = 0; 81ed65febSNathan Gauër; int c2 = 1; 91ed65febSNathan Gauër; int c3 = 0; 101ed65febSNathan Gauër; int c4 = 1; 111ed65febSNathan Gauër; int val = 0; 121ed65febSNathan Gauër; 131ed65febSNathan Gauër; if (c1) { 141ed65febSNathan Gauër; if (c2) 151ed65febSNathan Gauër; val = 1; 161ed65febSNathan Gauër; } else { 171ed65febSNathan Gauër; if (c3) { 181ed65febSNathan Gauër; val = 2; 191ed65febSNathan Gauër; } else { 201ed65febSNathan Gauër; if (c4) { 211ed65febSNathan Gauër; val = 3; 221ed65febSNathan Gauër; } 231ed65febSNathan Gauër; } 241ed65febSNathan Gauër; } 251ed65febSNathan Gauër; return val; 261ed65febSNathan Gauër; } 271ed65febSNathan Gauër; 281ed65febSNathan Gauër; [numthreads(1, 1, 1)] 291ed65febSNathan Gauër; void main() { 301ed65febSNathan Gauër; process(); 311ed65febSNathan Gauër; } 321ed65febSNathan Gauër 331ed65febSNathan Gauër; CHECK: %[[#func_11:]] = OpFunction %[[#uint:]] DontInline %[[#]] 341ed65febSNathan Gauër; CHECK: %[[#bb30:]] = OpLabel 351ed65febSNathan Gauër; CHECK: OpSelectionMerge %[[#bb31:]] None 361ed65febSNathan Gauër; CHECK: OpBranchConditional %[[#]] %[[#bb32:]] %[[#bb33:]] 37*53326ee0SNathan Gauër; CHECK: %[[#bb33]] = OpLabel 381ed65febSNathan Gauër; CHECK: OpSelectionMerge %[[#bb34:]] None 39*53326ee0SNathan Gauër; CHECK: OpBranchConditional %[[#]] %[[#bb35:]] %[[#bb36:]] 40*53326ee0SNathan Gauër; CHECK: %[[#bb36]] = OpLabel 41*53326ee0SNathan Gauër; CHECK: OpSelectionMerge %[[#bb37:]] None 42*53326ee0SNathan Gauër; CHECK: OpBranchConditional %[[#]] %[[#bb38:]] %[[#bb37]] 43*53326ee0SNathan Gauër; CHECK: %[[#bb38]] = OpLabel 44*53326ee0SNathan Gauër; CHECK: OpBranch %[[#bb37]] 45*53326ee0SNathan Gauër; CHECK: %[[#bb37]] = OpLabel 46*53326ee0SNathan Gauër; CHECK: OpBranch %[[#bb34]] 47*53326ee0SNathan Gauër; CHECK: %[[#bb35]] = OpLabel 48*53326ee0SNathan Gauër; CHECK: OpBranch %[[#bb34]] 49*53326ee0SNathan Gauër; CHECK: %[[#bb34]] = OpLabel 50*53326ee0SNathan Gauër; CHECK: OpBranch %[[#bb31]] 51*53326ee0SNathan Gauër; CHECK: %[[#bb32]] = OpLabel 521ed65febSNathan Gauër; CHECK: OpSelectionMerge %[[#bb39:]] None 53*53326ee0SNathan Gauër; CHECK: OpBranchConditional %[[#]] %[[#bb40:]] %[[#bb39]] 54*53326ee0SNathan Gauër; CHECK: %[[#bb40]] = OpLabel 55*53326ee0SNathan Gauër; CHECK: OpBranch %[[#bb39]] 56*53326ee0SNathan Gauër; CHECK: %[[#bb39]] = OpLabel 57*53326ee0SNathan Gauër; CHECK: OpBranch %[[#bb31]] 58*53326ee0SNathan Gauër; CHECK: %[[#bb31]] = OpLabel 591ed65febSNathan Gauër; CHECK: OpReturnValue %[[#]] 601ed65febSNathan Gauër; CHECK: OpFunctionEnd 611ed65febSNathan Gauër; CHECK: %[[#func_26:]] = OpFunction %[[#void:]] DontInline %[[#]] 621ed65febSNathan Gauër; CHECK: %[[#bb41:]] = OpLabel 631ed65febSNathan Gauër; CHECK: OpReturn 641ed65febSNathan Gauër; CHECK: OpFunctionEnd 65*53326ee0SNathan Gauër; CHECK: %[[#func_28:]] = OpFunction %[[#void]] None %[[#]] 661ed65febSNathan Gauër; CHECK: %[[#bb42:]] = OpLabel 671ed65febSNathan Gauër; CHECK: OpReturn 681ed65febSNathan Gauër; CHECK: OpFunctionEnd 691ed65febSNathan Gauër 701ed65febSNathan Gauërtarget datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-G1" 711ed65febSNathan Gauërtarget triple = "spirv-unknown-vulkan1.3-compute" 721ed65febSNathan Gauër 731ed65febSNathan Gauër; Function Attrs: convergent noinline norecurse nounwind optnone 741ed65febSNathan Gauërdefine spir_func noundef i32 @_Z7processv() #0 { 751ed65febSNathan Gauërentry: 761ed65febSNathan Gauër %0 = call token @llvm.experimental.convergence.entry() 771ed65febSNathan Gauër %c1 = alloca i32, align 4 781ed65febSNathan Gauër %c2 = alloca i32, align 4 791ed65febSNathan Gauër %c3 = alloca i32, align 4 801ed65febSNathan Gauër %c4 = alloca i32, align 4 811ed65febSNathan Gauër %val = alloca i32, align 4 821ed65febSNathan Gauër store i32 0, ptr %c1, align 4 831ed65febSNathan Gauër store i32 1, ptr %c2, align 4 841ed65febSNathan Gauër store i32 0, ptr %c3, align 4 851ed65febSNathan Gauër store i32 1, ptr %c4, align 4 861ed65febSNathan Gauër store i32 0, ptr %val, align 4 871ed65febSNathan Gauër %1 = load i32, ptr %c1, align 4 881ed65febSNathan Gauër %tobool = icmp ne i32 %1, 0 891ed65febSNathan Gauër br i1 %tobool, label %if.then, label %if.else 901ed65febSNathan Gauër 911ed65febSNathan Gauërif.then: ; preds = %entry 921ed65febSNathan Gauër %2 = load i32, ptr %c2, align 4 931ed65febSNathan Gauër %tobool1 = icmp ne i32 %2, 0 941ed65febSNathan Gauër br i1 %tobool1, label %if.then2, label %if.end 951ed65febSNathan Gauër 961ed65febSNathan Gauërif.then2: ; preds = %if.then 971ed65febSNathan Gauër store i32 1, ptr %val, align 4 981ed65febSNathan Gauër br label %if.end 991ed65febSNathan Gauër 1001ed65febSNathan Gauërif.end: ; preds = %if.then2, %if.then 1011ed65febSNathan Gauër br label %if.end10 1021ed65febSNathan Gauër 1031ed65febSNathan Gauërif.else: ; preds = %entry 1041ed65febSNathan Gauër %3 = load i32, ptr %c3, align 4 1051ed65febSNathan Gauër %tobool3 = icmp ne i32 %3, 0 1061ed65febSNathan Gauër br i1 %tobool3, label %if.then4, label %if.else5 1071ed65febSNathan Gauër 1081ed65febSNathan Gauërif.then4: ; preds = %if.else 1091ed65febSNathan Gauër store i32 2, ptr %val, align 4 1101ed65febSNathan Gauër br label %if.end9 1111ed65febSNathan Gauër 1121ed65febSNathan Gauërif.else5: ; preds = %if.else 1131ed65febSNathan Gauër %4 = load i32, ptr %c4, align 4 1141ed65febSNathan Gauër %tobool6 = icmp ne i32 %4, 0 1151ed65febSNathan Gauër br i1 %tobool6, label %if.then7, label %if.end8 1161ed65febSNathan Gauër 1171ed65febSNathan Gauërif.then7: ; preds = %if.else5 1181ed65febSNathan Gauër store i32 3, ptr %val, align 4 1191ed65febSNathan Gauër br label %if.end8 1201ed65febSNathan Gauër 1211ed65febSNathan Gauërif.end8: ; preds = %if.then7, %if.else5 1221ed65febSNathan Gauër br label %if.end9 1231ed65febSNathan Gauër 1241ed65febSNathan Gauërif.end9: ; preds = %if.end8, %if.then4 1251ed65febSNathan Gauër br label %if.end10 1261ed65febSNathan Gauër 1271ed65febSNathan Gauërif.end10: ; preds = %if.end9, %if.end 1281ed65febSNathan Gauër %5 = load i32, ptr %val, align 4 1291ed65febSNathan Gauër ret i32 %5 1301ed65febSNathan Gauër} 1311ed65febSNathan Gauër 1321ed65febSNathan Gauër; Function Attrs: convergent nocallback nofree nosync nounwind willreturn memory(none) 1331ed65febSNathan Gauërdeclare token @llvm.experimental.convergence.entry() #1 1341ed65febSNathan Gauër 1351ed65febSNathan Gauër; Function Attrs: convergent noinline norecurse nounwind optnone 1361ed65febSNathan Gauërdefine internal spir_func void @main() #0 { 1371ed65febSNathan Gauërentry: 1381ed65febSNathan Gauër %0 = call token @llvm.experimental.convergence.entry() 1391ed65febSNathan Gauër %call1 = call spir_func noundef i32 @_Z7processv() #3 [ "convergencectrl"(token %0) ] 1401ed65febSNathan Gauër ret void 1411ed65febSNathan Gauër} 1421ed65febSNathan Gauër 1431ed65febSNathan Gauër; Function Attrs: convergent norecurse 1441ed65febSNathan Gauërdefine void @main.1() #2 { 1451ed65febSNathan Gauërentry: 1461ed65febSNathan Gauër call void @main() 1471ed65febSNathan Gauër ret void 1481ed65febSNathan Gauër} 1491ed65febSNathan Gauër 1501ed65febSNathan Gauërattributes #0 = { convergent noinline norecurse nounwind optnone "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" } 1511ed65febSNathan Gauërattributes #1 = { convergent nocallback nofree nosync nounwind willreturn memory(none) } 1521ed65febSNathan Gauërattributes #2 = { convergent norecurse "frame-pointer"="all" "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" "no-trapping-math"="true" "stack-protector-buffer-size"="8" } 1531ed65febSNathan Gauërattributes #3 = { convergent } 1541ed65febSNathan Gauër 1551ed65febSNathan Gauër!llvm.module.flags = !{!0, !1, !2} 1561ed65febSNathan Gauër 1571ed65febSNathan Gauër 1581ed65febSNathan Gauër!0 = !{i32 1, !"wchar_size", i32 4} 1591ed65febSNathan Gauër!1 = !{i32 4, !"dx.disable_optimizations", i32 1} 1601ed65febSNathan Gauër!2 = !{i32 7, !"frame-pointer", i32 2} 1611ed65febSNathan Gauër 1621ed65febSNathan Gauër 163