Skip to content

Commit 807b187

Browse files
committed
[cast-opt] Update simplifyCheckedCastAddrBranchInst to use SILDynamicCastInst.
This is another step towards eliminating the many argument call to optimizeBridgedCasts.
1 parent 8fecc79 commit 807b187

File tree

2 files changed

+26
-26
lines changed

2 files changed

+26
-26
lines changed

include/swift/SIL/DynamicCasts.h

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ struct SILDynamicCastInst {
183183
CastConsumptionKind getBridgedConsumptionKind() const {
184184
switch (getKind()) {
185185
case SILDynamicCastKind::CheckedCastAddrBranchInst:
186+
return cast<CheckedCastAddrBranchInst>(inst)->getConsumptionKind();
186187
case SILDynamicCastKind::CheckedCastBranchInst:
187188
case SILDynamicCastKind::CheckedCastValueBranchInst:
188189
llvm_unreachable("unsupported");
@@ -210,7 +211,7 @@ struct SILDynamicCastInst {
210211
SILBasicBlock *getSuccessBlock() {
211212
switch (getKind()) {
212213
case SILDynamicCastKind::CheckedCastAddrBranchInst:
213-
llvm_unreachable("unsupported");
214+
return cast<CheckedCastAddrBranchInst>(inst)->getSuccessBB();
214215
case SILDynamicCastKind::CheckedCastBranchInst:
215216
return cast<CheckedCastBranchInst>(inst)->getSuccessBB();
216217
case SILDynamicCastKind::CheckedCastValueBranchInst:
@@ -246,7 +247,7 @@ struct SILDynamicCastInst {
246247
SILBasicBlock *getFailureBlock() {
247248
switch (getKind()) {
248249
case SILDynamicCastKind::CheckedCastAddrBranchInst:
249-
llvm_unreachable("unsupported");
250+
return cast<CheckedCastAddrBranchInst>(inst)->getFailureBB();
250251
case SILDynamicCastKind::CheckedCastBranchInst:
251252
return cast<CheckedCastBranchInst>(inst)->getFailureBB();
252253
case SILDynamicCastKind::CheckedCastValueBranchInst:
@@ -282,7 +283,7 @@ struct SILDynamicCastInst {
282283
SILValue getSource() const {
283284
switch (getKind()) {
284285
case SILDynamicCastKind::CheckedCastAddrBranchInst:
285-
llvm_unreachable("unsupported");
286+
return cast<CheckedCastAddrBranchInst>(inst)->getSrc();
286287
case SILDynamicCastKind::CheckedCastBranchInst:
287288
return cast<CheckedCastBranchInst>(inst)->getOperand();
288289
case SILDynamicCastKind::CheckedCastValueBranchInst:
@@ -300,6 +301,7 @@ struct SILDynamicCastInst {
300301
SILValue getDest() const {
301302
switch (getKind()) {
302303
case SILDynamicCastKind::CheckedCastAddrBranchInst:
304+
return cast<CheckedCastAddrBranchInst>(inst)->getDest();
303305
case SILDynamicCastKind::CheckedCastBranchInst:
304306
case SILDynamicCastKind::CheckedCastValueBranchInst:
305307
llvm_unreachable("unsupported");
@@ -318,6 +320,7 @@ struct SILDynamicCastInst {
318320
CanType getSourceType() const {
319321
switch (getKind()) {
320322
case SILDynamicCastKind::CheckedCastAddrBranchInst:
323+
return cast<CheckedCastAddrBranchInst>(inst)->getSourceType();
321324
case SILDynamicCastKind::CheckedCastBranchInst:
322325
case SILDynamicCastKind::CheckedCastValueBranchInst:
323326
llvm_unreachable("unsupported");
@@ -350,6 +353,7 @@ struct SILDynamicCastInst {
350353
CanType getTargetType() const {
351354
switch (getKind()) {
352355
case SILDynamicCastKind::CheckedCastAddrBranchInst:
356+
return cast<CheckedCastAddrBranchInst>(inst)->getTargetType();
353357
case SILDynamicCastKind::CheckedCastBranchInst:
354358
case SILDynamicCastKind::CheckedCastValueBranchInst:
355359
llvm_unreachable("unsupported");
@@ -384,10 +388,10 @@ struct SILDynamicCastInst {
384388

385389
bool isSourceTypeExact() const {
386390
switch (getKind()) {
387-
case SILDynamicCastKind::CheckedCastAddrBranchInst:
388391
case SILDynamicCastKind::CheckedCastBranchInst:
389392
case SILDynamicCastKind::CheckedCastValueBranchInst:
390393
llvm_unreachable("unsupported");
394+
case SILDynamicCastKind::CheckedCastAddrBranchInst:
391395
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
392396
case SILDynamicCastKind::UnconditionalCheckedCastInst:
393397
return isa<MetatypeInst>(getSource());
@@ -417,17 +421,25 @@ struct SILDynamicCastInst {
417421

418422
bool isConditional() const {
419423
switch (getKind()) {
420-
case SILDynamicCastKind::CheckedCastAddrBranchInst:
421424
case SILDynamicCastKind::CheckedCastBranchInst:
422425
case SILDynamicCastKind::CheckedCastValueBranchInst:
423426
llvm_unreachable("unsupported");
427+
case SILDynamicCastKind::CheckedCastAddrBranchInst: {
428+
auto f = classifyFeasibility(true /*allow wmo*/);
429+
return f == DynamicCastFeasibility::MaySucceed;
430+
}
424431
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
425432
case SILDynamicCastKind::UnconditionalCheckedCastInst:
426433
return false;
427434
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
428435
llvm_unreachable("unsupported");
429436
}
430437
}
438+
439+
bool canUseScalarCheckedCastInstructions() const {
440+
return swift::canUseScalarCheckedCastInstructions(
441+
getModule(), getSourceType(), getTargetType());
442+
}
431443
};
432444

433445
} // end namespace swift

lib/SILOptimizer/Utils/CastOptimizer.cpp

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -689,25 +689,18 @@ SILInstruction *CastOptimizer::simplifyCheckedCastAddrBranchInst(
689689
if (!Inst)
690690
return nullptr;
691691

692-
auto Loc = Inst->getLoc();
693-
auto Src = Inst->getSrc();
694-
auto Dest = Inst->getDest();
695-
auto SourceType = Inst->getSourceType();
696-
auto TargetType = Inst->getTargetType();
697-
auto *SuccessBB = Inst->getSuccessBB();
698-
auto *FailureBB = Inst->getFailureBB();
699-
auto &Mod = Inst->getModule();
692+
SILDynamicCastInst dynamicCast(Inst);
693+
auto Loc = dynamicCast.getLocation();
694+
auto Src = dynamicCast.getSource();
695+
auto Dest = dynamicCast.getDest();
696+
auto *SuccessBB = dynamicCast.getSuccessBlock();
697+
auto *FailureBB = dynamicCast.getFailureBlock();
700698

701699
SILBuilderWithScope Builder(Inst, BuilderContext);
702700

703-
// Try to determine the outcome of the cast from a known type
704-
// to a protocol type at compile-time.
705-
bool isSourceTypeExact = isa<MetatypeInst>(Inst->getSrc());
706-
707701
// Check if we can statically predict the outcome of the cast.
708702
auto Feasibility =
709-
classifyDynamicCast(Mod.getSwiftModule(), SourceType, TargetType,
710-
isSourceTypeExact, Mod.isWholeModule());
703+
dynamicCast.classifyFeasibility(true /*allow whole module*/);
711704

712705
if (Feasibility == DynamicCastFeasibility::WillFail) {
713706
if (shouldDestroyOnFailure(Inst->getConsumptionKind())) {
@@ -738,10 +731,7 @@ SILInstruction *CastOptimizer::simplifyCheckedCastAddrBranchInst(
738731
// To apply the bridged optimizations, we should
739732
// ensure that types are not existential,
740733
// and that not both types are classes.
741-
BridgedI = optimizeBridgedCasts(
742-
Inst, Inst->getConsumptionKind(),
743-
/* isConditional */ Feasibility == DynamicCastFeasibility::MaySucceed,
744-
Src, Dest, SourceType, TargetType, SuccessBB, FailureBB);
734+
BridgedI = optimizeBridgedCasts(dynamicCast);
745735

746736
if (!BridgedI) {
747737
// If the cast may succeed or fail, and it can't be optimized into a
@@ -787,9 +777,7 @@ SILInstruction *CastOptimizer::simplifyCheckedCastAddrBranchInst(
787777
break;
788778
}
789779

790-
if (!emitSuccessfulIndirectUnconditionalCast(Builder, Mod.getSwiftModule(),
791-
Loc, Src, SourceType, Dest,
792-
TargetType, Inst)) {
780+
if (!emitSuccessfulIndirectUnconditionalCast(Builder, Loc, dynamicCast)) {
793781
// No optimization was possible.
794782
return nullptr;
795783
}

0 commit comments

Comments
 (0)