diff --git a/include/llvm/Transforms/Utils/Local.h b/include/llvm/Transforms/Utils/Local.h index be619d74da3..79b743d6752 100644 --- a/include/llvm/Transforms/Utils/Local.h +++ b/include/llvm/Transforms/Utils/Local.h @@ -153,7 +153,7 @@ bool RecursivelyDeleteTriviallyDeadInstructions( /// `DeadInsts` will be used as scratch storage for this routine and will be /// empty afterward. void RecursivelyDeleteTriviallyDeadInstructions( - SmallVectorImpl &DeadInsts, + SmallVectorImpl &DeadInsts, const TargetLibraryInfo *TLI = nullptr, MemorySSAUpdater *MSSAU = nullptr); /// If the specified value is an effectively dead PHI node, due to being a diff --git a/lib/Transforms/IPO/Attributor.cpp b/lib/Transforms/IPO/Attributor.cpp index f2995817eaf..baa1cb125d7 100644 --- a/lib/Transforms/IPO/Attributor.cpp +++ b/lib/Transforms/IPO/Attributor.cpp @@ -6041,7 +6041,7 @@ ChangeStatus Attributor::run(Module &M) { << ToBeDeletedInsts.size() << " instructions and " << ToBeChangedUses.size() << " uses\n"); - SmallVector DeadInsts; + SmallVector DeadInsts; SmallVector TerminatorsToFold; for (auto &It : ToBeChangedUses) { diff --git a/lib/Transforms/Scalar/InstSimplifyPass.cpp b/lib/Transforms/Scalar/InstSimplifyPass.cpp index e8bbf2936da..e87b622ab19 100644 --- a/lib/Transforms/Scalar/InstSimplifyPass.cpp +++ b/lib/Transforms/Scalar/InstSimplifyPass.cpp @@ -40,7 +40,7 @@ static bool runImpl(Function &F, const SimplifyQuery &SQ, if (!SQ.DT->isReachableFromEntry(&BB)) continue; - SmallVector DeadInstsInBB; + SmallVector DeadInstsInBB; for (Instruction &I : BB) { // The first time through the loop, ToSimplify is empty and we try to // simplify all instructions. On later iterations, ToSimplify is not diff --git a/lib/Transforms/Scalar/LoopInstSimplify.cpp b/lib/Transforms/Scalar/LoopInstSimplify.cpp index 901204181a7..3153a872119 100644 --- a/lib/Transforms/Scalar/LoopInstSimplify.cpp +++ b/lib/Transforms/Scalar/LoopInstSimplify.cpp @@ -68,7 +68,7 @@ static bool simplifyLoopInst(Loop &L, DominatorTree &DT, LoopInfo &LI, // While simplifying we may discover dead code or cause code to become dead. // Keep track of all such instructions and we will delete them at the end. - SmallVector DeadInsts; + SmallVector DeadInsts; // First we want to create an RPO traversal of the loop body. By processing in // RPO we can ensure that definitions are processed prior to uses (for non PHI diff --git a/lib/Transforms/Utils/Local.cpp b/lib/Transforms/Utils/Local.cpp index 5b188fc4385..10afed34718 100644 --- a/lib/Transforms/Utils/Local.cpp +++ b/lib/Transforms/Utils/Local.cpp @@ -443,7 +443,7 @@ bool llvm::RecursivelyDeleteTriviallyDeadInstructions( if (!I || !isInstructionTriviallyDead(I, TLI)) return false; - SmallVector DeadInsts; + SmallVector DeadInsts; DeadInsts.push_back(I); RecursivelyDeleteTriviallyDeadInstructions(DeadInsts, TLI, MSSAU); @@ -451,21 +451,24 @@ bool llvm::RecursivelyDeleteTriviallyDeadInstructions( } void llvm::RecursivelyDeleteTriviallyDeadInstructions( - SmallVectorImpl &DeadInsts, const TargetLibraryInfo *TLI, + SmallVectorImpl &DeadInsts, const TargetLibraryInfo *TLI, MemorySSAUpdater *MSSAU) { // Process the dead instruction list until empty. while (!DeadInsts.empty()) { - Instruction &I = *DeadInsts.pop_back_val(); - assert(I.use_empty() && "Instructions with uses are not dead."); - assert(isInstructionTriviallyDead(&I, TLI) && + Value *V = DeadInsts.pop_back_val(); + Instruction *I = cast_or_null(V); + if (!I) + continue; + assert(isInstructionTriviallyDead(I, TLI) && "Live instruction found in dead worklist!"); + assert(I->use_empty() && "Instructions with uses are not dead."); // Don't lose the debug info while deleting the instructions. - salvageDebugInfo(I); + salvageDebugInfo(*I); // Null out all of the instruction's operands to see if any operand becomes // dead as we go. - for (Use &OpU : I.operands()) { + for (Use &OpU : I->operands()) { Value *OpV = OpU.get(); OpU.set(nullptr); @@ -480,9 +483,9 @@ void llvm::RecursivelyDeleteTriviallyDeadInstructions( DeadInsts.push_back(OpI); } if (MSSAU) - MSSAU->removeMemoryAccess(&I); + MSSAU->removeMemoryAccess(I); - I.eraseFromParent(); + I->eraseFromParent(); } }