@@ -282,13 +282,16 @@ static bool convertExtractsToDestructures(CanonicalDefWorklist &copiedDefs,
282282// / the lifetime at it), replace its uses with uses of the moved-from value and
283283// / delete it.
284284static bool eliminateRedundantMove (MoveValueInst *mvi,
285- InstructionDeleter &deleter) {
285+ InstructionDeleter &deleter,
286+ CanonicalDefWorklist &defWorklist) {
286287 if (!isRedundantMoveValue (mvi))
287288 return false ;
288- mvi->replaceAllUsesWith (mvi->getOperand ());
289+ auto original = mvi->getOperand ();
290+ mvi->replaceAllUsesWith (original);
289291 // Call InstructionDeleter::forceDeleteWithUsers to avoid "fixing up"
290292 // ownership of the moved-from value, i.e. inserting a destroy_value.
291293 deleter.forceDeleteWithUsers (mvi);
294+ defWorklist.updateForCopy (original);
292295 return true ;
293296}
294297
@@ -512,12 +515,12 @@ void CopyPropagation::run() {
512515 hoistDestroysOfOwnedLexicalValue (folded, *f, deleter, calleeAnalysis);
513516 // Keep running even if the new move's destroys can't be hoisted.
514517 (void )hoisted;
515- eliminateRedundantMove (folded, deleter);
518+ eliminateRedundantMove (folded, deleter, defWorklist );
516519 firstRun = false ;
517520 }
518521 }
519522 for (auto *mvi : moveValues) {
520- eliminateRedundantMove (mvi, deleter);
523+ eliminateRedundantMove (mvi, deleter, defWorklist );
521524 }
522525 for (auto *argument : f->getArguments ()) {
523526 if (argument->getOwnershipKind () == OwnershipKind::Owned) {
0 commit comments