mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
3731 lines
116 KiB
Plaintext
3731 lines
116 KiB
Plaintext
// 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: Start @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))
|
|
// CHECK: End @one_natural_self_loop@
|
|
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: Start @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))
|
|
// CHECK: End @one_natural_loop@
|
|
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: Start @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))
|
|
// CHECK: End @one_natural_loop_with_diamond@
|
|
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: Start @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))
|
|
// CHECK: End @one_natural_loop_multiple_backedges@
|
|
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: Start @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))
|
|
// CHECK: End @inner_natural_loop_with_multiple_backedges@
|
|
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: Start @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))
|
|
// CHECK: End @two_separate_natural_loops@
|
|
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: Start @two_separate_natural_loops_separated_by_diamond@
|
|
// CHECK: (region id:9 kind:func ucfh:false ucft:false
|
|
// CHECK: (preds)
|
|
// CHECK: (succs)
|
|
// CHECK: (subregs
|
|
// CHECK: (region id:0)
|
|
// CHECK: (region id:10)
|
|
// CHECK: (region id:3)
|
|
// CHECK: (region id:4)
|
|
// CHECK: (region id:11)
|
|
// CHECK: (region id:7))
|
|
// CHECK: (non-local-succs)
|
|
// CHECK: (exiting-subregs)
|
|
// CHECK: (backedge-regs))
|
|
// CHECK: (region id:7 kind:bb ucfh:false ucft:false parent:9
|
|
// CHECK: (preds
|
|
// CHECK: (region id:11))
|
|
// CHECK: (succs)
|
|
// CHECK: (subregs)
|
|
// CHECK: (non-local-succs)
|
|
// CHECK: (exiting-subregs)
|
|
// CHECK: (backedge-regs))
|
|
// CHECK: (region id:11 kind:loop ucfh:false ucft:false parent:9
|
|
// CHECK: (preds
|
|
// CHECK: (region id:3)
|
|
// CHECK: (region id:4))
|
|
// CHECK: (succs
|
|
// CHECK: (region id:7))
|
|
// CHECK: (subregs
|
|
// CHECK: (region id:5)
|
|
// CHECK: (region id:6))
|
|
// CHECK: (non-local-succs)
|
|
// CHECK: (exiting-subregs
|
|
// CHECK: (region id:6))
|
|
// CHECK: (backedge-regs
|
|
// CHECK: (region id:6)))
|
|
// CHECK: (region id:6 kind:bb ucfh:false ucft:false parent:11
|
|
// CHECK: (preds
|
|
// CHECK: (region id:5))
|
|
// CHECK: (succs)
|
|
// CHECK: (subregs)
|
|
// CHECK: (non-local-succs
|
|
// CHECK: (parentindex:0))
|
|
// CHECK: (exiting-subregs)
|
|
// CHECK: (backedge-regs))
|
|
// CHECK: (region id:5 kind:bb ucfh:false ucft:false parent:11
|
|
// CHECK: (preds)
|
|
// CHECK: (succs
|
|
// CHECK: (region id:6))
|
|
// CHECK: (subregs)
|
|
// CHECK: (non-local-succs)
|
|
// CHECK: (exiting-subregs)
|
|
// CHECK: (backedge-regs))
|
|
// CHECK: (region id:4 kind:bb ucfh:false ucft:false parent:9
|
|
// CHECK: (preds
|
|
// CHECK: (region id:10))
|
|
// CHECK: (succs
|
|
// CHECK: (region id:11))
|
|
// CHECK: (subregs)
|
|
// CHECK: (non-local-succs)
|
|
// CHECK: (exiting-subregs)
|
|
// CHECK: (backedge-regs))
|
|
// CHECK: (region id:3 kind:bb ucfh:false ucft:false parent:9
|
|
// CHECK: (preds
|
|
// CHECK: (region id:10))
|
|
// CHECK: (succs
|
|
// CHECK: (region id:11))
|
|
// CHECK: (subregs)
|
|
// CHECK: (non-local-succs)
|
|
// CHECK: (exiting-subregs)
|
|
// CHECK: (backedge-regs))
|
|
// CHECK: (region id:10 kind:loop ucfh:false ucft:false parent:9
|
|
// CHECK: (preds
|
|
// CHECK: (region id:0))
|
|
// CHECK: (succs
|
|
// CHECK: (region id:3)
|
|
// CHECK: (region id:4))
|
|
// CHECK: (subregs
|
|
// CHECK: (region id:1)
|
|
// CHECK: (region id:2)
|
|
// CHECK: (region id:8))
|
|
// CHECK: (non-local-succs)
|
|
// CHECK: (exiting-subregs
|
|
// CHECK: (region id:2))
|
|
// CHECK: (backedge-regs
|
|
// CHECK: (region id:8)))
|
|
// CHECK: (region id:8 kind:bb ucfh:false ucft:false parent:10
|
|
// CHECK: (preds
|
|
// CHECK: (region id:2))
|
|
// CHECK: (succs)
|
|
// CHECK: (subregs)
|
|
// CHECK: (non-local-succs)
|
|
// CHECK: (exiting-subregs)
|
|
// CHECK: (backedge-regs))
|
|
// CHECK: (region id:2 kind:bb ucfh:false ucft:false parent:10
|
|
// CHECK: (preds
|
|
// CHECK: (region id:1))
|
|
// CHECK: (succs
|
|
// CHECK: (region id:8))
|
|
// CHECK: (subregs)
|
|
// CHECK: (non-local-succs
|
|
// CHECK: (parentindex:0)
|
|
// CHECK: (parentindex:1))
|
|
// CHECK: (exiting-subregs)
|
|
// CHECK: (backedge-regs))
|
|
// CHECK: (region id:1 kind:bb ucfh:false ucft:false parent:10
|
|
// CHECK: (preds)
|
|
// CHECK: (succs
|
|
// CHECK: (region id:2))
|
|
// CHECK: (subregs)
|
|
// CHECK: (non-local-succs)
|
|
// CHECK: (exiting-subregs)
|
|
// CHECK: (backedge-regs))
|
|
// CHECK: (region id:0 kind:bb ucfh:false ucft:false parent:9
|
|
// CHECK: (preds)
|
|
// CHECK: (succs
|
|
// CHECK: (region id:10))
|
|
// CHECK: (subregs)
|
|
// CHECK: (non-local-succs)
|
|
// CHECK: (exiting-subregs)
|
|
// CHECK: (backedge-regs))
|
|
// CHECK: End @two_separate_natural_loops_separated_by_diamond@
|
|
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: Start @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))
|
|
// CHECK: End @two_separate_natural_loops_separated_by_diamond_with_loop@
|
|
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: Start @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))
|
|
// CHECK: End @three_separate_natural_loops@
|
|
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: Start @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))
|
|
// CHECK: End @two_level_natural_loop@
|
|
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: Start @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))
|
|
// CHECK: End @two_level_natural_loop_with_diamond_and_multiple_loop_exits@
|
|
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: Start @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))
|
|
// CHECK: End @three_level_natural_loop_with_inner_loop_in_diamond@
|
|
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: Start @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))
|
|
// CHECK: End @one_level_irreducible_loop@
|
|
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: Start @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))
|
|
// CHECK: End @natural_loop_containing_irreducible_loop@
|
|
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: Start @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))
|
|
// CHECK: End @two_natural_loop_one_with_irreducible_loop@
|
|
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: Start @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))
|
|
// CHECK: End @multiple_level_natural_loop_with_irreducible_loop_sandwich@
|
|
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: Start @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)
|
|
// CHECK: End @unreachable_bb_in_loop@
|
|
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: Start @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)
|
|
// CHECK: End @unreachable_bb_in_inner_loop@
|
|
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: Start @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))
|
|
// CHECK: End @unreachable_bb_in_inner_loop_with_multiple_edges@
|
|
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: Start @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)
|
|
// CHECK: End @noreturn_bb_in_loop@
|
|
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: Start @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)
|
|
// CHECK: End @noreturn_bb_in_three_level_loop@
|
|
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: Start @bb_with_unreachable_predecessor@
|
|
// CHECK: End @bb_with_unreachable_predecessor@
|
|
sil @bb_with_unreachable_predecessor : $@convention(thin) () -> () {
|
|
bb0:
|
|
br bb2
|
|
|
|
bb1:
|
|
br bb2
|
|
|
|
bb2:
|
|
return undef : $()
|
|
}
|
|
|
|
// CHECK-LABEL: Start @self_loop_with_unreachable_predecessor@
|
|
// CHECK: End @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: Start @multibb_loop_with_unreachable_predecessor@
|
|
// CHECK: End @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: Start @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)
|
|
// CHECK: End @exit_block_that_is_a_loop@
|
|
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: Start @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))
|
|
// CHECK: End @multiple_exit_blocks_that_are_loops@
|
|
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: Start @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))
|
|
// CHECK: End @loop_with_multiple_early_exit@
|
|
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: Start @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))
|
|
// CHECK: End @loop_with_one_early_exit_from_inner_loop@
|
|
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: Start @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))
|
|
// CHECK: End @loop_with_multiple_early_exit_from_inner_loop@
|
|
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 : $()
|
|
}
|