Skip to content

Commit 84a078b

Browse files
committed
Teach the speculative devirtualize to deal with error basic blocks without args
1 parent 8c079c3 commit 84a078b

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

lib/SILOptimizer/Transforms/SpeculativeDevirtualizer.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -239,11 +239,19 @@ static FullApplySite speculateMonomorphicTarget(FullApplySite AI,
239239
// Split critical edges resulting from VirtAI.
240240
if (auto *TAI = dyn_cast<TryApplyInst>(VirtAI)) {
241241
auto *ErrorBB = TAI->getFunction()->createBasicBlock();
242-
ErrorBB->createPhiArgument(TAI->getErrorBB()->getArgument(0)->getType(),
243-
OwnershipKind::Owned);
242+
SILArgument *ErrorArg = nullptr;
243+
if (TAI->getErrorBB()->getNumArguments() == 1) {
244+
ErrorArg = TAI->getErrorBB()->getArgument(0);
245+
ErrorBB->createPhiArgument(ErrorArg->getType(), OwnershipKind::Owned);
246+
}
244247
Builder.setInsertionPoint(ErrorBB);
245-
Builder.createBranch(TAI->getLoc(), TAI->getErrorBB(),
246-
{ErrorBB->getArgument(0)});
248+
249+
if (ErrorArg) {
250+
Builder.createBranch(TAI->getLoc(), TAI->getErrorBB(),
251+
{ErrorBB->getArgument(0)});
252+
} else {
253+
Builder.createBranch(TAI->getLoc(), TAI->getErrorBB());
254+
}
247255

248256
auto *NormalBB = TAI->getFunction()->createBasicBlock();
249257
NormalBB->createPhiArgument(TAI->getNormalBB()->getArgument(0)->getType(),

0 commit comments

Comments
 (0)