diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2011-06-24 15:47:41 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2011-06-24 15:47:41 +0000 |
commit | d7f35fa824165eea799a583ff5af678f2d842b87 (patch) | |
tree | 9bfcec3bfeb7401721feb8544d480218af1abfa3 /lib/CodeGen/TailDuplication.cpp | |
parent | 1f71549a2ef24fc5d0fc9f0bb3b49fda770fe3d2 (diff) | |
download | external_llvm-d7f35fa824165eea799a583ff5af678f2d842b87.tar.gz external_llvm-d7f35fa824165eea799a583ff5af678f2d842b87.tar.bz2 external_llvm-d7f35fa824165eea799a583ff5af678f2d842b87.zip |
Now that bb with phis are not considered simple, duplicate them even if
we cannot duplicate to every predecessor.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@133797 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/TailDuplication.cpp')
-rw-r--r-- | lib/CodeGen/TailDuplication.cpp | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/lib/CodeGen/TailDuplication.cpp b/lib/CodeGen/TailDuplication.cpp index 33795c3acb..c798dd2049 100644 --- a/lib/CodeGen/TailDuplication.cpp +++ b/lib/CodeGen/TailDuplication.cpp @@ -98,7 +98,7 @@ namespace { bool IsSimple, MachineBasicBlock &TailBB); bool isSimpleBB(MachineBasicBlock *TailBB); bool canCompletelyDuplicateBB(MachineBasicBlock &BB, bool IsSimple); - void duplicateSimpleBB(MachineBasicBlock *TailBB, + bool duplicateSimpleBB(MachineBasicBlock *TailBB, SmallVector<MachineBasicBlock*, 8> &TDBBs, const DenseSet<unsigned> &RegsUsedByPhi, SmallVector<MachineInstr*, 16> &Copies); @@ -568,7 +568,7 @@ TailDuplicatePass::shouldTailDuplicate(const MachineFunction &MF, return true; if (IsSimple) - return canCompletelyDuplicateBB(TailBB, IsSimple); + return true; if (!PreRegAlloc) return true; @@ -635,24 +635,32 @@ TailDuplicatePass::canCompletelyDuplicateBB(MachineBasicBlock &BB, return true; } -void +bool TailDuplicatePass::duplicateSimpleBB(MachineBasicBlock *TailBB, SmallVector<MachineBasicBlock*, 8> &TDBBs, const DenseSet<unsigned> &UsedByPhi, SmallVector<MachineInstr*, 16> &Copies) { + SmallPtrSet<MachineBasicBlock*, 8> Succs(TailBB->succ_begin(), + TailBB->succ_end()); SmallVector<MachineBasicBlock*, 8> Preds(TailBB->pred_begin(), TailBB->pred_end()); + bool Changed = false; for (SmallSetVector<MachineBasicBlock *, 8>::iterator PI = Preds.begin(), PE = Preds.end(); PI != PE; ++PI) { MachineBasicBlock *PredBB = *PI; + if (PredBB->getLandingPadSuccessor()) + continue; + + if (bothUsedInPHI(*PredBB, Succs)) + continue; + MachineBasicBlock *PredTBB = NULL, *PredFBB = NULL; SmallVector<MachineOperand, 4> PredCond; - bool NotAnalyzable = - TII->AnalyzeBranch(*PredBB, PredTBB, PredFBB, PredCond, true); - (void)NotAnalyzable; - assert(!NotAnalyzable && "Cannot duplicate this!"); + if (TII->AnalyzeBranch(*PredBB, PredTBB, PredFBB, PredCond, true)) + continue; + Changed = true; DEBUG(dbgs() << "\nTail-duplicating into PredBB: " << *PredBB << "From simple Succ: " << *TailBB); @@ -700,6 +708,7 @@ TailDuplicatePass::duplicateSimpleBB(MachineBasicBlock *TailBB, TDBBs.push_back(PredBB); } + return Changed; } /// TailDuplicate - If it is profitable, duplicate TailBB's contents in each @@ -718,11 +727,8 @@ TailDuplicatePass::TailDuplicate(MachineBasicBlock *TailBB, MachineFunction &MF, DenseSet<unsigned> UsedByPhi; getRegsUsedByPHIs(*TailBB, &UsedByPhi); - if (IsSimple) { - duplicateSimpleBB(TailBB, TDBBs, UsedByPhi, Copies); - return true; - } - + if (IsSimple) + return duplicateSimpleBB(TailBB, TDBBs, UsedByPhi, Copies); // Iterate through all the unique predecessors and tail-duplicate this // block into them, if possible. Copying the list ahead of time also |