File: protocol_with_superclass.sil

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (141 lines) | stat: -rw-r--r-- 7,836 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// RUN: %target-swift-frontend -primary-file %s -emit-ir | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-runtime -DINT=i%target-ptrsize

sil_stage canonical

import Builtin
import Swift

// CHECK-LABEL: @"$s24protocol_with_superclass17ProtoRefinesClassMp" =

class Concrete {}

class SubConcrete : Concrete {}

protocol SuperProto : AnyObject {}

protocol ProtoRefinesClass : SuperProto, Concrete {}

protocol SubProto : ProtoRefinesClass {}

protocol OtherProto {}

class Derived : Concrete, ProtoRefinesClass {}

class SubDerived : Derived {}

class MoreDerived : Concrete, SubProto {}

// CHECK-objc-LABEL: define hidden swiftcc void @checkExistentialDowncast(ptr %0, {{.*}} {
// CHECK-native-LABEL: define hidden swiftcc void @checkExistentialDowncast(ptr %0, ptr %1, ptr %2, ptr %3, ptr %4, ptr %5, ptr %6, ptr %7, ptr %8) {{.*}} {
sil hidden @checkExistentialDowncast : $@convention(thin) (@owned Concrete, @owned SuperProto, @owned SuperProto & Concrete, @owned ProtoRefinesClass, @owned SubProto) -> () {
bb0(%0 : $Concrete, %1 : $SuperProto, %2 : $SuperProto & Concrete, %3 : $ProtoRefinesClass, %4 : $SubProto):

  // CHECK:        [[ISA:%.*]] = load ptr, ptr %0
  // CHECK-NEXT:        [[RESULT:%.*]] = call { ptr, ptr } @dynamic_cast_existential_1_unconditional(ptr %0, ptr [[ISA]], {{.*}} @"$s24protocol_with_superclass17ProtoRefinesClassMp"
  // CHECK-NEXT:        [[FIRST:%.*]] = extractvalue { ptr, ptr } [[RESULT]], 0
  %5 = unconditional_checked_cast %0 : $Concrete to ProtoRefinesClass

  // CHECK:             call void @swift_release(ptr [[FIRST]])
  strong_release %5 : $ProtoRefinesClass

  // CHECK:        [[ISA:%.*]] = load ptr, ptr %0
  // CHECK-NEXT:        [[RESULT:%.*]] = call { ptr, ptr } @dynamic_cast_existential_1_unconditional(ptr %0, ptr [[ISA]], {{.*}} @"$s24protocol_with_superclass8SubProtoMp"
  // CHECK-NEXT:        [[FIRST:%.*]] = extractvalue { ptr, ptr } [[RESULT]], 0
  %6 = unconditional_checked_cast %0 : $Concrete to SubProto

  // CHECK:             call void @swift_release(ptr [[FIRST]])
  strong_release %6 : $SubProto

  // CHECK-objc:        [[ISA:%.*]] = call ptr @swift_getObjectType(ptr %{{[0-9]+}})
  // CHECK-native-NEXT: [[ISA:%.*]] = load ptr, ptr %1
  // CHECK-NEXT:        [[RESULT:%.*]] = call { ptr, ptr } @dynamic_cast_existential_1_unconditional(ptr %1, ptr [[ISA]], {{.*}} @"$s24protocol_with_superclass17ProtoRefinesClassMp"
  // CHECK-NEXT:        [[FIRST:%.*]] = extractvalue { ptr, ptr } [[RESULT]], 0
  %7 = unconditional_checked_cast %1 : $SuperProto to ProtoRefinesClass

  // CHECK:             call void @swift_release(ptr [[FIRST]])
  strong_release %7 : $ProtoRefinesClass

  // CHECK-objc:        [[ISA:%.*]] = call ptr @swift_getObjectType(ptr %{{[0-9]+}})
  // CHECK-native-NEXT: [[ISA:%.*]] = load ptr, ptr %1
  // CHECK-NEXT:        [[RESULT:%.*]] = call { ptr, ptr } @dynamic_cast_existential_1_unconditional(ptr %1, ptr [[ISA]], {{.*}} @"$s24protocol_with_superclass8SubProtoMp"
  // CHECK-NEXT:        [[FIRST:%.*]] = extractvalue { ptr, ptr } [[RESULT]], 0
  %8 = unconditional_checked_cast %1 : $SuperProto to SubProto

  // CHECK:             call void @swift_release(ptr [[FIRST]])
  strong_release %8 : $SubProto

  // CHECK:        [[ISA:%.*]] = load ptr, ptr %{{[0-9]+}}
  // CHECK-NEXT:        [[RESULT:%.*]] = call { ptr, ptr } @dynamic_cast_existential_1_unconditional(ptr %{{[0-9]+}}, ptr [[ISA]], {{.*}} @"$s24protocol_with_superclass17ProtoRefinesClassMp"
  // CHECK-NEXT:        [[FIRST:%.*]] = extractvalue { ptr, ptr } [[RESULT]], 0
  %9 = unconditional_checked_cast %2 : $SuperProto & Concrete to ProtoRefinesClass

  // CHECK:             call void @swift_release(ptr [[FIRST]])
  strong_release %9 : $ProtoRefinesClass

  // CHECK:        [[ISA:%.*]] = load ptr, ptr %{{[0-9]+}}
  // CHECK-NEXT:        [[RESULT:%.*]] = call { ptr, ptr } @dynamic_cast_existential_1_unconditional(ptr %{{[0-9]+}}, ptr [[ISA]], {{.*}} @"$s24protocol_with_superclass8SubProtoMp"
  // CHECK-NEXT:        [[FIRST:%.*]] = extractvalue { ptr, ptr } [[RESULT]], 0
  %10 = unconditional_checked_cast %2 : $SuperProto & Concrete to SubProto

  // CHECK:             call void @swift_release(ptr [[FIRST]])
  strong_release %10 : $SubProto

  // CHECK:        [[RESPONSE:%.*]] = call swiftcc %swift.metadata_response @"$s24protocol_with_superclass7DerivedCMa"(i{{[0-9]+}} 0)
  // CHECK-NEXT:        [[METADATA:%.*]] = extractvalue %swift.metadata_response [[RESPONSE]], 0
  // CHECK-NEXT:        [[RESULT:%.*]] = call ptr @swift_dynamicCastClassUnconditional(ptr %{{[0-9]+}}, ptr [[METADATA]], {{.*}})
  %11 = unconditional_checked_cast %3 : $ProtoRefinesClass to Derived

  // CHECK:             call void @swift_release(ptr [[RESULT]])
  strong_release %11 : $Derived

  // CHECK:        [[RESPONSE:%.*]] = call swiftcc %swift.metadata_response @"$s24protocol_with_superclass10SubDerivedCMa"(i{{[0-9]+}} 0)
  // CHECK-NEXT:        [[METADATA:%.*]] = extractvalue %swift.metadata_response [[RESPONSE]], 0
  // CHECK-NEXT:        [[RESULT:%.*]] = call ptr @swift_dynamicCastClassUnconditional(ptr %{{[0-9]+}}, ptr [[METADATA]], {{.*}})
  %12 = unconditional_checked_cast %3 : $ProtoRefinesClass to SubDerived

  // CHECK:             call void @swift_release(ptr [[RESULT]])
  strong_release %12 : $SubDerived

  // CHECK:        [[ISA:%.*]] = load ptr, ptr %{{[0-9]+}}
  // CHECK-NEXT:        [[RESULT:%.*]] = call { ptr, ptr } @dynamic_cast_existential_1_unconditional(ptr %{{[0-9]+}}, ptr [[ISA]], {{.*}} @"$s24protocol_with_superclass10OtherProtoMp"
  // CHECK-NEXT:        [[FIRST:%.*]] = extractvalue { ptr, ptr } [[RESULT]], 0
  %13 = unconditional_checked_cast %3 : $ProtoRefinesClass to OtherProto & Concrete

  // CHECK:             call void @swift_release(ptr [[FIRST]])
  strong_release %13 : $OtherProto & Concrete

  // CHECK:        [[ISA:%.*]] = load ptr, ptr %{{[0-9]+}}
  // CHECK-NEXT:        [[RESPONSE:%.*]] = call swiftcc %swift.metadata_response @"$s24protocol_with_superclass11SubConcreteCMa"(i{{[0-9]+}} 0)
  // CHECK-NEXT:        [[METADATA:%.*]] = extractvalue %swift.metadata_response [[RESPONSE]], 0
  // CHECK-NEXT:        [[RESULT:%.*]] = call { ptr, ptr } @dynamic_cast_existential_1_superclass_unconditional(ptr %{{[0-9]+}}, ptr [[ISA]], ptr [[METADATA]], {{.*}} @"$s24protocol_with_superclass10OtherProtoMp"
  // CHECK-NEXT:        [[FIRST:%.*]] = extractvalue { ptr, ptr } [[RESULT]], 0
  %14 = unconditional_checked_cast %3 : $ProtoRefinesClass to OtherProto & SubConcrete

  // CHECK:             call void @swift_release(ptr [[FIRST]])
  strong_release %14 : $OtherProto & SubConcrete

  // CHECK:        [[RESPONSE:%.*]] = call swiftcc %swift.metadata_response @"$s24protocol_with_superclass11MoreDerivedCMa"(i{{[0-9]+}} 0)
  // CHECK-NEXT:        [[METADATA:%.*]] = extractvalue %swift.metadata_response [[RESPONSE]], 0
  // CHECK-NEXT:        [[RESULT:%.*]] = call ptr @swift_dynamicCastClassUnconditional(ptr %{{[0-9]+}}, ptr [[METADATA]], {{.*}})
  %15 = unconditional_checked_cast %4 : $SubProto to MoreDerived

  // CHECK:             call void @swift_release(ptr [[RESULT]])
  strong_release %15 : $MoreDerived

  // CHECK:        [[ISA:%.*]] = load ptr, ptr %{{[0-9]+}}
  // CHECK-NEXT:        [[RESULT:%.*]] = call { ptr, ptr } @dynamic_cast_existential_1_unconditional(ptr %{{[0-9]+}}, ptr [[ISA]], {{.*}} @"$s24protocol_with_superclass10OtherProtoMp"
  // CHECK-NEXT:        [[FIRST:%.*]] = extractvalue { ptr, ptr } [[RESULT]], 0
  %16 = unconditional_checked_cast %4 : $SubProto to OtherProto & Concrete

  // CHECK:             call void @swift_release(ptr [[FIRST]])
  strong_release %16 : $OtherProto & Concrete

  %result = tuple ()
  return %result : $()
}

sil_vtable Concrete {}
sil_vtable SubConcrete {}
sil_vtable Derived {}
sil_vtable SubDerived {}
sil_vtable MoreDerived {}