[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