Add a flag to mark a dirty cache entry. This is not yet used, but will eventually
[oota-llvm.git] / include / llvm / Analysis / Dominators.h
index dfb73bd0d747535dd8643891bee3ab45b5d78c64..76998fb36fd8ad8e86fcc949a19b7cf89d39970d 100644 (file)
@@ -253,6 +253,11 @@ public:
     changeImmediateDominator(getNode(BB), getNode(NewBB));
   }
 
+  /// eraseNode - Removes a node from  the dominator tree. Block must not
+  /// domiante any other blocks. Removes node from its immediate dominator's
+  /// children list. Deletes dominator node associated with basic block BB.
+  void eraseNode(BasicBlock *BB);
+
   /// removeNode - Removes a node from the dominator tree.  Block must not
   /// dominate any other blocks.  Invalidates any node pointing to removed
   /// block.
@@ -370,6 +375,14 @@ public:
     Frontiers.insert(std::make_pair(BB, frontier));
   }
 
+  /// removeBlock - Remove basic block BB's frontier.
+  void removeBlock(BasicBlock *BB) {
+    assert(find(BB) != end() && "Block is not in DominanceFrontier!");
+    for (iterator I = begin(), E = end(); I != E; ++I)
+      I->second.erase(BB);
+    Frontiers.erase(BB);
+  }
+
   void addToFrontier(iterator I, BasicBlock *Node) {
     assert(I != end() && "BB is not in DominanceFrontier!");
     I->second.insert(Node);
@@ -424,6 +437,26 @@ public:
   /// frontier to reflect this change.
   void splitBlock(BasicBlock *BB);
 
+  /// BasicBlock BB's new dominator is NewBB. Update BB's dominance frontier
+  /// to reflect this change.
+  void changeImmediateDominator(BasicBlock *BB, BasicBlock *NewBB,
+                                DominatorTree *DT) {
+    // NewBB is now  dominating BB. Which means BB's dominance
+    // frontier is now part of NewBB's dominance frontier. However, BB
+    // itself is not member of NewBB's dominance frontier.
+    DominanceFrontier::iterator NewDFI = find(NewBB);
+    DominanceFrontier::iterator DFI = find(BB);
+    DominanceFrontier::DomSetType BBSet = DFI->second;
+    for (DominanceFrontier::DomSetType::iterator BBSetI = BBSet.begin(),
+           BBSetE = BBSet.end(); BBSetI != BBSetE; ++BBSetI) {
+      BasicBlock *DFMember = *BBSetI;
+      // Insert only if NewBB dominates DFMember.
+      if (!DT->dominates(NewBB, DFMember))
+        NewDFI->second.insert(DFMember);
+    }
+    NewDFI->second.erase(BB);
+  }
+
 private:
   const DomSetType &calculate(const DominatorTree &DT,
                               const DomTreeNode *Node);