@@ -63,6 +63,9 @@ DynamicCastFeasibility classifyDynamicCast(
63
63
bool isSourceTypeExact = false ,
64
64
bool isWholdModuleOpts = false );
65
65
66
+ SILValue emitSuccessfulScalarUnconditionalCast (SILBuilder &B, SILLocation loc,
67
+ SILDynamicCastInst inst);
68
+
66
69
SILValue emitSuccessfulScalarUnconditionalCast (
67
70
SILBuilder &B, ModuleDecl *M, SILLocation loc, SILValue value,
68
71
SILType loweredTargetType,
@@ -186,6 +189,7 @@ struct SILDynamicCastInst {
186
189
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
187
190
return CastConsumptionKind::TakeAlways;
188
191
case SILDynamicCastKind::UnconditionalCheckedCastInst:
192
+ return CastConsumptionKind::CopyOnSuccess;
189
193
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
190
194
llvm_unreachable (" unsupported" );
191
195
}
@@ -206,12 +210,30 @@ struct SILDynamicCastInst {
206
210
SILBasicBlock *getSuccessBlock () {
207
211
switch (getKind ()) {
208
212
case SILDynamicCastKind::CheckedCastAddrBranchInst:
213
+ llvm_unreachable (" unsupported" );
209
214
case SILDynamicCastKind::CheckedCastBranchInst:
215
+ return cast<CheckedCastBranchInst>(inst)->getSuccessBB ();
210
216
case SILDynamicCastKind::CheckedCastValueBranchInst:
211
217
llvm_unreachable (" unsupported" );
212
218
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
219
+ case SILDynamicCastKind::UnconditionalCheckedCastInst:
213
220
return nullptr ;
221
+ case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
222
+ llvm_unreachable (" unsupported" );
223
+ }
224
+ }
225
+
226
+ Optional<ProfileCounter> getSuccessBlockCount () {
227
+ switch (getKind ()) {
228
+ case SILDynamicCastKind::CheckedCastAddrBranchInst:
229
+ llvm_unreachable (" unsupported" );
230
+ case SILDynamicCastKind::CheckedCastBranchInst:
231
+ return cast<CheckedCastBranchInst>(inst)->getTrueBBCount ();
232
+ case SILDynamicCastKind::CheckedCastValueBranchInst:
233
+ llvm_unreachable (" unsupported" );
234
+ case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
214
235
case SILDynamicCastKind::UnconditionalCheckedCastInst:
236
+ return None;
215
237
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
216
238
llvm_unreachable (" unsupported" );
217
239
}
@@ -224,12 +246,30 @@ struct SILDynamicCastInst {
224
246
SILBasicBlock *getFailureBlock () {
225
247
switch (getKind ()) {
226
248
case SILDynamicCastKind::CheckedCastAddrBranchInst:
249
+ llvm_unreachable (" unsupported" );
227
250
case SILDynamicCastKind::CheckedCastBranchInst:
251
+ return cast<CheckedCastBranchInst>(inst)->getFailureBB ();
228
252
case SILDynamicCastKind::CheckedCastValueBranchInst:
229
253
llvm_unreachable (" unsupported" );
230
254
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
255
+ case SILDynamicCastKind::UnconditionalCheckedCastInst:
231
256
return nullptr ;
257
+ case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
258
+ llvm_unreachable (" unsupported" );
259
+ }
260
+ }
261
+
262
+ Optional<ProfileCounter> getFailureBlockCount () {
263
+ switch (getKind ()) {
264
+ case SILDynamicCastKind::CheckedCastAddrBranchInst:
265
+ llvm_unreachable (" unsupported" );
266
+ case SILDynamicCastKind::CheckedCastBranchInst:
267
+ return cast<CheckedCastBranchInst>(inst)->getFalseBBCount ();
268
+ case SILDynamicCastKind::CheckedCastValueBranchInst:
269
+ llvm_unreachable (" unsupported" );
270
+ case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
232
271
case SILDynamicCastKind::UnconditionalCheckedCastInst:
272
+ return None;
233
273
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
234
274
llvm_unreachable (" unsupported" );
235
275
}
@@ -242,12 +282,15 @@ struct SILDynamicCastInst {
242
282
SILValue getSource () const {
243
283
switch (getKind ()) {
244
284
case SILDynamicCastKind::CheckedCastAddrBranchInst:
285
+ llvm_unreachable (" unsupported" );
245
286
case SILDynamicCastKind::CheckedCastBranchInst:
287
+ return cast<CheckedCastBranchInst>(inst)->getOperand ();
246
288
case SILDynamicCastKind::CheckedCastValueBranchInst:
247
289
llvm_unreachable (" unsupported" );
248
290
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
249
291
return cast<UnconditionalCheckedCastAddrInst>(inst)->getSrc ();
250
292
case SILDynamicCastKind::UnconditionalCheckedCastInst:
293
+ return cast<UnconditionalCheckedCastInst>(inst)->getOperand ();
251
294
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
252
295
llvm_unreachable (" unsupported" );
253
296
}
@@ -263,6 +306,10 @@ struct SILDynamicCastInst {
263
306
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
264
307
return cast<UnconditionalCheckedCastAddrInst>(inst)->getDest ();
265
308
case SILDynamicCastKind::UnconditionalCheckedCastInst:
309
+ // TODO: Why isn't this:
310
+ //
311
+ // return cast<UnconditionalCheckedCastInst>(inst);
312
+ return SILValue ();
266
313
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
267
314
llvm_unreachable (" unimplemented" );
268
315
}
@@ -277,6 +324,7 @@ struct SILDynamicCastInst {
277
324
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
278
325
return cast<UnconditionalCheckedCastAddrInst>(inst)->getSourceType ();
279
326
case SILDynamicCastKind::UnconditionalCheckedCastInst:
327
+ return cast<UnconditionalCheckedCastInst>(inst)->getSourceType ();
280
328
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
281
329
llvm_unreachable (" unsupported" );
282
330
}
@@ -293,6 +341,7 @@ struct SILDynamicCastInst {
293
341
return uccai->getSrc ()->getType ();
294
342
}
295
343
case SILDynamicCastKind::UnconditionalCheckedCastInst:
344
+ return cast<UnconditionalCheckedCastInst>(inst)->getOperand ()->getType ();
296
345
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
297
346
llvm_unreachable (" unsupported" );
298
347
}
@@ -307,6 +356,7 @@ struct SILDynamicCastInst {
307
356
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
308
357
return cast<UnconditionalCheckedCastAddrInst>(inst)->getTargetType ();
309
358
case SILDynamicCastKind::UnconditionalCheckedCastInst:
359
+ return cast<UnconditionalCheckedCastInst>(inst)->getTargetType ();
310
360
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
311
361
llvm_unreachable (" unimplemented" );
312
362
}
@@ -315,14 +365,18 @@ struct SILDynamicCastInst {
315
365
SILType getLoweredTargetType () const {
316
366
switch (getKind ()) {
317
367
case SILDynamicCastKind::CheckedCastAddrBranchInst:
368
+ llvm_unreachable (" unsupported" );
318
369
case SILDynamicCastKind::CheckedCastBranchInst:
370
+ return cast<CheckedCastBranchInst>(inst)->getCastType ();
319
371
case SILDynamicCastKind::CheckedCastValueBranchInst:
320
372
llvm_unreachable (" unsupported" );
321
373
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst: {
322
374
auto *uccai = dyn_cast<UnconditionalCheckedCastAddrInst>(inst);
323
375
return uccai->getDest ()->getType ();
324
376
}
325
- case SILDynamicCastKind::UnconditionalCheckedCastInst:
377
+ case SILDynamicCastKind::UnconditionalCheckedCastInst: {
378
+ return cast<UnconditionalCheckedCastInst>(inst)->getType ();
379
+ }
326
380
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
327
381
llvm_unreachable (" unsupported" );
328
382
}
@@ -335,8 +389,8 @@ struct SILDynamicCastInst {
335
389
case SILDynamicCastKind::CheckedCastValueBranchInst:
336
390
llvm_unreachable (" unsupported" );
337
391
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
338
- return isa<MetatypeInst>(getSource ());
339
392
case SILDynamicCastKind::UnconditionalCheckedCastInst:
393
+ return isa<MetatypeInst>(getSource ());
340
394
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
341
395
llvm_unreachable (" unsupported" );
342
396
}
@@ -368,8 +422,8 @@ struct SILDynamicCastInst {
368
422
case SILDynamicCastKind::CheckedCastValueBranchInst:
369
423
llvm_unreachable (" unsupported" );
370
424
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
371
- return false ;
372
425
case SILDynamicCastKind::UnconditionalCheckedCastInst:
426
+ return false ;
373
427
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
374
428
llvm_unreachable (" unsupported" );
375
429
}
0 commit comments