@@ -63,6 +63,9 @@ DynamicCastFeasibility classifyDynamicCast(
6363 bool isSourceTypeExact = false ,
6464 bool isWholdModuleOpts = false );
6565
66+ SILValue emitSuccessfulScalarUnconditionalCast (SILBuilder &B, SILLocation loc,
67+ SILDynamicCastInst inst);
68+
6669SILValue emitSuccessfulScalarUnconditionalCast (
6770 SILBuilder &B, ModuleDecl *M, SILLocation loc, SILValue value,
6871 SILType loweredTargetType,
@@ -186,6 +189,7 @@ struct SILDynamicCastInst {
186189 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
187190 return CastConsumptionKind::TakeAlways;
188191 case SILDynamicCastKind::UnconditionalCheckedCastInst:
192+ return CastConsumptionKind::CopyOnSuccess;
189193 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
190194 llvm_unreachable (" unsupported" );
191195 }
@@ -206,12 +210,30 @@ struct SILDynamicCastInst {
206210 SILBasicBlock *getSuccessBlock () {
207211 switch (getKind ()) {
208212 case SILDynamicCastKind::CheckedCastAddrBranchInst:
213+ llvm_unreachable (" unsupported" );
209214 case SILDynamicCastKind::CheckedCastBranchInst:
215+ return cast<CheckedCastBranchInst>(inst)->getSuccessBB ();
210216 case SILDynamicCastKind::CheckedCastValueBranchInst:
211217 llvm_unreachable (" unsupported" );
212218 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
219+ case SILDynamicCastKind::UnconditionalCheckedCastInst:
213220 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:
214235 case SILDynamicCastKind::UnconditionalCheckedCastInst:
236+ return None;
215237 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
216238 llvm_unreachable (" unsupported" );
217239 }
@@ -224,12 +246,30 @@ struct SILDynamicCastInst {
224246 SILBasicBlock *getFailureBlock () {
225247 switch (getKind ()) {
226248 case SILDynamicCastKind::CheckedCastAddrBranchInst:
249+ llvm_unreachable (" unsupported" );
227250 case SILDynamicCastKind::CheckedCastBranchInst:
251+ return cast<CheckedCastBranchInst>(inst)->getFailureBB ();
228252 case SILDynamicCastKind::CheckedCastValueBranchInst:
229253 llvm_unreachable (" unsupported" );
230254 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
255+ case SILDynamicCastKind::UnconditionalCheckedCastInst:
231256 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:
232271 case SILDynamicCastKind::UnconditionalCheckedCastInst:
272+ return None;
233273 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
234274 llvm_unreachable (" unsupported" );
235275 }
@@ -242,12 +282,15 @@ struct SILDynamicCastInst {
242282 SILValue getSource () const {
243283 switch (getKind ()) {
244284 case SILDynamicCastKind::CheckedCastAddrBranchInst:
285+ llvm_unreachable (" unsupported" );
245286 case SILDynamicCastKind::CheckedCastBranchInst:
287+ return cast<CheckedCastBranchInst>(inst)->getOperand ();
246288 case SILDynamicCastKind::CheckedCastValueBranchInst:
247289 llvm_unreachable (" unsupported" );
248290 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
249291 return cast<UnconditionalCheckedCastAddrInst>(inst)->getSrc ();
250292 case SILDynamicCastKind::UnconditionalCheckedCastInst:
293+ return cast<UnconditionalCheckedCastInst>(inst)->getOperand ();
251294 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
252295 llvm_unreachable (" unsupported" );
253296 }
@@ -263,6 +306,10 @@ struct SILDynamicCastInst {
263306 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
264307 return cast<UnconditionalCheckedCastAddrInst>(inst)->getDest ();
265308 case SILDynamicCastKind::UnconditionalCheckedCastInst:
309+ // TODO: Why isn't this:
310+ //
311+ // return cast<UnconditionalCheckedCastInst>(inst);
312+ return SILValue ();
266313 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
267314 llvm_unreachable (" unimplemented" );
268315 }
@@ -277,6 +324,7 @@ struct SILDynamicCastInst {
277324 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
278325 return cast<UnconditionalCheckedCastAddrInst>(inst)->getSourceType ();
279326 case SILDynamicCastKind::UnconditionalCheckedCastInst:
327+ return cast<UnconditionalCheckedCastInst>(inst)->getSourceType ();
280328 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
281329 llvm_unreachable (" unsupported" );
282330 }
@@ -293,6 +341,7 @@ struct SILDynamicCastInst {
293341 return uccai->getSrc ()->getType ();
294342 }
295343 case SILDynamicCastKind::UnconditionalCheckedCastInst:
344+ return cast<UnconditionalCheckedCastInst>(inst)->getOperand ()->getType ();
296345 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
297346 llvm_unreachable (" unsupported" );
298347 }
@@ -307,6 +356,7 @@ struct SILDynamicCastInst {
307356 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
308357 return cast<UnconditionalCheckedCastAddrInst>(inst)->getTargetType ();
309358 case SILDynamicCastKind::UnconditionalCheckedCastInst:
359+ return cast<UnconditionalCheckedCastInst>(inst)->getTargetType ();
310360 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
311361 llvm_unreachable (" unimplemented" );
312362 }
@@ -315,14 +365,18 @@ struct SILDynamicCastInst {
315365 SILType getLoweredTargetType () const {
316366 switch (getKind ()) {
317367 case SILDynamicCastKind::CheckedCastAddrBranchInst:
368+ llvm_unreachable (" unsupported" );
318369 case SILDynamicCastKind::CheckedCastBranchInst:
370+ return cast<CheckedCastBranchInst>(inst)->getCastType ();
319371 case SILDynamicCastKind::CheckedCastValueBranchInst:
320372 llvm_unreachable (" unsupported" );
321373 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst: {
322374 auto *uccai = dyn_cast<UnconditionalCheckedCastAddrInst>(inst);
323375 return uccai->getDest ()->getType ();
324376 }
325- case SILDynamicCastKind::UnconditionalCheckedCastInst:
377+ case SILDynamicCastKind::UnconditionalCheckedCastInst: {
378+ return cast<UnconditionalCheckedCastInst>(inst)->getType ();
379+ }
326380 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
327381 llvm_unreachable (" unsupported" );
328382 }
@@ -335,8 +389,8 @@ struct SILDynamicCastInst {
335389 case SILDynamicCastKind::CheckedCastValueBranchInst:
336390 llvm_unreachable (" unsupported" );
337391 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
338- return isa<MetatypeInst>(getSource ());
339392 case SILDynamicCastKind::UnconditionalCheckedCastInst:
393+ return isa<MetatypeInst>(getSource ());
340394 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
341395 llvm_unreachable (" unsupported" );
342396 }
@@ -368,8 +422,8 @@ struct SILDynamicCastInst {
368422 case SILDynamicCastKind::CheckedCastValueBranchInst:
369423 llvm_unreachable (" unsupported" );
370424 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
371- return false ;
372425 case SILDynamicCastKind::UnconditionalCheckedCastInst:
426+ return false ;
373427 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
374428 llvm_unreachable (" unsupported" );
375429 }
0 commit comments