@@ -289,11 +289,17 @@ static bool canZapInstruction(SILInstruction *Inst, bool acceptRefCountInsts,
289
289
if (isa<DestroyAddrInst>(Inst))
290
290
return true ;
291
291
292
- // If we see a store here, we have already checked that we are storing into
293
- // the pointer before we added it to the worklist, so we can skip it.
292
+ // We have already checked that we are storing into the pointer before we
293
+ // added it to the worklist. Here, in the case we are allowing non-trivial
294
+ // stores, check if the store's source is lexical, if so return false.
295
+ // Deleting a dead object with non-trivial stores, will need compensating
296
+ // destroys at the store for it's source, which will shorten the lifetime of
297
+ // the store's source.
294
298
if (auto *store = dyn_cast<StoreInst>(Inst)) {
295
- return !onlyAcceptTrivialStores ||
296
- store->getSrc ()->getType ().isTrivial (*store->getFunction ());
299
+ auto storeSrc = store->getSrc ();
300
+ return storeSrc->getType ().isTrivial (*store->getFunction ()) ||
301
+ (!onlyAcceptTrivialStores &&
302
+ (!store->getFunction ()->hasOwnership () || !storeSrc->isLexical ()));
297
303
}
298
304
299
305
// Conceptually this instruction has no side-effects.
@@ -943,11 +949,18 @@ bool DeadObjectElimination::processKeyPath(KeyPathInst *KPI) {
943
949
return false ;
944
950
}
945
951
946
- // In non-ossa, bail out if we have non-trivial pattern operands
947
- if (!KPI->getFunction ()->hasOwnership ()) {
948
- for (const Operand &Op : KPI->getPatternOperands ()) {
949
- if (!Op.get ()->getType ().isTrivial (*KPI->getFunction ()))
952
+ bool hasOwnership = KPI->getFunction ()->hasOwnership ();
953
+ for (const Operand &Op : KPI->getPatternOperands ()) {
954
+ // In non-ossa, bail out if we have non-trivial pattern operands.
955
+ if (!hasOwnership) {
956
+ if (Op.get ()->getType ().isTrivial (*KPI->getFunction ()))
950
957
return false ;
958
+ continue ;
959
+ }
960
+ // In ossa, bail out if we have non-trivial pattern operand values that are
961
+ // lexical.
962
+ if (Op.get ()->isLexical ()) {
963
+ return false ;
951
964
}
952
965
}
953
966
0 commit comments