summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorChijun Sima <simachijun@gmail.com>2018-07-13 04:02:13 +0000
committerChijun Sima <simachijun@gmail.com>2018-07-13 04:02:13 +0000
commit00712cb749b47ef1e1c71b06958101743f8f3408 (patch)
treec02bcc136c1df95d9d470ea1422164dbd40fb5d6 /llvm/lib
parentdc5ba317b1c15355560fc3bf42d02f5ef3e9cf3b (diff)
downloadbcm5719-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.cpp43
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() {
OpenPOWER on IntegriCloud