[llvm] 5429c82 - [Attributor][FIX] Avoid dangling pointers during code deletion
Johannes Doerfert via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 23 16:43:37 PST 2020
Author: Johannes Doerfert
Date: 2020-01-23T18:42:45-06:00
New Revision: 5429c82db2295f191c05fca42659b2998224c1fe
URL: https://github.com/llvm/llvm-project/commit/5429c82db2295f191c05fca42659b2998224c1fe
DIFF: https://github.com/llvm/llvm-project/commit/5429c82db2295f191c05fca42659b2998224c1fe.diff
LOG: [Attributor][FIX] Avoid dangling pointers during code deletion
It can happen that we have instructions in the ToBeDeletedInsts set
which are deleted earlier already. To avoid dangling pointers we use
weak tracking handles.
Added:
Modified:
llvm/include/llvm/Transforms/IPO/Attributor.h
llvm/lib/Transforms/IPO/Attributor.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Transforms/IPO/Attributor.h b/llvm/include/llvm/Transforms/IPO/Attributor.h
index f7430a83e8d7..bf97d4dca297 100644
--- a/llvm/include/llvm/Transforms/IPO/Attributor.h
+++ b/llvm/include/llvm/Transforms/IPO/Attributor.h
@@ -1192,7 +1192,7 @@ struct Attributor {
///{
SmallPtrSet<Function *, 8> ToBeDeletedFunctions;
SmallPtrSet<BasicBlock *, 8> ToBeDeletedBlocks;
- SmallPtrSet<Instruction *, 8> ToBeDeletedInsts;
+ SmallDenseSet<WeakVH, 8> ToBeDeletedInsts;
///}
};
diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp
index c65925bc4e5d..648dc8f2ba18 100644
--- a/llvm/lib/Transforms/IPO/Attributor.cpp
+++ b/llvm/lib/Transforms/IPO/Attributor.cpp
@@ -6131,12 +6131,14 @@ ChangeStatus Attributor::run(Module &M) {
for (Instruction *I : TerminatorsToFold)
ConstantFoldTerminator(I->getParent());
- for (Instruction *I : ToBeDeletedInsts) {
- I->replaceAllUsesWith(UndefValue::get(I->getType()));
- if (!isa<PHINode>(I) && isInstructionTriviallyDead(I))
- DeadInsts.push_back(I);
- else
- I->eraseFromParent();
+ for (auto &V : ToBeDeletedInsts) {
+ if (Instruction *I = dyn_cast_or_null<Instruction>(V)) {
+ I->replaceAllUsesWith(UndefValue::get(I->getType()));
+ if (!isa<PHINode>(I) && isInstructionTriviallyDead(I))
+ DeadInsts.push_back(I);
+ else
+ I->eraseFromParent();
+ }
}
RecursivelyDeleteTriviallyDeadInstructions(DeadInsts);
More information about the llvm-commits
mailing list