1a5641f10SNathan Gauër; RUN: llc -mtriple=spirv-unknown-vulkan-compute -O0 %s -o - | FileCheck %s --match-full-lines 2*cba70550SNathan Gauër; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan-compute %s -o - -filetype=obj | spirv-val %} 3a5641f10SNathan Gauër 4a5641f10SNathan 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" 5a5641f10SNathan Gauërtarget triple = "spirv-unknown-vulkan-compute" 6a5641f10SNathan Gauër 7a5641f10SNathan Gauërdefine internal spir_func void @main() #0 { 8a5641f10SNathan Gauër 9*cba70550SNathan Gauër; CHECK-DAG: OpName %[[#idx:]] "idx" 10*cba70550SNathan Gauër; CHECK-DAG: OpDecorate %[[#builtin:]] BuiltIn SubgroupLocalInvocationId 11a5641f10SNathan Gauër; CHECK-DAG: %[[#int_ty:]] = OpTypeInt 32 0 121ed65febSNathan Gauër; CHECK-DAG: %[[#int_ipty:]] = OpTypePointer Input %[[#int_ty]] 13a5641f10SNathan Gauër; CHECK-DAG: %[[#bool_ty:]] = OpTypeBool 14a5641f10SNathan Gauër; CHECK-DAG: %[[#int_0:]] = OpConstant %[[#int_ty]] 0 15a5641f10SNathan Gauër; CHECK-DAG: %[[#int_10:]] = OpConstant %[[#int_ty]] 10 161ed65febSNathan Gauër; CHECK-DAG: %[[#builtin]] = OpVariable %[[#int_ipty]] Input 17a5641f10SNathan Gauër 18a5641f10SNathan Gauër; CHECK: %[[#entry:]] = OpLabel 19*cba70550SNathan Gauër; CHECK: %[[#idx]] = OpVariable %[[#]] Function 20*cba70550SNathan Gauër; ACHECK: OpStore %[[#idx]] %[[#int_0]] Aligned 4 21a5641f10SNathan Gauër; CHECK: OpBranch %[[#while_cond:]] 22a5641f10SNathan Gauërentry: 23a5641f10SNathan Gauër %0 = call token @llvm.experimental.convergence.entry() 24a5641f10SNathan Gauër %idx = alloca i32, align 4 25a5641f10SNathan Gauër store i32 0, ptr %idx, align 4 26a5641f10SNathan Gauër br label %while.cond 27a5641f10SNathan Gauër 28a5641f10SNathan Gauër; CHECK: %[[#while_cond]] = OpLabel 29a5641f10SNathan Gauër; CHECK: %[[#tmp:]] = OpLoad %[[#int_ty]] %[[#idx]] Aligned 4 30a5641f10SNathan Gauër; CHECK: %[[#cmp:]] = OpINotEqual %[[#bool_ty]] %[[#tmp]] %[[#int_10]] 311ed65febSNathan Gauër; CHECK: OpLoopMerge %[[#new_end:]] %[[#if_end:]] None 321ed65febSNathan Gauër; CHECK: OpBranchConditional %[[#cmp]] %[[#while_body:]] %[[#new_end]] 331ed65febSNathan Gauër 34a5641f10SNathan Gauërwhile.cond: 35a5641f10SNathan Gauër %1 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %0) ] 36a5641f10SNathan Gauër %2 = load i32, ptr %idx, align 4 37a5641f10SNathan Gauër %cmp = icmp ne i32 %2, 10 38a5641f10SNathan Gauër br i1 %cmp, label %while.body, label %while.end 39a5641f10SNathan Gauër 40a5641f10SNathan Gauër; CHECK: %[[#while_body]] = OpLabel 41*cba70550SNathan Gauër; CHECK: %[[#tmp:]] = OpLoad %[[#]] %[[#builtin]] Aligned 1 42*cba70550SNathan Gauër; CHECK: OpStore %[[#idx]] %[[#tmp]] Aligned 4 43*cba70550SNathan Gauër; CHECK: %[[#tmp:]] = OpLoad %[[#int_ty]] %[[#idx]] Aligned 4 44*cba70550SNathan Gauër; CHECK: %[[#cmp1:]] = OpIEqual %[[#bool_ty]] %[[#tmp]] %[[#int_0]] 451ed65febSNathan Gauër; CHECK: OpBranchConditional %[[#cmp1]] %[[#new_end]] %[[#if_end]] 46a5641f10SNathan Gauërwhile.body: 47a5641f10SNathan Gauër %3 = call i32 @__hlsl_wave_get_lane_index() [ "convergencectrl"(token %1) ] 48a5641f10SNathan Gauër store i32 %3, ptr %idx, align 4 49a5641f10SNathan Gauër %4 = load i32, ptr %idx, align 4 50a5641f10SNathan Gauër %cmp1 = icmp eq i32 %4, 0 51a5641f10SNathan Gauër br i1 %cmp1, label %if.then, label %if.end 52a5641f10SNathan Gauër 53*cba70550SNathan Gauër; CHECK: %[[#if_end]] = OpLabel 54*cba70550SNathan Gauër; CHECK: OpBranch %[[#while_cond]] 55*cba70550SNathan Gauër 561ed65febSNathan Gauër; CHECK: %[[#new_end]] = OpLabel 571ed65febSNathan Gauër; CHECK: OpBranch %[[#while_end:]] 58a5641f10SNathan Gauërif.then: 59a5641f10SNathan Gauër br label %while.end 60a5641f10SNathan Gauër 61a5641f10SNathan Gauërif.end: 62a5641f10SNathan Gauër br label %while.cond 63a5641f10SNathan Gauër 641ed65febSNathan Gauër; CHECK: %[[#while_end]] = OpLabel 651ed65febSNathan Gauër; CHECK: OpReturn 66a5641f10SNathan Gauërwhile.end: 67a5641f10SNathan Gauër ret void 68a5641f10SNathan Gauër} 69a5641f10SNathan Gauër 70a5641f10SNathan Gauërdeclare token @llvm.experimental.convergence.entry() #2 71a5641f10SNathan Gauërdeclare token @llvm.experimental.convergence.loop() #2 72a5641f10SNathan Gauërdeclare i32 @__hlsl_wave_get_lane_index() #3 73a5641f10SNathan Gauër 74a5641f10SNathan Gauërattributes #0 = { convergent noinline norecurse nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" } 75a5641f10SNathan Gauërattributes #1 = { convergent norecurse "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" "no-trapping-math"="true" "stack-protector-buffer-size"="8" } 76a5641f10SNathan Gauërattributes #2 = { convergent nocallback nofree nosync nounwind willreturn memory(none) } 77a5641f10SNathan Gauërattributes #3 = { convergent } 78a5641f10SNathan Gauër 79a5641f10SNathan Gauër!llvm.module.flags = !{!0, !1} 80a5641f10SNathan Gauër 81a5641f10SNathan Gauër!0 = !{i32 1, !"wchar_size", i32 4} 82a5641f10SNathan Gauër!1 = !{i32 4, !"dx.disable_optimizations", i32 1} 83