mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
[cast-opt] Simplify some code by hoisting some code/early exiting.
Importantly this lets us know further on in the function that as an invariant we only can have checked_cast_addr_br.
This commit is contained in:
@@ -308,26 +308,29 @@ CastOptimizer::optimizeBridgedObjCToSwiftCast(SILDynamicCastInst dynamicCast) {
|
||||
// TODO: Is it safe to just eliminate the initial retain?
|
||||
Builder.createReleaseValue(Loc, srcOp, Builder.getDefaultAtomicity());
|
||||
|
||||
// If the source of a cast should be destroyed, emit a release.
|
||||
// If we have an unconditional_checked_cast_addr, return early. We do not need
|
||||
// to handle any conditional code.
|
||||
if (isa<UnconditionalCheckedCastAddrInst>(Inst)) {
|
||||
// Destroy the source value as unconditional_checked_cast_addr would.
|
||||
Builder.createReleaseValue(Loc, srcOp, Builder.getDefaultAtomicity());
|
||||
eraseInstAction(Inst);
|
||||
return (newI) ? newI : AI;
|
||||
}
|
||||
|
||||
if (auto *CCABI = dyn_cast<CheckedCastAddrBranchInst>(Inst)) {
|
||||
switch (CCABI->getConsumptionKind()) {
|
||||
case CastConsumptionKind::TakeAlways:
|
||||
Builder.createReleaseValue(Loc, srcOp, Builder.getDefaultAtomicity());
|
||||
break;
|
||||
case CastConsumptionKind::TakeOnSuccess:
|
||||
// Insert a release in the success BB.
|
||||
Builder.setInsertionPoint(SuccessBB->begin());
|
||||
Builder.createReleaseValue(Loc, srcOp, Builder.getDefaultAtomicity());
|
||||
break;
|
||||
case CastConsumptionKind::BorrowAlways:
|
||||
llvm_unreachable("checked_cast_addr_br never has BorrowAlways");
|
||||
case CastConsumptionKind::CopyOnSuccess:
|
||||
break;
|
||||
}
|
||||
auto *CCABI = cast<CheckedCastAddrBranchInst>(Inst);
|
||||
switch (CCABI->getConsumptionKind()) {
|
||||
case CastConsumptionKind::TakeAlways:
|
||||
Builder.createReleaseValue(Loc, srcOp, Builder.getDefaultAtomicity());
|
||||
break;
|
||||
case CastConsumptionKind::TakeOnSuccess:
|
||||
// Insert a release in the success BB.
|
||||
Builder.setInsertionPoint(SuccessBB->begin());
|
||||
Builder.createReleaseValue(Loc, srcOp, Builder.getDefaultAtomicity());
|
||||
break;
|
||||
case CastConsumptionKind::BorrowAlways:
|
||||
llvm_unreachable("checked_cast_addr_br never has BorrowAlways");
|
||||
case CastConsumptionKind::CopyOnSuccess:
|
||||
break;
|
||||
}
|
||||
|
||||
// Results should be checked in case we process a conditional
|
||||
|
||||
Reference in New Issue
Block a user