diff --git a/llvm/include/llvm/Transforms/IPO/Attributor.h b/llvm/include/llvm/Transforms/IPO/Attributor.h --- a/llvm/include/llvm/Transforms/IPO/Attributor.h +++ b/llvm/include/llvm/Transforms/IPO/Attributor.h @@ -823,6 +823,12 @@ return true; } + /// Record that \p I is to be replaced with `unreachable` after information + /// was manifested. + void changeToUnreachableAfterManifest(Instruction *I) { + ToBeChangedToUnreachableInsts.insert(I); + } + /// Record that \p I is deleted after information was manifested. This also /// triggers deletion of trivially dead istructions. void deleteAfterManifest(Instruction &I) { ToBeDeletedInsts.insert(&I); } @@ -1031,6 +1037,9 @@ /// then trivially dead instructions as well. DenseMap ToBeChangedUses; + /// Instructions we replace with `unreachable` insts after manifest is done. + SmallPtrSet ToBeChangedToUnreachableInsts; + /// Functions, blocks, and instructions we delete after manifest is done. /// ///{ diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp --- a/llvm/lib/Transforms/IPO/Attributor.cpp +++ b/llvm/lib/Transforms/IPO/Attributor.cpp @@ -2049,7 +2049,7 @@ if (!UBMemAccessInsts.size()) return ChangeStatus::UNCHANGED; for (Instruction *I : UBMemAccessInsts) - changeToUnreachable(I, /* UseLLVMTrap */ false); + A.changeToUnreachableAfterManifest(I); return ChangeStatus::CHANGED; } @@ -2736,7 +2736,7 @@ BB = SplitPos->getParent(); SplitBlock(BB, SplitPos); - changeToUnreachable(BB->getTerminator(), /* UseLLVMTrap */ false); + A.changeToUnreachableAfterManifest(BB->getTerminator()); HasChanged = ChangeStatus::CHANGED; } @@ -5459,7 +5459,6 @@ SmallVector DeadInsts; SmallVector TerminatorsToFold; - SmallVector UnreachablesToInsert; for (auto &It : ToBeChangedUses) { Use *U = It.first; @@ -5476,13 +5475,13 @@ if (isa(NewV) && isa(U->getUser())) { Instruction *UserI = cast(U->getUser()); if (isa(NewV)) { - UnreachablesToInsert.push_back(UserI); + ToBeChangedToUnreachableInsts.insert(UserI); } else { TerminatorsToFold.push_back(UserI); } } } - for (Instruction *I : UnreachablesToInsert) + for (Instruction *I : ToBeChangedToUnreachableInsts) changeToUnreachable(I, /* UseLLVMTrap */ false); for (Instruction *I : TerminatorsToFold) ConstantFoldTerminator(I->getParent());