]> granicus.if.org Git - llvm/commitdiff
[Dominators] Take fast path when applying <=1 updates
authorJakub Kuderski <kubakuderski@gmail.com>
Wed, 4 Oct 2017 17:32:55 +0000 (17:32 +0000)
committerJakub Kuderski <kubakuderski@gmail.com>
Wed, 4 Oct 2017 17:32:55 +0000 (17:32 +0000)
Summary:
This patch teaches `DT.applyUpdates` to take the fast when applying zero or just one update and makes it not run the internal batch updater machinery.

With this patch, it should no longer make sense to have a special check in user's code that checks the update sequence size before applying them, e.g.
```
if (!MyUpdates.empty())
  DT.applyUpdates(MyUpdates);
```
or
```
if (MyUpdates.size() == 1)
  if (...)
    DT.insertEdge(...)
  else
    DT.deleteEdge(...)
```

Reviewers: dberlin, brzycki, davide, grosser, sanjoy

Reviewed By: dberlin, davide

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D38541

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@314917 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/GenericDomTree.h
include/llvm/Support/GenericDomTreeConstruction.h

index 8d9640f76fd6754aef0fb03eff94c048da3665fe..635c87a106f0b218f7e308debb9cac4c0fd3fe7a 100644 (file)
@@ -522,7 +522,9 @@ class DominatorTreeBase {
   ///
   /// Batch updates should be generally faster when performing longer sequences
   /// of updates than calling insertEdge/deleteEdge manually multiple times, as
-  /// they can reorder the updates and remove redundant ones internally.
+  /// it can reorder the updates and remove redundant ones internally.
+  /// The batch updater is also able to detect sequences of zero and exactly one
+  /// update -- it's optimized to do less work in these cases.
   ///
   /// Note that for postdominators it automatically takes care of applying
   /// updates on reverse edges internally (so there's no need to swap the
index 34c1fe6800add7f6d5b3e5d5400b25c24e57f2d5..460110eb70b701008a0269b7e71c9b08d3416514 100644 (file)
@@ -1122,6 +1122,22 @@ struct SemiNCAInfo {
   //~~
 
   static void ApplyUpdates(DomTreeT &DT, ArrayRef<UpdateT> Updates) {
+    const size_t NumUpdates = Updates.size();
+    if (NumUpdates == 0)
+      return;
+
+    // Take the fast path for a single update and avoid running the batch update
+    // machinery.
+    if (NumUpdates == 1) {
+      const auto &Update = Updates.front();
+      if (Update.getKind() == UpdateKind::Insert)
+        DT.insertEdge(Update.getFrom(), Update.getTo());
+      else
+        DT.deleteEdge(Update.getFrom(), Update.getTo());
+
+      return;
+    }
+
     BatchUpdateInfo BUI;
     LegalizeUpdates(Updates, BUI.Updates);