Skip to content

Commit 57773f7

Browse files
authored
Merge pull request #22039 from aschwaighofer/fix-use-after-free-in-capture-promotion
2 parents feddd1d + 5e1344d commit 57773f7

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

lib/SILOptimizer/IPO/CapturePromotion.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1212,18 +1212,20 @@ static SILValue getOrCreateProjectBoxHelper(SILValue PartialOperand) {
12121212
/// Change the base in mark_dependence.
12131213
static void
12141214
mapMarkDependenceArguments(SingleValueInstruction *root,
1215-
llvm::DenseMap<SILValue, SILValue> &map) {
1216-
for (auto *Use : root->getUses()) {
1215+
llvm::DenseMap<SILValue, SILValue> &map,
1216+
SmallVectorImpl<SILInstruction *> &Delete) {
1217+
SmallVector<Operand *, 16> Uses(root->getUses());
1218+
for (auto *Use : Uses) {
12171219
if (auto *MD = dyn_cast<MarkDependenceInst>(Use->getUser())) {
1218-
mapMarkDependenceArguments(MD, map);
1220+
mapMarkDependenceArguments(MD, map, Delete);
12191221
auto iter = map.find(MD->getBase());
12201222
if (iter != map.end()) {
12211223
MD->setBase(iter->second);
12221224
}
12231225
// Remove mark_dependence on trivial values.
12241226
if (MD->getBase()->getType().isTrivial(MD->getModule())) {
12251227
MD->replaceAllUsesWith(MD->getValue());
1226-
MD->eraseFromParent();
1228+
Delete.push_back(MD);
12271229
}
12281230
}
12291231
}
@@ -1332,7 +1334,10 @@ processPartialApplyInst(SILOptFunctionBuilder &FuncBuilder,
13321334
}
13331335
}
13341336
// Map the mark dependence arguments.
1335-
mapMarkDependenceArguments(NewPAI, capturedMap);
1337+
SmallVector<SILInstruction *, 16> Delete;
1338+
mapMarkDependenceArguments(NewPAI, capturedMap, Delete);
1339+
for (auto *inst : Delete)
1340+
inst->eraseFromParent();
13361341
}
13371342

13381343
return ClonedFn;

0 commit comments

Comments
 (0)