mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-27 14:07:32 +00:00
Do not copy gigantic switch instructions
llvm-svn: 12441
This commit is contained in:
parent
44aa3ab91d
commit
2175b35b46
@ -91,7 +91,8 @@ bool TailDup::shouldEliminateUnconditionalBranch(TerminatorInst *TI) {
|
||||
if (Dest == BI->getParent()) return false; // Do not loop infinitely!
|
||||
|
||||
// Do not inline a block if we will just get another branch to the same block!
|
||||
if (BranchInst *DBI = dyn_cast<BranchInst>(Dest->getTerminator()))
|
||||
TerminatorInst *DTI = Dest->getTerminator();
|
||||
if (BranchInst *DBI = dyn_cast<BranchInst>(DTI))
|
||||
if (DBI->isUnconditional() && DBI->getSuccessor(0) == Dest)
|
||||
return false; // Do not loop infinitely!
|
||||
|
||||
@ -110,6 +111,15 @@ bool TailDup::shouldEliminateUnconditionalBranch(TerminatorInst *TI) {
|
||||
|
||||
for (unsigned Size = 0; I != Dest->end(); ++Size, ++I)
|
||||
if (Size == 6) return false; // The block is too large...
|
||||
|
||||
// Do not tail duplicate a block that has thousands of successors into a block
|
||||
// with a single successor if the block has many other predecessors. This can
|
||||
// cause an N^2 explosion in CFG edges (and PHI node entries), as seen in
|
||||
// cases that have a large number of indirect gotos.
|
||||
if (DTI->getNumSuccessors() > 8)
|
||||
if (std::distance(PI, PE) * DTI->getNumSuccessors() > 128)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -331,8 +331,15 @@ static void AddPredecessorToBlock(BasicBlock *Succ, BasicBlock *NewPred,
|
||||
// isValueEqualityComparison - Return true if the specified terminator checks to
|
||||
// see if a value is equal to constant integer value.
|
||||
static Value *isValueEqualityComparison(TerminatorInst *TI) {
|
||||
if (SwitchInst *SI = dyn_cast<SwitchInst>(TI))
|
||||
if (SwitchInst *SI = dyn_cast<SwitchInst>(TI)) {
|
||||
// Do not permit merging of large switch instructions into their
|
||||
// predecessors unless there is only one predecessor.
|
||||
if (SI->getNumSuccessors() * std::distance(pred_begin(SI->getParent()),
|
||||
pred_end(SI->getParent())) > 128)
|
||||
return 0;
|
||||
|
||||
return SI->getCondition();
|
||||
}
|
||||
if (BranchInst *BI = dyn_cast<BranchInst>(TI))
|
||||
if (BI->isConditional() && BI->getCondition()->hasOneUse())
|
||||
if (SetCondInst *SCI = dyn_cast<SetCondInst>(BI->getCondition()))
|
||||
|
Loading…
Reference in New Issue
Block a user