diff options
author | Chijun Sima <simachijun@gmail.com> | 2018-07-13 04:02:13 +0000 |
---|---|---|
committer | Chijun Sima <simachijun@gmail.com> | 2018-07-13 04:02:13 +0000 |
commit | 00712cb749b47ef1e1c71b06958101743f8f3408 (patch) | |
tree | c02bcc136c1df95d9d470ea1422164dbd40fb5d6 /llvm/lib | |
parent | dc5ba317b1c15355560fc3bf42d02f5ef3e9cf3b (diff) | |
download | bcm5719-llvm-00712cb749b47ef1e1c71b06958101743f8f3408.tar.gz bcm5719-llvm-00712cb749b47ef1e1c71b06958101743f8f3408.zip |
[DomTreeUpdater] Ignore updates when both DT and PDT are nullptrs
Summary:
Previously, when both DT and PDT are nullptrs and the UpdateStrategy is Lazy, DomTreeUpdater still pends updates inside.
After this patch, DomTreeUpdater will ignore all updates from(`applyUpdates()/insertEdge*()/deleteEdge*()`) in this case. (call `delBB()` still pends BasicBlock deletion until a flush event according to the doc).
The behavior of DomTreeUpdater previously documented won't change after the patch.
Reviewers: dmgreen, davide, kuhar, brzycki, grosser
Reviewed By: kuhar
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D48974
llvm-svn: 336968
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/IR/DomTreeUpdater.cpp | 43 |
1 files changed, 29 insertions, 14 deletions
diff --git a/llvm/lib/IR/DomTreeUpdater.cpp b/llvm/lib/IR/DomTreeUpdater.cpp index ffdb5c7e0b1..51dd24bccfa 100644 --- a/llvm/lib/IR/DomTreeUpdater.cpp +++ b/llvm/lib/IR/DomTreeUpdater.cpp @@ -56,6 +56,8 @@ bool DomTreeUpdater::isSelfDominance( bool DomTreeUpdater::applyLazyUpdate(DominatorTree::UpdateKind Kind, BasicBlock *From, BasicBlock *To) { + assert(DT || + PDT && "Call applyLazyUpdate() when both DT and PDT are nullptrs."); assert(Strategy == DomTreeUpdater::UpdateStrategy::Lazy && "Call applyLazyUpdate() with Eager strategy error"); // Analyze pending updates to determine if the update is unnecessary. @@ -260,6 +262,9 @@ void DomTreeUpdater::validateDeleteBB(BasicBlock *DelBB) { void DomTreeUpdater::applyUpdates(ArrayRef<DominatorTree::UpdateType> Updates, bool ForceRemoveDuplicates) { + if (!DT && !PDT) + return; + if (Strategy == UpdateStrategy::Lazy || ForceRemoveDuplicates) { SmallVector<DominatorTree::UpdateType, 8> Seen; for (const auto U : Updates) @@ -310,6 +315,9 @@ void DomTreeUpdater::insertEdge(BasicBlock *From, BasicBlock *To) { "Inserted edge does not appear in the CFG"); #endif + if (!DT && !PDT) + return; + // Won't affect DomTree and PostDomTree; discard update. if (From == To) return; @@ -325,23 +333,25 @@ void DomTreeUpdater::insertEdge(BasicBlock *From, BasicBlock *To) { applyLazyUpdate(DominatorTree::Insert, From, To); } -bool DomTreeUpdater::insertEdgeRelaxed(BasicBlock *From, BasicBlock *To) { - if (!isUpdateValid({DominatorTree::Insert, From, To})) - return false; - +void DomTreeUpdater::insertEdgeRelaxed(BasicBlock *From, BasicBlock *To) { if (From == To) - return true; + return; + + if (!DT && !PDT) + return; + + if (!isUpdateValid({DominatorTree::Insert, From, To})) + return; if (Strategy == UpdateStrategy::Eager) { if (DT) DT->insertEdge(From, To); if (PDT) PDT->insertEdge(From, To); - return true; + return; } applyLazyUpdate(DominatorTree::Insert, From, To); - return true; } void DomTreeUpdater::deleteEdge(BasicBlock *From, BasicBlock *To) { @@ -351,6 +361,9 @@ void DomTreeUpdater::deleteEdge(BasicBlock *From, BasicBlock *To) { "Deleted edge still exists in the CFG!"); #endif + if (!DT && !PDT) + return; + // Won't affect DomTree and PostDomTree; discard update. if (From == To) return; @@ -366,23 +379,25 @@ void DomTreeUpdater::deleteEdge(BasicBlock *From, BasicBlock *To) { applyLazyUpdate(DominatorTree::Delete, From, To); } -bool DomTreeUpdater::deleteEdgeRelaxed(BasicBlock *From, BasicBlock *To) { - if (!isUpdateValid({DominatorTree::Delete, From, To})) - return false; - +void DomTreeUpdater::deleteEdgeRelaxed(BasicBlock *From, BasicBlock *To) { if (From == To) - return true; + return; + + if (!DT && !PDT) + return; + + if (!isUpdateValid({DominatorTree::Delete, From, To})) + return; if (Strategy == UpdateStrategy::Eager) { if (DT) DT->deleteEdge(From, To); if (PDT) PDT->deleteEdge(From, To); - return true; + return; } applyLazyUpdate(DominatorTree::Delete, From, To); - return true; } void DomTreeUpdater::dropOutOfDateUpdates() { |