Skip to content

Commit 3d4f947

Browse files
committed
---
yaml --- r: 347069 b: refs/heads/master c: 4929212 h: refs/heads/master i: 347067: 88a69e7
1 parent b87e507 commit 3d4f947

File tree

4 files changed

+102
-120
lines changed

4 files changed

+102
-120
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 203928b8086b4a1750387d33751976e4a87b6419
2+
refs/heads/master: 49292128e34a2ea6f53b39788b1691a852fe42df
33
refs/heads/master-next: 203b3026584ecad859eb328b2e12490099409cd5
44
refs/tags/osx-passed: b6b74147ef8a386f532cf9357a1bde006e552c54
55
refs/tags/swift-2.2-SNAPSHOT-2015-12-01-a: 6bb18e013c2284f2b45f5f84f2df2887dc0f7dea

trunk/include/swift/SIL/DynamicCasts.h

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -183,9 +183,13 @@ struct SILDynamicCastInst {
183183
CastConsumptionKind getBridgedConsumptionKind() const {
184184
switch (getKind()) {
185185
case SILDynamicCastKind::CheckedCastAddrBranchInst:
186+
return cast<CheckedCastAddrBranchInst>(inst)->getConsumptionKind();
187+
// TODO: Bridged casts cannot be expressed by checked_cast_br or
188+
// checked_cast_value_br yet. Should we ever support it, please
189+
// review this code.
186190
case SILDynamicCastKind::CheckedCastBranchInst:
187191
case SILDynamicCastKind::CheckedCastValueBranchInst:
188-
llvm_unreachable("unsupported");
192+
return CastConsumptionKind::CopyOnSuccess;
189193
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
190194
return CastConsumptionKind::TakeAlways;
191195
case SILDynamicCastKind::UnconditionalCheckedCastInst:
@@ -210,11 +214,11 @@ struct SILDynamicCastInst {
210214
SILBasicBlock *getSuccessBlock() {
211215
switch (getKind()) {
212216
case SILDynamicCastKind::CheckedCastAddrBranchInst:
213-
llvm_unreachable("unsupported");
217+
return cast<CheckedCastAddrBranchInst>(inst)->getSuccessBB();
214218
case SILDynamicCastKind::CheckedCastBranchInst:
215219
return cast<CheckedCastBranchInst>(inst)->getSuccessBB();
216220
case SILDynamicCastKind::CheckedCastValueBranchInst:
217-
llvm_unreachable("unsupported");
221+
return cast<CheckedCastValueBranchInst>(inst)->getSuccessBB();
218222
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
219223
case SILDynamicCastKind::UnconditionalCheckedCastInst:
220224
return nullptr;
@@ -246,11 +250,11 @@ struct SILDynamicCastInst {
246250
SILBasicBlock *getFailureBlock() {
247251
switch (getKind()) {
248252
case SILDynamicCastKind::CheckedCastAddrBranchInst:
249-
llvm_unreachable("unsupported");
253+
return cast<CheckedCastAddrBranchInst>(inst)->getFailureBB();
250254
case SILDynamicCastKind::CheckedCastBranchInst:
251255
return cast<CheckedCastBranchInst>(inst)->getFailureBB();
252256
case SILDynamicCastKind::CheckedCastValueBranchInst:
253-
llvm_unreachable("unsupported");
257+
return cast<CheckedCastValueBranchInst>(inst)->getFailureBB();
254258
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
255259
case SILDynamicCastKind::UnconditionalCheckedCastInst:
256260
return nullptr;
@@ -282,11 +286,11 @@ struct SILDynamicCastInst {
282286
SILValue getSource() const {
283287
switch (getKind()) {
284288
case SILDynamicCastKind::CheckedCastAddrBranchInst:
285-
llvm_unreachable("unsupported");
289+
return cast<CheckedCastAddrBranchInst>(inst)->getSrc();
286290
case SILDynamicCastKind::CheckedCastBranchInst:
287291
return cast<CheckedCastBranchInst>(inst)->getOperand();
288292
case SILDynamicCastKind::CheckedCastValueBranchInst:
289-
llvm_unreachable("unsupported");
293+
return cast<CheckedCastValueBranchInst>(inst)->getOperand();
290294
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
291295
return cast<UnconditionalCheckedCastAddrInst>(inst)->getSrc();
292296
case SILDynamicCastKind::UnconditionalCheckedCastInst:
@@ -300,9 +304,11 @@ struct SILDynamicCastInst {
300304
SILValue getDest() const {
301305
switch (getKind()) {
302306
case SILDynamicCastKind::CheckedCastAddrBranchInst:
307+
return cast<CheckedCastAddrBranchInst>(inst)->getDest();
303308
case SILDynamicCastKind::CheckedCastBranchInst:
304309
case SILDynamicCastKind::CheckedCastValueBranchInst:
305-
llvm_unreachable("unsupported");
310+
// TODO: Shouldn't this return getSuccessBlock()->getArgument(0)?
311+
return SILValue();
306312
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
307313
return cast<UnconditionalCheckedCastAddrInst>(inst)->getDest();
308314
case SILDynamicCastKind::UnconditionalCheckedCastInst:
@@ -318,9 +324,11 @@ struct SILDynamicCastInst {
318324
CanType getSourceType() const {
319325
switch (getKind()) {
320326
case SILDynamicCastKind::CheckedCastAddrBranchInst:
327+
return cast<CheckedCastAddrBranchInst>(inst)->getSourceType();
321328
case SILDynamicCastKind::CheckedCastBranchInst:
329+
return cast<CheckedCastBranchInst>(inst)->getSourceType();
322330
case SILDynamicCastKind::CheckedCastValueBranchInst:
323-
llvm_unreachable("unsupported");
331+
return cast<CheckedCastValueBranchInst>(inst)->getSourceType();
324332
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
325333
return cast<UnconditionalCheckedCastAddrInst>(inst)->getSourceType();
326334
case SILDynamicCastKind::UnconditionalCheckedCastInst:
@@ -350,9 +358,11 @@ struct SILDynamicCastInst {
350358
CanType getTargetType() const {
351359
switch (getKind()) {
352360
case SILDynamicCastKind::CheckedCastAddrBranchInst:
361+
return cast<CheckedCastAddrBranchInst>(inst)->getTargetType();
353362
case SILDynamicCastKind::CheckedCastBranchInst:
363+
return cast<CheckedCastBranchInst>(inst)->getTargetType();
354364
case SILDynamicCastKind::CheckedCastValueBranchInst:
355-
llvm_unreachable("unsupported");
365+
return cast<CheckedCastValueBranchInst>(inst)->getTargetType();
356366
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
357367
return cast<UnconditionalCheckedCastAddrInst>(inst)->getTargetType();
358368
case SILDynamicCastKind::UnconditionalCheckedCastInst:
@@ -369,7 +379,7 @@ struct SILDynamicCastInst {
369379
case SILDynamicCastKind::CheckedCastBranchInst:
370380
return cast<CheckedCastBranchInst>(inst)->getCastType();
371381
case SILDynamicCastKind::CheckedCastValueBranchInst:
372-
llvm_unreachable("unsupported");
382+
return cast<CheckedCastValueBranchInst>(inst)->getCastType();
373383
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst: {
374384
auto *uccai = dyn_cast<UnconditionalCheckedCastAddrInst>(inst);
375385
return uccai->getDest()->getType();
@@ -384,10 +394,9 @@ struct SILDynamicCastInst {
384394

385395
bool isSourceTypeExact() const {
386396
switch (getKind()) {
387-
case SILDynamicCastKind::CheckedCastAddrBranchInst:
388-
case SILDynamicCastKind::CheckedCastBranchInst:
389397
case SILDynamicCastKind::CheckedCastValueBranchInst:
390-
llvm_unreachable("unsupported");
398+
case SILDynamicCastKind::CheckedCastBranchInst:
399+
case SILDynamicCastKind::CheckedCastAddrBranchInst:
391400
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
392401
case SILDynamicCastKind::UnconditionalCheckedCastInst:
393402
return isa<MetatypeInst>(getSource());
@@ -417,17 +426,30 @@ struct SILDynamicCastInst {
417426

418427
bool isConditional() const {
419428
switch (getKind()) {
420-
case SILDynamicCastKind::CheckedCastAddrBranchInst:
421-
case SILDynamicCastKind::CheckedCastBranchInst:
422-
case SILDynamicCastKind::CheckedCastValueBranchInst:
423-
llvm_unreachable("unsupported");
429+
case SILDynamicCastKind::CheckedCastAddrBranchInst: {
430+
auto f = classifyFeasibility(true /*allow wmo*/);
431+
return f == DynamicCastFeasibility::MaySucceed;
432+
}
433+
case SILDynamicCastKind::CheckedCastBranchInst: {
434+
auto f = classifyFeasibility(false /*allow wmo*/);
435+
return f == DynamicCastFeasibility::MaySucceed;
436+
}
437+
case SILDynamicCastKind::CheckedCastValueBranchInst: {
438+
auto f = classifyFeasibility(false /*allow wmo opts*/);
439+
return f == DynamicCastFeasibility::MaySucceed;
440+
}
424441
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
425442
case SILDynamicCastKind::UnconditionalCheckedCastInst:
426443
return false;
427444
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
428445
llvm_unreachable("unsupported");
429446
}
430447
}
448+
449+
bool canUseScalarCheckedCastInstructions() const {
450+
return swift::canUseScalarCheckedCastInstructions(
451+
getModule(), getSourceType(), getTargetType());
452+
}
431453
};
432454

433455
} // end namespace swift

trunk/include/swift/SILOptimizer/Utils/CastOptimizer.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -147,13 +147,6 @@ class CastOptimizer {
147147
/// Check if it is a bridged cast and optimize it.
148148
///
149149
/// May change the control flow.
150-
SILInstruction *optimizeBridgedCasts(SILInstruction *Inst,
151-
CastConsumptionKind ConsumptionKind,
152-
bool isConditional, SILValue Src,
153-
SILValue Dest, CanType Source,
154-
CanType Target, SILBasicBlock *SuccessBB,
155-
SILBasicBlock *FailureBB);
156-
157150
SILInstruction *optimizeBridgedCasts(SILDynamicCastInst cast);
158151

159152
SILValue optimizeMetatypeConversion(ConversionInst *mci,

0 commit comments

Comments
 (0)