1
- // RUN: %target-swift-frontend -O -module-name devirt_default_case -disable-func-sig-opts - emit-sil %s | FileCheck -check-prefix=CHECK -check-prefix=CHECK-NORMAL %s
2
- // RUN: %target-swift-frontend -O -module-name devirt_default_case -disable-func-sig-opts - emit-sil -enable-testing %s | FileCheck -check-prefix=CHECK -check-prefix=CHECK-TESTABLE %s
1
+ // RUN: %target-swift-frontend -O -module-name devirt_default_case -emit-sil %s | FileCheck -check-prefix=CHECK -check-prefix=CHECK-NORMAL %s
2
+ // RUN: %target-swift-frontend -O -module-name devirt_default_case -emit-sil -enable-testing %s | FileCheck -check-prefix=CHECK -check-prefix=CHECK-TESTABLE %s
3
3
4
4
@_silgen_name ( " action " )
5
5
func action( n: Int ) -> ( )
@@ -41,8 +41,8 @@ private class Derived2 : Base2 {
41
41
// Check that call to Base2.middle can be devirtualized
42
42
//
43
43
// CHECK-LABEL: sil @_TF19devirt_default_case9callOuterFSiSi
44
- // CHECK: function_ref @_TFC19devirt_default_caseP33_77424841540E67CC820F5E5F7940DCB05Base25inner
45
- // CHECK: function_ref @_TFC19devirt_default_caseP33_77424841540E67CC820F5E5F7940DCB08Derived26middle
44
+ // CHECK: function_ref @{{.*}}TFC19devirt_default_caseP33_77424841540E67CC820F5E5F7940DCB05Base25inner
45
+ // CHECK: function_ref @{{.*}}TFC19devirt_default_caseP33_77424841540E67CC820F5E5F7940DCB08Derived26middle
46
46
// CHECK-NOT: class_method
47
47
// CHECK: return
48
48
public func callOuter( x: Int ) -> Int {
@@ -67,8 +67,8 @@ class Base3 {
67
67
// for testing.
68
68
//
69
69
// CHECK-LABEL: sil{{( hidden)?}} [noinline] @_TFC19devirt_default_case5Base35outer
70
- // CHECK: function_ref @_TFC19devirt_default_case5Base36middle
71
- // CHECK: function_ref @_TFC19devirt_default_caseP {{.*}}8Derived36middle
70
+ // CHECK: function_ref @{{.*}}TFC19devirt_default_case5Base36middle
71
+ // CHECK: function_ref @{{.*}}TFC19devirt_default_caseP {{.*}}8Derived36middle
72
72
// CHECK-NORMAL-NOT: class_method
73
73
// CHECK-TESTABLE: class_method %0 : $Base3, #Base3.middle!1
74
74
// CHECK: }
@@ -91,17 +91,6 @@ class C2 : A2 {}
91
91
class D2 : B2 { }
92
92
class E2 : C2 { }
93
93
94
- @inline ( never)
95
- func foo( a: A2 ) -> Int {
96
- // Check that call to A2.f() can be devirualized.
97
- //
98
- // CHECK-LABEL: sil{{( hidden)?}} [noinline] @_TF19devirt_default_case3fooFCS_2A2Si
99
- // CHECK: function_ref @_TFC19devirt_default_case2A21f
100
- // CHECK-NORMAL-NOT: class_method
101
- // CHECK-TESTABLE: class_method %0 : $A2, #A2.f!1
102
- // CHECK: }
103
- return a. f ( )
104
- }
105
94
106
95
public func testfoo1( ) -> Int {
107
96
return foo ( E2 ( ) )
@@ -120,8 +109,8 @@ func foo(a: A3) -> Int {
120
109
// Check that call to A3.f() can be devirualized.
121
110
//
122
111
// CHECK-LABEL: sil{{( hidden)?}} [noinline] @_TF19devirt_default_case3fooFCS_2A3Si
123
- // CHECK: function_ref @_TFC19devirt_default_case2B31f
124
- // CHECK: function_ref @_TFC19devirt_default_case2A31f
112
+ // CHECK: function_ref @{{.*}}TFC19devirt_default_case2B31f
113
+ // CHECK: function_ref @{{.*}}TFC19devirt_default_case2A31f
125
114
// CHECK-NORMAL-NOT: class_method
126
115
// CHECK-TESTABLE: class_method %0 : $A3, #A3.f!1
127
116
// CHECK: }
@@ -138,8 +127,8 @@ class Base4 {
138
127
// Check that call to foo() can be devirtualized
139
128
//
140
129
// CHECK-LABEL: sil{{( hidden)?}} [noinline] @_TFC19devirt_default_case5Base44test
141
- // CHECK: function_ref @_TFC19devirt_default_case5Base43foo
142
- // CHECK: function_ref @_TFC19devirt_default_case8Derived43foo
130
+ // CHECK: function_ref @{{.*}}TFC19devirt_default_case5Base43foo
131
+ // CHECK: function_ref @{{.*}}TFC19devirt_default_case8Derived43foo
143
132
// CHECK-NORMAL-NOT: class_method
144
133
// CHECK-TESTABLE: class_method %0 : $Base4, #Base4.foo!1
145
134
// CHECK: }
@@ -156,13 +145,6 @@ class Derived4 : Base4 {
156
145
public class Base5 {
157
146
@inline ( never)
158
147
public func test( ) {
159
- // Check that call to foo() does not use class_method, because
160
- // it is a final method.
161
- //
162
- // CHECK-LABEL: sil [noinline] @_TFC19devirt_default_case5Base54test
163
- // CHECK: function_ref @_TFC19devirt_default_case5Base53foo
164
- // CHECK-NOT: class_method
165
- // CHECK: }
166
148
foo ( )
167
149
}
168
150
@@ -200,28 +182,6 @@ public func test_check_static_class_devirt() -> Int {
200
182
class A7 { @inline ( never) func foo( ) -> Bool { return false } }
201
183
class B7 : A7 { @inline ( never) override func foo( ) -> Bool { return true } }
202
184
203
- // Check that it compiles without crashes and devirtualizes
204
- // calls to A7.foo and B7.foo
205
- //
206
- // CHECK-LABEL: sil{{( hidden)?}} [noinline] @_TF19devirt_default_case33check_call_on_downcasted_instanceFCS_2A7Sb
207
- // CHECK: checked_cast_br
208
- // CHECK-NOT: class_method
209
- // CHECK: unconditional_checked_cast
210
- // CHECK: function_ref @_TFC19devirt_default_case2B73foo
211
- // CHECK-NORMAL-NOT: class_method
212
- // CHECK-TESTABLE: class_method %{{[0-9]+}} : $B7, #B7.foo!1
213
- // CHECK: function_ref @_TFC19devirt_default_case2A73foo
214
- // CHECK-NORMAL-NOT: class_method
215
- // CHECK-TESTABLE: class_method %{{[0-9]+}} : $A7, #A7.foo!1
216
- // CHECK: return
217
- @inline ( never)
218
- func check_call_on_downcasted_instance( a: A7 ) -> Bool {
219
- if a is B7 {
220
- return ( a as! B7 ) . foo ( )
221
- }
222
- return a. foo ( )
223
- }
224
-
225
185
public func test_check_call_on_downcasted_instance( ) -> Bool {
226
186
return check_call_on_downcasted_instance ( B7 ( ) )
227
187
}
@@ -292,30 +252,21 @@ internal class M33: M3 {
292
252
// The alternatives should be taken in a breadth-first order, starting with
293
253
// the static type of the instance.
294
254
295
- // CHECK: sil [noinline] @_TF19devirt_default_case54testSpeculativeDevirtualizationWithTooManyAlternativesFCS_2M1Vs5Int32
296
- // CHECK: checked_cast_br [exact] %0 : $M1 to $M1
297
- // CHECK: function_ref @_TFC19devirt_default_case2M13foo
298
- // CHECK: br bb1
299
- // CHECK: checked_cast_br [exact] %0 : $M1 to $M2
300
- // CHECK: function_ref @_TFC19devirt_default_case2M23foo
301
- // CHECK: br bb1
302
- // CHECK: checked_cast_br [exact] %0 : $M1 to $M3
303
- // CHECK: function_ref @_TFC19devirt_default_case2M33foo
304
- // CHECK: br bb1
305
- // CHECK: checked_cast_br [exact] %0 : $M1 to $M22
306
- // CHECK: function_ref @_TFC19devirt_default_case3M223foo
307
- // CHECK: br bb1
308
- // CHECK: checked_cast_br [exact] %0 : $M1 to $M33
309
- // CHECK: function_ref @_TFC19devirt_default_case3M333foo
310
- // CHECK: br bb1
311
- // CHECK: checked_cast_br [exact] %0 : $M1 to $M222
312
- // CHECK: function_ref @_TFC19devirt_default_case4M2223foo
313
- // CHECK: br bb1
314
- // CHECK-NOT: checked_cast_br
315
- // CHECK: class_method
316
- // CHECK: apply
317
- // CHECK: br bb1
318
255
@inline ( never)
319
256
public func testSpeculativeDevirtualizationWithTooManyAlternatives( c: M1 ) -> Int32 {
320
257
return c. foo ( )
321
258
}
259
+
260
+
261
+ @inline ( never)
262
+ func foo( a: A2 ) -> Int {
263
+ return a. f ( )
264
+ }
265
+
266
+ @inline ( never)
267
+ func check_call_on_downcasted_instance( a: A7 ) -> Bool {
268
+ if a is B7 {
269
+ return ( a as! B7 ) . foo ( )
270
+ }
271
+ return a. foo ( )
272
+ }
0 commit comments