diff options
author | Chijun Sima <simachijun@gmail.com> | 2018-08-15 13:56:21 +0000 |
---|---|---|
committer | Chijun Sima <simachijun@gmail.com> | 2018-08-15 13:56:21 +0000 |
commit | e8263f33d93c811bfc26c7d2d2eaaee4196d06be (patch) | |
tree | ce53d2c38661e52876d2c020a90cff9fe0f2617f | |
parent | 942e8ed19d519fa983d1c06acc9390db800c1761 (diff) | |
download | bcm5719-llvm-e8263f33d93c811bfc26c7d2d2eaaee4196d06be.tar.gz bcm5719-llvm-e8263f33d93c811bfc26c7d2d2eaaee4196d06be.zip |
[SimplifyCFG] Remove pointer from SmallPtrSet before deletion
Summary:
Previously, `eraseFromParent()` calls `delete` which invalidates the value of the pointer. Copying the value of the pointer later is undefined behavior in C++11 and implementation-defined (which may cause a segfault on implementations having strict pointer safety) in C++14.
This patch removes the BasicBlock pointer from related SmallPtrSet before `delete` invalidates it in the SimplifyCFG pass.
Reviewers: kuhar, dmgreen, davide, trentxintong
Reviewed By: kuhar, dmgreen
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D50717
llvm-svn: 339773
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index c87b5c16ffc..d88a908d219 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -3861,9 +3861,9 @@ bool SimplifyCFGOpt::SimplifySingleResume(ResumeInst *RI) { } // The landingpad is now unreachable. Zap it. - BB->eraseFromParent(); if (LoopHeaders) LoopHeaders->erase(BB); + BB->eraseFromParent(); return true; } @@ -4083,9 +4083,9 @@ bool SimplifyCFGOpt::SimplifyReturn(ReturnInst *RI, IRBuilder<> &Builder) { // If we eliminated all predecessors of the block, delete the block now. if (pred_empty(BB)) { // We know there are no successors, so just nuke the block. - BB->eraseFromParent(); if (LoopHeaders) LoopHeaders->erase(BB); + BB->eraseFromParent(); } return true; @@ -4245,9 +4245,9 @@ bool SimplifyCFGOpt::SimplifyUnreachable(UnreachableInst *UI) { // If this block is now dead, remove it. if (pred_empty(BB) && BB != &BB->getParent()->getEntryBlock()) { // We know there are no successors, so just nuke the block. - BB->eraseFromParent(); if (LoopHeaders) LoopHeaders->erase(BB); + BB->eraseFromParent(); return true; } |