@@ -210,21 +210,15 @@ SILInstruction *SILCombiner::visitSwitchEnumAddrInst(SwitchEnumAddrInst *SEAI) {
210
210
auto eltType = Addr->getType ().getEnumElementType (
211
211
c.first , Builder.getModule (), Builder.getTypeExpansionContext ());
212
212
eltType = eltType.getObjectType ();
213
- if (eltType.isTrivial (Builder.getFunction ())) {
214
- c.second ->createPhiArgument (eltType, OwnershipKind::None);
215
- } else {
216
- c.second ->createPhiArgument (eltType, OwnershipKind::Guaranteed);
217
- }
213
+ sei->createResult (c.second , eltType);
218
214
}
219
215
Builder.setInsertionPoint (c.second ->front ().getIterator ());
220
- Builder.emitEndBorrowOperation (SEAI ->getLoc (), EnumVal);
216
+ Builder.emitEndBorrowOperation (sei ->getLoc (), EnumVal);
221
217
}
222
-
218
+ sei-> createDefaultResult ();
223
219
if (auto defaultBlock = sei->getDefaultBBOrNull ()) {
224
- defaultBlock.get ()->createPhiArgument (EnumVal->getType (),
225
- OwnershipKind::Guaranteed);
226
220
Builder.setInsertionPoint (defaultBlock.get ()->front ().getIterator ());
227
- Builder.emitEndBorrowOperation (SEAI ->getLoc (), EnumVal);
221
+ Builder.emitEndBorrowOperation (sei ->getLoc (), EnumVal);
228
222
}
229
223
}
230
224
@@ -2005,16 +1999,15 @@ SILInstruction *SILCombiner::visitCondBranchInst(CondBranchInst *CBI) {
2005
1999
//
2006
2000
// 3. In each destination block, we need to create an argument and end the
2007
2001
// lifetime of that argument.
2008
- auto enumOperandType = SEI->getEnumOperand ()->getType ();
2009
- if (DefaultBB) {
2010
- auto *defaultArg =
2011
- DefaultBB->createPhiArgument (enumOperandType, OwnershipKind::Owned);
2012
- SILBuilderWithScope innerBuilder (defaultArg->getNextInstruction (),
2013
- Builder);
2014
- auto loc = RegularLocation::getAutoGeneratedLocation ();
2015
- innerBuilder.emitDestroyValueOperation (loc, defaultArg);
2002
+ SILValue selectEnumOperand = SEI->getEnumOperand ();
2003
+ SILValue switchEnumOperand = selectEnumOperand;
2004
+ if (selectEnumOperand.getOwnershipKind () != OwnershipKind::None) {
2005
+ switchEnumOperand =
2006
+ makeCopiedValueAvailable (selectEnumOperand, Builder.getInsertionBB ());
2016
2007
}
2017
-
2008
+ auto *switchEnum = Builder.createSwitchEnum (
2009
+ SEI->getLoc (), switchEnumOperand, DefaultBB, Cases);
2010
+ auto enumOperandType = SEI->getEnumOperand ()->getType ();
2018
2011
for (auto pair : Cases) {
2019
2012
// We only need to create the phi argument if our case doesn't have an
2020
2013
// associated value.
@@ -2026,22 +2019,24 @@ SILInstruction *SILCombiner::visitCondBranchInst(CondBranchInst *CBI) {
2026
2019
2027
2020
auto enumEltType =
2028
2021
enumOperandType.getEnumElementType (enumEltDecl, block->getParent ());
2029
- auto *arg = block-> createPhiArgument (enumEltType, OwnershipKind::Owned );
2022
+ auto *arg = switchEnum-> createResult (block, enumEltType );
2030
2023
SILBuilderWithScope innerBuilder (arg->getNextInstruction (), Builder);
2031
- auto loc = RegularLocation::getAutoGeneratedLocation ();
2032
- innerBuilder.emitDestroyValueOperation (loc, arg);
2024
+ // The switch enum may change ownership resulting in Guaranteed or None.
2025
+ if (arg->getOwnershipKind () == OwnershipKind::Owned) {
2026
+ auto loc = RegularLocation::getAutoGeneratedLocation ();
2027
+ innerBuilder.emitDestroyValueOperation (loc, arg);
2028
+ }
2033
2029
}
2034
-
2035
- SILValue selectEnumOperand = SEI->getEnumOperand ();
2036
- SILValue switchEnumOperand = selectEnumOperand;
2037
- if (selectEnumOperand.getOwnershipKind () != OwnershipKind::None) {
2038
- switchEnumOperand = makeCopiedValueAvailable (selectEnumOperand,
2039
- Builder.getInsertionBB ());
2030
+ if (auto defaultArg = switchEnum->createDefaultResult ()) {
2031
+ SILBuilderWithScope innerBuilder (defaultArg->getNextInstruction (), SEI);
2032
+ // The switch enum may change ownership resulting in Guaranteed or None.
2033
+ if (defaultArg->getOwnershipKind () == OwnershipKind::Owned) {
2034
+ auto loc = RegularLocation::getAutoGeneratedLocation ();
2035
+ innerBuilder.emitDestroyValueOperation (loc, defaultArg);
2036
+ }
2040
2037
}
2041
- return Builder.createSwitchEnum (SEI->getLoc (), switchEnumOperand, DefaultBB,
2042
- Cases);
2038
+ return switchEnum;
2043
2039
}
2044
-
2045
2040
return nullptr ;
2046
2041
}
2047
2042
0 commit comments