Skip to content

Commit aaf4644

Browse files
committed
[cast-opt] Change CheckedCastBranch metatype opts to use SILDynamicCastInst.
1 parent e80c394 commit aaf4644

File tree

2 files changed

+58
-16
lines changed

2 files changed

+58
-16
lines changed

include/swift/SIL/DynamicCasts.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,9 @@ struct SILDynamicCastInst {
210210
SILBasicBlock *getSuccessBlock() {
211211
switch (getKind()) {
212212
case SILDynamicCastKind::CheckedCastAddrBranchInst:
213+
llvm_unreachable("unsupported");
213214
case SILDynamicCastKind::CheckedCastBranchInst:
215+
return cast<CheckedCastBranchInst>(inst)->getSuccessBB();
214216
case SILDynamicCastKind::CheckedCastValueBranchInst:
215217
llvm_unreachable("unsupported");
216218
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
@@ -221,14 +223,32 @@ struct SILDynamicCastInst {
221223
}
222224
}
223225

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:
235+
case SILDynamicCastKind::UnconditionalCheckedCastInst:
236+
return None;
237+
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
238+
llvm_unreachable("unsupported");
239+
}
240+
}
241+
224242
const SILBasicBlock *getSuccessBlock() const {
225243
return const_cast<SILDynamicCastInst &>(*this).getSuccessBlock();
226244
}
227245

228246
SILBasicBlock *getFailureBlock() {
229247
switch (getKind()) {
230248
case SILDynamicCastKind::CheckedCastAddrBranchInst:
249+
llvm_unreachable("unsupported");
231250
case SILDynamicCastKind::CheckedCastBranchInst:
251+
return cast<CheckedCastBranchInst>(inst)->getFailureBB();
232252
case SILDynamicCastKind::CheckedCastValueBranchInst:
233253
llvm_unreachable("unsupported");
234254
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
@@ -239,14 +259,32 @@ struct SILDynamicCastInst {
239259
}
240260
}
241261

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:
271+
case SILDynamicCastKind::UnconditionalCheckedCastInst:
272+
return None;
273+
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
274+
llvm_unreachable("unsupported");
275+
}
276+
}
277+
242278
const SILBasicBlock *getFailureBlock() const {
243279
return const_cast<SILDynamicCastInst &>(*this).getFailureBlock();
244280
}
245281

246282
SILValue getSource() const {
247283
switch (getKind()) {
248284
case SILDynamicCastKind::CheckedCastAddrBranchInst:
285+
llvm_unreachable("unsupported");
249286
case SILDynamicCastKind::CheckedCastBranchInst:
287+
return cast<CheckedCastBranchInst>(inst)->getOperand();
250288
case SILDynamicCastKind::CheckedCastValueBranchInst:
251289
llvm_unreachable("unsupported");
252290
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
@@ -327,7 +365,9 @@ struct SILDynamicCastInst {
327365
SILType getLoweredTargetType() const {
328366
switch (getKind()) {
329367
case SILDynamicCastKind::CheckedCastAddrBranchInst:
368+
llvm_unreachable("unsupported");
330369
case SILDynamicCastKind::CheckedCastBranchInst:
370+
return cast<CheckedCastBranchInst>(inst)->getCastType();
331371
case SILDynamicCastKind::CheckedCastValueBranchInst:
332372
llvm_unreachable("unsupported");
333373
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst: {

lib/SILOptimizer/Utils/CastOptimizer.cpp

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,11 +1098,21 @@ CastOptimizer::optimizeCheckedCastBranchInst(CheckedCastBranchInst *Inst) {
10981098
if (Inst->isExact())
10991099
return nullptr;
11001100

1101-
auto LoweredTargetType = Inst->getCastType();
1102-
auto Loc = Inst->getLoc();
1103-
auto *SuccessBB = Inst->getSuccessBB();
1104-
auto *FailureBB = Inst->getFailureBB();
1105-
auto Op = Inst->getOperand();
1101+
// Local helper we use to simplify replacing a checked_cast_branch with an
1102+
// optimized checked cast branch.
1103+
auto replaceCastHelper = [](SILBuilderWithScope &B,
1104+
SILDynamicCastInst dynamicCast,
1105+
MetatypeInst *mi) -> SILInstruction * {
1106+
return B.createCheckedCastBranch(
1107+
dynamicCast.getLocation(), false /*isExact*/, mi,
1108+
dynamicCast.getLoweredTargetType(), dynamicCast.getSuccessBlock(),
1109+
dynamicCast.getFailureBlock(), *dynamicCast.getSuccessBlockCount(),
1110+
*dynamicCast.getFailureBlockCount());
1111+
};
1112+
1113+
SILDynamicCastInst dynamicCast(Inst);
1114+
1115+
auto Op = dynamicCast.getSource();
11061116

11071117
// Try to simplify checked_cond_br instructions using existential
11081118
// metatypes by propagating a concrete type whenever it can be
@@ -1117,9 +1127,7 @@ CastOptimizer::optimizeCheckedCastBranchInst(CheckedCastBranchInst *Inst) {
11171127
if (auto *IEMI = dyn_cast<InitExistentialMetatypeInst>(Op)) {
11181128
if (auto *MI = dyn_cast<MetatypeInst>(IEMI->getOperand())) {
11191129
SILBuilderWithScope B(Inst, BuilderContext);
1120-
auto *NewI = B.createCheckedCastBranch(
1121-
Loc, /* isExact */ false, MI, LoweredTargetType, SuccessBB, FailureBB,
1122-
Inst->getTrueBBCount(), Inst->getFalseBBCount());
1130+
auto *NewI = replaceCastHelper(B, dynamicCast, MI);
11231131
EraseInstAction(Inst);
11241132
return NewI;
11251133
}
@@ -1183,10 +1191,7 @@ CastOptimizer::optimizeCheckedCastBranchInst(CheckedCastBranchInst *Inst) {
11831191
B.getOpenedArchetypes().addOpenedArchetypeOperands(
11841192
FoundIEI->getTypeDependentOperands());
11851193
auto *MI = B.createMetatype(FoundIEI->getLoc(), SILMetaTy);
1186-
1187-
auto *NewI = B.createCheckedCastBranch(
1188-
Loc, /* isExact */ false, MI, LoweredTargetType, SuccessBB,
1189-
FailureBB, Inst->getTrueBBCount(), Inst->getFalseBBCount());
1194+
auto *NewI = replaceCastHelper(B, dynamicCast, MI);
11901195
EraseInstAction(Inst);
11911196
return NewI;
11921197
}
@@ -1242,10 +1247,7 @@ CastOptimizer::optimizeCheckedCastBranchInst(CheckedCastBranchInst *Inst) {
12421247
B.getOpenedArchetypes().addOpenedArchetypeOperands(
12431248
FoundIERI->getTypeDependentOperands());
12441249
auto *MI = B.createMetatype(FoundIERI->getLoc(), SILMetaTy);
1245-
1246-
auto *NewI = B.createCheckedCastBranch(
1247-
Loc, /* isExact */ false, MI, LoweredTargetType, SuccessBB,
1248-
FailureBB, Inst->getTrueBBCount(), Inst->getFalseBBCount());
1250+
auto *NewI = replaceCastHelper(B, dynamicCast, MI);
12491251
EraseInstAction(Inst);
12501252
return NewI;
12511253
}

0 commit comments

Comments
 (0)