mirror of
https://github.com/intel/llvm.git
synced 2026-01-21 20:53:29 +08:00
[BOLT] Fix double jump peephole, remove useless conditional branches.
Summary: I split some of this out from the jumptable diff since it fixes the double jump peephole. I've changed the pass manager so that UCE and peepholes are not called after SCTC. I've incorporated a call to the double jump fixer to SCTC since it is needed to fix things up afterwards. While working on fixing the double jump peephole I discovered a few useless conditional branches that could be removed as well. I highly doubt that removing them will improve perf at all but it does seem odd to leave in useless conditional branches. There are also some minor logging improvements. (cherry picked from FBD4751875)
This commit is contained in:
committed by
Maksim Panchenko
parent
f7d32f7e7d
commit
6c5c65e3a3
@@ -322,10 +322,22 @@ std::pair<unsigned, uint64_t> BinaryFunction::eraseInvalidBBs() {
|
||||
}
|
||||
|
||||
bool BinaryFunction::isForwardCall(const MCSymbol *CalleeSymbol) const {
|
||||
// TODO: Once we start reordering functions this has to change. #15031238
|
||||
// This function should work properly before and after function reordering.
|
||||
// In order to accomplish this, we use the function index (if it is valid).
|
||||
// If the function indices are not valid, we fall back to the original
|
||||
// addresses. This should be ok because the functions without valid indices
|
||||
// should have been ordered with a stable sort.
|
||||
const auto *CalleeBF = BC.getFunctionForSymbol(CalleeSymbol);
|
||||
if (CalleeBF) {
|
||||
return CalleeBF->getAddress() > getAddress();
|
||||
if (hasValidIndex() && CalleeBF->hasValidIndex()) {
|
||||
return getIndex() < CalleeBF->getIndex();
|
||||
} else if (hasValidIndex() && !CalleeBF->hasValidIndex()) {
|
||||
return true;
|
||||
} else if (!hasValidIndex() && CalleeBF->hasValidIndex()) {
|
||||
return false;
|
||||
} else {
|
||||
return getAddress() < CalleeBF->getAddress();
|
||||
}
|
||||
} else {
|
||||
// Absolute symbol.
|
||||
auto const CalleeSI = BC.GlobalSymbols.find(CalleeSymbol->getName());
|
||||
@@ -2888,6 +2900,9 @@ void BinaryFunction::fixBranches() {
|
||||
} else {
|
||||
MIA->replaceBranchTarget(*CondBranch, TSuccessor->getLabel(), Ctx);
|
||||
}
|
||||
if (TSuccessor == FSuccessor) {
|
||||
BB->removeDuplicateConditionalSuccessor(CondBranch);
|
||||
}
|
||||
if (!NextBB || (NextBB != TSuccessor && NextBB != FSuccessor)) {
|
||||
BB->addBranchInstruction(FSuccessor);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user