diff --git a/llvm/lib/CodeGen/MachineBlockPlacement.cpp b/llvm/lib/CodeGen/MachineBlockPlacement.cpp --- a/llvm/lib/CodeGen/MachineBlockPlacement.cpp +++ b/llvm/lib/CodeGen/MachineBlockPlacement.cpp @@ -2949,9 +2949,33 @@ SmallVector DuplicatedPreds; bool IsSimple = TailDup.isSimpleBB(BB); + BlockChain &BBChain = *BlockToChain[BB]; TailDup.tailDuplicateAndUpdate(IsSimple, BB, LPred, &DuplicatedPreds, &RemovalCallbackRef); + // Decrease UnscheduledPredecessors previously set for duplicated BB's + // BlockChain. Consider duplicate a BB from a chain(as BBChain in the CFG + // below) with multiple BBs, and PredBB is coming from different block + // chain(as PredChain). The UnscheduledPredecessors counter for BBChain was + // increased while calling fillWorkList for BB. When the duplicated BB becomes + // a dead block due to tail-duplication, build PredChain may not release the + // UnscheduledPredecessors counter for BBChain, as Succ1(also in BBChain) may + // not be in the BlockFilter previously collected for PredChain. + // + // PredBB [PredChain] PredBB [PredChain] + // \ / \ + // BB [BBChain] => Succ0 Succ1 [BBChain] + // / \ + // Succ0 Succ1 [BBChain] + if (Removed) + for (MachineBasicBlock *Pred : DuplicatedPreds) { + if (BlockFilter && !BlockFilter->count(Pred)) + continue; + if (&BBChain != BlockToChain[Pred] && + BBChain.UnscheduledPredecessors != 0) + --BBChain.UnscheduledPredecessors; + } + // Update UnscheduledPredecessors to reflect tail-duplication. DuplicatedToLPred = false; for (MachineBasicBlock *Pred : DuplicatedPreds) {