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: OpName %[[#reg_0:]] "reg" 11*cba70550SNathan Gauër; CHECK-DAG: OpDecorate %[[#builtin:]] BuiltIn SubgroupLocalInvocationId 12a5641f10SNathan Gauër; CHECK-DAG: %[[#int_ty:]] = OpTypeInt 32 0 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_1:]] = OpConstant %[[#int_ty]] 1 16a5641f10SNathan Gauër; CHECK-DAG: %[[#int_2:]] = OpConstant %[[#int_ty]] 2 17a5641f10SNathan Gauër; CHECK-DAG: %[[#int_10:]] = OpConstant %[[#int_ty]] 10 18a5641f10SNathan Gauër 19a5641f10SNathan Gauër; CHECK: %[[#entry:]] = OpLabel 20*cba70550SNathan Gauër; CHECK: %[[#idx]] = OpVariable %[[#]] Function 21a5641f10SNathan Gauër; CHECK: OpStore %[[#idx]] %[[#int_0]] Aligned 4 22a5641f10SNathan Gauër; CHECK: OpBranch %[[#while_cond:]] 23a5641f10SNathan Gauërentry: 24a5641f10SNathan Gauër %0 = call token @llvm.experimental.convergence.entry() 25a5641f10SNathan Gauër %idx = alloca i32, align 4 26a5641f10SNathan Gauër store i32 0, ptr %idx, align 4 27a5641f10SNathan Gauër br label %while.cond 28a5641f10SNathan Gauër 29a5641f10SNathan Gauër; CHECK: %[[#while_cond]] = OpLabel 30*cba70550SNathan Gauër; CHECK: OpStore %[[#reg_0]] %[[#]] Aligned 4 31a5641f10SNathan Gauër; CHECK: %[[#tmp:]] = OpLoad %[[#int_ty]] %[[#idx]] Aligned 4 32a5641f10SNathan Gauër; CHECK: %[[#cmp:]] = OpINotEqual %[[#bool_ty]] %[[#tmp]] %[[#int_10]] 331ed65febSNathan Gauër; CHECK: OpLoopMerge %[[#new_end:]] %[[#if_end2:]] None 341ed65febSNathan Gauër; CHECK: OpBranchConditional %[[#cmp]] %[[#while_body:]] %[[#new_end]] 35a5641f10SNathan Gauërwhile.cond: 36a5641f10SNathan Gauër %1 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %0) ] 37a5641f10SNathan Gauër %2 = load i32, ptr %idx, align 4 38a5641f10SNathan Gauër %cmp = icmp ne i32 %2, 10 39a5641f10SNathan Gauër br i1 %cmp, label %while.body, label %while.end 40a5641f10SNathan Gauër 41a5641f10SNathan Gauër; CHECK: %[[#while_body]] = OpLabel 42*cba70550SNathan Gauër; CHECK: OpStore %[[#reg_0]] %[[#]] Aligned 4 43*cba70550SNathan Gauër; CHECK: %[[#tmp:]] = OpLoad %[[#]] %[[#builtin]] Aligned 1 44*cba70550SNathan Gauër; CHECK: OpStore %[[#idx]] %[[#tmp]] Aligned 4 45*cba70550SNathan Gauër; CHECK: %[[#tmp:]] = OpLoad %[[#int_ty]] %[[#idx]] Aligned 4 46*cba70550SNathan Gauër; CHECK: %[[#cmp1:]] = OpIEqual %[[#bool_ty]] %[[#tmp]] %[[#int_0]] 471ed65febSNathan Gauër; CHECK: OpBranchConditional %[[#cmp1]] %[[#new_end]] %[[#if_end:]] 48a5641f10SNathan Gauërwhile.body: 49a5641f10SNathan Gauër %3 = call i32 @__hlsl_wave_get_lane_index() [ "convergencectrl"(token %1) ] 50a5641f10SNathan Gauër store i32 %3, ptr %idx, align 4 51a5641f10SNathan Gauër %4 = load i32, ptr %idx, align 4 52a5641f10SNathan Gauër %cmp1 = icmp eq i32 %4, 0 53a5641f10SNathan Gauër br i1 %cmp1, label %if.then, label %if.end 54a5641f10SNathan Gauër 55a5641f10SNathan Gauër; CHECK: %[[#if_end]] = OpLabel 56*cba70550SNathan Gauër; CHECK: OpStore %[[#reg_0]] %[[#]] Aligned 4 57*cba70550SNathan Gauër; CHECK: %[[#tmp:]] = OpLoad %[[#int_ty]] %[[#builtin]] Aligned 1 58*cba70550SNathan Gauër; CHECK: OpStore %[[#idx]] %[[#tmp]] Aligned 4 59*cba70550SNathan Gauër; CHECK: %[[#tmp:]] = OpLoad %[[#int_ty]] %[[#idx]] Aligned 4 60*cba70550SNathan Gauër; CHECK: %[[#cmp2:]] = OpIEqual %[[#bool_ty]] %[[#tmp]] %[[#int_0]] 611ed65febSNathan Gauër; CHECK: OpBranchConditional %[[#cmp2]] %[[#new_end]] %[[#if_end2]] 62a5641f10SNathan Gauërif.end: 63a5641f10SNathan Gauër %5 = call i32 @__hlsl_wave_get_lane_index() [ "convergencectrl"(token %1) ] 64a5641f10SNathan Gauër store i32 %5, ptr %idx, align 4 65a5641f10SNathan Gauër %6 = load i32, ptr %idx, align 4 66a5641f10SNathan Gauër %cmp2 = icmp eq i32 %6, 0 67a5641f10SNathan Gauër br i1 %cmp2, label %if.then2, label %if.end2 68a5641f10SNathan Gauër 69*cba70550SNathan Gauër; CHECK: %[[#if_end2]] = OpLabel 70*cba70550SNathan Gauër; CHECK: OpBranch %[[#while_cond]] 71*cba70550SNathan Gauër 721ed65febSNathan Gauër; TODO: this OpSwitch is useless. Improve the "remove useless branches" step of the structurizer to 731ed65febSNathan Gauër; cleanup those. 741ed65febSNathan Gauër; CHECK: %[[#new_end]] = OpLabel 75*cba70550SNathan Gauër; CHECK: %[[#route:]] = OpLoad %[[#]] %[[#reg_0]] Aligned 4 761ed65febSNathan Gauër; CHECK: OpSwitch %[[#route]] %[[#while_end:]] 1 %[[#while_end:]] 2 %[[#while_end:]] 77a5641f10SNathan Gauër 78a5641f10SNathan Gauërif.end2: 79a5641f10SNathan Gauër br label %while.cond 80a5641f10SNathan Gauër 811ed65febSNathan Gauër; CHECK: %[[#while_end]] = OpLabel 821ed65febSNathan Gauër; CHECK: OpReturn 83a5641f10SNathan Gauërwhile.end: 84a5641f10SNathan Gauër ret void 85a5641f10SNathan Gauër 861ed65febSNathan Gauër; Those blocks are removed by the structurizer. 871ed65febSNathan Gauërif.then: 881ed65febSNathan Gauër br label %while.end 891ed65febSNathan Gauër 901ed65febSNathan Gauërif.then2: 911ed65febSNathan Gauër br label %while.end 92a5641f10SNathan Gauër} 93a5641f10SNathan Gauër 941ed65febSNathan Gauërdeclare token @llvm.experimental.convergence.entry() #1 951ed65febSNathan Gauërdeclare token @llvm.experimental.convergence.loop() #1 961ed65febSNathan Gauërdeclare i32 @__hlsl_wave_get_lane_index() convergent 97a5641f10SNathan Gauër 98a5641f10SNathan Gauërattributes #0 = { convergent noinline norecurse nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" } 991ed65febSNathan Gauërattributes #1 = { convergent nocallback nofree nosync nounwind willreturn memory(none) } 100a5641f10SNathan Gauër 101a5641f10SNathan Gauër!llvm.module.flags = !{!0, !1} 102a5641f10SNathan Gauër 103a5641f10SNathan Gauër!0 = !{i32 1, !"wchar_size", i32 4} 104a5641f10SNathan Gauër!1 = !{i32 4, !"dx.disable_optimizations", i32 1} 105