mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
[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
This commit is contained in:
parent
ec11a04ab3
commit
514bfb5e93
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user