@@ -10,44 +10,96 @@ public class Base {
1010 public init ( ) { }
1111 public func foo( ) { }
1212}
13+
14+ @_optimize ( none)
15+ func blackHole< T : AnyObject > ( _: T ) { }
16+
1317class Sub1 : Base {
14- override func foo( ) { }
18+ override func foo( ) { blackHole ( self ) }
1519}
1620class Sub2 : Base {
17- override func foo( ) { }
21+ override func foo( ) { blackHole ( self ) }
1822}
1923class Sub3 : Base {
20- override func foo( ) { }
24+ override func foo( ) { blackHole ( self ) }
2125}
2226class Sub4 : Base {
23- override func foo( ) { }
27+ override func foo( ) { blackHole ( self ) }
2428}
2529class Sub5 : Base {
26- override func foo( ) { }
30+ override func foo( ) { blackHole ( self ) }
2731}
2832class Sub6 : Base {
29- override func foo( ) { }
33+ override func foo( ) { blackHole ( self ) }
3034}
3135class Sub7 : Base {
32- override func foo( ) { }
36+ override func foo( ) { blackHole ( self ) }
3337}
3438// CHECK: @$s16devirt_speculate28testMaxNumSpeculativeTargetsyyAA4BaseCF
35- // CHECK: checked_cast_br [exact] %0 : $Base to Base
36- // CHECK: checked_cast_br [exact] %0 : $Base to Sub1
37- // CHECK: checked_cast_br [exact] %0 : $Base to Sub2
38- // CHECK: checked_cast_br [exact] %0 : $Base to Sub3
39- // CHECK: checked_cast_br [exact] %0 : $Base to Sub4
40- // CHECK: checked_cast_br [exact] %0 : $Base to Sub5
41- // CHECK: checked_cast_br [exact] %0 : $Base to Sub6
39+ // CHECK: bb0(%0 : $Base):
40+ // CHECK: checked_cast_br [exact] %0 : $Base to Base, bb2, bb3
41+
42+ // CHECK: bb2([[CASTED:%.*]]):
43+ // CHECK: br bb1
44+
45+ // CHECK: bb3:
46+ // CHECK: checked_cast_br [exact] %0 : $Base to Sub1, bb4, bb5
47+
48+ // CHECK: bb4([[CASTED:%.*]] : $Sub1):
49+ // CHECK: [[FN:%.*]] = function_ref @$s16devirt_speculate9blackHoleyyxRlzClF : $@convention(thin) <τ_0_0 where τ_0_0 : AnyObject> (@guaranteed τ_0_0) -> ()
50+ // CHECK: apply [[FN]]<Sub1>([[CASTED]])
51+ // CHECK: br bb1
52+
53+ // CHECK: bb5:
54+ // CHECK: checked_cast_br [exact] %0 : $Base to Sub2, bb6, bb7
55+
56+ // CHECK: bb6([[CASTED:%.*]] : $Sub2):
57+ // CHECK: [[FN:%.*]] = function_ref @$s16devirt_speculate9blackHoleyyxRlzClF : $@convention(thin) <τ_0_0 where τ_0_0 : AnyObject> (@guaranteed τ_0_0) -> ()
58+ // CHECK: apply [[FN]]<Sub2>([[CASTED]])
59+ // CHECK: br bb1
60+
61+ // CHECK: bb7:
62+ // CHECK: checked_cast_br [exact] %0 : $Base to Sub3, bb8, bb9
63+
64+ // CHECK: bb8([[CASTED:%.*]] : $Sub3):
65+ // CHECK: [[FN:%.*]] = function_ref @$s16devirt_speculate9blackHoleyyxRlzClF : $@convention(thin) <τ_0_0 where τ_0_0 : AnyObject> (@guaranteed τ_0_0) -> ()
66+ // CHECK: apply [[FN]]<Sub3>([[CASTED]])
67+ // CHECK: br bb1
68+
69+ // CHECK: bb9:
70+ // CHECK: checked_cast_br [exact] %0 : $Base to Sub4, bb10, bb11
71+
72+ // CHECK: bb10([[CASTED:%.*]] : $Sub4):
73+ // CHECK: [[FN:%.*]] = function_ref @$s16devirt_speculate9blackHoleyyxRlzClF : $@convention(thin) <τ_0_0 where τ_0_0 : AnyObject> (@guaranteed τ_0_0) -> ()
74+ // CHECK: apply [[FN]]<Sub4>([[CASTED]])
75+ // CHECK: br bb1
76+
77+ // CHECK: bb11:
78+ // CHECK: checked_cast_br [exact] %0 : $Base to Sub5, bb12, bb13
79+
80+ // CHECK: bb12([[CASTED:%.*]] : $Sub5):
81+ // CHECK: [[FN:%.*]] = function_ref @$s16devirt_speculate9blackHoleyyxRlzClF : $@convention(thin) <τ_0_0 where τ_0_0 : AnyObject> (@guaranteed τ_0_0) -> ()
82+ // CHECK: apply [[FN]]<Sub5>([[CASTED]])
83+ // CHECK: br bb1
84+
85+ // CHECK: bb13:
86+ // CHECK: checked_cast_br [exact] %0 : $Base to Sub6, bb14, bb15
87+
88+ // CHECK: bb14([[CASTED:%.*]] : $Sub6):
89+ // CHECK: [[FN:%.*]] = function_ref @$s16devirt_speculate9blackHoleyyxRlzClF : $@convention(thin) <τ_0_0 where τ_0_0 : AnyObject> (@guaranteed τ_0_0) -> ()
90+ // CHECK: apply [[FN]]<Sub6>([[CASTED]])
91+ // CHECK: br bb1
92+
93+ // CHECK: bb15:
4294// CHECK-NOT: checked_cast_br
43- // CHECK: %[[CM:[0-9]+]] = class_method %0 : $Base, #Base.foo!1 : (Base) -> () -> (), $@convention(method) (@guaranteed Base) -> ()
44- // CHECK: apply %[[CM]](%0) : $@convention(method) (@guaranteed Base) -> ()
95+ // CHECK: %[[CM:[0-9]+]] = class_method %0 : $Base, #Base.foo!1 : (Base) -> () -> (), $@convention(method) (@guaranteed Base) -> ()
96+ // CHECK: apply %[[CM]](%0) : $@convention(method) (@guaranteed Base) -> ()
4597
4698// YAML: Pass: sil-speculative-devirtualizer
4799// YAML-NEXT: Name: sil.PartialSpecDevirt
48100// YAML-NEXT: DebugLoc:
49101// YAML-NEXT: File: {{.*}}/devirt_speculate.swift
50- // YAML-NEXT: Line: 66
102+ // YAML-NEXT: Line: 118
51103// YAML-NEXT: Column: 5
52104// YAML-NEXT: Function: 'testMaxNumSpeculativeTargets(_:)'
53105// YAML-NEXT: Args:
0 commit comments