@@ -32,6 +32,7 @@ class SILLocation;
3232class SILModule ;
3333class SILType ;
3434enum class CastConsumptionKind : unsigned char ;
35+ struct SILDynamicCastInst ;
3536
3637enum class DynamicCastFeasibility {
3738 // / The cast will always succeed.
@@ -74,6 +75,9 @@ bool emitSuccessfulIndirectUnconditionalCast(
7475 SILValue dest, CanType targetType,
7576 SILInstruction *existingCast = nullptr );
7677
78+ bool emitSuccessfulIndirectUnconditionalCast (SILBuilder &B, SILLocation loc,
79+ SILDynamicCastInst dynamicCast);
80+
7781// / Can the given cast be performed by the scalar checked-cast
7882// / instructions, or does we need to use the indirect instructions?
7983bool canUseScalarCheckedCastInstructions (SILModule &M,
@@ -173,6 +177,20 @@ struct SILDynamicCastInst {
173177
174178 SILInstruction *getInstruction () const { return inst; }
175179
180+ CastConsumptionKind getBridgedConsumptionKind () const {
181+ switch (getKind ()) {
182+ case SILDynamicCastKind::CheckedCastAddrBranchInst:
183+ case SILDynamicCastKind::CheckedCastBranchInst:
184+ case SILDynamicCastKind::CheckedCastValueBranchInst:
185+ llvm_unreachable (" unsupported" );
186+ case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
187+ return CastConsumptionKind::TakeAlways;
188+ case SILDynamicCastKind::UnconditionalCheckedCastInst:
189+ case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
190+ llvm_unreachable (" unsupported" );
191+ }
192+ }
193+
176194 CastConsumptionKind getConsumptionKind () const {
177195 switch (getKind ()) {
178196 case SILDynamicCastKind::CheckedCastAddrBranchInst:
@@ -181,7 +199,7 @@ struct SILDynamicCastInst {
181199 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
182200 case SILDynamicCastKind::UnconditionalCheckedCastInst:
183201 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
184- llvm_unreachable (" unsupported query " );
202+ llvm_unreachable (" unsupported" );
185203 }
186204 }
187205
@@ -190,10 +208,12 @@ struct SILDynamicCastInst {
190208 case SILDynamicCastKind::CheckedCastAddrBranchInst:
191209 case SILDynamicCastKind::CheckedCastBranchInst:
192210 case SILDynamicCastKind::CheckedCastValueBranchInst:
211+ llvm_unreachable (" unsupported" );
193212 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
213+ return nullptr ;
194214 case SILDynamicCastKind::UnconditionalCheckedCastInst:
195215 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
196- llvm_unreachable (" Unsupported query " );
216+ llvm_unreachable (" unsupported " );
197217 }
198218 }
199219
@@ -206,10 +226,12 @@ struct SILDynamicCastInst {
206226 case SILDynamicCastKind::CheckedCastAddrBranchInst:
207227 case SILDynamicCastKind::CheckedCastBranchInst:
208228 case SILDynamicCastKind::CheckedCastValueBranchInst:
229+ llvm_unreachable (" unsupported" );
209230 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
231+ return nullptr ;
210232 case SILDynamicCastKind::UnconditionalCheckedCastInst:
211233 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
212- llvm_unreachable (" Unsupported query " );
234+ llvm_unreachable (" unsupported " );
213235 }
214236 }
215237
@@ -222,7 +244,9 @@ struct SILDynamicCastInst {
222244 case SILDynamicCastKind::CheckedCastAddrBranchInst:
223245 case SILDynamicCastKind::CheckedCastBranchInst:
224246 case SILDynamicCastKind::CheckedCastValueBranchInst:
247+ llvm_unreachable (" unsupported" );
225248 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
249+ return cast<UnconditionalCheckedCastAddrInst>(inst)->getSrc ();
226250 case SILDynamicCastKind::UnconditionalCheckedCastInst:
227251 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
228252 llvm_unreachable (" unsupported" );
@@ -235,7 +259,9 @@ struct SILDynamicCastInst {
235259 case SILDynamicCastKind::CheckedCastAddrBranchInst:
236260 case SILDynamicCastKind::CheckedCastBranchInst:
237261 case SILDynamicCastKind::CheckedCastValueBranchInst:
262+ llvm_unreachable (" unsupported" );
238263 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
264+ return cast<UnconditionalCheckedCastAddrInst>(inst)->getDest ();
239265 case SILDynamicCastKind::UnconditionalCheckedCastInst:
240266 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
241267 llvm_unreachable (" unimplemented" );
@@ -247,7 +273,9 @@ struct SILDynamicCastInst {
247273 case SILDynamicCastKind::CheckedCastAddrBranchInst:
248274 case SILDynamicCastKind::CheckedCastBranchInst:
249275 case SILDynamicCastKind::CheckedCastValueBranchInst:
276+ llvm_unreachable (" unsupported" );
250277 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
278+ return cast<UnconditionalCheckedCastAddrInst>(inst)->getSourceType ();
251279 case SILDynamicCastKind::UnconditionalCheckedCastInst:
252280 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
253281 llvm_unreachable (" unsupported" );
@@ -259,7 +287,11 @@ struct SILDynamicCastInst {
259287 case SILDynamicCastKind::CheckedCastAddrBranchInst:
260288 case SILDynamicCastKind::CheckedCastBranchInst:
261289 case SILDynamicCastKind::CheckedCastValueBranchInst:
262- case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
290+ llvm_unreachable (" unsupported" );
291+ case SILDynamicCastKind::UnconditionalCheckedCastAddrInst: {
292+ auto *uccai = cast<UnconditionalCheckedCastAddrInst>(inst);
293+ return uccai->getSrc ()->getType ();
294+ }
263295 case SILDynamicCastKind::UnconditionalCheckedCastInst:
264296 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
265297 llvm_unreachable (" unsupported" );
@@ -271,7 +303,9 @@ struct SILDynamicCastInst {
271303 case SILDynamicCastKind::CheckedCastAddrBranchInst:
272304 case SILDynamicCastKind::CheckedCastBranchInst:
273305 case SILDynamicCastKind::CheckedCastValueBranchInst:
306+ llvm_unreachable (" unsupported" );
274307 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
308+ return cast<UnconditionalCheckedCastAddrInst>(inst)->getTargetType ();
275309 case SILDynamicCastKind::UnconditionalCheckedCastInst:
276310 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
277311 llvm_unreachable (" unimplemented" );
@@ -283,7 +317,11 @@ struct SILDynamicCastInst {
283317 case SILDynamicCastKind::CheckedCastAddrBranchInst:
284318 case SILDynamicCastKind::CheckedCastBranchInst:
285319 case SILDynamicCastKind::CheckedCastValueBranchInst:
286- case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
320+ llvm_unreachable (" unsupported" );
321+ case SILDynamicCastKind::UnconditionalCheckedCastAddrInst: {
322+ auto *uccai = dyn_cast<UnconditionalCheckedCastAddrInst>(inst);
323+ return uccai->getDest ()->getType ();
324+ }
287325 case SILDynamicCastKind::UnconditionalCheckedCastInst:
288326 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
289327 llvm_unreachable (" unsupported" );
@@ -295,7 +333,9 @@ struct SILDynamicCastInst {
295333 case SILDynamicCastKind::CheckedCastAddrBranchInst:
296334 case SILDynamicCastKind::CheckedCastBranchInst:
297335 case SILDynamicCastKind::CheckedCastValueBranchInst:
336+ llvm_unreachable (" unsupported" );
298337 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
338+ return isa<MetatypeInst>(getSource ());
299339 case SILDynamicCastKind::UnconditionalCheckedCastInst:
300340 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
301341 llvm_unreachable (" unsupported" );
@@ -305,11 +345,12 @@ struct SILDynamicCastInst {
305345 SILLocation getLocation () const { return inst->getLoc (); }
306346
307347 SILModule &getModule () const { return inst->getModule (); }
348+ SILFunction *getFunction () const { return inst->getFunction (); }
308349
309- DynamicCastFeasibility classifyDynamicCast ( ) const {
350+ DynamicCastFeasibility classifyFeasibility ( bool allowWholeModule ) const {
310351 return swift::classifyDynamicCast (
311352 getModule ().getSwiftModule (), getSourceType (), getTargetType (),
312- isSourceTypeExact (), getModule ().isWholeModule ());
353+ isSourceTypeExact (), allowWholeModule && getModule ().isWholeModule ());
313354 }
314355
315356 bool isBridgingCast () const {
@@ -320,12 +361,14 @@ struct SILDynamicCastInst {
320361 return TargetIsBridgeable != SourceIsBridgeable;
321362 }
322363
323- bool isConditionalCast () const {
364+ bool isConditional () const {
324365 switch (getKind ()) {
325366 case SILDynamicCastKind::CheckedCastAddrBranchInst:
326367 case SILDynamicCastKind::CheckedCastBranchInst:
327368 case SILDynamicCastKind::CheckedCastValueBranchInst:
369+ llvm_unreachable (" unsupported" );
328370 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
371+ return false ;
329372 case SILDynamicCastKind::UnconditionalCheckedCastInst:
330373 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
331374 llvm_unreachable (" unsupported" );
0 commit comments