@@ -103,27 +103,69 @@ bb0:
103
103
return %tuple : $()
104
104
}
105
105
106
+ // CHECK-LABEL: define {{.*}} @testOtherGlobal
106
107
sil @testOtherGlobal : $@convention(thin) () -> () {
107
108
bb0:
108
109
// CHECK: [[METADATA:%.*]] = call %swift.type* @_T016resilient_struct4SizeVMa()
110
+ // CHECK: call %swift.opaque* @__swift_allocate_value_buffer(%swift.type* %0, %swift.opaque* bitcast ([{{.*}} x i8]* @otherGlobal to %swift.opaque*))
111
+ alloc_global @otherGlobal
109
112
110
- // CHECK: [[METADATA_ADDR:%.*]] = bitcast %swift.type* [[METADATA]] to i8***
111
- // CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[METADATA_ADDR]], [[INT]] -1
112
- // CHECK: [[VWT:%.*]] = load i8**, i8*** [[VWT_ADDR]]
113
- // CHECK: [[WITNESS_PTR:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32 11
114
- // CHECK: [[WITNESS:%.*]] = load i8*, i8** [[WITNESS_PTR]]
115
- // CHECK: [[allocateBuffer:%.*]] = bitcast i8* [[WITNESS]] to %swift.opaque* ([[BUFFER]]*, %swift.type*)*
116
- // CHECK: [[VALUE:%.*]] = call %swift.opaque* [[allocateBuffer]]([[BUFFER]]* @otherGlobal, %swift.type* [[METADATA]])
117
- alloc_global @otherGlobal
118
-
119
- // CHECK: [[WITNESS_PTR:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32 2
120
- // CHECK: [[WITNESS:%.*]] = load i8*, i8** [[WITNESS_PTR]]
121
- // CHECK: [[projectBuffer:%.*]] = bitcast i8* [[WITNESS]] to %swift.opaque* ([[BUFFER]]*, %swift.type*)*
122
- // CHECK: [[VALUE:%.*]] = call %swift.opaque* [[projectBuffer]]([[BUFFER]]* @otherGlobal, %swift.type* [[METADATA]])
113
+ // CHECK: call %swift.opaque* @__swift_project_value_buffer(%swift.type* %0, %swift.opaque* bitcast ([{{.*}} x i8]* @otherGlobal to %swift.opaque*))
123
114
%addr = global_addr @otherGlobal : $*Size
124
115
125
116
%tuple = tuple ()
126
117
127
118
// CHECK: ret void
128
119
return %tuple : $()
129
120
}
121
+
122
+ // CHECK-LABEL: define linkonce_odr hidden %swift.opaque* @__swift_allocate_value_buffer(%swift.type*, %swift.opaque*)
123
+ // CHECK: entry:
124
+ // CHECK: [[CAST:%.*]] = bitcast %swift.type* %0 to i8***
125
+ // CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[CAST]], {{.*}} -1
126
+ // CHECK: [[VWT:%.*]] = load i8**, i8*** [[VWT_ADDR]]
127
+ // CHECK: [[FLAGS_ADDR:%.*]] = getelementptr inbounds i8*, i8** %.valueWitnesses, i32 18
128
+ // CHECK: [[FLAGSWITNESS:%.*]] = load i8*, i8** [[FLAGS_ADDR]]
129
+ // CHECK: [[FLAGS:%.*]] = ptrtoint i8* [[FLAGSWITNESS]] to i{{.*}}
130
+ // CHECK: [[ISNOTINLINE:%.*]] = and {{.*}} [[FLAGS]], 131072
131
+ // CHECK: [[ISINLINE:%.*]] = icmp eq {{.*}} [[ISNOTINLINE]], 0
132
+ // CHECK: br i1 [[ISINLINE]], label %done, label %outline.allocateValueInBuffer
133
+ //
134
+ // CHECK: outline.allocateValueInBuffer:
135
+ // CHECK: [[CAST:%.*]] = bitcast %swift.type* %0 to i8***
136
+ // CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[CAST]], {{.*}} -1
137
+ // CHECK: [[VWT:%.*]] = load i8**, i8*** [[VWT_ADDR]]
138
+ // CHECK: [[SIZE_ADDR:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32 17
139
+ // CHECK: [[SIZEWITNESS:%.*]] = load i8*, i8** [[SIZE_ADDR]]
140
+ // CHECK: [[SIZE:%.*]] = ptrtoint i8* [[SIZEWITNESS]]
141
+ // CHECK: [[ALIGN:%.*]] = and {{.*}} [[FLAGS]], 65535
142
+ // CHECK: [[PTR:%.*]] = call noalias i8* @swift_rt_swift_slowAlloc({{.*}} [[SIZE]], {{.*}} [[ALIGN]])
143
+ // CHECK: [[ADDR:%.*]] = bitcast %swift.opaque* %1 to i8**
144
+ // CHECK: store i8* [[PTR]], i8** [[ADDR]]
145
+ // CHECK: [[OUTLINEADDR:%.*]] = bitcast i8* [[PTR]] to %swift.opaque*
146
+ // CHECK: br label %done
147
+ //
148
+ // CHECK: done:
149
+ // CHECK: [[PHI:%.*]] = phi %swift.opaque* [ %1, %entry ], [ [[OUTLINEADDR]], %outline.allocateValueInBuffer ]
150
+ // CHECK: ret %swift.opaque* [[PHI]]
151
+
152
+
153
+ // CHECK-LABEL: define linkonce_odr hidden %swift.opaque* @__swift_project_value_buffer(%swift.type*, %swift.opaque*)
154
+ // CHECK: [[CAST:%.*]] = bitcast %swift.type* %0 to i8***
155
+ // CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[CAST]], {{.*}} -1
156
+ // CHECK: [[VWT:%.*]] = load i8**, i8*** [[VWT_ADDR]]
157
+ // CHECK: [[FLAGS_ADDR:%.*]] = getelementptr inbounds i8*, i8** %.valueWitnesses, i32 18
158
+ // CHECK: [[FLAGSWITNESS:%.*]] = load i8*, i8** [[FLAGS_ADDR]]
159
+ // CHECK: [[FLAGS:%.*]] = ptrtoint i8* [[FLAGSWITNESS]] to i{{.*}}
160
+ // CHECK: [[ISNOTINLINE:%.*]] = and {{.*}} [[FLAGS]], 131072
161
+ // CHECK: [[ISINLINE:%.*]] = icmp eq {{.*}} [[ISNOTINLINE]], 0
162
+ // CHECK: br i1 [[ISINLINE]], label %done, label %outline.projectValueInBuffer
163
+ //
164
+ // CHECK: outline.projectValueInBuffer:
165
+ // CHECK: [[CAST:%.*]] = bitcast %swift.opaque* %1 to %swift.opaque**
166
+ // CHECK: [[PTR_TO_BUFFER:%.*]] = load %swift.opaque*, %swift.opaque** [[CAST]]
167
+ // CHECK: br label %done
168
+ //
169
+ // CHECK: done:
170
+ // CHECK: [[PHI:%.*]] = phi %swift.opaque* [ %1, %entry ], [ [[PTR_TO_BUFFER]], %outline.projectValueInBuffer ]
171
+ // CHECK: ret %swift.opaque* [[PHI]]
0 commit comments