[llvm-commits] [llvm] r109744 - /llvm/trunk/tools/llvm-diff/DifferenceEngine.cpp

John McCall rjmccall at apple.com
Thu Jul 29 02:20:34 PDT 2010


Author: rjmccall
Date: Thu Jul 29 04:20:34 2010
New Revision: 109744

URL: http://llvm.org/viewvc/llvm-project?rev=109744&view=rev
Log:
Centralize the logic to permanently unify two instructions and make sure
it establishes a context and does a complaining diff.  Also make sure we
unify the prelude and postlude of a diff after a block-diff call.


Modified:
    llvm/trunk/tools/llvm-diff/DifferenceEngine.cpp

Modified: llvm/trunk/tools/llvm-diff/DifferenceEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-diff/DifferenceEngine.cpp?rev=109744&r1=109743&r2=109744&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-diff/DifferenceEngine.cpp (original)
+++ llvm/trunk/tools/llvm-diff/DifferenceEngine.cpp Thu Jul 29 04:20:34 2010
@@ -172,6 +172,18 @@
     Queue.insert(BlockPair(L, R));
     return false;
   }
+  
+  /// Unifies two instructions, given that they're known not to have
+  /// structural differences.
+  void unify(Instruction *L, Instruction *R) {
+    DifferenceEngine::Context C(Engine, L, R);
+
+    bool Result = diff(L, R, true, true);
+    assert(!Result && "structural differences second time around?");
+    (void) Result;
+    if (!L->use_empty())
+      Values[L] = R;
+  }
 
   void processQueue() {
     while (!Queue.empty()) {
@@ -207,22 +219,10 @@
     } while (LI != LE); // This is sufficient: we can't get equality of
                         // terminators if there are residual instructions.
 
+    // Unify everything in the block, non-tentatively this time.
     TentativeValues.clear();
-
-    // Do another pass over the block, this time in complaints mode.
-    LI = L->begin(); RI = R->begin();
-    do {
-      assert(LI != LE && RI != RE);
-      bool Result = diff(&*LI, &*RI, true, true);
-      assert(!Result && "structural differences second time around?");
-      (void) Result;
-
-      // Make the mapping non-tentative this time.
-      if (!LI->use_empty())
-        Values[&*LI] = &*RI;
-      
-      ++LI, ++RI;
-    } while (LI != LE);
+    for (LI = L->begin(), RI = R->begin(); LI != LE; ++LI, ++RI)
+      unify(&*LI, &*RI);
   }
 
   bool matchForBlockDiff(Instruction *L, Instruction *R);
@@ -538,6 +538,10 @@
     std::swap(Cur, Next);
   }
 
+  // We don't need the tentative values anymore; everything from here
+  // on out should be non-tentative.
+  TentativeValues.clear();
+
   SmallVectorImpl<char> &Path = Cur[NL].Path;
   BasicBlock::iterator LI = LStart, RI = RStart;
 
@@ -550,8 +554,10 @@
   // Skip leading matches.
   SmallVectorImpl<char>::iterator
     PI = Path.begin(), PE = Path.end();
-  while (PI != PE && *PI == DifferenceEngine::DC_match)
+  while (PI != PE && *PI == DifferenceEngine::DC_match) {
+    unify(&*LI, &*RI);
     ++PI, ++LI, ++RI;
+  }
 
   for (; PI != PE; ++PI) {
     switch (static_cast<DifferenceEngine::DiffChange>(*PI)) {
@@ -559,9 +565,7 @@
       assert(LI != LE && RI != RE);
       {
         Instruction *L = &*LI, *R = &*RI;
-        DifferenceEngine::Context C(Engine, L, R);
-        diff(L, R, true, true); // complain and unify successors
-        Values[L] = R; // make non-tentative
+        unify(L, R);
         Diff.addMatch(L, R);
       }
       ++LI; ++RI;
@@ -581,7 +585,13 @@
     }
   }
 
-  TentativeValues.clear();
+  // Finishing unifying and complaining about the tails of the block,
+  // which should be matches all the way through.
+  while (LI != LE) {
+    assert(RI != RE);
+    unify(&*LI, &*RI);
+    ++LI, ++RI;
+  }
 }
 
 }





More information about the llvm-commits mailing list