[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