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