// 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 : $() }