Index: include/llvm/CodeGen/TailDuplicator.h =================================================================== --- include/llvm/CodeGen/TailDuplicator.h +++ include/llvm/CodeGen/TailDuplicator.h @@ -51,6 +51,8 @@ static bool isSimpleBB(MachineBasicBlock *TailBB); bool shouldTailDuplicate(const MachineFunction &MF, bool IsSimple, MachineBasicBlock &TailBB); + /// Returns true if TailBB can successfully be duplicated into PredBB + bool canTailDuplicate(MachineBasicBlock *TailBB, MachineBasicBlock *PredBB); bool tailDuplicateAndUpdate(MachineFunction &MF, bool IsSimple, MachineBasicBlock *MBB); Index: lib/CodeGen/TailDuplicator.cpp =================================================================== --- lib/CodeGen/TailDuplicator.cpp +++ lib/CodeGen/TailDuplicator.cpp @@ -717,6 +717,21 @@ return Changed; } +bool TailDuplicator::canTailDuplicate(MachineBasicBlock *TailBB, + MachineBasicBlock *PredBB) { + // EH edges are ignored by AnalyzeBranch. + if (PredBB->succ_size() > 1) + return false; + + MachineBasicBlock *PredTBB, *PredFBB; + SmallVector PredCond; + if (TII->AnalyzeBranch(*PredBB, PredTBB, PredFBB, PredCond, true)) + return false; + if (!PredCond.empty()) + return false; + return true; +} + /// If it is profitable, duplicate TailBB's contents in each /// of its predecessors. bool TailDuplicator::tailDuplicate(MachineFunction &MF, bool IsSimple, @@ -741,19 +756,12 @@ PE = Preds.end(); PI != PE; ++PI) { MachineBasicBlock *PredBB = *PI; - assert(TailBB != PredBB && "Single-block loop should have been rejected earlier!"); - // EH edges are ignored by AnalyzeBranch. - if (PredBB->succ_size() > 1) - continue; - MachineBasicBlock *PredTBB, *PredFBB; - SmallVector PredCond; - if (TII->AnalyzeBranch(*PredBB, PredTBB, PredFBB, PredCond, true)) - continue; - if (!PredCond.empty()) + if (!canTailDuplicate(TailBB, PredBB)) continue; + // Don't duplicate into a fall-through predecessor (at least for now). if (PredBB->isLayoutSuccessor(TailBB) && PredBB->canFallThrough()) continue; @@ -788,6 +796,8 @@ appendCopies(PredBB, CopyInfos, Copies); // Simplify + MachineBasicBlock *PredTBB, *PredFBB; + SmallVector PredCond; TII->AnalyzeBranch(*PredBB, PredTBB, PredFBB, PredCond, true); NumTailDupAdded += TailBB->size() - 1; // subtract one for removed branch