Early exit with cheaper checks

Reviewers: sebpop,davide,fhahn,trentxintong
Differential Revision: https://reviews.llvm.org/D49617

llvm-svn: 337643
This commit is contained in:
Aditya Kumar 2018-07-21 14:13:44 +00:00
parent 25ac3ae21d
commit 47d9e0be5b

View File

@ -191,6 +191,17 @@ static bool canSplitCallSite(CallSite CS, TargetTransformInfo &TTI) {
return false;
BasicBlock *CallSiteBB = Instr->getParent();
// Need 2 predecessors and cannot split an edge from an IndirectBrInst.
SmallVector<BasicBlock *, 2> Preds(predecessors(CallSiteBB));
if (Preds.size() != 2 || isa<IndirectBrInst>(Preds[0]->getTerminator()) ||
isa<IndirectBrInst>(Preds[1]->getTerminator()))
return false;
// BasicBlock::canSplitPredecessors is more agressive, so checking for
// BasicBlock::isEHPad as well.
if (!CallSiteBB->canSplitPredecessors() || CallSiteBB->isEHPad())
return false;
// Allow splitting a call-site only when the CodeSize cost of the
// instructions before the call is less then DuplicationThreshold. The
// instructions before the call will be duplicated in the split blocks and
@ -204,19 +215,7 @@ static bool canSplitCallSite(CallSite CS, TargetTransformInfo &TTI) {
return false;
}
// Need 2 predecessors and cannot split an edge from an IndirectBrInst.
SmallVector<BasicBlock *, 2> Preds(predecessors(CallSiteBB));
if (Preds.size() != 2 || isa<IndirectBrInst>(Preds[0]->getTerminator()) ||
isa<IndirectBrInst>(Preds[1]->getTerminator()))
return false;
// Do not split a call-site in an exception handling block. This check
// prevents triggering an assertion in SplitEdge used via
// DuplicateInstructionsInSplitBetween.
if (CallSiteBB->isEHPad())
return false;
return CallSiteBB->canSplitPredecessors();
return true;
}
static Instruction *cloneInstForMustTail(Instruction *I, Instruction *Before,