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

Zhongxing Xu xuzhongxing at gmail.com
Mon Feb 1 18:40:56 PST 2010


Author: zhongxingxu
Date: Mon Feb  1 20:40:56 2010
New Revision: 95056

URL: http://llvm.org/viewvc/llvm-project?rev=95056&view=rev
Log:
Fix a bunch of errors in the old logic.

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=95056&r1=95055&r2=95056&view=diff

==============================================================================
--- llvm/trunk/include/llvm/ADT/ImmutableIntervalMap.h (original)
+++ llvm/trunk/include/llvm/ADT/ImmutableIntervalMap.h Mon Feb  1 20:40:56 2010
@@ -93,16 +93,15 @@
 
 private:
   TreeTy *Add_internal(value_type_ref V, TreeTy *T) {
+    key_type_ref K = ImutInfo::KeyOfValue(V);
+    T = RemoveAllOverlaps(T, K);
     if (isEmpty(T))
       return CreateNode(NULL, V, NULL);
 
     assert(!T->isMutable());
 
-    key_type_ref K = ImutInfo::KeyOfValue(V);
     key_type_ref KCurrent = ImutInfo::KeyOfValue(Value(T));
 
-    T = RemoveAllOverlaps(T, K);
-
     if (ImutInfo::isLess(K, KCurrent))
       return Balance(Add_internal(V, Left(T)), Value(T), Right(T));
     else
@@ -113,14 +112,19 @@
   TreeTy *RemoveAllOverlaps(TreeTy *T, key_type_ref K) {
     TreeTy *OldTree, *NewTree;
     NewTree = T;
+
     do {
       OldTree = NewTree;
       NewTree = RemoveOverlap(OldTree, K);
     } while (NewTree != OldTree);
+
+    return NewTree;
   }
 
   // Remove one overlap from T.
   TreeTy *RemoveOverlap(TreeTy *T, key_type_ref K) {
+    if (!T)
+      return NULL;
     Interval CurrentK = ImutInfo::KeyOfValue(Value(T));
 
     // If current key does not overlap the inserted key.
@@ -131,27 +135,28 @@
 
     // Current key overlaps with the inserted key.
     // Remove the current key.
+    TreeTy *OldNode = T;
     T = Remove_internal(CurrentK, T);
     // Add back the unoverlapped part of the current key.
     if (CurrentK.getStart() < K.getStart()) {
       if (CurrentK.getEnd() <= K.getEnd()) {
         Interval NewK(CurrentK.getStart(), K.getStart()-1);
         return Add_internal(std::make_pair<key_type, data_type>(NewK, 
-                                           ImutInfo::DataOfValue(Value(T))), T);
+                                     ImutInfo::DataOfValue(Value(OldNode))), T);
       } else {
         Interval NewK1(CurrentK.getStart(), K.getStart()-1);
         T = Add_internal(std::make_pair<key_type, data_type>(NewK1, 
-                                           ImutInfo::DataOfValue(Value(T))), T);
+                                     ImutInfo::DataOfValue(Value(OldNode))), T);
 
         Interval NewK2(K.getEnd()+1, CurrentK.getEnd());
         return Add_internal(std::make_pair<key_type, data_type>(NewK2,
-                                           ImutInfo::DataOfValue(Value(T))), T);
+                                     ImutInfo::DataOfValue(Value(OldNode))), T);
       }
     } else {
       if (CurrentK.getEnd() > K.getEnd()) {
         Interval NewK(K.getEnd()+1, CurrentK.getEnd());
         return Add_internal(std::make_pair<key_type, data_type>(NewK, 
-                                           ImutInfo::DataOfValue(Value(T))), T);
+                                     ImutInfo::DataOfValue(Value(OldNode))), T);
       }
     }
   }





More information about the llvm-commits mailing list