[llvm] 53326ee - [SPIR-V] Fix block sorting with irreducible CFG (#116996)

via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 28 04:43:01 PST 2024


Author: Nathan Gauër
Date: 2024-11-28T13:42:57+01:00
New Revision: 53326ee0cf45fce3f80e2e98638dd27edb20c516

URL: https://github.com/llvm/llvm-project/commit/53326ee0cf45fce3f80e2e98638dd27edb20c516
DIFF: https://github.com/llvm/llvm-project/commit/53326ee0cf45fce3f80e2e98638dd27edb20c516.diff

LOG: [SPIR-V] Fix block sorting with irreducible CFG (#116996)

Block sorting was assuming reducible CFG. Meaning we always had a best
node to continue with. Irreducible CFG makes breaks this assumption, so
the algorithm looped indefinitely because no node was a valid candidate.

Fixes #116692

---------

Signed-off-by: Nathan Gauër <brioche at google.com>

Added: 
    llvm/unittests/Target/SPIRV/SPIRVSortBlocksTests.cpp

Modified: 
    llvm/lib/Target/SPIRV/SPIRVUtils.cpp
    llvm/test/CodeGen/SPIRV/branching/OpSwitchBranches.ll
    llvm/test/CodeGen/SPIRV/branching/OpSwitchUnreachable.ll
    llvm/test/CodeGen/SPIRV/branching/Two_OpSwitch_same_register.ll
    llvm/test/CodeGen/SPIRV/branching/if-merging.ll
    llvm/test/CodeGen/SPIRV/branching/if-non-merging.ll
    llvm/test/CodeGen/SPIRV/instructions/ret-type.ll
    llvm/test/CodeGen/SPIRV/structurizer/basic-if.ll
    llvm/test/CodeGen/SPIRV/structurizer/basic-loop.ll
    llvm/test/CodeGen/SPIRV/structurizer/basic-phi.ll
    llvm/test/CodeGen/SPIRV/structurizer/cf.cond-op.ll
    llvm/test/CodeGen/SPIRV/structurizer/cf.for.continue.ll
    llvm/test/CodeGen/SPIRV/structurizer/cf.for.nested.ll
    llvm/test/CodeGen/SPIRV/structurizer/cf.for.plain.ll
    llvm/test/CodeGen/SPIRV/structurizer/cf.for.short-circuited-cond.ll
    llvm/test/CodeGen/SPIRV/structurizer/cf.if.for.ll
    llvm/test/CodeGen/SPIRV/structurizer/cf.if.nested.ll
    llvm/test/CodeGen/SPIRV/structurizer/cf.return.early.ll
    llvm/test/CodeGen/SPIRV/structurizer/cf.switch.ifstmt.simple2.ll
    llvm/test/CodeGen/SPIRV/structurizer/cf.while.continue.ll
    llvm/test/CodeGen/SPIRV/structurizer/cf.while.nested.ll
    llvm/test/CodeGen/SPIRV/structurizer/cf.while.plain.ll
    llvm/test/CodeGen/SPIRV/structurizer/cf.while.short-circuited-cond.ll
    llvm/test/CodeGen/SPIRV/structurizer/condition-linear.ll
    llvm/test/CodeGen/SPIRV/structurizer/do-continue.ll
    llvm/test/CodeGen/SPIRV/structurizer/do-nested.ll
    llvm/test/CodeGen/SPIRV/structurizer/do-plain.ll
    llvm/test/CodeGen/SPIRV/structurizer/logical-or.ll
    llvm/test/CodeGen/SPIRV/structurizer/loop-continue-split.ll
    llvm/test/CodeGen/SPIRV/structurizer/merge-exit-simple-while-identity.ll
    llvm/test/CodeGen/SPIRV/structurizer/return-early.ll
    llvm/unittests/Target/SPIRV/CMakeLists.txt

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/SPIRV/SPIRVUtils.cpp b/llvm/lib/Target/SPIRV/SPIRVUtils.cpp
index ad8dfa0e8811b7..9598622f202252 100644
--- a/llvm/lib/Target/SPIRV/SPIRVUtils.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVUtils.cpp
@@ -635,15 +635,12 @@ bool sortBlocks(Function &F) {
     return false;
 
   bool Modified = false;
-
   std::vector<BasicBlock *> Order;
   Order.reserve(F.size());
 
-  PartialOrderingVisitor Visitor(F);
-  Visitor.partialOrderVisit(*F.begin(), [&Order](BasicBlock *Block) {
-    Order.push_back(Block);
-    return true;
-  });
+  ReversePostOrderTraversal<Function *> RPOT(&F);
+  for (BasicBlock *BB : RPOT)
+    Order.push_back(BB);
 
   assert(&*F.begin() == Order[0]);
   BasicBlock *LastBlock = &*F.begin();

diff  --git a/llvm/test/CodeGen/SPIRV/branching/OpSwitchBranches.ll b/llvm/test/CodeGen/SPIRV/branching/OpSwitchBranches.ll
index bc61e951fc18f4..3665c07cfcf53a 100644
--- a/llvm/test/CodeGen/SPIRV/branching/OpSwitchBranches.ll
+++ b/llvm/test/CodeGen/SPIRV/branching/OpSwitchBranches.ll
@@ -34,16 +34,16 @@ end:
   %result = load i32, ptr %alloc
   ret i32 %result
 
-; CHECK-SPIRV:      %[[#DEFAULT]] = OpLabel
+; CHECK-SPIRV:      %[[#CASE3]] = OpLabel
 ; CHECK-SPIRV:      OpBranch %[[#END:]]
 
-; CHECK-SPIRV:      %[[#CASE1]] = OpLabel
+; CHECK-SPIRV:      %[[#CASE2]] = OpLabel
 ; CHECK-SPIRV:      OpBranch %[[#END]]
 
-; CHECK-SPIRV:      %[[#CASE2]] = OpLabel
+; CHECK-SPIRV:      %[[#CASE1]] = OpLabel
 ; CHECK-SPIRV:      OpBranch %[[#END]]
 
-; CHECK-SPIRV:      %[[#CASE3]] = OpLabel
+; CHECK-SPIRV:      %[[#DEFAULT]] = OpLabel
 ; CHECK-SPIRV:      OpBranch %[[#END]]
 
 ; CHECK-SPIRV:      %[[#END]] = OpLabel

diff  --git a/llvm/test/CodeGen/SPIRV/branching/OpSwitchUnreachable.ll b/llvm/test/CodeGen/SPIRV/branching/OpSwitchUnreachable.ll
index 6bf58d1c86fd52..7fbd06c67b56e0 100644
--- a/llvm/test/CodeGen/SPIRV/branching/OpSwitchUnreachable.ll
+++ b/llvm/test/CodeGen/SPIRV/branching/OpSwitchUnreachable.ll
@@ -12,14 +12,13 @@ define void @test_switch_with_unreachable_block(i1 %a) {
     i32 1, label %reachable
   ]
 
-; CHECK-SPIRV:      %[[#UNREACHABLE]] = OpLabel
-; CHECK-SPIRV-NEXT: OpUnreachable
-
 ; CHECK-SPIRV-NEXT: %[[#REACHABLE]] = OpLabel
 reachable:
 ; CHECK-SPIRV-NEXT: OpReturn
   ret void
 
+; CHECK-SPIRV:      %[[#UNREACHABLE]] = OpLabel
+; CHECK-SPIRV-NEXT: OpUnreachable
 unreachable:
   unreachable
 }

diff  --git a/llvm/test/CodeGen/SPIRV/branching/Two_OpSwitch_same_register.ll b/llvm/test/CodeGen/SPIRV/branching/Two_OpSwitch_same_register.ll
index 59a40dce343a39..7a134193de2a64 100644
--- a/llvm/test/CodeGen/SPIRV/branching/Two_OpSwitch_same_register.ll
+++ b/llvm/test/CodeGen/SPIRV/branching/Two_OpSwitch_same_register.ll
@@ -32,19 +32,19 @@ case4:
 default2:
   ret void
 
-; CHECK-SPIRV:      %[[#CASE1]] = OpLabel
+; CHECK-SPIRV:      %[[#CASE2]] = OpLabel
 ; CHECK-SPIRV-NEXT: OpBranch %[[#DEFAULT1]]
 
-; CHECK-SPIRV:      %[[#CASE2]] = OpLabel
+; CHECK-SPIRV:      %[[#CASE1]] = OpLabel
 ; CHECK-SPIRV-NEXT: OpBranch %[[#DEFAULT1]]
 
 ; CHECK-SPIRV:      %[[#DEFAULT1]] = OpLabel
 ; CHECK-SPIRV-NEXT:      OpSwitch %[[#REGISTER]] %[[#DEFAULT2:]] 0 %[[#CASE3:]] 1 %[[#CASE4:]]
 
-; CHECK-SPIRV:      %[[#CASE3]] = OpLabel
+; CHECK-SPIRV:      %[[#CASE4]] = OpLabel
 ; CHECK-SPIRV-NEXT: OpBranch %[[#DEFAULT2]]
 
-; CHECK-SPIRV:      %[[#CASE4:]] = OpLabel
+; CHECK-SPIRV:      %[[#CASE3]] = OpLabel
 ; CHECK-SPIRV-NEXT: OpBranch %[[#DEFAULT2]]
 
 ; CHECK-SPIRV:      %[[#DEFAULT2]] = OpLabel

diff  --git a/llvm/test/CodeGen/SPIRV/branching/if-merging.ll b/llvm/test/CodeGen/SPIRV/branching/if-merging.ll
index 52eeb216234e5d..eb8ca515c58225 100644
--- a/llvm/test/CodeGen/SPIRV/branching/if-merging.ll
+++ b/llvm/test/CodeGen/SPIRV/branching/if-merging.ll
@@ -5,8 +5,8 @@
 ; CHECK-DAG: OpName [[FOO:%.+]] "foo"
 ; CHECK-DAG: OpName [[BAR:%.+]] "bar"
 
-; CHECK-DAG: [[I32:%.+]] = OpTypeInt 32
-; CHECK-DAG: [[BOOL:%.+]] = OpTypeBool
+; CHECK-DAG: %[[#I32:]] = OpTypeInt 32
+; CHECK-DAG: %[[#BOOL:]] = OpTypeBool
 
 declare i32 @foo()
 declare i32 @bar()
@@ -30,23 +30,24 @@ merge_label:
 }
 
 ; CHECK: OpFunction
-; CHECK: [[A:%.+]] = OpFunctionParameter [[I32]]
-; CHECK: [[B:%.+]] = OpFunctionParameter [[I32]]
+; CHECK: %[[#A:]] = OpFunctionParameter %[[#I32]]
+; CHECK: %[[#B:]] = OpFunctionParameter %[[#I32]]
 
-; CHECK: [[ENTRY:%.+]] = OpLabel
-; CHECK: [[COND:%.+]] = OpIEqual [[BOOL]] [[A]] [[B]]
-; CHECK: OpBranchConditional [[COND]] [[TRUE_LABEL:%.+]] [[FALSE_LABEL:%.+]]
+; CHECK: %[[#ENTRY:]] = OpLabel
+; CHECK: %[[#COND:]] = OpIEqual %[[#BOOL]] %[[#A]] %[[#B]]
+; CHECK: OpBranchConditional %[[#COND]] %[[#TRUE_LABEL:]] %[[#FALSE_LABEL:]]
 
-; CHECK: [[TRUE_LABEL]] = OpLabel
-; CHECK: [[V1:%.+]] = OpFunctionCall [[I32]] [[FOO]]
-; CHECK: OpBranch [[MERGE_LABEL:%.+]]
+; CHECK: %[[#FALSE_LABEL]] = OpLabel
+; CHECK: %[[#V2:]] = OpFunctionCall %[[#I32]] [[BAR]]
+; CHECK: OpBranch %[[#MERGE_LABEL:]]
 
-; CHECK: [[FALSE_LABEL]] = OpLabel
-; CHECK: [[V2:%.+]] = OpFunctionCall [[I32]] [[BAR]]
-; CHECK: OpBranch [[MERGE_LABEL]]
+; CHECK: %[[#TRUE_LABEL]] = OpLabel
+; CHECK: %[[#V1:]] = OpFunctionCall %[[#I32]] [[FOO]]
+; CHECK: OpBranch %[[#MERGE_LABEL]]
 
-; CHECK: [[MERGE_LABEL]] = OpLabel
-; CHECK-NEXT: [[V:%.+]] = OpPhi [[I32]] [[V1]] [[TRUE_LABEL]] [[V2]] [[FALSE_LABEL]]
+
+; CHECK: %[[#MERGE_LABEL]] = OpLabel
+; CHECK-NEXT: [[V:%.+]] = OpPhi %[[#I32]] %[[#V1]] %[[#TRUE_LABEL]] %[[#V2]] %[[#FALSE_LABEL]]
 ; CHECK: OpReturnValue [[V]]
 
 ; CHECK-NEXT: OpFunctionEnd

diff  --git a/llvm/test/CodeGen/SPIRV/branching/if-non-merging.ll b/llvm/test/CodeGen/SPIRV/branching/if-non-merging.ll
index 319abda86b046c..f978c44888e0f3 100644
--- a/llvm/test/CodeGen/SPIRV/branching/if-non-merging.ll
+++ b/llvm/test/CodeGen/SPIRV/branching/if-non-merging.ll
@@ -21,7 +21,9 @@ false_label:
 ; CHECK: [[ENTRY:%.+]] = OpLabel
 ; CHECK: [[COND:%.+]] = OpIEqual [[BOOL]] [[A]] [[B]]
 ; CHECK: OpBranchConditional [[COND]] [[TRUE_LABEL:%.+]] [[FALSE_LABEL:%.+]]
-; CHECK: [[TRUE_LABEL]] = OpLabel
-; CHECK: OpReturnValue [[TRUE]]
+
 ; CHECK: [[FALSE_LABEL]] = OpLabel
 ; CHECK: OpReturnValue [[FALSE]]
+
+; CHECK: [[TRUE_LABEL]] = OpLabel
+; CHECK: OpReturnValue [[TRUE]]

diff  --git a/llvm/test/CodeGen/SPIRV/instructions/ret-type.ll b/llvm/test/CodeGen/SPIRV/instructions/ret-type.ll
index 354434c37201dc..bf71eb5628e217 100644
--- a/llvm/test/CodeGen/SPIRV/instructions/ret-type.ll
+++ b/llvm/test/CodeGen/SPIRV/instructions/ret-type.ll
@@ -2,10 +2,6 @@
 ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown --translator-compatibility-mode %s -o - -filetype=obj | spirv-val %}
 ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
 
-; Modifying the block ordering prevents the pointer types to correctly be deduced. Not sure why, but looks
-; orthogonal to the block sorting.
-; XFAIL: *
-
 ; CHECK-DAG: OpName %[[Test1:.*]] "test1"
 ; CHECK-DAG: OpName %[[Foo:.*]] "foo"
 ; CHECK-DAG: OpName %[[Bar:.*]] "bar"

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/basic-if.ll b/llvm/test/CodeGen/SPIRV/structurizer/basic-if.ll
index 5585e4a07590a3..75fe865c9be9d0 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/basic-if.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/basic-if.ll
@@ -14,18 +14,18 @@ entry:
   %1 = alloca i32, align 4
   br i1 true, label %left, label %right
 
-; CHECK: %[[#left]] = OpLabel
-; CHECK:              OpBranch %[[#merge]]
-left:
-  store i32 0, ptr %1
-  br label %end
-
 ; CHECK: %[[#right]] = OpLabel
 ; CHECK:               OpBranch %[[#merge]]
 right:
   store i32 0, ptr %1
   br label %end
 
+; CHECK: %[[#left]] = OpLabel
+; CHECK:              OpBranch %[[#merge]]
+left:
+  store i32 0, ptr %1
+  br label %end
+
 ; CHECK: %[[#merge]] = OpLabel
 ; CHECK:               OpReturnValue %[[#]]
 end:

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/basic-loop.ll b/llvm/test/CodeGen/SPIRV/structurizer/basic-loop.ll
index ded9c335c5a25f..29091534bf1d29 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/basic-loop.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/basic-loop.ll
@@ -21,6 +21,11 @@ header:
   %2 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %0) ]
   br i1 true, label %body, label %merge
 
+; CHECK: %[[#merge]] = OpLabel
+; CHECK:               OpReturnValue %[[#]]
+merge:
+  ret i32 0
+
 ; CHECK: %[[#body]] = OpLabel
 ; CHECK:              OpBranch %[[#continue]]
 body:
@@ -31,11 +36,6 @@ continue:
   br label %header
 ; CHECK: %[[#continue]] = OpLabel
 ; CHECK:                  OpBranch %[[#header]]
-
-; CHECK: %[[#merge]] = OpLabel
-; CHECK:               OpReturnValue %[[#]]
-merge:
-  ret i32 0
 }
 
 ; Function Attrs: convergent nocallback nofree nosync nounwind willreturn memory(none)

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/basic-phi.ll b/llvm/test/CodeGen/SPIRV/structurizer/basic-phi.ll
index a43d25e9b06d5d..8ad1758a14c844 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/basic-phi.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/basic-phi.ll
@@ -18,18 +18,18 @@ entry:
   %0 = call token @llvm.experimental.convergence.entry()
   br i1 true, label %left, label %right
 
-; CHECK:      %[[#left]] = OpLabel
-; CHECK-NEXT:              OpStore %[[#var]] %[[#int_0]]
-; CHECK-NEXT:              OpBranch %[[#merge]]
-left:
-  br label %end
-
 ; CHECK:      %[[#right]] = OpLabel
 ; CHECK-NEXT:               OpStore %[[#var]] %[[#int_1]]
 ; CHECK-NEXT:               OpBranch %[[#merge]]
 right:
   br label %end
 
+; CHECK:      %[[#left]] = OpLabel
+; CHECK-NEXT:              OpStore %[[#var]] %[[#int_0]]
+; CHECK-NEXT:              OpBranch %[[#merge]]
+left:
+  br label %end
+
 ; CHECK: %[[#merge]] = OpLabel
 ; CHECK:  %[[#tmp:]] = OpLoad %[[#]] %[[#var]]
 ; CHECK:               OpReturnValue %[[#tmp]]

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/cf.cond-op.ll b/llvm/test/CodeGen/SPIRV/structurizer/cf.cond-op.ll
index 86033608deb6e2..e4cb1ddc594b09 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/cf.cond-op.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/cf.cond-op.ll
@@ -55,18 +55,18 @@ entry:
   %var = alloca i32
   br i1 true, label %a_true, label %a_false
 
-; CHECK: %[[#a_true]] = OpLabel
-; CHECK:                OpStore %[[#r2m_a]] %[[#true]]
-; CHECK:                OpBranch %[[#a_merge]]
-a_true:
-  br label %a_merge
-
 ; CHECK: %[[#a_false]] = OpLabel
 ; CHECK:                 OpStore %[[#r2m_a]] %[[#false]]
 ; CHECK:                 OpBranch %[[#a_merge]]
 a_false:
   br label %a_merge
 
+; CHECK: %[[#a_true]] = OpLabel
+; CHECK:                OpStore %[[#r2m_a]] %[[#true]]
+; CHECK:                OpBranch %[[#a_merge]]
+a_true:
+  br label %a_merge
+
 ; CHECK: %[[#a_merge]] = OpLabel
 ; CHECK:    %[[#tmp:]] = OpLoad %[[#]] %[[#r2m_a]]
 ; CHECK:                 OpSelectionMerge %[[#b_merge:]]
@@ -89,6 +89,14 @@ b_merge:
   %f1 = call spir_func noundef i32 @_Z2fnv() #4 [ "convergencectrl"(token %0) ]
   br i1 true, label %c_true, label %c_false
 
+; CHECK: %[[#c_false]] = OpLabel
+; CHECK:        %[[#]] = OpFunctionCall
+; CHECK:                 OpStore %[[#r2m_b]] %[[#]]
+; CHECK:                 OpBranch %[[#c_merge]]
+c_false:
+  %f3 = call spir_func noundef i32 @_Z3fn2v() #4 [ "convergencectrl"(token %0) ]
+  br label %c_merge
+
 ; CHECK: %[[#c_true]] = OpLabel
 ; CHECK:       %[[#]] = OpFunctionCall
 ; CHECK:                OpStore %[[#r2m_b]] %[[#]]
@@ -97,13 +105,6 @@ c_true:
   %f2 = call spir_func noundef i32 @_Z3fn1v() #4 [ "convergencectrl"(token %0) ]
   br label %c_merge
 
-; CHECK: %[[#c_false]] = OpLabel
-; CHECK:        %[[#]] = OpFunctionCall
-; CHECK:                 OpStore %[[#r2m_b]] %[[#]]
-; CHECK:                 OpBranch %[[#c_merge]]
-c_false:
-  %f3 = call spir_func noundef i32 @_Z3fn2v() #4 [ "convergencectrl"(token %0) ]
-  br label %c_merge
 
 ; CHECK: %[[#c_merge]] = OpLabel
 ; CHECK:    %[[#tmp:]] = OpLoad %[[#]] %[[#r2m_b]]

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/cf.for.continue.ll b/llvm/test/CodeGen/SPIRV/structurizer/cf.for.continue.ll
index 12e6473c15c757..2c12e09e223c70 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/cf.for.continue.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/cf.for.continue.ll
@@ -50,43 +50,49 @@
 ; CHECK: %[[#func_12:]] = OpFunction %[[#uint:]] DontInline %[[#]]
 ; CHECK:    %[[#bb44:]] = OpLabel
 ; CHECK:                  OpBranch %[[#bb45:]]
-; CHECK:    %[[#bb45:]] = OpLabel
+; CHECK:     %[[#bb45]] = OpLabel
 ; CHECK:                  OpLoopMerge %[[#bb46:]] %[[#bb47:]] None
 ; CHECK:                  OpBranchConditional %[[#]] %[[#bb48:]] %[[#bb46:]]
-; CHECK:    %[[#bb48:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb49:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb49:]] %[[#bb50:]]
-; CHECK:    %[[#bb50:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb49:]]
-; CHECK:    %[[#bb49:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb47:]]
-; CHECK:    %[[#bb47:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb45:]]
-; CHECK:    %[[#bb46:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb51:]]
-; CHECK:    %[[#bb51:]] = OpLabel
-; CHECK:                  OpLoopMerge %[[#bb52:]] %[[#bb53:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb54:]] %[[#bb52:]]
-; CHECK:    %[[#bb54:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb55:]]
-; CHECK:    %[[#bb55:]] = OpLabel
-; CHECK:                  OpLoopMerge %[[#bb56:]] %[[#bb57:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb58:]] %[[#bb56:]]
-; CHECK:    %[[#bb58:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb57:]]
-; CHECK:    %[[#bb57:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb55:]]
-; CHECK:    %[[#bb56:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb53:]]
-; CHECK:    %[[#bb53:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb51:]]
-; CHECK:    %[[#bb52:]] = OpLabel
-; CHECK:                  OpReturnValue %[[#]]
+  ; CHECK:     %[[#bb46]] = OpLabel
+  ; CHECK:                  OpBranch %[[#bb51:]]
+  ; CHECK:     %[[#bb51]] = OpLabel
+  ; CHECK:                  OpLoopMerge %[[#bb52:]] %[[#bb53:]] None
+  ; CHECK:                  OpBranchConditional %[[#]] %[[#bb54:]] %[[#bb52]]
+    ; CHECK:     %[[#bb52]] = OpLabel
+    ; CHECK:                  OpReturnValue %[[#]]
+
+    ; CHECK:     %[[#bb54]] = OpLabel
+    ; CHECK:                  OpBranch %[[#bb55:]]
+    ; CHECK:     %[[#bb55]] = OpLabel
+    ; CHECK:                  OpLoopMerge %[[#bb56:]] %[[#bb57:]] None
+    ; CHECK:                  OpBranchConditional %[[#]] %[[#bb58:]] %[[#bb56]]
+      ; CHECK:     %[[#bb56]] = OpLabel
+      ; CHECK:                  OpBranch %[[#bb53]]
+      ; CHECK:     %[[#bb53]] = OpLabel
+      ; CHECK:                  OpBranch %[[#bb51]]
+
+      ; CHECK:     %[[#bb58]] = OpLabel
+      ; CHECK:                  OpBranch %[[#bb57]]
+      ; CHECK:     %[[#bb57]] = OpLabel
+      ; CHECK:                  OpBranch %[[#bb55]]
+  ; CHECK:     %[[#bb48]] = OpLabel
+  ; CHECK:                  OpSelectionMerge %[[#bb49:]] None
+  ; CHECK:                  OpBranchConditional %[[#]] %[[#bb49]] %[[#bb50:]]
+    ; CHECK:     %[[#bb50]] = OpLabel
+    ; CHECK:                  OpBranch %[[#bb49]]
+
+    ; CHECK:     %[[#bb49]] = OpLabel
+    ; CHECK:                  OpBranch %[[#bb47]]
+
+; CHECK:     %[[#bb47]] = OpLabel
+; CHECK:                  OpBranch %[[#bb45]]
 ; CHECK:                  OpFunctionEnd
+
 ; CHECK: %[[#func_40:]] = OpFunction %[[#void:]] DontInline %[[#]]
 ; CHECK:    %[[#bb59:]] = OpLabel
 ; CHECK:                  OpReturn
 ; CHECK:                  OpFunctionEnd
+
 ; CHECK: %[[#func_42:]] = OpFunction %[[#void:]] None %[[#]]
 ; CHECK:    %[[#bb60:]] = OpLabel
 ; CHECK:                  OpReturn

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/cf.for.nested.ll b/llvm/test/CodeGen/SPIRV/structurizer/cf.for.nested.ll
index ddd4c5222301a3..35a36b468ea52a 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/cf.for.nested.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/cf.for.nested.ll
@@ -28,38 +28,43 @@
 ; CHECK: %[[#func_11:]] = OpFunction %[[#uint:]] DontInline %[[#]]
 ; CHECK:    %[[#bb41:]] = OpLabel
 ; CHECK:                  OpBranch %[[#bb42:]]
-; CHECK:    %[[#bb42:]] = OpLabel
+; CHECK:     %[[#bb42]] = OpLabel
 ; CHECK:                  OpLoopMerge %[[#bb43:]] %[[#bb44:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb45:]] %[[#bb43:]]
-; CHECK:    %[[#bb45:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb46:]]
-; CHECK:    %[[#bb46:]] = OpLabel
-; CHECK:                  OpLoopMerge %[[#bb47:]] %[[#bb48:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb49:]] %[[#bb47:]]
-; CHECK:    %[[#bb49:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb50:]]
-; CHECK:    %[[#bb50:]] = OpLabel
-; CHECK:                  OpLoopMerge %[[#bb51:]] %[[#bb52:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb53:]] %[[#bb51:]]
-; CHECK:    %[[#bb53:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb52:]]
-; CHECK:    %[[#bb52:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb50:]]
-; CHECK:    %[[#bb51:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb48:]]
-; CHECK:    %[[#bb48:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb46:]]
-; CHECK:    %[[#bb47:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb44:]]
-; CHECK:    %[[#bb44:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb42:]]
-; CHECK:    %[[#bb43:]] = OpLabel
-; CHECK:                  OpReturnValue %[[#]]
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb45:]] %[[#bb43]]
+  ; CHECK:     %[[#bb43]] = OpLabel
+  ; CHECK:                  OpReturnValue %[[#]]
+
+  ; CHECK:     %[[#bb45]] = OpLabel
+  ; CHECK:                  OpBranch %[[#bb46:]]
+  ; CHECK:     %[[#bb46]] = OpLabel
+  ; CHECK:                  OpLoopMerge %[[#bb47:]] %[[#bb48:]] None
+  ; CHECK:                  OpBranchConditional %[[#]] %[[#bb49:]] %[[#bb47]]
+    ; CHECK:     %[[#bb47]] = OpLabel
+    ; CHECK:                  OpBranch %[[#bb44]]
+    ; CHECK:     %[[#bb44]] = OpLabel
+    ; CHECK:                  OpBranch %[[#bb42]]
+
+    ; CHECK:     %[[#bb49]] = OpLabel
+    ; CHECK:                  OpBranch %[[#bb50:]]
+    ; CHECK:     %[[#bb50]] = OpLabel
+    ; CHECK:                  OpLoopMerge %[[#bb51:]] %[[#bb52:]] None
+    ; CHECK:                  OpBranchConditional %[[#]] %[[#bb53:]] %[[#bb51]]
+      ; CHECK:     %[[#bb51]] = OpLabel
+      ; CHECK:                  OpBranch %[[#bb48]]
+      ; CHECK:     %[[#bb48]] = OpLabel
+      ; CHECK:                  OpBranch %[[#bb46]]
+
+      ; CHECK:     %[[#bb53]] = OpLabel
+      ; CHECK:                  OpBranch %[[#bb52]]
+      ; CHECK:     %[[#bb52]] = OpLabel
+      ; CHECK:                  OpBranch %[[#bb50]]
 ; CHECK:                  OpFunctionEnd
+
 ; CHECK: %[[#func_37:]] = OpFunction %[[#void:]] DontInline %[[#]]
 ; CHECK:    %[[#bb54:]] = OpLabel
 ; CHECK:                  OpReturn
 ; CHECK:                  OpFunctionEnd
+
 ; CHECK: %[[#func_39:]] = OpFunction %[[#void:]] None %[[#]]
 ; CHECK:    %[[#bb55:]] = OpLabel
 ; CHECK:                  OpReturn

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/cf.for.plain.ll b/llvm/test/CodeGen/SPIRV/structurizer/cf.for.plain.ll
index 3e898c4f11b7e5..b7167e01e92248 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/cf.for.plain.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/cf.for.plain.ll
@@ -37,28 +37,13 @@ for.cond:                                         ; preds = %for.inc, %entry
   ; CHECK: OpBranchConditional %[[#]] %[[#for_body:]] %[[#for_end]]
   br i1 %cmp, label %for.body, label %for.end
 
-for.body:                                         ; preds = %for.cond
-  %3 = load i32, ptr %i, align 4
-  store i32 %3, ptr %val, align 4
-  br label %for.inc
-  ; CHECK: %[[#for_body]] = OpLabel
-  ; CHECK:                 OpBranch %[[#for_inc]]
-
-for.inc:                                          ; preds = %for.body
-  %4 = load i32, ptr %i, align 4
-  %inc = add nsw i32 %4, 1
-  store i32 %inc, ptr %i, align 4
-  br label %for.cond
-  ; CHECK: %[[#for_inc]] = OpLabel
-  ; CHECK:                 OpBranch %[[#for_cond]]
-
 for.end:                                          ; preds = %for.cond
   br label %for.cond1
   ; CHECK: %[[#for_end]] = OpLabel
   ; CHECK:                 OpBranch %[[#for_cond1:]]
 
 for.cond1:                                        ; preds = %for.cond1, %for.end
-  %5 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %0) ]
+  %3 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %0) ]
   store i32 0, ptr %val, align 4
   br label %for.cond1
   ; CHECK: %[[#for_cond1]] = OpLabel
@@ -67,6 +52,23 @@ for.cond1:                                        ; preds = %for.cond1, %for.end
 
   ; CHECK: %[[#unreachable]] = OpLabel
   ; CHECK-NEXT:                OpUnreachable
+
+for.body:                                         ; preds = %for.cond
+  %4 = load i32, ptr %i, align 4
+  store i32 %4, ptr %val, align 4
+  br label %for.inc
+  ; CHECK: %[[#for_body]] = OpLabel
+  ; CHECK:                 OpBranch %[[#for_inc]]
+
+for.inc:                                          ; preds = %for.body
+  %5 = load i32, ptr %i, align 4
+  %inc = add nsw i32 %5, 1
+  store i32 %inc, ptr %i, align 4
+  br label %for.cond
+  ; CHECK: %[[#for_inc]] = OpLabel
+  ; CHECK:                 OpBranch %[[#for_cond]]
+
+
 }
 
 ; Function Attrs: convergent nocallback nofree nosync nounwind willreturn memory(none)

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/cf.for.short-circuited-cond.ll b/llvm/test/CodeGen/SPIRV/structurizer/cf.for.short-circuited-cond.ll
index 07c20ebadd159e..a5db8f53d2b35f 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/cf.for.short-circuited-cond.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/cf.for.short-circuited-cond.ll
@@ -42,115 +42,146 @@
 ;   process();
 ; }
 
-; CHECK: %[[#func_14:]] = OpFunction %[[#uint:]] DontInline %[[#]]
-; CHECK:    %[[#bb87:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb88:]]
-; CHECK:    %[[#bb88:]] = OpLabel
-; CHECK:                  OpLoopMerge %[[#bb89:]] %[[#bb90:]] None
-; CHECK:                  OpBranch %[[#bb91:]]
-; CHECK:    %[[#bb91:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb92:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb93:]] %[[#bb92:]]
-; CHECK:    %[[#bb93:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb92:]]
-; CHECK:    %[[#bb92:]] = OpLabel
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb94:]] %[[#bb89:]]
-; CHECK:    %[[#bb94:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb90:]]
-; CHECK:    %[[#bb89:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb95:]]
-; CHECK:    %[[#bb90:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb88:]]
-; CHECK:    %[[#bb95:]] = OpLabel
-; CHECK:                  OpLoopMerge %[[#bb96:]] %[[#bb97:]] None
-; CHECK:                  OpBranch %[[#bb98:]]
-; CHECK:    %[[#bb98:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb99:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb99:]] %[[#bb100:]]
-; CHECK:   %[[#bb100:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb99:]]
-; CHECK:    %[[#bb99:]] = OpLabel
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb101:]] %[[#bb96:]]
-; CHECK:   %[[#bb101:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb97:]]
-; CHECK:    %[[#bb96:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb102:]]
-; CHECK:    %[[#bb97:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb95:]]
-; CHECK:   %[[#bb102:]] = OpLabel
-; CHECK:                  OpLoopMerge %[[#bb103:]] %[[#bb104:]] None
-; CHECK:                  OpBranch %[[#bb105:]]
-; CHECK:   %[[#bb105:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb106:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb107:]] %[[#bb106:]]
-; CHECK:   %[[#bb107:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb108:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb109:]] %[[#bb110:]]
-; CHECK:   %[[#bb109:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb111:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb111:]] %[[#bb112:]]
-; CHECK:   %[[#bb110:]] = OpLabel
-; CHECK:   %[[#bb112:]] = OpLabel
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb111:]] %[[#bb113:]]
-; CHECK:   %[[#bb113:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb111:]]
-; CHECK:   %[[#bb111:]] = OpLabel
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb114:]] %[[#bb108:]]
-; CHECK:   %[[#bb114:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb108:]]
-; CHECK:   %[[#bb108:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb106:]]
-; CHECK:   %[[#bb106:]] = OpLabel
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb115:]] %[[#bb103:]]
-; CHECK:   %[[#bb115:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb104:]]
-; CHECK:   %[[#bb103:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb116:]]
-; CHECK:   %[[#bb104:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb102:]]
-; CHECK:   %[[#bb116:]] = OpLabel
-; CHECK:                  OpLoopMerge %[[#bb117:]] %[[#bb118:]] None
-; CHECK:                  OpBranch %[[#bb119:]]
-; CHECK:   %[[#bb119:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb120:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb121:]] %[[#bb122:]]
-; CHECK:   %[[#bb121:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb120:]]
-; CHECK:   %[[#bb122:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb120:]]
-; CHECK:   %[[#bb120:]] = OpLabel
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb123:]] %[[#bb117:]]
-; CHECK:   %[[#bb123:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb118:]]
-; CHECK:   %[[#bb117:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb124:]]
-; CHECK:   %[[#bb118:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb116:]]
-; CHECK:   %[[#bb124:]] = OpLabel
-; CHECK:                  OpLoopMerge %[[#bb125:]] %[[#bb126:]] None
-; CHECK:                  OpBranch %[[#bb127:]]
-; CHECK:   %[[#bb127:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb128:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb129:]] %[[#bb128:]]
-; CHECK:   %[[#bb129:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb128:]]
-; CHECK:   %[[#bb128:]] = OpLabel
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb130:]] %[[#bb125:]]
-; CHECK:   %[[#bb130:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb126:]]
-; CHECK:   %[[#bb126:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb124:]]
-; CHECK:   %[[#bb125:]] = OpLabel
-; CHECK:                  OpReturnValue %[[#]]
-; CHECK:                  OpFunctionEnd
-; CHECK: %[[#func_83:]] = OpFunction %[[#void:]] DontInline %[[#]]
-; CHECK:   %[[#bb131:]] = OpLabel
-; CHECK:                  OpReturn
-; CHECK:                  OpFunctionEnd
-; CHECK: %[[#func_85:]] = OpFunction %[[#void:]] None %[[#]]
-; CHECK:   %[[#bb132:]] = OpLabel
-; CHECK:                  OpReturn
-; CHECK:                  OpFunctionEnd
+; CHECK:     %[[#process:]] = OpFunction %[[#uint:]] DontInline %[[#]]
+; CHECK:        %[[#bb86:]] = OpLabel
+; CHECK:                      OpBranch %[[#bb87:]]
+  ; CHECK:         %[[#bb87]] = OpLabel
+  ; CHECK:                      OpLoopMerge %[[#bb89:]] %[[#bb90:]] None
+  ; CHECK:                      OpBranch %[[#bb91:]]
+  ; CHECK:         %[[#bb91]] = OpLabel
+  ; CHECK:                      OpSelectionMerge %[[#bb92:]] None
+  ; CHECK:                      OpBranchConditional %[[#]] %[[#bb93:]] %[[#bb94:]]
+    ; CHECK:         %[[#bb94]] = OpLabel
+    ; CHECK:                      OpBranch %[[#bb92]]
+
+    ; CHECK:         %[[#bb93]] = OpLabel
+    ; CHECK:                      OpBranch %[[#bb92]]
+    ; CHECK:         %[[#bb92]] = OpLabel
+    ; CHECK:                      OpBranchConditional %[[#]] %[[#bb96:]] %[[#bb89]]
+      ; CHECK:         %[[#bb89]] = OpLabel
+      ; CHECK:                      OpBranch %[[#bb97:]]
+      ; CHECK:         %[[#bb97]] = OpLabel
+      ; CHECK:                      OpLoopMerge %[[#bb99:]] %[[#bb100:]] None
+      ; CHECK:                      OpBranch %[[#bb101:]]
+      ; CHECK:        %[[#bb101]] = OpLabel
+      ; CHECK:                      OpSelectionMerge %[[#bb102:]] None
+      ; CHECK:                      OpBranchConditional %[[#]] %[[#bb103:]] %[[#bb104:]]
+        ; CHECK:        %[[#bb104]] = OpLabel
+        ; CHECK:                      OpBranch %[[#bb102]]
+
+        ; CHECK:        %[[#bb103]] = OpLabel
+        ; CHECK:                      OpBranch %[[#bb102]]
+        ; CHECK:        %[[#bb102]] = OpLabel
+        ; CHECK:                      OpBranchConditional %[[#]] %[[#bb106:]] %[[#bb99]]
+          ; CHECK:         %[[#bb99]] = OpLabel
+          ; CHECK:                      OpBranch %[[#bb107:]]
+          ; CHECK:        %[[#bb107]] = OpLabel
+          ; CHECK:                      OpLoopMerge %[[#bb109:]] %[[#bb110:]] None
+          ; CHECK:                      OpBranch %[[#bb111:]]
+          ; CHECK:        %[[#bb111]] = OpLabel
+          ; CHECK:                      OpSelectionMerge %[[#bb112:]] None
+          ; CHECK:                      OpBranchConditional %[[#]] %[[#bb113:]] %[[#bb114:]]
+            ; CHECK:        %[[#bb114]] = OpLabel
+            ; CHECK:                      OpBranch %[[#bb112]]
+
+            ; CHECK:        %[[#bb113]] = OpLabel
+            ; CHECK:                      OpSelectionMerge %[[#bb116:]] None
+            ; CHECK:                      OpBranchConditional %[[#]] %[[#bb117:]] %[[#bb116]]
+              ; CHECK:        %[[#bb117]] = OpLabel
+              ; CHECK:                      OpSelectionMerge %[[#bb118:]] None
+              ; CHECK:                      OpBranchConditional %[[#]] %[[#bb119:]] %[[#bb120:]]
+                ; CHECK:        %[[#bb120]] = OpLabel
+                ; CHECK:                      OpSelectionMerge %[[#bb122:]] None
+                ; CHECK:                      OpBranchConditional %[[#]] %[[#bb122]] %[[#bb123:]]
+                  ; CHECK:        %[[#bb123]] = OpLabel
+                  ; CHECK:                      OpBranch %[[#bb122]]
+                  ; CHECK:        %[[#bb122]] = OpLabel
+                  ; CHECK:                      OpBranchConditional %[[#]] %[[#bb126:]] %[[#bb118]]
+                    ; CHECK:        %[[#bb126]] = OpLabel
+                    ; CHECK:                      OpBranch %[[#bb118]]
+
+                ; CHECK:        %[[#bb119]] = OpLabel
+                ; CHECK:                      OpBranch %[[#bb118]]
+                ; CHECK:        %[[#bb118]] = OpLabel
+                ; CHECK:                      OpBranchConditional %[[#]] %[[#bb116]] %[[#bb129:]]
+                  ; CHECK:        %[[#bb129]] = OpLabel
+                  ; CHECK:                      OpBranch %[[#bb116]]
+                  ; CHECK:        %[[#bb116]] = OpLabel
+                  ; CHECK:                      OpBranchConditional %[[#]] %[[#bb112]] %[[#bb133:]]
+                    ; CHECK:        %[[#bb133]] = OpLabel
+                    ; CHECK:                      OpBranch %[[#bb112]]
+                    ; CHECK:        %[[#bb112]] = OpLabel
+                    ; CHECK:                      OpSelectionMerge %[[#bb136:]] None
+                    ; CHECK:                      OpBranchConditional %[[#]] %[[#bb136]] %[[#bb137:]]
+                    ; CHECK:        %[[#bb137]] = OpLabel
+                    ; CHECK-NEXT:                 OpUnreachable
+
+                    ; CHECK:        %[[#bb136]] = OpLabel
+                    ; CHECK:                      OpBranchConditional %[[#]] %[[#bb138:]] %[[#bb109]]
+                      ; CHECK:        %[[#bb109]] = OpLabel
+                      ; CHECK:                      OpBranch %[[#bb139:]]
+                      ; CHECK:        %[[#bb139]] = OpLabel
+                      ; CHECK:                      OpLoopMerge %[[#bb141:]] %[[#bb142:]] None
+                      ; CHECK:                      OpBranch %[[#bb143:]]
+                      ; CHECK:        %[[#bb143]] = OpLabel
+                      ; CHECK:                      OpSelectionMerge %[[#bb144:]] None
+                      ; CHECK:                      OpBranchConditional %[[#]] %[[#bb145:]] %[[#bb146:]]
+                        ; CHECK:        %[[#bb146]] = OpLabel
+                        ; CHECK:                      OpBranch %[[#bb144]]
+
+                        ; CHECK:        %[[#bb145]] = OpLabel
+                        ; CHECK:                      OpBranch %[[#bb144]]
+                      ; CHECK:        %[[#bb144]] = OpLabel
+                      ; CHECK:                      OpBranchConditional %[[#]] %[[#bb149:]] %[[#bb141]]
+                        ; CHECK:        %[[#bb141]] = OpLabel
+                        ; CHECK:                      OpBranch %[[#bb150:]]
+                        ; CHECK:        %[[#bb150]] = OpLabel
+                        ; CHECK:                      OpLoopMerge %[[#bb153:]] %[[#bb154:]] None
+                        ; CHECK:                      OpBranch %[[#bb155:]]
+                        ; CHECK:        %[[#bb155]] = OpLabel
+                        ; CHECK:                      OpSelectionMerge %[[#bb156:]] None
+                        ; CHECK:                      OpBranchConditional %[[#]] %[[#bb157:]] %[[#bb158:]]
+                          ; CHECK:        %[[#bb158]] = OpLabel
+                          ; CHECK:                      OpBranch %[[#bb156]]
+
+                          ; CHECK:        %[[#bb157]] = OpLabel
+                          ; CHECK:                      OpBranch %[[#bb156]]
+                        ; CHECK:        %[[#bb156]] = OpLabel
+                        ; CHECK:                      OpBranchConditional %[[#]] %[[#bb160:]] %[[#bb153]]
+                          ; CHECK:        %[[#bb153]] = OpLabel
+                          ; CHECK:                      OpReturnValue %[[#]]
+
+                          ; CHECK:        %[[#bb160]] = OpLabel
+                          ; CHECK:                      OpBranch %[[#bb154]]
+                          ; CHECK:        %[[#bb154]] = OpLabel
+                          ; CHECK:                      OpBranch %[[#bb150]]
+                        ; CHECK:        %[[#bb149]] = OpLabel
+                        ; CHECK:                      OpBranch %[[#bb142]]
+                        ; CHECK:        %[[#bb142]] = OpLabel
+                        ; CHECK:                      OpBranch %[[#bb139]]
+                      ; CHECK:        %[[#bb138]] = OpLabel
+                      ; CHECK:                      OpBranch %[[#bb110]]
+                      ; CHECK:        %[[#bb110]] = OpLabel
+                      ; CHECK:                      OpBranch %[[#bb107]]
+          ; CHECK:        %[[#bb106]] = OpLabel
+          ; CHECK:                      OpBranch %[[#bb100]]
+          ; CHECK:        %[[#bb100]] = OpLabel
+          ; CHECK:                      OpBranch %[[#bb97]]
+      ; CHECK:         %[[#bb96]] = OpLabel
+      ; CHECK:                      OpBranch %[[#bb90]]
+      ; CHECK:         %[[#bb90]] = OpLabel
+      ; CHECK:                      OpBranch %[[#bb87]]
+; CHECK:                      OpFunctionEnd
+
+; CHECK:   %[[#func_main:]] = OpFunction %[[#void:]] DontInline %[[#]]
+; CHECK:       %[[#bb172:]] = OpLabel
+; CHECK:                      OpReturn
+; CHECK:                      OpFunctionEnd
+
+; CHECK: %[[#func_main_1:]] = OpFunction %[[#void]] None %[[#]]
+; CHECK:       %[[#bb173:]] = OpLabel
+; CHECK:                      OpReturn
+; CHECK:                      OpFunctionEnd
 
 target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-G1"
 target triple = "spirv-unknown-vulkan1.3-compute"

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/cf.if.for.ll b/llvm/test/CodeGen/SPIRV/structurizer/cf.if.for.ll
index 93effc141fc812..1a241d69154dd9 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/cf.if.for.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/cf.if.for.ll
@@ -49,72 +49,73 @@
 ; CHECK: %[[#func_18:]] = OpFunction %[[#uint:]] DontInline %[[#]]
 ; CHECK:    %[[#bb65:]] = OpLabel
 ; CHECK:                  OpSelectionMerge %[[#bb66:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb67:]] %[[#bb66:]]
-; CHECK:    %[[#bb67:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb66:]]
-; CHECK:    %[[#bb66:]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb67:]] %[[#bb66]]
+; CHECK:     %[[#bb67]] = OpLabel
+; CHECK:                  OpBranch %[[#bb66]]
+; CHECK:     %[[#bb66]] = OpLabel
 ; CHECK:                  OpBranch %[[#bb68:]]
-; CHECK:    %[[#bb68:]] = OpLabel
+; CHECK:     %[[#bb68]] = OpLabel
 ; CHECK:                  OpLoopMerge %[[#bb69:]] %[[#bb70:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb71:]] %[[#bb69:]]
-; CHECK:    %[[#bb71:]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb71:]] %[[#bb69]]
+; CHECK:     %[[#bb69]] = OpLabel
 ; CHECK:                  OpSelectionMerge %[[#bb72:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb73:]] %[[#bb72:]]
-; CHECK:    %[[#bb73:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb74:]]
-; CHECK:    %[[#bb74:]] = OpLabel
-; CHECK:                  OpLoopMerge %[[#bb75:]] %[[#bb76:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb77:]] %[[#bb75:]]
-; CHECK:    %[[#bb77:]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb73:]] %[[#bb72]]
+; CHECK:     %[[#bb73]] = OpLabel
+; CHECK:                  OpBranch %[[#bb72]]
+; CHECK:     %[[#bb72]] = OpLabel
+; CHECK:                  OpReturnValue %[[#]]
+; CHECK:     %[[#bb71]] = OpLabel
+; CHECK:                  OpSelectionMerge %[[#bb74:]] None
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb75:]] %[[#bb74]]
+; CHECK:     %[[#bb75]] = OpLabel
 ; CHECK:                  OpBranch %[[#bb76:]]
-; CHECK:    %[[#bb76:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb74:]]
-; CHECK:    %[[#bb75:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb72:]]
-; CHECK:    %[[#bb72:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb78:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb79:]] %[[#bb80:]]
-; CHECK:    %[[#bb79:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb78:]]
-; CHECK:    %[[#bb80:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb81:]]
-; CHECK:    %[[#bb81:]] = OpLabel
-; CHECK:                  OpLoopMerge %[[#bb82:]] %[[#bb83:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb84:]] %[[#bb82:]]
-; CHECK:    %[[#bb84:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb85:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb86:]] %[[#bb85:]]
-; CHECK:    %[[#bb86:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb85:]]
-; CHECK:    %[[#bb85:]] = OpLabel
+; CHECK:     %[[#bb76]] = OpLabel
+; CHECK:                  OpLoopMerge %[[#bb77:]] %[[#bb78:]] None
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb79:]] %[[#bb77]]
+; CHECK:     %[[#bb77]] = OpLabel
+; CHECK:                  OpBranch %[[#bb74]]
+; CHECK:     %[[#bb74]] = OpLabel
+; CHECK:                  OpSelectionMerge %[[#bb80:]] None
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb81:]] %[[#bb82:]]
+; CHECK:     %[[#bb82]] = OpLabel
 ; CHECK:                  OpBranch %[[#bb83:]]
-; CHECK:    %[[#bb83:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb81:]]
-; CHECK:    %[[#bb82:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb78:]]
-; CHECK:    %[[#bb78:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb70:]]
-; CHECK:    %[[#bb70:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb68:]]
-; CHECK:    %[[#bb69:]] = OpLabel
+; CHECK:     %[[#bb83]] = OpLabel
+; CHECK:                  OpLoopMerge %[[#bb84:]] %[[#bb85:]] None
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb86:]] %[[#bb84]]
+; CHECK:     %[[#bb84]] = OpLabel
+; CHECK:                  OpBranch %[[#bb80]]
+; CHECK:     %[[#bb86]] = OpLabel
 ; CHECK:                  OpSelectionMerge %[[#bb87:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb88:]] %[[#bb87:]]
-; CHECK:    %[[#bb88:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb87:]]
-; CHECK:    %[[#bb87:]] = OpLabel
-; CHECK:                  OpReturnValue %[[#]]
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb88:]] %[[#bb87]]
+; CHECK:     %[[#bb88]] = OpLabel
+; CHECK:                  OpBranch %[[#bb87]]
+; CHECK:     %[[#bb87]] = OpLabel
+; CHECK:                  OpBranch %[[#bb85]]
+; CHECK:     %[[#bb85]] = OpLabel
+; CHECK:                  OpBranch %[[#bb83]]
+; CHECK:     %[[#bb81]] = OpLabel
+; CHECK:                  OpBranch %[[#bb80]]
+; CHECK:     %[[#bb80]] = OpLabel
+; CHECK:                  OpBranch %[[#bb70]]
+; CHECK:     %[[#bb70]] = OpLabel
+; CHECK:                  OpBranch %[[#bb68]]
+; CHECK:     %[[#bb79]] = OpLabel
+; CHECK:                  OpBranch %[[#bb78]]
+; CHECK:     %[[#bb78]] = OpLabel
+; CHECK:                  OpBranch %[[#bb76]]
 ; CHECK:                  OpFunctionEnd
+
 ; CHECK: %[[#func_61:]] = OpFunction %[[#void:]] DontInline %[[#]]
 ; CHECK:    %[[#bb89:]] = OpLabel
 ; CHECK:                  OpReturn
 ; CHECK:                  OpFunctionEnd
-; CHECK: %[[#func_63:]] = OpFunction %[[#void:]] None %[[#]]
+
+; CHECK: %[[#func_63:]] = OpFunction %[[#void]] None %[[#]]
 ; CHECK:    %[[#bb90:]] = OpLabel
 ; CHECK:                  OpReturn
 ; CHECK:                  OpFunctionEnd
 
 
-
 target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-G1"
 target triple = "spirv-unknown-vulkan1.3-compute"
 

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/cf.if.nested.ll b/llvm/test/CodeGen/SPIRV/structurizer/cf.if.nested.ll
index a69475a59db6f4..64fc651e94bb5b 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/cf.if.nested.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/cf.if.nested.ll
@@ -34,35 +34,35 @@
 ; CHECK:    %[[#bb30:]] = OpLabel
 ; CHECK:                  OpSelectionMerge %[[#bb31:]] None
 ; CHECK:                  OpBranchConditional %[[#]] %[[#bb32:]] %[[#bb33:]]
-; CHECK:    %[[#bb32:]] = OpLabel
+; CHECK:     %[[#bb33]] = OpLabel
 ; CHECK:                  OpSelectionMerge %[[#bb34:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb35:]] %[[#bb34:]]
-; CHECK:    %[[#bb33:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb36:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb37:]] %[[#bb38:]]
-; CHECK:    %[[#bb35:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb34:]]
-; CHECK:    %[[#bb37:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb36:]]
-; CHECK:    %[[#bb38:]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb35:]] %[[#bb36:]]
+; CHECK:     %[[#bb36]] = OpLabel
+; CHECK:                  OpSelectionMerge %[[#bb37:]] None
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb38:]] %[[#bb37]]
+; CHECK:     %[[#bb38]] = OpLabel
+; CHECK:                  OpBranch %[[#bb37]]
+; CHECK:     %[[#bb37]] = OpLabel
+; CHECK:                  OpBranch %[[#bb34]]
+; CHECK:     %[[#bb35]] = OpLabel
+; CHECK:                  OpBranch %[[#bb34]]
+; CHECK:     %[[#bb34]] = OpLabel
+; CHECK:                  OpBranch %[[#bb31]]
+; CHECK:     %[[#bb32]] = OpLabel
 ; CHECK:                  OpSelectionMerge %[[#bb39:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb40:]] %[[#bb39:]]
-; CHECK:    %[[#bb34:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb31:]]
-; CHECK:    %[[#bb40:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb39:]]
-; CHECK:    %[[#bb39:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb36:]]
-; CHECK:    %[[#bb36:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb31:]]
-; CHECK:    %[[#bb31:]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb40:]] %[[#bb39]]
+; CHECK:     %[[#bb40]] = OpLabel
+; CHECK:                  OpBranch %[[#bb39]]
+; CHECK:     %[[#bb39]] = OpLabel
+; CHECK:                  OpBranch %[[#bb31]]
+; CHECK:     %[[#bb31]] = OpLabel
 ; CHECK:                  OpReturnValue %[[#]]
 ; CHECK:                  OpFunctionEnd
 ; CHECK: %[[#func_26:]] = OpFunction %[[#void:]] DontInline %[[#]]
 ; CHECK:    %[[#bb41:]] = OpLabel
 ; CHECK:                  OpReturn
 ; CHECK:                  OpFunctionEnd
-; CHECK: %[[#func_28:]] = OpFunction %[[#void:]] None %[[#]]
+; CHECK: %[[#func_28:]] = OpFunction %[[#void]] None %[[#]]
 ; CHECK:    %[[#bb42:]] = OpLabel
 ; CHECK:                  OpReturn
 ; CHECK:                  OpFunctionEnd

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/cf.return.early.ll b/llvm/test/CodeGen/SPIRV/structurizer/cf.return.early.ll
index dfaca85be2280c..1cb2d6d542a5bc 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/cf.return.early.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/cf.return.early.ll
@@ -59,51 +59,53 @@
 ; }
 
 ; CHECK: %[[#func_13:]] = OpFunction %[[#uint:]] DontInline %[[#]]
-; CHECK:    %[[#bb43:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb44:]]
-; CHECK:    %[[#bb44:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb45:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb46:]] %[[#bb47:]]
 ; CHECK:    %[[#bb46:]] = OpLabel
+; CHECK:                  OpBranch %[[#bb47:]]
+; CHECK:     %[[#bb47]] = OpLabel
 ; CHECK:                  OpSelectionMerge %[[#bb48:]] None
-; CHECK:                  OpSwitch %[[#]] %[[#bb48:]] 1 %[[#bb49:]] 2 %[[#bb50:]] 5 %[[#bb51:]]
-; CHECK:    %[[#bb47:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb45:]]
-; CHECK:    %[[#bb49:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb48:]]
-; CHECK:    %[[#bb50:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb48:]]
-; CHECK:    %[[#bb51:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb48:]]
-; CHECK:    %[[#bb48:]] = OpLabel
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb52:]] %[[#bb45:]]
-; CHECK:    %[[#bb52:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb53:]]
-; CHECK:    %[[#bb53:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb54:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb54:]] %[[#bb55:]]
-; CHECK:    %[[#bb55:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb54:]]
-; CHECK:    %[[#bb54:]] = OpLabel
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb56:]] %[[#bb45:]]
-; CHECK:    %[[#bb56:]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb49:]] %[[#bb50:]]
+; CHECK:     %[[#bb50]] = OpLabel
+; CHECK:                  OpBranch %[[#bb48]]
+; CHECK:     %[[#bb49]] = OpLabel
+; CHECK:                  OpSelectionMerge %[[#bb51:]] None
+; CHECK:                  OpSwitch %[[#]] %[[#bb51]] 1 %[[#bb52:]] 2 %[[#bb53:]] 5 %[[#bb54:]]
+; CHECK:     %[[#bb54]] = OpLabel
+; CHECK:                  OpBranch %[[#bb51]]
+; CHECK:     %[[#bb53]] = OpLabel
+; CHECK:                  OpBranch %[[#bb51]]
+; CHECK:     %[[#bb52]] = OpLabel
+; CHECK:                  OpBranch %[[#bb51]]
+; CHECK:     %[[#bb51]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb55:]] %[[#bb48]]
+; CHECK:     %[[#bb55]] = OpLabel
+; CHECK:                  OpBranch %[[#bb56:]]
+; CHECK:     %[[#bb56]] = OpLabel
 ; CHECK:                  OpSelectionMerge %[[#bb57:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb57:]] %[[#bb58:]]
-; CHECK:    %[[#bb58:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb57:]]
-; CHECK:    %[[#bb57:]] = OpLabel
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb59:]] %[[#bb45:]]
-; CHECK:    %[[#bb59:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb45:]]
-; CHECK:    %[[#bb45:]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb57]] %[[#bb58:]]
+; CHECK:     %[[#bb58]] = OpLabel
+; CHECK:                  OpBranch %[[#bb57]]
+; CHECK:     %[[#bb57]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb59:]] %[[#bb48]]
+; CHECK:     %[[#bb59]] = OpLabel
+; CHECK:                  OpSelectionMerge %[[#bb60:]] None
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb60]] %[[#bb61:]]
+; CHECK:     %[[#bb61]] = OpLabel
+; CHECK:                  OpBranch %[[#bb60]]
+; CHECK:     %[[#bb60]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb62:]] %[[#bb48]]
+; CHECK:     %[[#bb62]] = OpLabel
+; CHECK:                  OpBranch %[[#bb48]]
+; CHECK:     %[[#bb48]] = OpLabel
 ; CHECK:                  OpReturnValue %[[#]]
 ; CHECK:                  OpFunctionEnd
-; CHECK: %[[#func_39:]] = OpFunction %[[#void:]] DontInline %[[#]]
-; CHECK:    %[[#bb60:]] = OpLabel
+
+; CHECK: %[[#func_42:]] = OpFunction %[[#void:]] DontInline %[[#]]
+; CHECK:    %[[#bb63:]] = OpLabel
 ; CHECK:                  OpReturn
 ; CHECK:                  OpFunctionEnd
-; CHECK: %[[#func_41:]] = OpFunction %[[#void:]] None %[[#]]
-; CHECK:    %[[#bb61:]] = OpLabel
+
+; CHECK: %[[#func_44:]] = OpFunction %[[#void]] None %[[#]]
+; CHECK:    %[[#bb64:]] = OpLabel
 ; CHECK:                  OpReturn
 ; CHECK:                  OpFunctionEnd
 

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/cf.switch.ifstmt.simple2.ll b/llvm/test/CodeGen/SPIRV/structurizer/cf.switch.ifstmt.simple2.ll
index cf50b982b23dc8..d7b453aac56bc6 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/cf.switch.ifstmt.simple2.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/cf.switch.ifstmt.simple2.ll
@@ -1,10 +1,9 @@
 ; RUN: llc -mtriple=spirv-unknown-vulkan-compute -O0 %s -o - | FileCheck %s
 ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan-compute %s -o - -filetype=obj | spirv-val %}
 
+; static int foo() { return 200; }
 ;
-; int foo() { return 200; }
-;
-; int process() {
+; static int process() {
 ;   int a = 0;
 ;   int b = 0;
 ;   int c = 0;
@@ -20,10 +19,10 @@
 ;       b += 2;
 ;       break;
 ;     case 3:
-;     {
-;       b += 3;
-;       break;
-;     }
+;       {
+;         b += 3;
+;         break;
+;       }
 ;     case t:
 ;       b += t;
 ;     case 4:
@@ -31,10 +30,10 @@
 ;       b += 5;
 ;       break;
 ;     case 6: {
-;     case 7:
-;       break;}
+;               case 7:
+;                 break;}
 ;     default:
-;       break;
+;             break;
 ;   }
 ;
 ;   return a + b + c;
@@ -45,198 +44,167 @@
 ;   process();
 ; }
 
-; CHECK: %[[#func_18:]] = OpFunction %[[#uint:]] DontInline %[[#]]
-; CHECK:    %[[#bb52:]] = OpLabel
-; CHECK:                  OpReturnValue %[[#]]
-; CHECK:                  OpFunctionEnd
-; CHECK: %[[#func_19:]] = OpFunction %[[#uint:]] DontInline %[[#]]
-; CHECK:    %[[#bb53:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb54:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb55:]] %[[#bb56:]]
-; CHECK:    %[[#bb55:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb57:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb58:]] %[[#bb59:]]
-; CHECK:    %[[#bb56:]] = OpLabel
-; CHECK:    %[[#bb58:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb60:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb61:]] %[[#bb62:]]
-; CHECK:    %[[#bb59:]] = OpLabel
-; CHECK:    %[[#bb61:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb63:]] None
-; CHECK:                  OpSwitch %[[#]] %[[#bb64:]] 1 %[[#bb65:]] 2 %[[#bb63:]] 3 %[[#bb66:]] 140 %[[#bb67:]] 4 %[[#bb68:]] 5 %[[#bb69:]] 6 %[[#bb70:]] 7 %[[#bb71:]]
-; CHECK:    %[[#bb62:]] = OpLabel
-; CHECK:    %[[#bb64:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb63:]]
-; CHECK:    %[[#bb65:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb63:]]
-; CHECK:    %[[#bb66:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb63:]]
-; CHECK:    %[[#bb67:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb63:]]
-; CHECK:    %[[#bb68:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb63:]]
-; CHECK:    %[[#bb69:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb63:]]
-; CHECK:    %[[#bb70:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb63:]]
-; CHECK:    %[[#bb71:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb63:]]
-; CHECK:    %[[#bb63:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb72:]] None
-; CHECK:                  OpSwitch %[[#]] %[[#bb73:]] 1 %[[#bb72:]] 2 %[[#bb74:]] 3 %[[#bb75:]]
-; CHECK:    %[[#bb73:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb72:]]
-; CHECK:    %[[#bb74:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb72:]]
-; CHECK:    %[[#bb75:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb72:]]
-; CHECK:    %[[#bb72:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb60:]]
-; CHECK:    %[[#bb60:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb76:]] None
-; CHECK:                  OpSwitch %[[#]] %[[#bb77:]] 1 %[[#bb76:]] 2 %[[#bb78:]]
-; CHECK:    %[[#bb77:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb76:]]
-; CHECK:    %[[#bb78:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb76:]]
-; CHECK:    %[[#bb76:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb57:]]
-; CHECK:    %[[#bb57:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb54:]]
-; CHECK:    %[[#bb54:]] = OpLabel
-; CHECK:                  OpReturnValue %[[#]]
-; CHECK:                  OpFunctionEnd
-; CHECK: %[[#func_48:]] = OpFunction %[[#void:]] DontInline %[[#]]
-; CHECK:    %[[#bb79:]] = OpLabel
-; CHECK:                  OpReturn
-; CHECK:                  OpFunctionEnd
-; CHECK: %[[#func_50:]] = OpFunction %[[#void:]] None %[[#]]
-; CHECK:    %[[#bb80:]] = OpLabel
-; CHECK:                  OpReturn
-; CHECK:                  OpFunctionEnd
+; CHECK: %[[#func:]] = OpFunction %[[#]] DontInline %[[#]]
+; CHECK: %[[#bb30:]] = OpLabel
+; CHECK:               OpSelectionMerge %[[#bb31:]] None
+; CHECK:               OpBranchConditional %[[#]] %[[#bb32:]] %[[#bb33:]]
+
+; CHECK:  %[[#bb33]] = OpLabel
+; CHECK:               OpUnreachable
+
+; CHECK:  %[[#bb32]] = OpLabel
+; CHECK:               OpSelectionMerge %[[#bb34:]] None
+; CHECK:               OpBranchConditional %[[#]] %[[#bb35:]] %[[#bb36:]]
+
+; CHECK:  %[[#bb36]] = OpLabel
+; CHECK:               OpUnreachable
+
+; CHECK:  %[[#bb35]] = OpLabel
+; CHECK:               OpSelectionMerge %[[#bb37:]] None
+; CHECK:               OpBranchConditional %[[#]] %[[#bb38:]] %[[#bb39:]]
+
+; CHECK:  %[[#bb39]] = OpLabel
+; CHECK:               OpUnreachable
+
+; CHECK:  %[[#bb38]] = OpLabel
+; CHECK:               OpSelectionMerge %[[#bb40:]] None
+; CHECK:               OpSwitch %[[#]] %[[#bb41:]] 1 %[[#bb42:]] 2 %[[#bb43:]] 3 %[[#bb44:]] 140 %[[#bb45:]] 4 %[[#bb46:]] 5 %[[#bb47:]] 6 %[[#bb48:]] 7 %[[#bb49:]]
+
+; CHECK:  %[[#bb49]] = OpLabel
+; CHECK:               OpBranch %[[#bb40]]
+; CHECK:  %[[#bb48]] = OpLabel
+; CHECK:               OpBranch %[[#bb40]]
+; CHECK:  %[[#bb47]] = OpLabel
+; CHECK:               OpBranch %[[#bb40]]
+; CHECK:  %[[#bb46]] = OpLabel
+; CHECK:               OpBranch %[[#bb40]]
+; CHECK:  %[[#bb45]] = OpLabel
+; CHECK:               OpBranch %[[#bb40]]
+; CHECK:  %[[#bb44]] = OpLabel
+; CHECK:               OpBranch %[[#bb40]]
+; CHECK:  %[[#bb43]] = OpLabel
+; CHECK:               OpBranch %[[#bb40]]
+; CHECK:  %[[#bb42]] = OpLabel
+; CHECK:               OpBranch %[[#bb40]]
+; CHECK:  %[[#bb41]] = OpLabel
+; CHECK:               OpBranch %[[#bb40]]
+
+; CHECK:  %[[#bb40]] = OpLabel
+; CHECK:               OpSelectionMerge %[[#bb50:]] None
+; CHECK:               OpSwitch %[[#]] %[[#bb50]] 1 %[[#bb51:]] 2 %[[#bb52:]] 3 %[[#bb53:]]
+; CHECK:  %[[#bb53]] = OpLabel
+; CHECK:               OpBranch %[[#bb50]]
+; CHECK:  %[[#bb52]] = OpLabel
+; CHECK:               OpBranch %[[#bb50]]
+; CHECK:  %[[#bb51]] = OpLabel
+; CHECK:               OpBranch %[[#bb50]]
+; CHECK:  %[[#bb50]] = OpLabel
+; CHECK:               OpBranch %[[#bb37]]
+
+; CHECK:  %[[#bb37]] = OpLabel
+; CHECK:               OpSelectionMerge %[[#bb54:]] None
+; CHECK:               OpSwitch %[[#]] %[[#bb54]] 1 %[[#bb55:]] 2 %[[#bb56:]]
+; CHECK:  %[[#bb56]] = OpLabel
+; CHECK:               OpBranch %[[#bb54]]
+; CHECK:  %[[#bb55]] = OpLabel
+; CHECK:               OpBranch %[[#bb54]]
+; CHECK:  %[[#bb54]] = OpLabel
+; CHECK:               OpBranch %[[#bb34]]
+
+; CHECK:  %[[#bb34]] = OpLabel
+; CHECK:               OpBranch %[[#bb31]]
+
+; CHECK:  %[[#bb31]] = OpLabel
+; CHECK:               OpReturn
+; CHECK:               OpFunctionEnd
 
 
 
 target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-G1"
 target triple = "spirv-unknown-vulkan1.3-compute"
 
-; Function Attrs: convergent noinline norecurse nounwind optnone
-define spir_func noundef i32 @_Z3foov() #0 {
+; Function Attrs: convergent noinline norecurse
+define void @main() #0 {
 entry:
+  %a.i = alloca i32, align 4
+  %b.i = alloca i32, align 4
+  %c.i = alloca i32, align 4
+  %r.i = alloca i32, align 4
+  %s.i = alloca i32, align 4
+  %t.i = alloca i32, align 4
+  %d.i = alloca i32, align 4
   %0 = call token @llvm.experimental.convergence.entry()
-  ret i32 200
-}
-
-; Function Attrs: convergent nocallback nofree nosync nounwind willreturn memory(none)
-declare token @llvm.experimental.convergence.entry() #1
-
-; Function Attrs: convergent noinline norecurse nounwind optnone
-define spir_func noundef i32 @_Z7processv() #0 {
-entry:
-  %0 = call token @llvm.experimental.convergence.entry()
-  %a = alloca i32, align 4
-  %b = alloca i32, align 4
-  %c = alloca i32, align 4
-  %r = alloca i32, align 4
-  %s = alloca i32, align 4
-  %t = alloca i32, align 4
-  %d = alloca i32, align 4
-  store i32 0, ptr %a, align 4
-  store i32 0, ptr %b, align 4
-  store i32 0, ptr %c, align 4
-  store i32 20, ptr %r, align 4
-  store i32 40, ptr %s, align 4
-  store i32 140, ptr %t, align 4
-  store i32 5, ptr %d, align 4
-  %1 = load i32, ptr %d, align 4
-  switch i32 %1, label %sw.default [
-    i32 1, label %sw.bb
-    i32 2, label %sw.bb3
-    i32 3, label %sw.bb5
-    i32 140, label %sw.bb7
-    i32 4, label %sw.bb9
-    i32 5, label %sw.bb9
-    i32 6, label %sw.bb11
-    i32 7, label %sw.bb12
+  store i32 0, ptr %a.i, align 4
+  store i32 0, ptr %b.i, align 4
+  store i32 0, ptr %c.i, align 4
+  store i32 20, ptr %r.i, align 4
+  store i32 40, ptr %s.i, align 4
+  store i32 140, ptr %t.i, align 4
+  store i32 5, ptr %d.i, align 4
+  %1 = load i32, ptr %d.i, align 4
+  switch i32 %1, label %sw.default.i [
+    i32 1, label %sw.bb.i
+    i32 2, label %sw.bb3.i
+    i32 3, label %sw.bb5.i
+    i32 140, label %sw.bb7.i
+    i32 4, label %sw.bb9.i
+    i32 5, label %sw.bb9.i
+    i32 6, label %sw.bb11.i
+    i32 7, label %sw.bb12.i
   ]
 
-sw.bb:                                            ; preds = %entry
-  %2 = load i32, ptr %b, align 4
-  %add = add nsw i32 %2, 1
-  store i32 %add, ptr %b, align 4
-  %call1 = call spir_func noundef i32 @_Z3foov() #3 [ "convergencectrl"(token %0) ]
-  %3 = load i32, ptr %c, align 4
-  %add2 = add nsw i32 %3, %call1
-  store i32 %add2, ptr %c, align 4
-  br label %sw.bb3
-
-sw.bb3:                                           ; preds = %entry, %sw.bb
-  %4 = load i32, ptr %b, align 4
-  %add4 = add nsw i32 %4, 2
-  store i32 %add4, ptr %b, align 4
-  br label %sw.epilog
-
-sw.bb5:                                           ; preds = %entry
-  %5 = load i32, ptr %b, align 4
-  %add6 = add nsw i32 %5, 3
-  store i32 %add6, ptr %b, align 4
-  br label %sw.epilog
-
-sw.bb7:                                           ; preds = %entry
-  %6 = load i32, ptr %b, align 4
-  %add8 = add nsw i32 %6, 140
-  store i32 %add8, ptr %b, align 4
-  br label %sw.bb9
-
-sw.bb9:                                           ; preds = %entry, %entry, %sw.bb7
-  %7 = load i32, ptr %b, align 4
-  %add10 = add nsw i32 %7, 5
-  store i32 %add10, ptr %b, align 4
-  br label %sw.epilog
-
-sw.bb11:                                          ; preds = %entry
-  br label %sw.bb12
-
-sw.bb12:                                          ; preds = %entry, %sw.bb11
-  br label %sw.epilog
-
-sw.default:                                       ; preds = %entry
-  br label %sw.epilog
-
-sw.epilog:                                        ; preds = %sw.default, %sw.bb12, %sw.bb9, %sw.bb5, %sw.bb3
-  %8 = load i32, ptr %a, align 4
-  %9 = load i32, ptr %b, align 4
-  %add13 = add nsw i32 %8, %9
-  %10 = load i32, ptr %c, align 4
-  %add14 = add nsw i32 %add13, %10
-  ret i32 %add14
-}
-
-; Function Attrs: convergent noinline norecurse nounwind optnone
-define internal spir_func void @main() #0 {
-entry:
-  %0 = call token @llvm.experimental.convergence.entry()
-  %call1 = call spir_func noundef i32 @_Z7processv() #3 [ "convergencectrl"(token %0) ]
+sw.bb.i:
+  %2 = load i32, ptr %b.i, align 4
+  %add.i = add nsw i32 %2, 1
+  store i32 %add.i, ptr %b.i, align 4
+  %3 = load i32, ptr %c.i, align 4
+  %add2.i = add nsw i32 %3, 200
+  store i32 %add2.i, ptr %c.i, align 4
+  br label %sw.bb3.i
+
+sw.bb3.i:
+  %4 = load i32, ptr %b.i, align 4
+  %add4.i = add nsw i32 %4, 2
+  store i32 %add4.i, ptr %b.i, align 4
+  br label %_ZL7processv.exit
+
+sw.bb5.i:
+  %5 = load i32, ptr %b.i, align 4
+  %add6.i = add nsw i32 %5, 3
+  store i32 %add6.i, ptr %b.i, align 4
+  br label %_ZL7processv.exit
+
+sw.bb7.i:
+  %6 = load i32, ptr %b.i, align 4
+  %add8.i = add nsw i32 %6, 140
+  store i32 %add8.i, ptr %b.i, align 4
+  br label %sw.bb9.i
+
+sw.bb9.i:
+  %7 = load i32, ptr %b.i, align 4
+  %add10.i = add nsw i32 %7, 5
+  store i32 %add10.i, ptr %b.i, align 4
+  br label %_ZL7processv.exit
+
+sw.bb11.i:
+  br label %sw.bb12.i
+
+sw.bb12.i:
+  br label %_ZL7processv.exit
+
+sw.default.i:
+  br label %_ZL7processv.exit
+
+_ZL7processv.exit:
+  %8 = load i32, ptr %a.i, align 4
+  %9 = load i32, ptr %b.i, align 4
+  %add13.i = add nsw i32 %8, %9
+  %10 = load i32, ptr %c.i, align 4
+  %add14.i = add nsw i32 %add13.i, %10
   ret void
 }
 
-; Function Attrs: convergent norecurse
-define void @main.1() #2 {
-entry:
-  call void @main()
-  ret void
-}
+declare token @llvm.experimental.convergence.entry() #1
 
-attributes #0 = { convergent noinline norecurse nounwind optnone "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
+attributes #0 = { convergent noinline norecurse "frame-pointer"="all" "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
 attributes #1 = { convergent nocallback nofree nosync nounwind willreturn memory(none) }
-attributes #2 = { convergent norecurse "frame-pointer"="all" "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
-attributes #3 = { convergent }
-
-!llvm.module.flags = !{!0, !1, !2}
-
-
-!0 = !{i32 1, !"wchar_size", i32 4}
-!1 = !{i32 4, !"dx.disable_optimizations", i32 1}
-!2 = !{i32 7, !"frame-pointer", i32 2}
-
-

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/cf.while.continue.ll b/llvm/test/CodeGen/SPIRV/structurizer/cf.while.continue.ll
index 6c53008386f495..e5545c62db5839 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/cf.while.continue.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/cf.while.continue.ll
@@ -45,54 +45,54 @@
 ; }
 
 ; CHECK: %[[#func_15:]] = OpFunction %[[#uint:]] DontInline %[[#]]
-; CHECK:    %[[#bb35:]] = OpLabel
+; CHECK:    %[[#bb36:]] = OpLabel
 ; CHECK:                  OpReturnValue %[[#]]
 ; CHECK:                  OpFunctionEnd
+
 ; CHECK: %[[#func_16:]] = OpFunction %[[#void:]] DontInline %[[#]]
-; CHECK:    %[[#bb36:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb37:]]
 ; CHECK:    %[[#bb37:]] = OpLabel
-; CHECK:                  OpLoopMerge %[[#bb38:]] %[[#bb39:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb40:]] %[[#bb38:]]
-; CHECK:    %[[#bb40:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb41:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb41:]] %[[#bb42:]]
-; CHECK:    %[[#bb42:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb43:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb43:]] %[[#bb44:]]
-; CHECK:    %[[#bb44:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb43:]]
-; CHECK:    %[[#bb43:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb41:]]
-; CHECK:    %[[#bb41:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb39:]]
-; CHECK:    %[[#bb39:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb37:]]
-; CHECK:    %[[#bb38:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb45:]]
-; CHECK:    %[[#bb45:]] = OpLabel
-; CHECK:                  OpLoopMerge %[[#bb46:]] %[[#bb47:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb46:]] %[[#bb48:]]
-; CHECK:    %[[#bb48:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb49:]]
-; CHECK:    %[[#bb49:]] = OpLabel
-; CHECK:                  OpLoopMerge %[[#bb50:]] %[[#bb51:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb51:]] %[[#bb50:]]
-; CHECK:    %[[#bb51:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb49:]]
-; CHECK:    %[[#bb50:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb47:]]
-; CHECK:    %[[#bb47:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb45:]]
-; CHECK:    %[[#bb46:]] = OpLabel
+; CHECK:                  OpBranch %[[#bb38:]]
+; CHECK:     %[[#bb38]] = OpLabel
+; CHECK:                  OpLoopMerge %[[#bb39:]] %[[#bb40:]] None
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb41:]] %[[#bb39]]
+; CHECK:     %[[#bb39]] = OpLabel
+; CHECK:                  OpBranch %[[#bb42:]]
+; CHECK:     %[[#bb42]] = OpLabel
+; CHECK:                  OpLoopMerge %[[#bb43:]] %[[#bb44:]] None
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb43]] %[[#bb45:]]
+; CHECK:     %[[#bb45]] = OpLabel
+; CHECK:                  OpBranch %[[#bb46:]]
+; CHECK:     %[[#bb46]] = OpLabel
+; CHECK:                  OpLoopMerge %[[#bb47:]] %[[#bb48:]] None
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb48]] %[[#bb47]]
+; CHECK:     %[[#bb47]] = OpLabel
+; CHECK:                  OpBranch %[[#bb44]]
+; CHECK:     %[[#bb44]] = OpLabel
+; CHECK:                  OpBranch %[[#bb42]]
+; CHECK:     %[[#bb48]] = OpLabel
+; CHECK:                  OpBranch %[[#bb46]]
+; CHECK:     %[[#bb43]] = OpLabel
+; CHECK:     %[[#bb41]] = OpLabel
+; CHECK:                  OpSelectionMerge %[[#bb49:]] None
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb49]] %[[#bb50:]]
+; CHECK:     %[[#bb50]] = OpLabel
+; CHECK:                  OpSelectionMerge %[[#bb51:]] None
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb51]] %[[#bb52:]]
+; CHECK:     %[[#bb52]] = OpLabel
+; CHECK:                  OpBranch %[[#bb51]]
+; CHECK:     %[[#bb51]] = OpLabel
+; CHECK:                  OpBranch %[[#bb49]]
+; CHECK:     %[[#bb49]] = OpLabel
+; CHECK:                  OpBranch %[[#bb40]]
+; CHECK:     %[[#bb40]] = OpLabel
+; CHECK:                  OpBranch %[[#bb38]]
 ; CHECK:                  OpFunctionEnd
-; CHECK: %[[#func_33:]] = OpFunction %[[#void:]] None %[[#]]
-; CHECK:    %[[#bb52:]] = OpLabel
+
+; CHECK: %[[#func_34:]] = OpFunction %[[#void]] None %[[#]]
+; CHECK:    %[[#bb53:]] = OpLabel
 ; CHECK:                  OpReturn
 ; CHECK:                  OpFunctionEnd
 
-
-
 target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-G1"
 target triple = "spirv-unknown-vulkan1.3-compute"
 

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/cf.while.nested.ll b/llvm/test/CodeGen/SPIRV/structurizer/cf.while.nested.ll
index 716c48d391fe2e..59410ec347f5b1 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/cf.while.nested.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/cf.while.nested.ll
@@ -25,29 +25,29 @@
 ; CHECK: %[[#func_12:]] = OpFunction %[[#void:]] DontInline %[[#]]
 ; CHECK:    %[[#bb39:]] = OpLabel
 ; CHECK:                  OpBranch %[[#bb40:]]
-; CHECK:    %[[#bb40:]] = OpLabel
+; CHECK:     %[[#bb40]] = OpLabel
 ; CHECK:                  OpLoopMerge %[[#bb41:]] %[[#bb42:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb43:]] %[[#bb41:]]
-; CHECK:    %[[#bb43:]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb43:]] %[[#bb41]]
+; CHECK:     %[[#bb41]] = OpLabel
+; CHECK:                  OpReturn
+; CHECK:     %[[#bb43]] = OpLabel
 ; CHECK:                  OpBranch %[[#bb44:]]
-; CHECK:    %[[#bb44:]] = OpLabel
+; CHECK:     %[[#bb44]] = OpLabel
 ; CHECK:                  OpLoopMerge %[[#bb45:]] %[[#bb46:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb47:]] %[[#bb45:]]
-; CHECK:    %[[#bb47:]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb47:]] %[[#bb45]]
+; CHECK:     %[[#bb45]] = OpLabel
+; CHECK:                  OpBranch %[[#bb42]]
+; CHECK:     %[[#bb42]] = OpLabel
+; CHECK:                  OpBranch %[[#bb40]]
+; CHECK:     %[[#bb47]] = OpLabel
 ; CHECK:                  OpLoopMerge %[[#bb48:]] %[[#bb49:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb49:]] %[[#bb48:]]
-; CHECK:    %[[#bb49:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb47:]]
-; CHECK:    %[[#bb48:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb46:]]
-; CHECK:    %[[#bb46:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb44:]]
-; CHECK:    %[[#bb45:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb42:]]
-; CHECK:    %[[#bb42:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb40:]]
-; CHECK:    %[[#bb41:]] = OpLabel
-; CHECK:                  OpReturn
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb49]] %[[#bb48]]
+; CHECK:     %[[#bb48]] = OpLabel
+; CHECK:                  OpBranch %[[#bb46]]
+; CHECK:     %[[#bb46]] = OpLabel
+; CHECK:                  OpBranch %[[#bb44]]
+; CHECK:     %[[#bb49]] = OpLabel
+; CHECK:                  OpBranch %[[#bb47]]
 ; CHECK:                  OpFunctionEnd
 ; CHECK: %[[#func_37:]] = OpFunction %[[#void:]] None %[[#]]
 ; CHECK:    %[[#bb50:]] = OpLabel

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/cf.while.plain.ll b/llvm/test/CodeGen/SPIRV/structurizer/cf.while.plain.ll
index 2f1d228d8ffdfb..e1aa00a3a174b0 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/cf.while.plain.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/cf.while.plain.ll
@@ -43,23 +43,26 @@
 ; CHECK:    %[[#bb20:]] = OpLabel
 ; CHECK:                  OpReturnValue %[[#]]
 ; CHECK:                  OpFunctionEnd
+
 ; CHECK: %[[#func_12:]] = OpFunction %[[#void:]] DontInline %[[#]]
 ; CHECK:    %[[#bb21:]] = OpLabel
 ; CHECK:                  OpBranch %[[#bb22:]]
-; CHECK:    %[[#bb22:]] = OpLabel
+; CHECK:     %[[#bb22]] = OpLabel
 ; CHECK:                  OpLoopMerge %[[#bb23:]] %[[#bb24:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb24:]] %[[#bb23:]]
-; CHECK:    %[[#bb24:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb22:]]
-; CHECK:    %[[#bb23:]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb24]] %[[#bb23]]
+; CHECK:     %[[#bb23]] = OpLabel
 ; CHECK:                  OpBranch %[[#bb25:]]
-; CHECK:    %[[#bb25:]] = OpLabel
+; CHECK:     %[[#bb25]] = OpLabel
 ; CHECK:                  OpLoopMerge %[[#bb26:]] %[[#bb27:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb26:]] %[[#bb27:]]
-; CHECK:    %[[#bb27:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb25:]]
-; CHECK:    %[[#bb26:]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb26]] %[[#bb27]]
+; CHECK:     %[[#bb27]] = OpLabel
+; CHECK:                  OpBranch %[[#bb25]]
+; CHECK:     %[[#bb26]] = OpLabel
+; CHECK-NEXT:             OpUnreachable
+; CHECK:     %[[#bb24]] = OpLabel
+; CHECK:                  OpBranch %[[#bb22]]
 ; CHECK:                  OpFunctionEnd
+
 ; CHECK: %[[#func_18:]] = OpFunction %[[#void:]] None %[[#]]
 ; CHECK:    %[[#bb28:]] = OpLabel
 ; CHECK:                  OpReturn

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/cf.while.short-circuited-cond.ll b/llvm/test/CodeGen/SPIRV/structurizer/cf.while.short-circuited-cond.ll
index 79ce0c15e5c43b..7f77b6da4ed466 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/cf.while.short-circuited-cond.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/cf.while.short-circuited-cond.ll
@@ -21,104 +21,123 @@
 ;   }
 ; }
 
-; CHECK: %[[#func_10:]] = OpFunction %[[#void:]] DontInline %[[#]]
-; CHECK:    %[[#bb54:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb55:]]
-; CHECK:    %[[#bb55:]] = OpLabel
-; CHECK:                  OpLoopMerge %[[#bb56:]] %[[#bb57:]] None
-; CHECK:                  OpBranch %[[#bb58:]]
-; CHECK:    %[[#bb58:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb59:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb60:]] %[[#bb59:]]
-; CHECK:    %[[#bb60:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb59:]]
-; CHECK:    %[[#bb59:]] = OpLabel
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb57:]] %[[#bb56:]]
-; CHECK:    %[[#bb57:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb55:]]
-; CHECK:    %[[#bb56:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb61:]]
-; CHECK:    %[[#bb61:]] = OpLabel
-; CHECK:                  OpLoopMerge %[[#bb62:]] %[[#bb63:]] None
-; CHECK:                  OpBranch %[[#bb64:]]
-; CHECK:    %[[#bb64:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb65:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb65:]] %[[#bb66:]]
-; CHECK:    %[[#bb66:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb65:]]
-; CHECK:    %[[#bb65:]] = OpLabel
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb63:]] %[[#bb62:]]
-; CHECK:    %[[#bb63:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb61:]]
-; CHECK:    %[[#bb62:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb67:]]
-; CHECK:    %[[#bb67:]] = OpLabel
-; CHECK:                  OpLoopMerge %[[#bb68:]] %[[#bb69:]] None
-; CHECK:                  OpBranch %[[#bb70:]]
-; CHECK:    %[[#bb70:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb71:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb72:]] %[[#bb71:]]
-; CHECK:    %[[#bb72:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb73:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb74:]] %[[#bb75:]]
-; CHECK:    %[[#bb74:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb76:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb76:]] %[[#bb77:]]
-; CHECK:    %[[#bb75:]] = OpLabel
-; CHECK:    %[[#bb77:]] = OpLabel
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb76:]] %[[#bb78:]]
-; CHECK:    %[[#bb78:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb76:]]
-; CHECK:    %[[#bb76:]] = OpLabel
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb79:]] %[[#bb73:]]
-; CHECK:    %[[#bb79:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb73:]]
-; CHECK:    %[[#bb73:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb71:]]
-; CHECK:    %[[#bb71:]] = OpLabel
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb69:]] %[[#bb68:]]
-; CHECK:    %[[#bb69:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb67:]]
-; CHECK:    %[[#bb68:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb80:]]
-; CHECK:    %[[#bb80:]] = OpLabel
-; CHECK:                  OpLoopMerge %[[#bb81:]] %[[#bb82:]] None
-; CHECK:                  OpBranch %[[#bb83:]]
-; CHECK:    %[[#bb83:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb84:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb85:]] %[[#bb86:]]
-; CHECK:    %[[#bb85:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb84:]]
-; CHECK:    %[[#bb86:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb84:]]
-; CHECK:    %[[#bb84:]] = OpLabel
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb82:]] %[[#bb81:]]
-; CHECK:    %[[#bb82:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb80:]]
-; CHECK:    %[[#bb81:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb87:]]
+; CHECK: %[[#func_11:]] = OpFunction %[[#void:]] DontInline %[[#]]
 ; CHECK:    %[[#bb87:]] = OpLabel
-; CHECK:                  OpLoopMerge %[[#bb88:]] %[[#bb89:]] None
-; CHECK:                  OpBranch %[[#bb90:]]
-; CHECK:    %[[#bb90:]] = OpLabel
-; CHECK:                  OpSelectionMerge %[[#bb91:]] None
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb92:]] %[[#bb91:]]
-; CHECK:    %[[#bb92:]] = OpLabel
+; CHECK:                  OpBranch %[[#bb88:]]
+; CHECK:     %[[#bb88]] = OpLabel
+; CHECK:                  OpLoopMerge %[[#bb89:]] %[[#bb90:]] None
 ; CHECK:                  OpBranch %[[#bb91:]]
-; CHECK:    %[[#bb91:]] = OpLabel
-; CHECK:                  OpBranchConditional %[[#]] %[[#bb89:]] %[[#bb88:]]
-; CHECK:    %[[#bb89:]] = OpLabel
-; CHECK:                  OpBranch %[[#bb87:]]
-; CHECK:    %[[#bb88:]] = OpLabel
+; CHECK:     %[[#bb91]] = OpLabel
+; CHECK:                  OpSelectionMerge %[[#bb92:]] None
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb93:]] %[[#bb94:]]
+; CHECK:     %[[#bb94]] = OpLabel
+; CHECK:                  OpBranch %[[#bb92]]
+; CHECK:     %[[#bb93]] = OpLabel
+; CHECK:                  OpBranch %[[#bb92]]
+; CHECK:     %[[#bb92]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb90]] %[[#bb89]]
+; CHECK:     %[[#bb89]] = OpLabel
+; CHECK:                  OpBranch %[[#bb95:]]
+; CHECK:     %[[#bb95]] = OpLabel
+; CHECK:                  OpLoopMerge %[[#bb96:]] %[[#bb97:]] None
+; CHECK:                  OpBranch %[[#bb98:]]
+; CHECK:     %[[#bb98]] = OpLabel
+; CHECK:                  OpSelectionMerge %[[#bb99:]] None
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb100:]] %[[#bb101:]]
+; CHECK:    %[[#bb101]] = OpLabel
+; CHECK:                  OpBranch %[[#bb99]]
+; CHECK:    %[[#bb100]] = OpLabel
+; CHECK:                  OpBranch %[[#bb99]]
+; CHECK:     %[[#bb99]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb97]] %[[#bb96]]
+; CHECK:     %[[#bb96]] = OpLabel
+; CHECK:                  OpBranch %[[#bb102:]]
+; CHECK:    %[[#bb102]] = OpLabel
+; CHECK:                  OpLoopMerge %[[#bb103:]] %[[#bb104:]] None
+; CHECK:                  OpBranch %[[#bb105:]]
+; CHECK:    %[[#bb105]] = OpLabel
+; CHECK:                  OpSelectionMerge %[[#bb106:]] None
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb107:]] %[[#bb108:]]
+; CHECK:    %[[#bb108]] = OpLabel
+; CHECK:                  OpBranch %[[#bb106]]
+; CHECK:    %[[#bb107]] = OpLabel
+; CHECK:                  OpSelectionMerge %[[#bb109:]] None
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb110:]] %[[#bb109]]
+; CHECK:    %[[#bb110]] = OpLabel
+; CHECK:                  OpSelectionMerge %[[#bb111:]] None
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb112:]] %[[#bb113:]]
+; CHECK:    %[[#bb113]] = OpLabel
+; CHECK:                  OpSelectionMerge %[[#bb114:]] None
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb114]] %[[#bb115:]]
+; CHECK:    %[[#bb115]] = OpLabel
+; CHECK:                  OpBranch %[[#bb114]]
+; CHECK:    %[[#bb114]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb116:]] %[[#bb111]]
+; CHECK:    %[[#bb116]] = OpLabel
+; CHECK:                  OpBranch %[[#bb111]]
+; CHECK:    %[[#bb112]] = OpLabel
+; CHECK:                  OpBranch %[[#bb111]]
+; CHECK:    %[[#bb111]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb109]] %[[#bb117:]]
+; CHECK:    %[[#bb117]] = OpLabel
+; CHECK:                  OpBranch %[[#bb109]]
+; CHECK:    %[[#bb109]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb106]] %[[#bb118:]]
+; CHECK:    %[[#bb118]] = OpLabel
+; CHECK:                  OpBranch %[[#bb106]]
+; CHECK:    %[[#bb106]] = OpLabel
+; CHECK:                  OpSelectionMerge %[[#bb119:]] None
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb119]] %[[#bb120:]]
+; CHECK:    %[[#bb120]] = OpLabel
+; CHECK:    %[[#bb119]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb104]] %[[#bb103]]
+; CHECK:    %[[#bb103]] = OpLabel
+; CHECK:                  OpBranch %[[#bb121:]]
+; CHECK:    %[[#bb121]] = OpLabel
+; CHECK:                  OpLoopMerge %[[#bb122:]] %[[#bb123:]] None
+; CHECK:                  OpBranch %[[#bb124:]]
+; CHECK:    %[[#bb124]] = OpLabel
+; CHECK:                  OpSelectionMerge %[[#bb125:]] None
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb126:]] %[[#bb127:]]
+; CHECK:    %[[#bb127]] = OpLabel
+; CHECK:                  OpBranch %[[#bb125]]
+; CHECK:    %[[#bb126]] = OpLabel
+; CHECK:                  OpBranch %[[#bb125]]
+; CHECK:    %[[#bb125]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb123]] %[[#bb122]]
+; CHECK:    %[[#bb122]] = OpLabel
+; CHECK:                  OpBranch %[[#bb128:]]
+; CHECK:    %[[#bb128]] = OpLabel
+; CHECK:                  OpLoopMerge %[[#bb129:]] %[[#bb130:]] None
+; CHECK:                  OpBranch %[[#bb131:]]
+; CHECK:    %[[#bb131]] = OpLabel
+; CHECK:                  OpSelectionMerge %[[#bb132:]] None
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb133:]] %[[#bb134:]]
+; CHECK:    %[[#bb134]] = OpLabel
+; CHECK:                  OpBranch %[[#bb132]]
+; CHECK:    %[[#bb133]] = OpLabel
+; CHECK:                  OpBranch %[[#bb132]]
+; CHECK:    %[[#bb132]] = OpLabel
+; CHECK:                  OpBranchConditional %[[#]] %[[#bb130]] %[[#bb129]]
+; CHECK:    %[[#bb129]] = OpLabel
 ; CHECK:                  OpReturn
+; CHECK:    %[[#bb130]] = OpLabel
+; CHECK:                  OpBranch %[[#bb128]]
+; CHECK:    %[[#bb123]] = OpLabel
+; CHECK:                  OpBranch %[[#bb121]]
+; CHECK:    %[[#bb104]] = OpLabel
+; CHECK:                  OpBranch %[[#bb102]]
+; CHECK:     %[[#bb97]] = OpLabel
+; CHECK:                  OpBranch %[[#bb95]]
+; CHECK:     %[[#bb90]] = OpLabel
+; CHECK:                  OpBranch %[[#bb88]]
 ; CHECK:                  OpFunctionEnd
-; CHECK: %[[#func_52:]] = OpFunction %[[#void:]] None %[[#]]
-; CHECK:    %[[#bb93:]] = OpLabel
+
+; CHECK: %[[#func_85:]] = OpFunction %[[#void]] None %[[#]]
+; CHECK:   %[[#bb135:]] = OpLabel
 ; CHECK:                  OpReturn
 ; CHECK:                  OpFunctionEnd
 
-
-
 target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-G1"
 target triple = "spirv-unknown-vulkan1.3-compute"
 

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/condition-linear.ll b/llvm/test/CodeGen/SPIRV/structurizer/condition-linear.ll
index 71f3ce9263da56..3b3841142263ac 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/condition-linear.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/condition-linear.ll
@@ -38,18 +38,18 @@ entry:
   %b = alloca i32, align 4
   br i1 true, label %cond1_true, label %cond1_false
 
-; CHECK:  %[[#cond1_true]] = OpLabel
-; CHECK:                     OpStore %[[#reg_0]] %[[#]]
-; CHECK:                     OpBranch %[[#cond1_merge]]
-cond1_true:
-  %2 = load i32, ptr %a, align 4
-  br label %cond1_merge
-
 ; CHECK:  %[[#cond1_false]] = OpLabel
 ; CHECK:                      OpStore %[[#reg_0]] %[[#]]
 ; CHECK:                      OpBranch %[[#cond1_merge]]
 cond1_false:
-  %3 = load i32, ptr %b, align 4
+  %2 = load i32, ptr %b, align 4
+  br label %cond1_merge
+
+; CHECK:  %[[#cond1_true]] = OpLabel
+; CHECK:                     OpStore %[[#reg_0]] %[[#]]
+; CHECK:                     OpBranch %[[#cond1_merge]]
+cond1_true:
+  %3 = load i32, ptr %a, align 4
   br label %cond1_merge
 
 ; CHECK: %[[#cond1_merge]] = OpLabel
@@ -58,7 +58,7 @@ cond1_false:
 ; CHECK:                     OpSelectionMerge %[[#cond2_merge:]] None
 ; CHECK:                     OpBranchConditional %[[#cond]] %[[#cond2_true:]] %[[#cond2_merge]]
 cond1_merge:
-  %cond = phi i32 [ %2, %cond1_true ], [ %3, %cond1_false ]
+  %cond = phi i32 [ %3, %cond1_true ], [ %2, %cond1_false ]
   %tobool1 = icmp ne i32 %cond, 0
   br i1 %tobool1, label %cond2_true, label %cond2_merge
 
@@ -76,14 +76,6 @@ cond2_merge:
   %call2 = call spir_func noundef i32 @fn() #4 [ "convergencectrl"(token %0) ]
   br i1 true, label %cond3_true, label %cond3_false
 
-; CHECK:  %[[#cond3_true]] = OpLabel
-; CHECK:                     OpFunctionCall
-; CHECK:                     OpStore %[[#reg_1]] %[[#]]
-; CHECK:                     OpBranch %[[#cond3_merge]]
-cond3_true:
-  %call5 = call spir_func noundef i32 @fn1() #4 [ "convergencectrl"(token %0) ]
-  br label %cond3_merge
-
 ; CHECK:  %[[#cond3_false]] = OpLabel
 ; CHECK:                      OpFunctionCall
 ; CHECK:                      OpStore %[[#reg_1]] %[[#]]
@@ -92,6 +84,14 @@ cond3_false:
   %call7 = call spir_func noundef i32 @fn2() #4 [ "convergencectrl"(token %0) ]
   br label %cond3_merge
 
+; CHECK:  %[[#cond3_true]] = OpLabel
+; CHECK:                     OpFunctionCall
+; CHECK:                     OpStore %[[#reg_1]] %[[#]]
+; CHECK:                     OpBranch %[[#cond3_merge]]
+cond3_true:
+  %call5 = call spir_func noundef i32 @fn1() #4 [ "convergencectrl"(token %0) ]
+  br label %cond3_merge
+
 ; CHECK:  %[[#cond3_merge]] = OpLabel
 ; CHECK:         %[[#tmp:]] = OpLoad %[[#]] %[[#reg_1]]
 ; CHECK:       %[[#cond:]] = OpINotEqual %[[#]] %[[#tmp]] %[[#]]

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/do-continue.ll b/llvm/test/CodeGen/SPIRV/structurizer/do-continue.ll
index 05071d03164d5f..b95642f51c9fee 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/do-continue.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/do-continue.ll
@@ -21,7 +21,7 @@ entry:
 ; Here a the loop header had to be split in two:
 ; - 1 header for the loop
 ; - 1 header for the condition.
-; In SPIR-V, a loop header cannot directly 
+
 ; CHECK: %[[#do_header:]] = OpLabel
 ; CHECK:                    OpLoopMerge %[[#do_merge:]] %[[#do_latch:]] None
 ; CHECK:                    OpBranch %[[#new_header:]]
@@ -34,27 +34,21 @@ do_header:
   store i32 0, ptr %var
   br i1 true, label %if.then, label %if.end
 
-; CHECK: %[[#if_then]] = OpLabel
-; CHECK:                 OpBranch %[[#if_merge]]
-if.then:
-  store i32 0, ptr %var
-  br label %do_latch
-
 ; CHECK: %[[#if_end]] = OpLabel
 ; CHECK:                OpBranch %[[#if_merge]]
 if.end:
   store i32 0, ptr %var
   br label %do_latch
 
+; CHECK: %[[#if_then]] = OpLabel
+; CHECK:                 OpBranch %[[#if_merge]]
+if.then:
+  store i32 0, ptr %var
+  br label %do_latch
+
 ; CHECK: %[[#if_merge]] = OpLabel
 ; CHECK:                  OpBranchConditional %[[#]] %[[#do_latch]] %[[#do_merge]]
 
-; CHECK: %[[#do_latch]] = OpLabel
-; CHECK:                  OpBranch %[[#do_header]]
-do_latch:
-  store i32 0, ptr %var
-  br i1 true, label %do_header, label %do.end
-
 ; CHECK: %[[#do_merge]] = OpLabel
 ; CHECK:                  OpBranch %[[#do2_header:]]
 do.end:
@@ -80,12 +74,6 @@ do3_header:
 ; CHECK: %[[#do3_body]] = OpLabel
 ; CHECK:                  OpBranchConditional %[[#]] %[[#do3_continue]] %[[#do3_merge]]
 
-; CHECK: %[[#do3_continue]] = OpLabel
-; CHECK:                      OpBranch %[[#do3_header]]
-do3_continue:
-  store i32 0, ptr %var
-  br i1 true, label %do3_header, label %do3_merge
-
 ; CHECK: %[[#do3_merge]] = OpLabel
 ; CHECK:                   OpBranch %[[#do2_new_latch:]]
 do3_merge:
@@ -95,16 +83,28 @@ do3_merge:
 ; CHECK: %[[#do2_new_latch]] = OpLabel
 ; CHECK:                       OpBranchConditional %[[#]] %[[#do2_continue]] %[[#do2_merge]]
 
+; CHECK: %[[#do2_merge]] = OpLabel
+; CHECK:                   OpReturn
+do2_merge:
+  ret void
+
 ; CHECK: %[[#do2_continue]] = OpLabel
 ; CHECK:                      OpBranch %[[#do2_header]]
 do2_continue:
   store i32 0, ptr %var
   br i1 true, label %do2_header, label %do2_merge
 
-; CHECK: %[[#do2_merge]] = OpLabel
-; CHECK:                   OpReturn
-do2_merge:
-  ret void
+; CHECK: %[[#do3_continue]] = OpLabel
+; CHECK:                      OpBranch %[[#do3_header]]
+do3_continue:
+  store i32 0, ptr %var
+  br i1 true, label %do3_header, label %do3_merge
+
+; CHECK: %[[#do_latch]] = OpLabel
+; CHECK:                  OpBranch %[[#do_header]]
+do_latch:
+  store i32 0, ptr %var
+  br i1 true, label %do_header, label %do.end
 }
 
 declare token @llvm.experimental.convergence.entry() #1

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/do-nested.ll b/llvm/test/CodeGen/SPIRV/structurizer/do-nested.ll
index bef95f5f63bf7b..4ea5fcde348a3f 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/do-nested.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/do-nested.ll
@@ -37,11 +37,6 @@ do3_header:
 
 ; CHECK:        %[[#do3_cond]] = OpLabel
 ; CHECK:                         OpBranchConditional %[[#]] %[[#do3_continue]] %[[#do3_merge]]
-; CHECK:    %[[#do3_continue]] = OpLabel
-; CHECK:                         OpBranch %[[#do3_header]]
-do3_continue:
-  store i32 0, ptr %var
-  br i1 true, label %do3_header, label %do3_merge
 
 ; CHECK:    %[[#do3_merge]] = OpLabel
 ; CHECK:                      OpBranch %[[#do2_cond:]]
@@ -51,30 +46,38 @@ do3_merge:
 
 ; CHECK:        %[[#do2_cond]] = OpLabel
 ; CHECK:                         OpBranchConditional %[[#]] %[[#do2_continue]] %[[#do2_merge]]
-; CHECK:    %[[#do2_continue]] = OpLabel
-; CHECK:                         OpBranch %[[#do2_header]]
-do2_continue:
-  store i32 0, ptr %var
-  br i1 true, label %do2_header, label %do2_merge
 
 ; CHECK:    %[[#do2_merge]] = OpLabel
 ; CHECK:                      OpBranch %[[#do1_cond:]]
+
+; CHECK:        %[[#do1_cond]] = OpLabel
+; CHECK:                         OpBranchConditional %[[#]] %[[#do1_continue]] %[[#do1_merge]]
 do2_merge:
   store i32 0, ptr %var
   br label %do1_continue
 
-; CHECK:        %[[#do1_cond]] = OpLabel
-; CHECK:                         OpBranchConditional %[[#]] %[[#do1_continue]] %[[#do1_merge]]
+; CHECK:    %[[#do1_merge]] = OpLabel
+; CHECK:                      OpReturn
+do1_merge:
+  ret void
+
 ; CHECK:    %[[#do1_continue]] = OpLabel
 ; CHECK:                         OpBranch %[[#do1_header]]
 do1_continue:
   store i32 0, ptr %var
   br i1 true, label %do1_header, label %do1_merge
 
-; CHECK:    %[[#do1_merge]] = OpLabel
-; CHECK:                      OpReturn
-do1_merge:
-  ret void
+; CHECK:    %[[#do2_continue]] = OpLabel
+; CHECK:                         OpBranch %[[#do2_header]]
+do2_continue:
+  store i32 0, ptr %var
+  br i1 true, label %do2_header, label %do2_merge
+
+; CHECK:    %[[#do3_continue]] = OpLabel
+; CHECK:                         OpBranch %[[#do3_header]]
+do3_continue:
+  store i32 0, ptr %var
+  br i1 true, label %do3_header, label %do3_merge
 }
 
 declare token @llvm.experimental.convergence.entry() #1

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/do-plain.ll b/llvm/test/CodeGen/SPIRV/structurizer/do-plain.ll
index 9f84fc317021f0..1a419918790bcc 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/do-plain.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/do-plain.ll
@@ -24,18 +24,13 @@ entry:
 ; CHECK:    %[[#do1_header]] = OpLabel
 ; CHECK:                       OpLoopMerge %[[#do1_merge:]] %[[#do1_continue:]] None
 ; CHECK:                       OpBranch %[[#do1_cond:]]
-do1_header:
-  %1 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %0) ]
-  store i32 0, ptr %var
-  br label %do1_continue
 
 ; CHECK:        %[[#do1_cond]] = OpLabel
 ; CHECK:                         OpBranchConditional %[[#]] %[[#do1_continue]] %[[#do1_merge]]
-; CHECK:    %[[#do1_continue]] = OpLabel
-; CHECK:                         OpBranch %[[#do1_header]]
-do1_continue:
+do1_header:
+  %1 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %0) ]
   store i32 0, ptr %var
-  br i1 true, label %do1_header, label %do1_merge
+  br label %do1_continue
 
 ; CHECK: %[[#do1_merge]] = OpLabel
 ; CHECK:                   OpBranch %[[#do2_header:]]
@@ -53,11 +48,6 @@ do2_header:
 
 ; CHECK:        %[[#do2_cond]] = OpLabel
 ; CHECK:                         OpBranchConditional %[[#]] %[[#do2_continue]] %[[#do2_merge]]
-; CHECK:    %[[#do2_continue]] = OpLabel
-; CHECK:                         OpBranch %[[#do2_header]]
-do2_continue:
-  store i32 0, ptr %var
-  br i1 true, label %do2_header, label %do2_merge
 
 ; CHECK: %[[#do2_merge]] = OpLabel
 ; CHECK:                   OpBranch %[[#do3_header:]]
@@ -75,16 +65,29 @@ do3_header:
 
 ; CHECK:        %[[#do3_cond]] = OpLabel
 ; CHECK:                         OpBranchConditional %[[#]] %[[#do3_continue]] %[[#do3_merge]]
+
+; CHECK: %[[#do3_merge]] = OpLabel
+; CHECK:                   OpReturn
+do3_merge:
+  ret void
+
 ; CHECK:    %[[#do3_continue]] = OpLabel
 ; CHECK:                         OpBranch %[[#do3_header]]
 do3_continue:
   store i32 0, ptr %var
   br i1 true, label %do3_header, label %do3_merge
 
-; CHECK: %[[#do3_merge]] = OpLabel
-; CHECK:                   OpReturn
-do3_merge:
-  ret void
+; CHECK:    %[[#do2_continue]] = OpLabel
+; CHECK:                         OpBranch %[[#do2_header]]
+do2_continue:
+  store i32 0, ptr %var
+  br i1 true, label %do2_header, label %do2_merge
+
+; CHECK:    %[[#do1_continue]] = OpLabel
+; CHECK:                         OpBranch %[[#do1_header]]
+do1_continue:
+  store i32 0, ptr %var
+  br i1 true, label %do1_header, label %do1_merge
 }
 
 

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/logical-or.ll b/llvm/test/CodeGen/SPIRV/structurizer/logical-or.ll
index 235f15b0644704..732d8161766f26 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/logical-or.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/logical-or.ll
@@ -17,16 +17,12 @@ define internal spir_func void @main() #3 {
 ; CHECK:                      OpSelectionMerge %[[#merge:]] None
 ; CHECK:                      OpBranchConditional %[[#]] %[[#new_header:]] %[[#unreachable:]]
 
-; CHECK:     %[[#new_header]] = OpLabel
-; CHECK:                        OpSelectionMerge %[[#new_merge:]] None
-; CHECK:                        OpBranchConditional %[[#]] %[[#taint_true_merge:]] %[[#br_false:]]
-
 ; CHECK:       %[[#unreachable]] = OpLabel
 ; CHECK-NEXT:                      OpUnreachable
 
-; CHECK: %[[#taint_true_merge]] = OpLabel
-; CHECK:                          OpStore %[[#switch_0]] %[[#int_1]]
-; CHECK:                          OpBranch %[[#new_merge]]
+; CHECK:     %[[#new_header]] = OpLabel
+; CHECK:                        OpSelectionMerge %[[#new_merge:]] None
+; CHECK:                        OpBranchConditional %[[#]] %[[#taint_true_merge:]] %[[#br_false:]]
 
 ; CHECK:      %[[#br_false]] = OpLabel
 ; CHECK-DAG:                   OpStore %[[#switch_1]] %[[#int_0]]
@@ -47,6 +43,10 @@ define internal spir_func void @main() #3 {
 ; CHECK:                          OpStore %[[#switch_0]] %[[#int_1]]
 ; CHECK:                          OpBranch %[[#new_merge]]
 
+; CHECK: %[[#taint_true_merge]] = OpLabel
+; CHECK:                          OpStore %[[#switch_0]] %[[#int_1]]
+; CHECK:                          OpBranch %[[#new_merge]]
+
 ; CHECK:      %[[#new_merge]] = OpLabel
 ; CHECK:             %[[#tmp:]] = OpLoad %[[#]] %[[#switch_0]]
 ; CHECK:            %[[#cond:]] = OpIEqual %[[#]] %[[#int_0]] %[[#tmp]]

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/loop-continue-split.ll b/llvm/test/CodeGen/SPIRV/structurizer/loop-continue-split.ll
index 5a5ea002e0942f..4f8babb7f436f0 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/loop-continue-split.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/loop-continue-split.ll
@@ -43,14 +43,6 @@ header:
   %2 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %0) ]
   br i1 true, label %left, label %right
 
-; CHECK:     %[[#left]] = OpLabel
-; CHECK-DAG:              OpStore %[[#switch_0]] %[[#int_0]]
-; CHECK-DAG:              OpStore %[[#variable]] %[[#int_1]]
-; CHECK:                  OpBranchConditional %[[#]] %[[#inner_merge]] %[[#left_next:]]
-left:
-  store i32 1, ptr %var
-  br i1 true, label %merge, label %left_next
-
 ; CHECK:     %[[#right]] = OpLabel
 ; CHECK-DAG:               OpStore %[[#switch_0]] %[[#int_0]]
 ; CHECK-DAG:               OpStore %[[#variable]] %[[#int_2]]
@@ -59,14 +51,6 @@ right:
   store i32 2, ptr %var
   br i1 true, label %merge, label %right_next
 
-; CHECK:     %[[#left_next]] = OpLabel
-; CHECK-DAG:                   OpStore %[[#switch_0]] %[[#int_1]]
-; CHECK-DAG:                   OpStore %[[#variable]] %[[#int_3]]
-; CHECK:                       OpBranch %[[#inner_merge]]
-left_next:
-  store i32 3, ptr %var
-  br label %continue
-
 ; CHECK:     %[[#right_next]] = OpLabel
 ; CHECK-DAG:                    OpStore %[[#switch_0]] %[[#int_1]]
 ; CHECK-DAG:                    OpStore %[[#variable]] %[[#int_4]]
@@ -75,6 +59,22 @@ right_next:
   store i32 4, ptr %var
   br label %continue
 
+; CHECK:     %[[#left]] = OpLabel
+; CHECK-DAG:              OpStore %[[#switch_0]] %[[#int_0]]
+; CHECK-DAG:              OpStore %[[#variable]] %[[#int_1]]
+; CHECK:                  OpBranchConditional %[[#]] %[[#inner_merge]] %[[#left_next:]]
+left:
+  store i32 1, ptr %var
+  br i1 true, label %merge, label %left_next
+
+; CHECK:     %[[#left_next]] = OpLabel
+; CHECK-DAG:                   OpStore %[[#switch_0]] %[[#int_1]]
+; CHECK-DAG:                   OpStore %[[#variable]] %[[#int_3]]
+; CHECK:                       OpBranch %[[#inner_merge]]
+left_next:
+  store i32 3, ptr %var
+  br label %continue
+
 ; CHECK: %[[#inner_merge]] = OpLabel
 ; CHECK:        %[[#tmp:]] = OpLoad %[[#]] %[[#switch_0]]
 ; CHECK:       %[[#cond:]] = OpIEqual %[[#]] %[[#int_0]] %[[#tmp]]

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/merge-exit-simple-while-identity.ll b/llvm/test/CodeGen/SPIRV/structurizer/merge-exit-simple-while-identity.ll
index 9b7f1e0f92019c..eccd36d02a0da8 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/merge-exit-simple-while-identity.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/merge-exit-simple-while-identity.ll
@@ -22,6 +22,11 @@ while.cond:
   %cmp = icmp ne i32 %2, 0
   br i1 %cmp, label %while.body, label %while.end
 
+; CHECK:        %[[#while_end]] = OpLabel
+; CHECK-NEXT:                     OpReturn
+while.end:
+  ret void
+
 ; CHECK:   %[[#while_body]] = OpLabel
 ; CHECK:                      OpBranch %[[#while_cond]]
 while.body:
@@ -29,10 +34,6 @@ while.body:
   store i32 %3, ptr %idx, align 4
   br label %while.cond
 
-; CHECK:        %[[#while_end]] = OpLabel
-; CHECK-NEXT:                     OpReturn
-while.end:
-  ret void
 }
 
 declare token @llvm.experimental.convergence.entry() #2

diff  --git a/llvm/test/CodeGen/SPIRV/structurizer/return-early.ll b/llvm/test/CodeGen/SPIRV/structurizer/return-early.ll
index e27aca8784286c..5e64c24b787843 100644
--- a/llvm/test/CodeGen/SPIRV/structurizer/return-early.ll
+++ b/llvm/test/CodeGen/SPIRV/structurizer/return-early.ll
@@ -39,11 +39,11 @@ while.body:
     i32 5, label %sw.bb2
   ]
 
-; CHECK: %[[#case_1]] = OpLabel
+; CHECK: %[[#case_5]] = OpLabel
 ; CHECK:                OpStore %[[#reg_0]] %[[#]]
 ; CHECK:                OpBranch %[[#switch_end]]
-sw.bb:
-  store i32 1, ptr %a, align 4
+sw.bb2:
+  store i32 5, ptr %a, align 4
   br label %while.end
 
 ; CHECK: %[[#case_2]] = OpLabel
@@ -53,11 +53,11 @@ sw.bb1:
   store i32 3, ptr %a, align 4
   br label %while.end
 
-; CHECK: %[[#case_5]] = OpLabel
+; CHECK: %[[#case_1]] = OpLabel
 ; CHECK:                OpStore %[[#reg_0]] %[[#]]
 ; CHECK:                OpBranch %[[#switch_end]]
-sw.bb2:
-  store i32 5, ptr %a, align 4
+sw.bb:
+  store i32 1, ptr %a, align 4
   br label %while.end
 
 ; CHECK: %[[#switch_end]] = OpLabel

diff  --git a/llvm/unittests/Target/SPIRV/CMakeLists.txt b/llvm/unittests/Target/SPIRV/CMakeLists.txt
index e9fe4883e5b024..2af36225c5f200 100644
--- a/llvm/unittests/Target/SPIRV/CMakeLists.txt
+++ b/llvm/unittests/Target/SPIRV/CMakeLists.txt
@@ -15,6 +15,6 @@ set(LLVM_LINK_COMPONENTS
 
 add_llvm_target_unittest(SPIRVTests
   SPIRVConvergenceRegionAnalysisTests.cpp
+  SPIRVSortBlocksTests.cpp
   SPIRVAPITest.cpp
-  )
-
+)

diff  --git a/llvm/unittests/Target/SPIRV/SPIRVSortBlocksTests.cpp b/llvm/unittests/Target/SPIRV/SPIRVSortBlocksTests.cpp
new file mode 100644
index 00000000000000..7f0d9fd7247124
--- /dev/null
+++ b/llvm/unittests/Target/SPIRV/SPIRVSortBlocksTests.cpp
@@ -0,0 +1,389 @@
+//===- SPIRVSortBlocksTests.cpp ----------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "SPIRVUtils.h"
+#include "llvm/Analysis/DominanceFrontier.h"
+#include "llvm/Analysis/PostDominators.h"
+#include "llvm/AsmParser/Parser.h"
+#include "llvm/IR/Instructions.h"
+#include "llvm/IR/LLVMContext.h"
+#include "llvm/IR/LegacyPassManager.h"
+#include "llvm/IR/Module.h"
+#include "llvm/IR/PassInstrumentation.h"
+#include "llvm/IR/Type.h"
+#include "llvm/IR/TypedPointerType.h"
+#include "llvm/Support/SourceMgr.h"
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include <queue>
+
+using namespace llvm;
+using namespace llvm::SPIRV;
+
+class SPIRVSortBlocksTest : public testing::Test {
+protected:
+  void TearDown() override { M.reset(); }
+
+  bool run(StringRef Assembly) {
+    assert(M == nullptr &&
+           "Calling runAnalysis multiple times is unsafe. See getAnalysis().");
+
+    SMDiagnostic Error;
+    M = parseAssemblyString(Assembly, Error, Context);
+    assert(M && "Bad assembly. Bad test?");
+    llvm::Function *F = M->getFunction("main");
+    return sortBlocks(*F);
+  }
+
+  void checkBasicBlockOrder(std::vector<const char *> &&Expected) {
+    llvm::Function *F = M->getFunction("main");
+    auto It = F->begin();
+    for (const char *Name : Expected) {
+      ASSERT_TRUE(It != F->end())
+          << "Expected block \"" << Name
+          << "\" but reached the end of the function instead.";
+      ASSERT_TRUE(It->getName() == Name)
+          << "Error: expected block \"" << Name << "\" got \"" << It->getName()
+          << "\"";
+      It++;
+    }
+    ASSERT_TRUE(It == F->end())
+        << "No more blocks were expected, but function has more.";
+  }
+
+protected:
+  LLVMContext Context;
+  std::unique_ptr<Module> M;
+};
+
+TEST_F(SPIRVSortBlocksTest, DefaultRegion) {
+  StringRef Assembly = R"(
+    define void @main() convergent "hlsl.numthreads"="4,8,16" "hlsl.shader"="compute" {
+      ret void
+    }
+  )";
+
+  // No sorting is required.
+  EXPECT_FALSE(run(Assembly));
+}
+
+TEST_F(SPIRVSortBlocksTest, BasicBlockSwap) {
+  StringRef Assembly = R"(
+    define void @main() convergent "hlsl.numthreads"="4,8,16" "hlsl.shader"="compute" {
+    entry:
+      br label %middle
+    exit:
+      ret void
+    middle:
+      br label %exit
+    }
+  )";
+
+  EXPECT_TRUE(run(Assembly));
+  checkBasicBlockOrder({"entry", "middle", "exit"});
+}
+
+// Skip condition:
+//         +-> A -+
+//  entry -+      +-> C
+//         +------+
+TEST_F(SPIRVSortBlocksTest, SkipCondition) {
+  StringRef Assembly = R"(
+    define void @main() convergent "hlsl.numthreads"="4,8,16" "hlsl.shader"="compute" {
+    entry:
+      %1 = icmp ne i32 0, 0
+      br i1 %1, label %c, label %a
+    c:
+      ret void
+    a:
+      br label %c
+    }
+  )";
+
+  EXPECT_TRUE(run(Assembly));
+  checkBasicBlockOrder({"entry", "a", "c"});
+}
+
+// Simple loop:
+// entry -> header <-----------------+
+//           | `-> body -> continue -+
+//           `-> end
+TEST_F(SPIRVSortBlocksTest, LoopOrdering) {
+  StringRef Assembly = R"(
+    define void @main() convergent "hlsl.numthreads"="4,8,16" "hlsl.shader"="compute" {
+    entry:
+      %1 = icmp ne i32 0, 0
+      br label %header
+    end:
+      ret void
+    body:
+      br label %continue
+    continue:
+      br label %header
+    header:
+      br i1 %1, label %body, label %end
+    }
+  )";
+
+  EXPECT_TRUE(run(Assembly));
+  checkBasicBlockOrder({"entry", "header", "end", "body", "continue"});
+}
+
+// Diamond condition:
+//         +-> A -+
+//  entry -+      +-> C
+//         +-> B -+
+//
+// A and B order can be flipped with no effect, but it must be remain
+// deterministic/stable.
+TEST_F(SPIRVSortBlocksTest, DiamondCondition) {
+  StringRef Assembly = R"(
+    define void @main() convergent "hlsl.numthreads"="4,8,16" "hlsl.shader"="compute" {
+    entry:
+      %1 = icmp ne i32 0, 0
+      br i1 %1, label %b, label %a
+    c:
+      ret void
+    b:
+      br label %c
+    a:
+      br label %c
+    }
+  )";
+
+  EXPECT_TRUE(run(Assembly));
+  checkBasicBlockOrder({"entry", "a", "b", "c"});
+}
+
+// Crossing conditions:
+//             +------+  +-> C -+
+//         +-> A -+   |  |      |
+//  entry -+      +--_|_-+      +-> E
+//         +-> B -+   |         |
+//             +------+----> D -+
+//
+// A & B have the same rank.
+// C & D have the same rank, but are after A & B.
+// E if the last block.
+TEST_F(SPIRVSortBlocksTest, CrossingCondition) {
+  StringRef Assembly = R"(
+    define void @main() convergent "hlsl.numthreads"="4,8,16" "hlsl.shader"="compute" {
+    entry:
+      %1 = icmp ne i32 0, 0
+      br i1 %1, label %b, label %a
+    e:
+      ret void
+    c:
+      br label %e
+    b:
+      br i1 %1, label %d, label %c
+    d:
+      br label %e
+    a:
+      br i1 %1, label %d, label %c
+    }
+  )";
+
+  EXPECT_TRUE(run(Assembly));
+  checkBasicBlockOrder({"entry", "a", "b", "c", "d", "e"});
+}
+
+// Irreducible CFG
+// digraph {
+//    entry -> A;
+//
+//    A -> B;
+//    A -> C;
+//
+//    B -> A;
+//    B -> C;
+//
+//    C -> B;
+// }
+//
+// Order starts with Entry and A. Order of B and C can change, but must remain
+// stable.
+// In such case, rank will be defined by the arbitrary traversal order. What's
+// important is to have a stable value.
+TEST_F(SPIRVSortBlocksTest, IrreducibleOrdering) {
+  StringRef Assembly = R"(
+    define void @main() convergent "hlsl.numthreads"="4,8,16" "hlsl.shader"="compute" {
+    entry:
+      %1 = icmp ne i32 0, 0
+      br label %a
+
+    b:
+      br i1 %1, label %a, label %c
+
+    c:
+      br label %b
+
+    a:
+      br i1 %1, label %b, label %c
+
+    }
+  )";
+
+  EXPECT_TRUE(run(Assembly));
+  checkBasicBlockOrder({"entry", "a", "b", "c"});
+}
+
+TEST_F(SPIRVSortBlocksTest, IrreducibleOrderingBeforeReduction) {
+  StringRef Assembly = R"(
+    define void @main() convergent "hlsl.numthreads"="4,8,16" "hlsl.shader"="compute" {
+    entry:
+      %1 = icmp ne i32 0, 0
+      br label %a
+
+    c:
+      br i1 %1, label %e, label %d
+
+    e:
+      ret void
+
+    b:
+      br i1 %1, label %c, label %d
+
+    a:
+      br label %b
+
+    d:
+      br i1 %1, label %b, label %c
+
+    }
+  )";
+
+  EXPECT_TRUE(run(Assembly));
+  checkBasicBlockOrder({"entry", "a", "b", "c", "d", "e"});
+}
+
+TEST_F(SPIRVSortBlocksTest, LoopDiamond) {
+  StringRef Assembly = R"(
+    define void @main() convergent "hlsl.numthreads"="4,8,16" "hlsl.shader"="compute" {
+    entry:
+      %1 = icmp ne i32 0, 0
+      br label %header
+    header:
+      br i1 %1, label %body, label %end
+    body:
+      br i1 %1, label %break, label %inside_a
+    inside_a:
+      br label %inside_b
+    inside_b:
+      br i1 %1, label %inside_d, label %inside_c
+    inside_c:
+      br label %continue
+    inside_d:
+      br label %continue
+    break:
+      br label %end
+    continue:
+      br label %header
+    end:
+      ret void
+    }
+  )";
+
+  EXPECT_TRUE(run(Assembly));
+  checkBasicBlockOrder({"entry", "header", "body", "inside_a", "inside_b",
+                        "inside_c", "inside_d", "continue", "break", "end"});
+}
+
+TEST_F(SPIRVSortBlocksTest, LoopNested) {
+  StringRef Assembly = R"(
+    define void @main() convergent "hlsl.numthreads"="4,8,16" "hlsl.shader"="compute" {
+    entry:
+      %1 = icmp ne i32 0, 0
+      br label %a
+    a:
+      br i1 %1, label %h, label %b
+    b:
+      br label %c
+    c:
+      br i1 %1, label %d, label %e
+    d:
+      br label %g
+    e:
+      br label %f
+    f:
+      br label %c
+    g:
+      br label %a
+    h:
+      ret void
+    }
+  )";
+
+  EXPECT_TRUE(run(Assembly));
+  checkBasicBlockOrder({"entry", "a", "b", "c", "e", "f", "d", "g", "h"});
+}
+
+TEST_F(SPIRVSortBlocksTest, IfNested) {
+  StringRef Assembly = R"(
+    define void @main() convergent "hlsl.numthreads"="4,8,16" "hlsl.shader"="compute" {
+    entry:
+      br i1 true, label %d, label %a
+    i:
+      br label %j
+    j:
+      ret void
+    a:
+      br i1 true, label %b, label %c
+    d:
+      br i1 true, label %f, label %e
+    e:
+      br label %i
+    b:
+      br label %c
+    f:
+      br i1 true, label %h, label %g
+    g:
+      br label %h
+    c:
+      br label %j
+    h:
+      br label %i
+    }
+  )";
+  EXPECT_TRUE(run(Assembly));
+  checkBasicBlockOrder(
+      {"entry", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j"});
+}
+
+// Same as above, but this time blocks are already sorted, so no need to reorder
+// them.
+TEST_F(SPIRVSortBlocksTest, IfNestedSorted) {
+  StringRef Assembly = R"(
+    define void @main() convergent "hlsl.numthreads"="4,8,16" "hlsl.shader"="compute" {
+    entry:
+      br i1 true, label %d, label %z
+    z:
+      br i1 true, label %b, label %c
+    b:
+      br label %c
+    c:
+      br label %j
+    d:
+      br i1 true, label %f, label %e
+    e:
+      br label %i
+    f:
+      br i1 true, label %h, label %g
+    g:
+      br label %h
+    h:
+      br label %i
+    i:
+      br label %j
+    j:
+      ret void
+    }
+  )";
+  EXPECT_FALSE(run(Assembly));
+}


        


More information about the llvm-commits mailing list