diff options
author | John McCall <rjmccall@apple.com> | 2010-08-24 09:16:51 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-08-24 09:16:51 +0000 |
commit | b82b4339d1dded9c7e36afac80aac2ca73918e51 (patch) | |
tree | 60812ca95420b64f9524952aa668710c4be27eaf | |
parent | 59b06dc7758fb6087cdcf5d9f45a9ebb11e05504 (diff) |
Check in a couple of changes that I apparently never committed:
- teach DifferenceEngine to unify successors of calls and invokes
in certain circumstances
- basic blocks actually don't have their own numbering; did that change?
- add llvm-diff to the Makefile and CMake build systems
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@111909 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | tools/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tools/Makefile | 2 | ||||
-rw-r--r-- | tools/llvm-diff/DifferenceEngine.cpp | 33 | ||||
-rw-r--r-- | tools/llvm-diff/llvm-diff.cpp | 4 |
4 files changed, 36 insertions, 4 deletions
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 6ca57302d23..7ed10e9729d 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -27,6 +27,7 @@ add_subdirectory(llvm-link) add_subdirectory(lli) add_subdirectory(llvm-extract) +add_subdirectory(llvm-diff) add_subdirectory(bugpoint) add_subdirectory(bugpoint-passes) diff --git a/tools/Makefile b/tools/Makefile index e6d9207a1dc..aa07a2b1b77 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -21,7 +21,7 @@ PARALLEL_DIRS := opt llvm-as llvm-dis \ llvm-ld llvm-prof llvm-link \ lli llvm-extract llvm-mc \ bugpoint llvm-bcanalyzer llvm-stub \ - llvmc + llvmc llvm-diff # Let users override the set of tools to build from the command line. ifdef ONLY_TOOLS diff --git a/tools/llvm-diff/DifferenceEngine.cpp b/tools/llvm-diff/DifferenceEngine.cpp index 7436d1ed4e3..b0a24d0737e 100644 --- a/tools/llvm-diff/DifferenceEngine.cpp +++ b/tools/llvm-diff/DifferenceEngine.cpp @@ -590,6 +590,39 @@ void FunctionDifferenceEngine::runBlockDiff(BasicBlock::iterator LStart, unify(&*LI, &*RI); ++LI, ++RI; } + + // If the terminators have different kinds, but one is an invoke and the + // other is an unconditional branch immediately following a call, unify + // the results and the destinations. + TerminatorInst *LTerm = LStart->getParent()->getTerminator(); + TerminatorInst *RTerm = RStart->getParent()->getTerminator(); + if (isa<BranchInst>(LTerm) && isa<InvokeInst>(RTerm)) { + if (cast<BranchInst>(LTerm)->isConditional()) return; + BasicBlock::iterator I = LTerm; + if (I == LStart->getParent()->begin()) return; + --I; + if (!isa<CallInst>(*I)) return; + CallInst *LCall = cast<CallInst>(&*I); + InvokeInst *RInvoke = cast<InvokeInst>(RTerm); + if (!equivalentAsOperands(LCall->getCalledValue(), RInvoke->getCalledValue())) + return; + if (!LCall->use_empty()) + Values[LCall] = RInvoke; + tryUnify(LTerm->getSuccessor(0), RInvoke->getNormalDest()); + } else if (isa<InvokeInst>(LTerm) && isa<BranchInst>(RTerm)) { + if (cast<BranchInst>(RTerm)->isConditional()) return; + BasicBlock::iterator I = RTerm; + if (I == RStart->getParent()->begin()) return; + --I; + if (!isa<CallInst>(*I)) return; + CallInst *RCall = cast<CallInst>(I); + InvokeInst *LInvoke = cast<InvokeInst>(LTerm); + if (!equivalentAsOperands(LInvoke->getCalledValue(), RCall->getCalledValue())) + return; + if (!LInvoke->use_empty()) + Values[LInvoke] = RCall; + tryUnify(LInvoke->getNormalDest(), RTerm->getSuccessor(0)); + } } } diff --git a/tools/llvm-diff/llvm-diff.cpp b/tools/llvm-diff/llvm-diff.cpp index cc5d233db3b..16a990fb281 100644 --- a/tools/llvm-diff/llvm-diff.cpp +++ b/tools/llvm-diff/llvm-diff.cpp @@ -75,7 +75,6 @@ struct DiffContext { }; void ComputeNumbering(Function *F, DenseMap<Value*,unsigned> &Numbering) { - unsigned BBN = 0; unsigned IN = 0; // Arguments get the first numbers. @@ -86,9 +85,8 @@ void ComputeNumbering(Function *F, DenseMap<Value*,unsigned> &Numbering) { // Walk the basic blocks in order. for (Function::iterator FI = F->begin(), FE = F->end(); FI != FE; ++FI) { - // Basic blocks have their own 'namespace'. if (!FI->hasName()) - Numbering[&*FI] = BBN++; + Numbering[&*FI] = IN++; // Walk the instructions in order. for (BasicBlock::iterator BI = FI->begin(), BE = FI->end(); BI != BE; ++BI) |