mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
216 lines
5.1 KiB
Plaintext
216 lines
5.1 KiB
Plaintext
// RUN: %empty-directory(%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=1
|
|
// CHECK-NEXT: bb1: length=3+0, d-entry=1, d-exit=3
|
|
// CHECK-NEXT: bb2: length=0+0, d-entry=1, d-exit=0
|
|
// CHECK-NEXT: bb3: length=0+0, d-entry=1, 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=0+0, d-entry=0, d-exit=33
|
|
// CHECK-NEXT: bb1: length=3+30, d-entry=0, d-exit=33
|
|
// CHECK-NEXT: bb2: length=0+0, d-entry=33, d-exit=33
|
|
// CHECK-NEXT: bb3: length=0+0, d-entry=33, 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, bb2, bb3
|
|
|
|
bb2:
|
|
br bb1
|
|
|
|
bb3:
|
|
%4 = tuple ()
|
|
return %4 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: SPA @test_loop_with_bypass_edge
|
|
// CHECK-NEXT: bb0: length=1+0, d-entry=0, d-exit=1
|
|
// CHECK-NEXT: bb1: length=0+0, d-entry=1, d-exit=33
|
|
// CHECK-NEXT: bb2: length=3+30, d-entry=1, d-exit=33
|
|
// CHECK-NEXT: bb3: length=0+0, d-entry=34, d-exit=33
|
|
// CHECK-NEXT: bb4: length=0+0, d-entry=34, d-exit=0
|
|
// CHECK-NEXT: bb5: length=0+0, d-entry=1, d-exit=0
|
|
// CHECK-NEXT: bb6: length=0+0, d-entry=1, 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, bb5
|
|
|
|
bb1:
|
|
br bb2
|
|
|
|
bb2:
|
|
%c1 = builtin "assert_configuration"() : $Builtin.Int32
|
|
%c2 = builtin "assert_configuration"() : $Builtin.Int32
|
|
cond_br undef, bb3, bb4
|
|
|
|
bb3:
|
|
br bb2
|
|
|
|
bb4:
|
|
br bb6
|
|
|
|
bb5:
|
|
br bb6
|
|
|
|
bb6:
|
|
%4 = tuple ()
|
|
return %4 : $()
|
|
}
|
|
|
|
|
|
|
|
// CHECK-LABEL: SPA @test_nested_loops
|
|
// CHECK-NEXT: bb0: length=1+0, d-entry=0, d-exit=1
|
|
// CHECK-NEXT: bb1: length=0+0, d-entry=1, d-exit=44
|
|
// CHECK-NEXT: bb2: length=1+40, d-entry=1, d-exit=44
|
|
// CHECK-NEXT: bb3: length=0+0, d-entry=42, d-exit=4
|
|
// CHECK-NEXT: bb4: length=3+0, d-entry=42, d-exit=4
|
|
// CHECK-NEXT: bb5: length=0+0, d-entry=45, d-exit=4
|
|
// CHECK-NEXT: bb6: length=0+0, d-entry=45, d-exit=1
|
|
// CHECK-NEXT: bb7: length=2+0, d-entry=42, d-exit=3
|
|
// CHECK-NEXT: bb8: length=1+0, d-entry=44, d-exit=1
|
|
// CHECK-NEXT: bb9: length=0+0, d-entry=45, d-exit=44
|
|
// CHECK-NEXT: bb10: length=0+0, d-entry=45, d-exit=0
|
|
// CHECK-NEXT: bb11: length=0+0, d-entry=1, d-exit=0
|
|
// CHECK-NEXT: bb12: length=0+0, d-entry=1, d-exit=0
|
|
// CHECK-NEXT: Loop bb2:
|
|
// CHECK-NEXT: bb2: length=1+0, d-entry=0, d-exit=4
|
|
// CHECK-NEXT: bb7: length=2+0, d-entry=1, d-exit=3
|
|
// CHECK-NEXT: bb3: length=0+0, d-entry=1, d-exit=3
|
|
// CHECK-NEXT: bb4: length=3+30, d-entry=1, d-exit=34
|
|
// CHECK-NEXT: bb6: length=0+0, d-entry=34, d-exit=1
|
|
// CHECK-NEXT: bb8: length=1+0, d-entry=3, d-exit=1
|
|
// CHECK-NEXT: bb9: length=0+0, d-entry=4, d-exit=0
|
|
// CHECK-NEXT: bb5: length=0+0, d-entry=34, d-exit=34
|
|
// CHECK-NEXT: Loop bb4:
|
|
// CHECK-NEXT: bb4: length=3+0, d-entry=0, d-exit=3
|
|
// CHECK-NEXT: bb5: length=0+0, d-entry=3, d-exit=0
|
|
|
|
sil @test_nested_loops : $@convention(thin) () -> () {
|
|
bb0:
|
|
cond_br undef, bb1, bb11
|
|
|
|
bb1:
|
|
br bb2
|
|
|
|
bb2:
|
|
cond_br undef, bb3, bb7
|
|
|
|
bb3:
|
|
br bb4
|
|
|
|
bb4:
|
|
%c1 = builtin "assert_configuration"() : $Builtin.Int32
|
|
%c2 = builtin "assert_configuration"() : $Builtin.Int32
|
|
cond_br undef, bb5, bb6
|
|
|
|
bb5:
|
|
br bb4
|
|
|
|
bb6:
|
|
br bb8
|
|
|
|
bb7:
|
|
%c3 = builtin "assert_configuration"() : $Builtin.Int32
|
|
br bb8
|
|
|
|
bb8:
|
|
cond_br undef, bb9, bb10
|
|
|
|
bb9:
|
|
br bb2
|
|
|
|
bb10:
|
|
br bb12
|
|
|
|
bb11:
|
|
br bb12
|
|
|
|
bb12:
|
|
%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=0+0, d-entry=0, d-exit=132
|
|
// CHECK-NEXT: bb1: length=12+120, d-entry=0, d-exit=132
|
|
// CHECK-NEXT: bb2: length=0+0, d-entry=132, d-exit=132
|
|
// CHECK-NEXT: bb3: length=0+0, d-entry=132, 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, bb2, bb3
|
|
|
|
bb2:
|
|
br bb1
|
|
|
|
bb3:
|
|
%4 = tuple ()
|
|
return %4 : $()
|
|
}
|