blob: 07539b27546ca45008c5bbc1e95ca709204f3a9f [file] [log] [blame]
// All bbs should have IDs that match the rpo order put out when printing with -emit-sorted-sil
// RUN: %target-sil-opt %s -module-name Swift -loop-region-view-text -o /dev/null | %FileCheck %s
import Builtin
//////////////////
// Declarations //
//////////////////
enum Never {}
enum ManyCase {
case One
case Two
case Three
}
sil @no_return_func : $@convention(thin) () -> Never
///////////
// Tests //
///////////
// One Level Natural Self Loop:
//
// BB0 -> BB1 -> BB2
// ^ |
// | |
// ----
//
// CHECK-LABEL: @one_natural_self_loop@
// CHECK: (region id:3 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:4)
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:2 kind:bb ucfh:false ucft:false parent:3
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:4 kind:loop ucfh:false ucft:false parent:3
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:1)))
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:4
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:3
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
sil @one_natural_self_loop : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
cond_br undef, bb1, bb2
bb2:
%9999 = tuple()
return %9999 : $()
}
// One Level Natural Loop:
//
// BB0 -> BB1 -> BB2 -> BB3 -> BB4
// ^ |
// | |
// ---------------
//
// CHECK-LABEL: @one_natural_loop@
// CHECK: (region id:5 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:6)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:5
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:6 kind:loop ucfh:false ucft:false parent:5
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:3)))
// CHECK: (region id:3 kind:bb ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:2 kind:bb ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:5
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
sil @one_natural_loop : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
br bb2
bb2:
br bb3
bb3:
cond_br undef, bb1, bb4
bb4:
%9999 = tuple()
return %9999 : $()
}
// One Level Natural Loop with Diamond inside.
// -> BB2 ---\
// / v
// BB0 -> BB1 -> BB3 -> BB4 -> BB5
// ^ |
// | |
// ---------------
//
// CHECK-LABEL: @one_natural_loop_with_diamond@
// CHECK: (region id:6 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:7)
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:5 kind:bb ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:7 kind:loop ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:4)))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:3 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:2 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
sil @one_natural_loop_with_diamond : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
cond_br undef, bb2, bb3
bb2:
br bb4
bb3:
br bb4
bb4:
cond_br undef, bb1, bb5
bb5:
%9999 = tuple()
return %9999 : $()
}
// One Level Natural Loop, multiple backedges
//
// BB0 -> BB1 -> BB2 -> BB3 -> BB4
// ^ | |
// | | |
// ---------------
//
// CHECK-LABEL: @one_natural_loop_multiple_backedges@
// CHECK: (region id:5 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:6)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:5
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:6 kind:loop ucfh:true ucft:true parent:5
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:3)))
// CHECK: (region id:3 kind:bb ucfh:false ucft:true parent:6
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:2 kind:bb ucfh:false ucft:true parent:6
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:1 kind:bb ucfh:true ucft:false parent:6
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:5
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
sil @one_natural_loop_multiple_backedges : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
br bb2
bb2:
cond_br undef, bb1, bb3
bb3:
cond_br undef, bb1, bb4
bb4:
%9999 = tuple()
return %9999 : $()
}
// Make sure that we propagate up into the outer loop that we have a ucft in the
// inner loop. The ucfh does not propagate up b/c the header of the loop is not
// in the inner loop.
//
// This is an example that can not happen in sil with canonicalized loops.
//
// CHECK-LABEL: @inner_natural_loop_with_multiple_backedges@
// CHECK: (region id:8 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:9)
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:5 kind:bb ucfh:false ucft:false parent:8
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:9 kind:loop ucfh:false ucft:false parent:8
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:10)
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:10))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:7)))
// CHECK: (region id:7 kind:bb ucfh:false ucft:false parent:9
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:10))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:10 kind:loop ucfh:true ucft:false parent:9
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:4)
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:6)))
// CHECK: (region id:6 kind:bb ucfh:false ucft:true parent:10
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:10
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0)
// CHECK-NEXT: (parentindex:1))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:3 kind:bb ucfh:false ucft:true parent:10
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:2 kind:bb ucfh:true ucft:false parent:10
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:9
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:10))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:8
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
sil @inner_natural_loop_with_multiple_backedges : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
br bb2
bb2:
br bb3
bb3:
cond_br undef, bb2, bb4
bb4:
switch_enum undef : $ManyCase, case #ManyCase.One!enumelt: bb5, case #ManyCase.Two!enumelt: bb6, case #ManyCase.Three!enumelt: bb7
bb5:
br bb1
bb6:
br bb2
bb7:
return undef : $()
}
// Two separate natural loops
//
// Make sure that we package them up correctly
//
// BB0 -> BB1 -> BB2 -> BB3 -> BB4 -> BB5
// ^ | ^ |
// | | | |
// -------- --------
//
// CHECK-LABEL: @two_separate_natural_loops@
// CHECK: (region id:6 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:7)
// CHECK-NEXT: (region id:8)
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:5 kind:bb ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:8 kind:loop ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:4))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:8
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:3 kind:bb ucfh:false ucft:false parent:8
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:7 kind:loop ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:2)))
// CHECK: (region id:2 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
sil @two_separate_natural_loops : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
br bb2
bb2:
cond_br undef, bb1, bb3
bb3:
br bb4
bb4:
cond_br undef, bb3, bb5
bb5:
%9999 = tuple()
return %9999 : $()
}
// Two separate natural loops separated by a diamond
//
// Make sure that we package them up correctly
// -> BB3 -|
// / v
// BB0 -> BB1 -> BB2 ---> BB4 -> BB5 -> BB6
// ^ | ^ |
// | | | |
// -------- --------
//
// CHECK-LABEL: @two_separate_natural_loops_separated_by_diamond@
// CHECK(region id:6 kind:func ucfh:false ucft:false
sil @two_separate_natural_loops_separated_by_diamond : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
br bb2
bb2:
switch_enum undef : $ManyCase, case #ManyCase.One!enumelt: bbcase1, case #ManyCase.Two!enumelt: bbcase2, case #ManyCase.Three!enumelt: bbcase3
bbcase1:
br bb1
bbcase2:
br bb4
bbcase3:
br bb4
bb4:
br bb5
bb5:
cond_br undef, bb4, bb6
bb6:
%9999 = tuple()
return %9999 : $()
}
// Two separate natural loops separated by a diamond with else having a loop.
//
// Make sure that we package them up correctly
//
// /------\
// v |
// |-> BB3 -> BB4------------\
// | | |
// | v v
// BB0 -> BB1 -> BB2 ------> BB5 -> BB6 -> BB7
// ^ | ^ |
// | | | |
// -------- --------
//
// CHECK-LABEL: @two_separate_natural_loops_separated_by_diamond_with_loop@
// CHECK: (region id:13 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:14)
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:4)
// CHECK-NEXT: (region id:15)
// CHECK-NEXT: (region id:6)
// CHECK-NEXT: (region id:7)
// CHECK-NEXT: (region id:8)
// CHECK-NEXT: (region id:9)
// CHECK-NEXT: (region id:10))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:10 kind:bb ucfh:true ucft:true parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:9 kind:bb ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:6)
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:8 kind:bb ucfh:true ucft:true parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:7)
// CHECK-NEXT: (region id:10))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:9)
// CHECK-NEXT: (region id:10))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:7 kind:bb ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:15))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:6 kind:bb ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:15))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:15 kind:loop ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:6)
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:5)
// CHECK-NEXT: (region id:11))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:11)))
// CHECK: (region id:11 kind:bb ucfh:false ucft:false parent:15
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:5 kind:bb ucfh:false ucft:false parent:15
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:11))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0)
// CHECK-NEXT: (parentindex:1))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:14))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:15))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:3 kind:bb ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:14))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:10))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:14 kind:loop ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:12))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:12)))
// CHECK: (region id:12 kind:bb ucfh:false ucft:false parent:14
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:2 kind:bb ucfh:false ucft:false parent:14
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:12))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0)
// CHECK-NEXT: (parentindex:1))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:14
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK: (region id:14))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
sil @two_separate_natural_loops_separated_by_diamond_with_loop : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
br bb2
bb2:
switch_enum undef : $ManyCase, case #ManyCase.One!enumelt: bbcase1, case #ManyCase.Two!enumelt: bbcase2, case #ManyCase.Three!enumelt: bbcase3
bbcase1:
br bb1
bbcase2:
br bb4
bbcase3:
br bb5
bb4:
switch_enum undef : $ManyCase, case #ManyCase.One!enumelt: bbcase41, case #ManyCase.Two!enumelt: bbcase42, case #ManyCase.Three!enumelt: bbcase43
bbcase41:
br bb4
bbcase42:
br bb6
bbcase43:
br bb7
bb5:
br bb6
bb6:
cond_br undef, bb5, bb7
bb7:
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: @three_separate_natural_loops@
// CHECK: (region id:11 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:12)
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:4)
// CHECK-NEXT: (region id:13)
// CHECK-NEXT: (region id:6)
// CHECK-NEXT: (region id:14)
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:9 kind:bb ucfh:false ucft:false parent:11
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:13)
// CHECK-NEXT: (region id:14))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:14 kind:loop ucfh:false ucft:false parent:11
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:7)
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:8)))
// CHECK: (region id:8 kind:bb ucfh:false ucft:false parent:14
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:7 kind:bb ucfh:false ucft:false parent:14
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:6 kind:bb ucfh:false ucft:false parent:11
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:12))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:14))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:13 kind:loop ucfh:false ucft:false parent:11
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:5)))
// CHECK: (region id:5 kind:bb ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:11
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:13))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:3 kind:bb ucfh:false ucft:false parent:11
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:12))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:12 kind:loop ucfh:false ucft:false parent:11
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:10))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:10)))
// CHECK: (region id:10 kind:bb ucfh:false ucft:false parent:12
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:2 kind:bb ucfh:false ucft:false parent:12
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:10))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0)
// CHECK-NEXT: (parentindex:1))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:12
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:11
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:12))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
sil @three_separate_natural_loops : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
br bb2
bb2:
switch_enum undef : $ManyCase, case #ManyCase.One!enumelt: bbcase1, case #ManyCase.Two!enumelt: bbcase2, case #ManyCase.Three!enumelt: bbcase3
bbcase1:
br bb1
bbcase2:
br bb3
bbcase3:
br bb5
bb3:
br bb4
bb4:
cond_br undef, bb3, bb7
bb5:
br bb6
bb6:
cond_br undef, bb6, bb7
bb7:
%9999 = tuple()
return %9999 : $()
}
// Two Level Natural Loop, one backedge
//
// BB0 -> BB1 -> BB2 -> BB3 -> BB4
// ^ ^ | |
// | |-- |
// ---------------
//
// CHECK-LABEL: @two_level_natural_loop@
// CHECK: (region id:5 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:6)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:5
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:6 kind:loop ucfh:false ucft:false parent:5
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:7)
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:3))
// CHECK: (region id:3 kind:bb ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:7 kind:loop ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:2))
// CHECK: (region id:2 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:5
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
sil @two_level_natural_loop : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
br bb2
bb2:
cond_br undef, bb2, bb3
bb3:
cond_br undef, bb1, bb4
bb4:
%9999 = tuple()
return %9999 : $()
}
// Two Level Natural Loop, one backedge, with loop in diamond.
// ---> BB3 --\
// / v
// BB0 -> BB1 -> BB2 -> BB4 -> BB5
// ^ ^ | |
// | |-- |
// ---------------
//
// CHECK-LABEL: @two_level_natural_loop_with_diamond_and_multiple_loop_exits@
// CHECK: (region id:9 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:10)
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:7 kind:bb ucfh:false ucft:false parent:9
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:10))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:10 kind:loop ucfh:false ucft:false parent:9
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:11)
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:4)
// CHECK-NEXT: (region id:5)
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:6)))
// CHECK: (region id:6 kind:bb ucfh:false ucft:false parent:10
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:5 kind:bb ucfh:false ucft:false parent:10
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:10
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:11))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:3 kind:bb ucfh:false ucft:false parent:10
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:11))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:11 kind:loop ucfh:false ucft:false parent:10
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:8)))
// CHECK: (region id:8 kind:bb ucfh:false ucft:false parent:11
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:2 kind:bb ucfh:false ucft:false parent:11
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0)
// CHECK-NEXT: (parentindex:1))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:10
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:5)
// CHECK-NEXT: (region id:11))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:9
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:10))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
sil @two_level_natural_loop_with_diamond_and_multiple_loop_exits : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
cond_br undef, bb2, bb3
bb2:
switch_enum undef : $ManyCase, case #ManyCase.One!enumelt: bbcase1, case #ManyCase.Two!enumelt: bbcase2, case #ManyCase.Three!enumelt: bbcase3
bbcase1:
br bb2
bbcase2:
br bb3
bbcase3:
br bb4
bb3:
br bb4
bb4:
cond_br undef, bb1, bb5
bb5:
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: @three_level_natural_loop_with_inner_loop_in_diamond@
// CHECK: (region id:6 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:7)
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:5 kind:bb ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:7 kind:loop ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:8)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:4)
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:4))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:8 kind:loop ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:3)))
// CHECK: (region id:3 kind:bb ucfh:false ucft:false parent:8
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:2 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
sil @three_level_natural_loop_with_inner_loop_in_diamond : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
cond_br undef, bb2, bb3
bb2:
cond_br undef, bb2, bb4
bb3:
br bb4
bb4:
cond_br undef, bb1, bb5
bb5:
%9999 = tuple()
return %9999 : $()
}
// One level irreducible loop
//
// Make sure that we properly identify irreducible loop boundaries.
//
// CHECK-LABEL: @one_level_irreducible_loop@
// CHECK: (region id:8 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:4)
// CHECK-NEXT: (region id:5)
// CHECK-NEXT: (region id:6)
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:7 kind:bb ucfh:true ucft:true parent:8
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:6 kind:bb ucfh:false ucft:false parent:8
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:5 kind:bb ucfh:false ucft:false parent:8
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:4 kind:bb ucfh:true ucft:true parent:8
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:3 kind:bb ucfh:false ucft:false parent:8
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:2 kind:bb ucfh:true ucft:true parent:8
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:5)
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:1 kind:bb ucfh:true ucft:true parent:8
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:8
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
sil @one_level_irreducible_loop : $@convention(thin) () -> () {
bb0:
cond_br undef, bb1, bb3
bb1:
br bb2
bb2:
switch_enum undef : $ManyCase, case #ManyCase.One!enumelt: bbcase1, case #ManyCase.Two!enumelt: bbcase2, case #ManyCase.Three!enumelt: bbcase3
bbcase1:
br bb1
bbcase2:
br bb5
bbcase3:
br bb3
bb3:
br bb2
bb5:
%9999 = tuple()
return %9999 : $()
}
// One natural loop with one internal irreducible loop
//
// CHECK-LABEL: @natural_loop_containing_irreducible_loop@
// CHECK: (region id:10 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:11)
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:8 kind:bb ucfh:false ucft:false parent:10
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:11))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:11 kind:loop ucfh:false ucft:false parent:10
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:4)
// CHECK-NEXT: (region id:5)
// CHECK-NEXT: (region id:6)
// CHECK-NEXT: (region id:7)
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:7)))
// CHECK: (region id:9 kind:bb ucfh:true ucft:true parent:11
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:7 kind:bb ucfh:false ucft:false parent:11
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:6 kind:bb ucfh:false ucft:false parent:11
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:5 kind:bb ucfh:true ucft:true parent:11
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:11
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:3 kind:bb ucfh:true ucft:true parent:11
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4)
// CHECK-NEXT: (region id:6)
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:2 kind:bb ucfh:true ucft:true parent:11
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:11
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:10
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:11))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
sil @natural_loop_containing_irreducible_loop : $@convention(thin) () -> () {
bb0:
br bb6
bb6:
cond_br undef, bb1, bb3
bb1:
br bb2
bb2:
switch_enum undef : $ManyCase, case #ManyCase.One!enumelt: bbcase1, case #ManyCase.Two!enumelt: bbcase2, case #ManyCase.Three!enumelt: bbcase3
bbcase1:
br bb1
bbcase2:
br bb5
bbcase3:
br bb3
bb3:
br bb2
bb5:
cond_br undef, bb6, bb7
bb7:
%9999 = tuple()
return %9999 : $()
}
// Two natural loop of which one has an internal irreducible loop
//
// This makes sure that irreducibility is only propagated up the loop nest, not
// into siblings.
//
// CHECK-LABEL: @two_natural_loop_one_with_irreducible_loop@
// CHECK: (region id:12 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:13)
// CHECK-NEXT: (region id:14)
// CHECK-NEXT: (region id:10))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:10 kind:bb ucfh:false ucft:false parent:12
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:14))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:14 kind:loop ucfh:false ucft:false parent:12
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:13))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:10))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:8)
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:9)))
// CHECK: (region id:9 kind:bb ucfh:false ucft:false parent:14
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:8 kind:bb ucfh:false ucft:false parent:14
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:13 kind:loop ucfh:false ucft:false parent:12
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:14))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:4)
// CHECK-NEXT: (region id:5)
// CHECK-NEXT: (region id:6)
// CHECK-NEXT: (region id:7)
// CHECK-NEXT: (region id:11))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:7)))
// CHECK: (region id:11 kind:bb ucfh:true ucft:true parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:7 kind:bb ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:6 kind:bb ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:5 kind:bb ucfh:true ucft:true parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:3 kind:bb ucfh:true ucft:true parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4)
// CHECK-NEXT: (region id:6)
// CHECK-NEXT: (region id:11))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:2 kind:bb ucfh:true ucft:true parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:11))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:12
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:13))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
sil @two_natural_loop_one_with_irreducible_loop : $@convention(thin) () -> () {
bb0:
br bb6
bb6:
cond_br undef, bb1, bb3
bb1:
br bb2
bb2:
switch_enum undef : $ManyCase, case #ManyCase.One!enumelt: bbcase1, case #ManyCase.Two!enumelt: bbcase2, case #ManyCase.Three!enumelt: bbcase3
bbcase1:
br bb1
bbcase2:
br bb5
bbcase3:
br bb3
bb3:
br bb2
bb5:
cond_br undef, bb6, bb7
bb7:
br bb8
bb8:
cond_br undef, bb7, bb9
bb9:
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: @multiple_level_natural_loop_with_irreducible_loop_sandwich@
// CHECK: (region id:15 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:16)
// CHECK-NEXT: (region id:19)
// CHECK-NEXT: (region id:13))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:13 kind:bb ucfh:false ucft:false parent:15
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:19))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:19 kind:loop ucfh:false ucft:false parent:15
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:16))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:13))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:11)
// CHECK-NEXT: (region id:12))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:12))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:12)))
// CHECK: (region id:12 kind:bb ucfh:false ucft:false parent:19
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:11))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:11 kind:bb ucfh:false ucft:false parent:19
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:12))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:16 kind:loop ucfh:false ucft:false parent:15
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:19))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:4)
// CHECK-NEXT: (region id:17)
// CHECK-NEXT: (region id:9)
// CHECK-NEXT: (region id:10)
// CHECK-NEXT: (region id:14))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:10))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:10)))
// CHECK: (region id:14 kind:bb ucfh:true ucft:true parent:16
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:10 kind:bb ucfh:false ucft:false parent:16
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:9 kind:bb ucfh:false ucft:false parent:16
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:10))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:17 kind:loop ucfh:true ucft:true parent:16
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:5)
// CHECK-NEXT: (region id:18)
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:8)))
// CHECK: (region id:8 kind:bb ucfh:false ucft:false parent:17
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:18))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:18 kind:loop ucfh:false ucft:false parent:17
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:6)
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:7)))
// CHECK: (region id:7 kind:bb ucfh:false ucft:false parent:18
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:6 kind:bb ucfh:false ucft:false parent:18
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:5 kind:bb ucfh:true ucft:true parent:17
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:18))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:16
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:17))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:3 kind:bb ucfh:true ucft:true parent:16
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:17))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4)
// CHECK-NEXT: (region id:9)
// CHECK-NEXT: (region id:14))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:2 kind:bb ucfh:true ucft:true parent:16
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:14))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:16
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:17))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:15
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:16))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
sil @multiple_level_natural_loop_with_irreducible_loop_sandwich : $@convention(thin) () -> () {
bb0:
br bb6
bb6:
cond_br undef, bb1, bb3
bb1:
br bb2
bb2:
switch_enum undef : $ManyCase, case #ManyCase.One!enumelt: bbcase1, case #ManyCase.Two!enumelt: bbcase2, case #ManyCase.Three!enumelt: bbcase3
bbcase1:
br bb1
bbcase2:
br bb5
bbcase3:
br bb3
bb3:
cond_br undef, bb2, bb10
bb5:
cond_br undef, bb6, bb7
bb7:
br bb8
bb8:
cond_br undef, bb7, bb9
bb9:
%9999 = tuple()
return %9999 : $()
bb10:
br bb11
bb11:
cond_br undef, bb10, bb12
bb12:
br bb3
}
// CHECK-LABEL: @unreachable_bb_in_loop@
// CHECK: (region id:5 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:6)
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:5
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:3 kind:bb ucfh:false ucft:false parent:5
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:6 kind:loop ucfh:false ucft:false parent:5
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:2)))
// CHECK: (region id:2 kind:bb ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:1))
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:5
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
sil @unreachable_bb_in_loop : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
cond_br undef, bb2, bb3
bb2:
unreachable
bb3:
cond_br undef, bb1, bb4
bb4:
return undef : $()
}
// CHECK-LABEL: @unreachable_bb_in_inner_loop@
// CHECK: (region id:7 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:8)
// CHECK-NEXT: (region id:5)
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:6 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:5 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:8 kind:loop ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:5)
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:9)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:4)
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:4)))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:8
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:9 kind:loop ucfh:false ucft:false parent:8
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:1))
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:3)))
// CHECK: (region id:3 kind:bb ucfh:false ucft:false parent:9
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:1))
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:2 kind:bb ucfh:false ucft:false parent:9
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:8
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
sil @unreachable_bb_in_inner_loop : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
br bb2
bb2:
cond_br undef, bb3, bb4
bb3:
unreachable
bb4:
cond_br undef, bb2, bb5
bb5:
cond_br undef, bb1, bb6
bb6:
return undef : $()
}
// CHECK-LABEL: @unreachable_bb_in_inner_loop_with_multiple_edges@
// CHECK: (region id:13 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:14)
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:6)
// CHECK-NEXT: (region id:9)
// CHECK-NEXT: (region id:11)
// CHECK-NEXT: (region id:12))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:12 kind:bb ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:6)
// CHECK-NEXT: (region id:11))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:11 kind:bb ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:14))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:12))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:9 kind:bb ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:14))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:6 kind:bb ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:14))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:12))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:3 kind:bb ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:14))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:12))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:14 kind:loop ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:6)
// CHECK-NEXT: (region id:9)
// CHECK-NEXT: (region id:11))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:15)
// CHECK-NEXT: (region id:7)
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:8)
// CHECK-NEXT: (region id:15))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:8)))
// CHECK: (region id:8 kind:bb ucfh:false ucft:false parent:14
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:7 kind:bb ucfh:false ucft:false parent:14
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:15))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:15 kind:loop ucfh:false ucft:false parent:14
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:4)
// CHECK-NEXT: (region id:5)
// CHECK-NEXT: (region id:10))
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:1)
// CHECK-NEXT: (parentindex:2)
// CHECK-NEXT: (parentindex:3))
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:10)))
// CHECK: (region id:10 kind:bb ucfh:false ucft:false parent:15
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:5 kind:bb ucfh:false ucft:false parent:15
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:10))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:2)
// CHECK-NEXT: (parentindex:3))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:15
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:2 kind:bb ucfh:false ucft:false parent:15
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0)
// CHECK-NEXT: (parentindex:1))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:14
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:15))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:14))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
sil @unreachable_bb_in_inner_loop_with_multiple_edges : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
br bb2
bb2:
switch_enum undef : $ManyCase, case #ManyCase.One!enumelt: bbcase1, case #ManyCase.Two!enumelt: bbcase2, case #ManyCase.Three!enumelt: bbcase3
bbcase1:
br bb3
bbcase2:
br bb4
bbcase3:
br bb3
bb3:
unreachable
bb4:
switch_enum undef : $ManyCase, case #ManyCase.One!enumelt: bbcase41, case #ManyCase.Two!enumelt: bbcase42, case #ManyCase.Three!enumelt: bbcase43
bbcase41:
br bb2
bbcase42:
br bb5
bbcase43:
br bb3
bb5:
cond_br undef, bb1, bb6
bb6:
return undef : $()
}
// CHECK-LABEL: @noreturn_bb_in_loop@
// CHECK: (region id:5 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:6)
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:5
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:3 kind:bb ucfh:false ucft:false parent:5
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:6 kind:loop ucfh:false ucft:false parent:5
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:2))
// CHECK: (region id:2 kind:bb ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:1))
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:5
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
sil @noreturn_bb_in_loop : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
cond_br undef, bb2, bb3
bb2:
%0 = function_ref @no_return_func : $@convention(thin) () -> Never
apply %0() : $@convention(thin) () -> Never
unreachable
bb3:
cond_br undef, bb1, bb4
bb4:
return undef : $()
}
// CHECK-LABEL: @noreturn_bb_in_three_level_loop@
// CHECK: (region id:10 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:11)
// CHECK-NEXT: (region id:5)
// CHECK-NEXT: (region id:13)
// CHECK-NEXT: (region id:8)
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:9 kind:bb ucfh:false ucft:false parent:10
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:11))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:8 kind:bb ucfh:false ucft:false parent:10
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:13))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:13 kind:loop ucfh:false ucft:false parent:10
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:11))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:6)
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:7))
// CHECK: (region id:7 kind:bb ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:6 kind:bb ucfh:false ucft:false parent:13
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:5 kind:bb ucfh:false ucft:false parent:10
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:11))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:11 kind:loop ucfh:false ucft:false parent:10
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:5)
// CHECK-NEXT: (region id:9)
// CHECK-NEXT: (region id:13))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:12)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:4)
// CHECK-NEXT: (region id:12))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:11
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:12))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:1))
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:12 kind:loop ucfh:false ucft:false parent:11
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:2))
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:3))
// CHECK: (region id:3 kind:bb ucfh:false ucft:false parent:12
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:1))
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:2 kind:bb ucfh:false ucft:false parent:12
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:11
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:12))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:10
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:11))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
sil @noreturn_bb_in_three_level_loop : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
cond_br undef, bb2, bb3
bb2:
apply undef() : $@convention(thin) () -> Never
unreachable
bb3:
cond_br undef, bb4, bb5
bb4:
br bb8
bb5:
cond_br undef, bb3, bb6
bb6:
cond_br undef, bb1, bb7
bb7:
return undef : $()
bb8:
cond_br undef, bb4, bb9
bb9:
apply undef() : $@convention(thin) () -> Never
unreachable
}
// Make sure we do not crash in these cases.
// CHECK-LABEL: @bb_with_unreachable_predecessor@
sil @bb_with_unreachable_predecessor : $@convention(thin) () -> () {
bb0:
br bb2
bb1:
br bb2
bb2:
return undef : $()
}
// CHECK-LABEL: @self_loop_with_unreachable_predecessor@
sil @self_loop_with_unreachable_predecessor : $@convention(thin) () -> () {
bb0:
br bb2
bb1:
br bb2
bb2:
cond_br undef, bb2, bb3
bb3:
return undef : $()
}
// CHECK-LABEL: @multibb_loop_with_unreachable_predecessor@
sil @multibb_loop_with_unreachable_predecessor : $@convention(thin) () -> () {
bb0:
br bb2
bb1:
br bb2
bb2:
br bb3
bb3:
cond_br undef, bb3, bb4
bb4:
return undef : $()
}
// CHECK-LABEL: @exit_block_that_is_a_loop@
// CHECK: (region id:5 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:6)
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:3 kind:bb ucfh:false ucft:false parent:5
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:6 kind:loop ucfh:false ucft:false parent:5
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:7)))
// CHECK: (region id:7 kind:loop ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:4)))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:2 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:5
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
sil @exit_block_that_is_a_loop : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
br bb2
bb2:
cond_br undef, bb3, bb4
bb3:
cond_br undef, bb1, bb2
bb4:
return undef : $()
}
// This is the double backedge loop case.
//
// CHECK-LABEL: @multiple_exit_blocks_that_are_loops@
// CHECK: (region id:15 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:16)
// CHECK-NEXT: (region id:4)
// CHECK-NEXT: (region id:5)
// CHECK-NEXT: (region id:10)
// CHECK-NEXT: (region id:11)
// CHECK-NEXT: (region id:12))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:12 kind:bb ucfh:false ucft:false parent:15
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:5)
// CHECK-NEXT: (region id:11))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:11 kind:bb ucfh:false ucft:false parent:15
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:10))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:12))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:10 kind:bb ucfh:false ucft:false parent:15
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:16))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:11))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:5 kind:bb ucfh:false ucft:false parent:15
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:12))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:15
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:16))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:16 kind:loop ucfh:true ucft:false parent:15
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4)
// CHECK-NEXT: (region id:10))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:17)
// CHECK-NEXT: (region id:7)
// CHECK-NEXT: (region id:18)
// CHECK-NEXT: (region id:14))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:17)
// CHECK-NEXT: (region id:18))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:7)
// CHECK-NEXT: (region id:14)))
// CHECK: (region id:14 kind:bb ucfh:false ucft:true parent:16
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:18))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:18 kind:loop ucfh:false ucft:false parent:16
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:14))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:8)
// CHECK-NEXT: (region id:9)
// CHECK-NEXT: (region id:13))
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:1))
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:13)))
// CHECK: (region id:13 kind:bb ucfh:false ucft:false parent:18
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:9 kind:bb ucfh:false ucft:false parent:18
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:13))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0)
// CHECK-NEXT: (parentindex:1))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:8 kind:bb ucfh:false ucft:false parent:18
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:7 kind:bb ucfh:false ucft:true parent:16
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:17))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:17 kind:loop ucfh:false ucft:false parent:16
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:6)))
// CHECK: (region id:6 kind:bb ucfh:false ucft:false parent:17
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:3 kind:bb ucfh:false ucft:false parent:17
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0)
// CHECK-NEXT: (parentindex:1))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:2 kind:bb ucfh:false ucft:false parent:17
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:1 kind:bb ucfh:true ucft:false parent:16
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:17)
// CHECK-NEXT: (region id:18))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:15
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:16))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
sil @multiple_exit_blocks_that_are_loops : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
cond_br undef, bb2, bb4
bb2:
br bb3
bb3:
switch_enum undef : $ManyCase, case #ManyCase.One!enumelt: bbcase1, case #ManyCase.Two!enumelt: bbcase2, case #ManyCase.Three!enumelt: bbcase3
bbcase1:
br bb1
bbcase2:
br bb2
bbcase3:
br bb6
bb4:
br bb5
bb5:
switch_enum undef : $ManyCase, case #ManyCase.One!enumelt: bbcase51, case #ManyCase.Two!enumelt: bbcase52, case #ManyCase.Three!enumelt: bbcase53
bbcase51:
br bb1
bbcase52:
br bb4
bbcase53:
br bb7
bb6:
br bb8
bb7:
br bb8
bb8:
return undef : $()
}
// CHECK-LABEL: @loop_with_multiple_early_exit@
// CHECK: (region id:6 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:7)
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:5 kind:bb ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:7 kind:loop ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:4)))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:3 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:2 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
sil @loop_with_multiple_early_exit : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
br bb2
bb2:
cond_br undef, bb3, bb5
bb3:
cond_br undef, bb4, bb5
bb4:
cond_br undef, bb1, bb5
bb5:
return undef : $()
}
// Test one early exit from an inner loop. I.e.:
//
// ---> BB5 (return)
// /
// BB0 -> BB1 -> BB2 -> BB3 -> BB4
// ^ ^ | |
// | \----/ |
// \ |
// \-----------------/
//
// CHECK-LABEL: @loop_with_one_early_exit_from_inner_loop@
// CHECK: (region id:6 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:7)
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:3 kind:bb ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:7 kind:loop ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:8)
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:5)))
// CHECK: (region id:5 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:8 kind:loop ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:4)))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:8
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:1))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:2 kind:bb ucfh:false ucft:false parent:8
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:6
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:7))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (backedge-regs))
sil @loop_with_one_early_exit_from_inner_loop : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
br bb2
bb2:
cond_br undef, bb3, bb5
bb3:
cond_br undef, bb2, bb4
bb4:
br bb1
bb5:
return undef : $()
}
// CHECK-LABEL: @loop_with_multiple_early_exit_from_inner_loop@
// CHECK: (region id:7 kind:func ucfh:false ucft:false
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:0)
// CHECK-NEXT: (region id:8)
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:6 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:8 kind:loop ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:0))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:6))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:1)
// CHECK-NEXT: (region id:9)
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:5)
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:5)))
// CHECK: (region id:5 kind:bb ucfh:false ucft:false parent:8
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:9 kind:loop ucfh:false ucft:false parent:8
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:1))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:5))
// CHECK-NEXT: (subregs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs
// CHECK-NEXT: (region id:2)
// CHECK-NEXT: (region id:3)
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (backedge-regs
// CHECK-NEXT: (region id:4)))
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:9
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (succs)
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:1))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:3 kind:bb ucfh:false ucft:false parent:9
// CHECK-NEXT: (preds
// CHECK-NEXT: (region id:2))
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:4))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:2 kind:bb ucfh:false ucft:false parent:9
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:3))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs
// CHECK-NEXT: (parentindex:0))
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:8
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:9))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:7
// CHECK-NEXT: (preds)
// CHECK-NEXT: (succs
// CHECK-NEXT: (region id:8))
// CHECK-NEXT: (subregs)
// CHECK-NEXT: (non-local-succs)
// CHECK-NEXT: (exiting-subregs)
// CHECK-NEXT: (backedge-regs))
sil @loop_with_multiple_early_exit_from_inner_loop : $@convention(thin) () -> () {
bb0:
br bb1
bb1:
br bb2
bb2:
cond_br undef, bb3, bb6
bb3:
cond_br undef, bb4, bb6
bb4:
cond_br undef, bb2, bb5
bb5:
cond_br undef, bb1, bb6
bb6:
return undef : $()
}