[llvm-commits] [llvm] r56457 - /llvm/branches/ggreif/use-diet/lib/VMCore/Use.cpp

Gabor Greif ggreif at gmail.com
Mon Sep 22 13:08:26 PDT 2008


Author: ggreif
Date: Mon Sep 22 15:08:20 2008
New Revision: 56457

URL: http://llvm.org/viewvc/llvm-project?rev=56457&view=rev
Log:
first (untested but performant) implementation of Use::swap

Modified:
    llvm/branches/ggreif/use-diet/lib/VMCore/Use.cpp

Modified: llvm/branches/ggreif/use-diet/lib/VMCore/Use.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/ggreif/use-diet/lib/VMCore/Use.cpp?rev=56457&r1=56456&r2=56457&view=diff

==============================================================================
--- llvm/branches/ggreif/use-diet/lib/VMCore/Use.cpp (original)
+++ llvm/branches/ggreif/use-diet/lib/VMCore/Use.cpp Mon Sep 22 15:08:20 2008
@@ -20,7 +20,30 @@
 //===----------------------------------------------------------------------===//
 
 void Use::swap(Use &RHS) {
-  Value *V1(Val1);
+  ptrdiff_t dist((char*)&RHS - (char*)this);
+
+  if (dist) {
+    Use *valid1(stripTag<tagMaskN>(Next));
+    Use *valid2(stripTag<tagMaskN>(RHS.Next));
+    if (valid1 && valid2) {
+      bool real1(fullStopTagN != extractTag<NextPtrTag, tagMaskN>(Next));
+      bool real2(fullStopTagN != extractTag<NextPtrTag, tagMaskN>(RHS.Next));
+      (char*&)*stripTag<tagMask>(Prev) += dist;
+      (char*&)*stripTag<tagMask>(RHS.Prev) -= dist;
+      if (real1)
+	(char*&)valid1->Next += dist;
+      if (real2)
+        (char*&)valid2->Next -= dist;
+
+    }
+
+    // swap the members
+    std::swap(Next, RHS.Next);
+    Use** Prev1 = transferTag<tagMask>(Prev, stripTag<tagMask>(RHS.Prev));
+    RHS.Prev = transferTag<tagMask>(RHS.Prev, stripTag<tagMask>(Prev));
+    Prev = Prev1;
+  }
+  /*  Value *V1(Val1);
   Value *V2(RHS.Val1);
   if (V1 != V2) {
     if (V1) {
@@ -42,6 +65,7 @@
       RHS.Val1 = 0;
     }
   }
+  */
 }
 
 //===----------------------------------------------------------------------===//





More information about the llvm-commits mailing list