[llvm-commits] [llvm] r95073 - /llvm/trunk/include/llvm/ADT/ImmutableIntervalMap.h

Zhongxing Xu xuzhongxing at gmail.com
Mon Feb 1 22:22:09 PST 2010


Author: zhongxingxu
Date: Tue Feb  2 00:22:08 2010
New Revision: 95073

URL: http://llvm.org/viewvc/llvm-project?rev=95073&view=rev
Log:
More logic correction: RemoveOverlap should always create new tree. Add a
parameter to record whether changes actually happened.

Modified:
    llvm/trunk/include/llvm/ADT/ImmutableIntervalMap.h

Modified: llvm/trunk/include/llvm/ADT/ImmutableIntervalMap.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ImmutableIntervalMap.h?rev=95073&r1=95072&r2=95073&view=diff

==============================================================================
--- llvm/trunk/include/llvm/ADT/ImmutableIntervalMap.h (original)
+++ llvm/trunk/include/llvm/ADT/ImmutableIntervalMap.h Tue Feb  2 00:22:08 2010
@@ -131,31 +131,31 @@
 
   // Remove all overlaps from T.
   TreeTy *RemoveAllOverlaps(TreeTy *T, key_type_ref K) {
-    TreeTy *OldTree, *NewTree;
-    NewTree = T;
-
+    bool Changed;
     do {
-      OldTree = NewTree;
-      NewTree = RemoveOverlap(OldTree, K);
-    } while (NewTree != OldTree);
+      Changed = false;
+      T = RemoveOverlap(T, K, Changed);
+      MarkImmutable(T);
+    } while (Changed);
 
-    return NewTree;
+    return T;
   }
 
   // Remove one overlap from T.
-  TreeTy *RemoveOverlap(TreeTy *T, key_type_ref K) {
+  TreeTy *RemoveOverlap(TreeTy *T, key_type_ref K, bool &Changed) {
     if (!T)
       return NULL;
     Interval CurrentK = ImutInfo::KeyOfValue(Value(T));
 
     // If current key does not overlap the inserted key.
     if (CurrentK.getStart() > K.getEnd())
-      return RemoveOverlap(Left(T), K);
+      return Balance(RemoveOverlap(Left(T), K, Changed), Value(T), Right(T));
     else if (CurrentK.getEnd() < K.getStart())
-      return RemoveOverlap(Right(T), K);
+      return Balance(Left(T), Value(T), RemoveOverlap(Right(T), K, Changed));
 
     // Current key overlaps with the inserted key.
     // Remove the current key.
+    Changed = true;
     TreeTy *OldNode = T;
     T = Remove_internal(CurrentK, T);
     // Add back the unoverlapped part of the current key.





More information about the llvm-commits mailing list