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; int process() { 61ed65febSNathan Gauër; int val = 0; 71ed65febSNathan Gauër; 81ed65febSNathan Gauër; for (int i = 0; i < 10; ++i) { 91ed65febSNathan Gauër; val = val + i; 101ed65febSNathan Gauër; 111ed65febSNathan Gauër; for (int j = 0; j < 2; ++j) { 121ed65febSNathan Gauër; for (int k = 0; k < 2; ++k) { 131ed65febSNathan Gauër; val = val + k; 141ed65febSNathan Gauër; } 151ed65febSNathan Gauër; 161ed65febSNathan Gauër; val = val * 2; 171ed65febSNathan Gauër; 181ed65febSNathan Gauër; } 191ed65febSNathan Gauër; } 201ed65febSNathan Gauër; return val; 211ed65febSNathan Gauër; } 221ed65febSNathan Gauër; 231ed65febSNathan Gauër; [numthreads(1, 1, 1)] 241ed65febSNathan Gauër; void main() { 251ed65febSNathan Gauër; process(); 261ed65febSNathan Gauër; } 271ed65febSNathan Gauër 281ed65febSNathan Gauër; CHECK: %[[#func_11:]] = OpFunction %[[#uint:]] DontInline %[[#]] 291ed65febSNathan Gauër; CHECK: %[[#bb41:]] = OpLabel 301ed65febSNathan Gauër; CHECK: OpBranch %[[#bb42:]] 31*53326ee0SNathan Gauër; CHECK: %[[#bb42]] = OpLabel 321ed65febSNathan Gauër; CHECK: OpLoopMerge %[[#bb43:]] %[[#bb44:]] None 33*53326ee0SNathan Gauër; CHECK: OpBranchConditional %[[#]] %[[#bb45:]] %[[#bb43]] 34*53326ee0SNathan Gauër ; CHECK: %[[#bb43]] = OpLabel 351ed65febSNathan Gauër ; CHECK: OpReturnValue %[[#]] 36*53326ee0SNathan Gauër 37*53326ee0SNathan Gauër ; CHECK: %[[#bb45]] = OpLabel 38*53326ee0SNathan Gauër ; CHECK: OpBranch %[[#bb46:]] 39*53326ee0SNathan Gauër ; CHECK: %[[#bb46]] = OpLabel 40*53326ee0SNathan Gauër ; CHECK: OpLoopMerge %[[#bb47:]] %[[#bb48:]] None 41*53326ee0SNathan Gauër ; CHECK: OpBranchConditional %[[#]] %[[#bb49:]] %[[#bb47]] 42*53326ee0SNathan Gauër ; CHECK: %[[#bb47]] = OpLabel 43*53326ee0SNathan Gauër ; CHECK: OpBranch %[[#bb44]] 44*53326ee0SNathan Gauër ; CHECK: %[[#bb44]] = OpLabel 45*53326ee0SNathan Gauër ; CHECK: OpBranch %[[#bb42]] 46*53326ee0SNathan Gauër 47*53326ee0SNathan Gauër ; CHECK: %[[#bb49]] = OpLabel 48*53326ee0SNathan Gauër ; CHECK: OpBranch %[[#bb50:]] 49*53326ee0SNathan Gauër ; CHECK: %[[#bb50]] = OpLabel 50*53326ee0SNathan Gauër ; CHECK: OpLoopMerge %[[#bb51:]] %[[#bb52:]] None 51*53326ee0SNathan Gauër ; CHECK: OpBranchConditional %[[#]] %[[#bb53:]] %[[#bb51]] 52*53326ee0SNathan Gauër ; CHECK: %[[#bb51]] = OpLabel 53*53326ee0SNathan Gauër ; CHECK: OpBranch %[[#bb48]] 54*53326ee0SNathan Gauër ; CHECK: %[[#bb48]] = OpLabel 55*53326ee0SNathan Gauër ; CHECK: OpBranch %[[#bb46]] 56*53326ee0SNathan Gauër 57*53326ee0SNathan Gauër ; CHECK: %[[#bb53]] = OpLabel 58*53326ee0SNathan Gauër ; CHECK: OpBranch %[[#bb52]] 59*53326ee0SNathan Gauër ; CHECK: %[[#bb52]] = OpLabel 60*53326ee0SNathan Gauër ; CHECK: OpBranch %[[#bb50]] 611ed65febSNathan Gauër; CHECK: OpFunctionEnd 62*53326ee0SNathan Gauër 631ed65febSNathan Gauër; CHECK: %[[#func_37:]] = OpFunction %[[#void:]] DontInline %[[#]] 641ed65febSNathan Gauër; CHECK: %[[#bb54:]] = OpLabel 651ed65febSNathan Gauër; CHECK: OpReturn 661ed65febSNathan Gauër; CHECK: OpFunctionEnd 67*53326ee0SNathan Gauër 681ed65febSNathan Gauër; CHECK: %[[#func_39:]] = OpFunction %[[#void:]] None %[[#]] 691ed65febSNathan Gauër; CHECK: %[[#bb55:]] = OpLabel 701ed65febSNathan Gauër; CHECK: OpReturn 711ed65febSNathan Gauër; CHECK: OpFunctionEnd 721ed65febSNathan Gauër 731ed65febSNathan Gauër 741ed65febSNathan Gauër 751ed65febSNathan 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" 761ed65febSNathan Gauërtarget triple = "spirv-unknown-vulkan1.3-compute" 771ed65febSNathan Gauër 781ed65febSNathan Gauër; Function Attrs: convergent noinline norecurse nounwind optnone 791ed65febSNathan Gauërdefine spir_func noundef i32 @_Z7processv() #0 { 801ed65febSNathan Gauërentry: 811ed65febSNathan Gauër %0 = call token @llvm.experimental.convergence.entry() 821ed65febSNathan Gauër %val = alloca i32, align 4 831ed65febSNathan Gauër %i = alloca i32, align 4 841ed65febSNathan Gauër %j = alloca i32, align 4 851ed65febSNathan Gauër %k = alloca i32, align 4 861ed65febSNathan Gauër store i32 0, ptr %val, align 4 871ed65febSNathan Gauër store i32 0, ptr %i, align 4 881ed65febSNathan Gauër br label %for.cond 891ed65febSNathan Gauër 901ed65febSNathan Gauërfor.cond: ; preds = %for.inc11, %entry 911ed65febSNathan Gauër %1 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %0) ] 921ed65febSNathan Gauër %2 = load i32, ptr %i, align 4 931ed65febSNathan Gauër %cmp = icmp slt i32 %2, 10 941ed65febSNathan Gauër br i1 %cmp, label %for.body, label %for.end13 951ed65febSNathan Gauër 961ed65febSNathan Gauërfor.body: ; preds = %for.cond 971ed65febSNathan Gauër %3 = load i32, ptr %val, align 4 981ed65febSNathan Gauër %4 = load i32, ptr %i, align 4 991ed65febSNathan Gauër %add = add nsw i32 %3, %4 1001ed65febSNathan Gauër store i32 %add, ptr %val, align 4 1011ed65febSNathan Gauër store i32 0, ptr %j, align 4 1021ed65febSNathan Gauër br label %for.cond1 1031ed65febSNathan Gauër 1041ed65febSNathan Gauërfor.cond1: ; preds = %for.inc8, %for.body 1051ed65febSNathan Gauër %5 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %1) ] 1061ed65febSNathan Gauër %6 = load i32, ptr %j, align 4 1071ed65febSNathan Gauër %cmp2 = icmp slt i32 %6, 2 1081ed65febSNathan Gauër br i1 %cmp2, label %for.body3, label %for.end10 1091ed65febSNathan Gauër 1101ed65febSNathan Gauërfor.body3: ; preds = %for.cond1 1111ed65febSNathan Gauër store i32 0, ptr %k, align 4 1121ed65febSNathan Gauër br label %for.cond4 1131ed65febSNathan Gauër 1141ed65febSNathan Gauërfor.cond4: ; preds = %for.inc, %for.body3 1151ed65febSNathan Gauër %7 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %5) ] 1161ed65febSNathan Gauër %8 = load i32, ptr %k, align 4 1171ed65febSNathan Gauër %cmp5 = icmp slt i32 %8, 2 1181ed65febSNathan Gauër br i1 %cmp5, label %for.body6, label %for.end 1191ed65febSNathan Gauër 1201ed65febSNathan Gauërfor.body6: ; preds = %for.cond4 1211ed65febSNathan Gauër %9 = load i32, ptr %val, align 4 1221ed65febSNathan Gauër %10 = load i32, ptr %k, align 4 1231ed65febSNathan Gauër %add7 = add nsw i32 %9, %10 1241ed65febSNathan Gauër store i32 %add7, ptr %val, align 4 1251ed65febSNathan Gauër br label %for.inc 1261ed65febSNathan Gauër 1271ed65febSNathan Gauërfor.inc: ; preds = %for.body6 1281ed65febSNathan Gauër %11 = load i32, ptr %k, align 4 1291ed65febSNathan Gauër %inc = add nsw i32 %11, 1 1301ed65febSNathan Gauër store i32 %inc, ptr %k, align 4 1311ed65febSNathan Gauër br label %for.cond4 1321ed65febSNathan Gauër 1331ed65febSNathan Gauërfor.end: ; preds = %for.cond4 1341ed65febSNathan Gauër %12 = load i32, ptr %val, align 4 1351ed65febSNathan Gauër %mul = mul nsw i32 %12, 2 1361ed65febSNathan Gauër store i32 %mul, ptr %val, align 4 1371ed65febSNathan Gauër br label %for.inc8 1381ed65febSNathan Gauër 1391ed65febSNathan Gauërfor.inc8: ; preds = %for.end 1401ed65febSNathan Gauër %13 = load i32, ptr %j, align 4 1411ed65febSNathan Gauër %inc9 = add nsw i32 %13, 1 1421ed65febSNathan Gauër store i32 %inc9, ptr %j, align 4 1431ed65febSNathan Gauër br label %for.cond1 1441ed65febSNathan Gauër 1451ed65febSNathan Gauërfor.end10: ; preds = %for.cond1 1461ed65febSNathan Gauër br label %for.inc11 1471ed65febSNathan Gauër 1481ed65febSNathan Gauërfor.inc11: ; preds = %for.end10 1491ed65febSNathan Gauër %14 = load i32, ptr %i, align 4 1501ed65febSNathan Gauër %inc12 = add nsw i32 %14, 1 1511ed65febSNathan Gauër store i32 %inc12, ptr %i, align 4 1521ed65febSNathan Gauër br label %for.cond 1531ed65febSNathan Gauër 1541ed65febSNathan Gauërfor.end13: ; preds = %for.cond 1551ed65febSNathan Gauër %15 = load i32, ptr %val, align 4 1561ed65febSNathan Gauër ret i32 %15 1571ed65febSNathan Gauër} 1581ed65febSNathan Gauër 1591ed65febSNathan Gauër; Function Attrs: convergent nocallback nofree nosync nounwind willreturn memory(none) 1601ed65febSNathan Gauërdeclare token @llvm.experimental.convergence.entry() #1 1611ed65febSNathan Gauër 1621ed65febSNathan Gauër; Function Attrs: convergent nocallback nofree nosync nounwind willreturn memory(none) 1631ed65febSNathan Gauërdeclare token @llvm.experimental.convergence.loop() #1 1641ed65febSNathan Gauër 1651ed65febSNathan Gauër; Function Attrs: convergent noinline norecurse nounwind optnone 1661ed65febSNathan Gauërdefine internal spir_func void @main() #0 { 1671ed65febSNathan Gauërentry: 1681ed65febSNathan Gauër %0 = call token @llvm.experimental.convergence.entry() 1691ed65febSNathan Gauër %call1 = call spir_func noundef i32 @_Z7processv() #3 [ "convergencectrl"(token %0) ] 1701ed65febSNathan Gauër ret void 1711ed65febSNathan Gauër} 1721ed65febSNathan Gauër 1731ed65febSNathan Gauër; Function Attrs: convergent norecurse 1741ed65febSNathan Gauërdefine void @main.1() #2 { 1751ed65febSNathan Gauërentry: 1761ed65febSNathan Gauër call void @main() 1771ed65febSNathan Gauër ret void 1781ed65febSNathan Gauër} 1791ed65febSNathan Gauër 1801ed65febSNathan Gauërattributes #0 = { convergent noinline norecurse nounwind optnone "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" } 1811ed65febSNathan Gauërattributes #1 = { convergent nocallback nofree nosync nounwind willreturn memory(none) } 1821ed65febSNathan 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" } 1831ed65febSNathan Gauërattributes #3 = { convergent } 1841ed65febSNathan Gauër 1851ed65febSNathan Gauër!llvm.module.flags = !{!0, !1, !2} 1861ed65febSNathan Gauër 1871ed65febSNathan Gauër 1881ed65febSNathan Gauër!0 = !{i32 1, !"wchar_size", i32 4} 1891ed65febSNathan Gauër!1 = !{i32 4, !"dx.disable_optimizations", i32 1} 1901ed65febSNathan Gauër!2 = !{i32 7, !"frame-pointer", i32 2} 1911ed65febSNathan Gauër 1921ed65febSNathan Gauër 193