diff options
| author | Hideto Ueno <uenoku.tokotoko@gmail.com> | 2019-12-27 02:39:37 +0900 |
|---|---|---|
| committer | Hideto Ueno <uenoku.tokotoko@gmail.com> | 2019-12-27 02:39:37 +0900 |
| commit | cb5eb13eafdcf2d6ad8dc3a2c7b25eea3948839d (patch) | |
| tree | b75590fe20a7a1911efe4ff3b159b716e5d4799d /llvm | |
| parent | ffd57408efd4c8d455616a5ff4f623250e8580c9 (diff) | |
| download | bcm5719-llvm-cb5eb13eafdcf2d6ad8dc3a2c7b25eea3948839d.tar.gz bcm5719-llvm-cb5eb13eafdcf2d6ad8dc3a2c7b25eea3948839d.zip | |
[Attributor] Add helper to change an instruction to `unreachable` inst
Summary: Calling `changeToUnreachable` in `manifest` from different places might cause really unpredictable problems. As other deleting functions are doing, we need to change these instructions after all `manifest`.
Reviewers: jdoerfert, sstefan1
Reviewed By: jdoerfert
Subscribers: hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D71910
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/Transforms/IPO/Attributor.h | 9 | ||||
| -rw-r--r-- | llvm/lib/Transforms/IPO/Attributor.cpp | 9 |
2 files changed, 13 insertions, 5 deletions
diff --git a/llvm/include/llvm/Transforms/IPO/Attributor.h b/llvm/include/llvm/Transforms/IPO/Attributor.h index 25b3573a190..49196e08fea 100644 --- a/llvm/include/llvm/Transforms/IPO/Attributor.h +++ b/llvm/include/llvm/Transforms/IPO/Attributor.h @@ -823,6 +823,12 @@ struct Attributor { 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 @@ private: /// then trivially dead instructions as well. DenseMap<Use *, Value *> ToBeChangedUses; + /// Instructions we replace with `unreachable` insts after manifest is done. + SmallPtrSet<Instruction *, 8> 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 index deb11011f8e..65f02a72754 100644 --- a/llvm/lib/Transforms/IPO/Attributor.cpp +++ b/llvm/lib/Transforms/IPO/Attributor.cpp @@ -2049,7 +2049,7 @@ struct AAUndefinedBehaviorImpl : public AAUndefinedBehavior { if (!UBMemAccessInsts.size()) return ChangeStatus::UNCHANGED; for (Instruction *I : UBMemAccessInsts) - changeToUnreachable(I, /* UseLLVMTrap */ false); + A.changeToUnreachableAfterManifest(I); return ChangeStatus::CHANGED; } @@ -2736,7 +2736,7 @@ struct AAIsDeadFunction : public AAIsDead { BB = SplitPos->getParent(); SplitBlock(BB, SplitPos); - changeToUnreachable(BB->getTerminator(), /* UseLLVMTrap */ false); + A.changeToUnreachableAfterManifest(BB->getTerminator()); HasChanged = ChangeStatus::CHANGED; } @@ -5459,7 +5459,6 @@ ChangeStatus Attributor::run(Module &M) { SmallVector<Instruction *, 32> DeadInsts; SmallVector<Instruction *, 32> TerminatorsToFold; - SmallVector<Instruction *, 32> UnreachablesToInsert; for (auto &It : ToBeChangedUses) { Use *U = It.first; @@ -5476,13 +5475,13 @@ ChangeStatus Attributor::run(Module &M) { if (isa<Constant>(NewV) && isa<BranchInst>(U->getUser())) { Instruction *UserI = cast<Instruction>(U->getUser()); if (isa<UndefValue>(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()); |

