| // RUN: rm -rf %t && mkdir -p %t |
| // RUN: %target-sil-opt %s -inline -print-shortest-path-info 2>%t/log >/dev/null |
| // RUN: %FileCheck %s <%t/log |
| // REQUIRES: asserts |
| |
| sil_stage canonical |
| |
| import Builtin |
| |
| |
| // CHECK-LABEL: SPA @test_simple |
| // CHECK-NEXT: bb0: length=1+0, d-entry=0, d-exit=1 |
| |
| sil @test_simple : $@convention(thin) () -> () { |
| bb0: |
| %c1 = builtin "assert_configuration"() : $Builtin.Int32 |
| %4 = tuple () |
| return %4 : $() |
| } |
| |
| // CHECK-LABEL: SPA @test_if_then_else |
| // CHECK-NEXT: bb0: length=1+0, d-entry=0, d-exit=2 |
| // CHECK-NEXT: bb1: length=3+0, d-entry=1, d-exit=3 |
| // CHECK-NEXT: bb2: length=1+0, d-entry=1, d-exit=1 |
| // CHECK-NEXT: bb3: length=0+0, d-entry=2, d-exit=0 |
| |
| sil @test_if_then_else : $@convention(thin) () -> () { |
| bb0: |
| cond_br undef, bb1, bb2 |
| |
| bb1: |
| %c1 = builtin "assert_configuration"() : $Builtin.Int32 |
| %c2 = builtin "assert_configuration"() : $Builtin.Int32 |
| br bb3 |
| |
| bb2: |
| br bb3 |
| |
| bb3: |
| %4 = tuple () |
| return %4 : $() |
| } |
| |
| // CHECK-LABEL: SPA @test_simple_loop |
| // CHECK-NEXT: bb0: length=1+0, d-entry=0, d-exit=34 |
| // CHECK-NEXT: bb1: length=3+30, d-entry=1, d-exit=33 |
| // CHECK-NEXT: bb2: length=0+0, d-entry=34, d-exit=0 |
| // CHECK-NEXT: Loop bb1: |
| // CHECK-NEXT: bb1: length=3+0, d-entry=0, d-exit=3 |
| |
| sil @test_simple_loop : $@convention(thin) () -> () { |
| bb0: |
| br bb1 |
| |
| bb1: |
| %c1 = builtin "assert_configuration"() : $Builtin.Int32 |
| %c2 = builtin "assert_configuration"() : $Builtin.Int32 |
| cond_br undef, bb1, bb2 |
| |
| bb2: |
| %4 = tuple () |
| return %4 : $() |
| } |
| |
| // CHECK-LABEL: SPA @test_loop_with_bypass_edge |
| // CHECK-NEXT: bb0: length=1+30, d-entry=0, d-exit=31 |
| // CHECK-NEXT: bb1: length=1+0, d-entry=31, d-exit=5 |
| // CHECK-NEXT: bb2: length=3+0, d-entry=32, d-exit=4 |
| // CHECK-NEXT: bb3: length=1+0, d-entry=35, d-exit=1 |
| // CHECK-NEXT: bb4: length=0+0, d-entry=31, d-exit=0 |
| // CHECK-NEXT: Loop bb2: |
| // CHECK-NEXT: bb2: length=3+0, d-entry=0, d-exit=3 |
| |
| sil @test_loop_with_bypass_edge : $@convention(thin) () -> () { |
| bb0: |
| cond_br undef, bb1, bb4 |
| |
| bb1: |
| br bb2 |
| |
| bb2: |
| %c1 = builtin "assert_configuration"() : $Builtin.Int32 |
| %c2 = builtin "assert_configuration"() : $Builtin.Int32 |
| cond_br undef, bb2, bb3 |
| |
| bb3: |
| br bb4 |
| |
| bb4: |
| %4 = tuple () |
| return %4 : $() |
| } |
| |
| // CHECK-LABEL: SPA @test_nested_loops |
| // CHECK-NEXT: bb0: length=1+40, d-entry=0, d-exit=41 |
| // CHECK-NEXT: bb1: length=1+0, d-entry=41, d-exit=6 |
| // CHECK-NEXT: bb2: length=1+0, d-entry=42, d-exit=5 |
| // CHECK-NEXT: bb3: length=3+0, d-entry=43, d-exit=5 |
| // CHECK-NEXT: bb4: length=2+0, d-entry=43, d-exit=4 |
| // CHECK-NEXT: bb5: length=1+0, d-entry=45, d-exit=2 |
| // CHECK-NEXT: bb6: length=1+0, d-entry=46, d-exit=1 |
| // CHECK-NEXT: bb7: length=0+0, d-entry=41, d-exit=0 |
| // CHECK-NEXT: Loop bb2: |
| // CHECK-NEXT: bb2: length=1+0, d-entry=0, d-exit=4 |
| // CHECK-NEXT: bb4: length=2+0, d-entry=1, d-exit=3 |
| // CHECK-NEXT: bb3: length=3+30, d-entry=1, d-exit=34 |
| // CHECK-NEXT: bb5: length=1+0, d-entry=3, d-exit=1 |
| // CHECK-NEXT: Loop bb3: |
| // CHECK-NEXT: bb3: length=3+0, d-entry=0, d-exit=3 |
| |
| sil @test_nested_loops : $@convention(thin) () -> () { |
| bb0: |
| cond_br undef, bb1, bb7 |
| |
| bb1: |
| br bb2 |
| |
| bb2: |
| cond_br undef, bb3, bb4 |
| |
| bb3: |
| %c1 = builtin "assert_configuration"() : $Builtin.Int32 |
| %c2 = builtin "assert_configuration"() : $Builtin.Int32 |
| cond_br undef, bb3, bb5 |
| |
| bb4: |
| %c3 = builtin "assert_configuration"() : $Builtin.Int32 |
| br bb5 |
| |
| bb5: |
| cond_br undef, bb2, bb6 |
| |
| bb6: |
| br bb7 |
| |
| bb7: |
| %4 = tuple () |
| return %4 : $() |
| } |
| |
| // CHECK-LABEL: SPA @noreturn_func |
| // CHECK-NEXT: bb0: length=0+0, d-entry=0, d-exit=536870912 |
| sil @noreturn_func : $@convention(thin) () -> () { |
| bb0: |
| unreachable |
| } |
| |
| // CHECK-LABEL: SPA @test_call_of_noreturn_in_loop |
| // CHECK-NEXT: bb0: length=1+0, d-entry=0, d-exit=133 |
| // CHECK-NEXT: bb1: length=12+120, d-entry=1, d-exit=132 |
| // CHECK-NEXT: bb2: length=0+0, d-entry=133, d-exit=0 |
| // CHECK-NEXT: Loop bb1: |
| // CHECK-NEXT: bb1: length=12+0, d-entry=0, d-exit=12 |
| sil @test_call_of_noreturn_in_loop : $@convention(thin) () -> () { |
| bb0: |
| br bb1 |
| |
| bb1: |
| %f = function_ref @noreturn_func : $@convention(thin) () -> () |
| %a = apply %f() : $@convention(thin) () -> () |
| %c1 = builtin "assert_configuration"() : $Builtin.Int32 |
| cond_br undef, bb1, bb2 |
| |
| bb2: |
| %4 = tuple () |
| return %4 : $() |
| } |