mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
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
This commit is contained in:
parent
59b06dc775
commit
b82b4339d1
@ -27,6 +27,7 @@ add_subdirectory(llvm-link)
|
|||||||
add_subdirectory(lli)
|
add_subdirectory(lli)
|
||||||
|
|
||||||
add_subdirectory(llvm-extract)
|
add_subdirectory(llvm-extract)
|
||||||
|
add_subdirectory(llvm-diff)
|
||||||
|
|
||||||
add_subdirectory(bugpoint)
|
add_subdirectory(bugpoint)
|
||||||
add_subdirectory(bugpoint-passes)
|
add_subdirectory(bugpoint-passes)
|
||||||
|
@ -21,7 +21,7 @@ PARALLEL_DIRS := opt llvm-as llvm-dis \
|
|||||||
llvm-ld llvm-prof llvm-link \
|
llvm-ld llvm-prof llvm-link \
|
||||||
lli llvm-extract llvm-mc \
|
lli llvm-extract llvm-mc \
|
||||||
bugpoint llvm-bcanalyzer llvm-stub \
|
bugpoint llvm-bcanalyzer llvm-stub \
|
||||||
llvmc
|
llvmc llvm-diff
|
||||||
|
|
||||||
# Let users override the set of tools to build from the command line.
|
# Let users override the set of tools to build from the command line.
|
||||||
ifdef ONLY_TOOLS
|
ifdef ONLY_TOOLS
|
||||||
|
@ -590,6 +590,39 @@ void FunctionDifferenceEngine::runBlockDiff(BasicBlock::iterator LStart,
|
|||||||
unify(&*LI, &*RI);
|
unify(&*LI, &*RI);
|
||||||
++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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -75,7 +75,6 @@ struct DiffContext {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void ComputeNumbering(Function *F, DenseMap<Value*,unsigned> &Numbering) {
|
void ComputeNumbering(Function *F, DenseMap<Value*,unsigned> &Numbering) {
|
||||||
unsigned BBN = 0;
|
|
||||||
unsigned IN = 0;
|
unsigned IN = 0;
|
||||||
|
|
||||||
// Arguments get the first numbers.
|
// Arguments get the first numbers.
|
||||||
@ -86,9 +85,8 @@ void ComputeNumbering(Function *F, DenseMap<Value*,unsigned> &Numbering) {
|
|||||||
|
|
||||||
// Walk the basic blocks in order.
|
// Walk the basic blocks in order.
|
||||||
for (Function::iterator FI = F->begin(), FE = F->end(); FI != FE; ++FI) {
|
for (Function::iterator FI = F->begin(), FE = F->end(); FI != FE; ++FI) {
|
||||||
// Basic blocks have their own 'namespace'.
|
|
||||||
if (!FI->hasName())
|
if (!FI->hasName())
|
||||||
Numbering[&*FI] = BBN++;
|
Numbering[&*FI] = IN++;
|
||||||
|
|
||||||
// Walk the instructions in order.
|
// Walk the instructions in order.
|
||||||
for (BasicBlock::iterator BI = FI->begin(), BE = FI->end(); BI != BE; ++BI)
|
for (BasicBlock::iterator BI = FI->begin(), BE = FI->end(); BI != BE; ++BI)
|
||||||
|
Loading…
Reference in New Issue
Block a user