[llvm-commits] [llvm] r133415 - /llvm/trunk/lib/CodeGen/TailDuplication.cpp

Francois Pichet pichet2000 at gmail.com
Sun Jun 19 22:30:21 PDT 2011


On Mon, Jun 20, 2011 at 12:16 AM, Rafael Espindola
<rafael.espindola at gmail.com> wrote:
> Author: rafael
> Date: Sun Jun 19 23:16:35 2011
> New Revision: 133415
>
> URL: http://llvm.org/viewvc/llvm-project?rev=133415&view=rev
> Log:
> Teach early dup how to duplicate basic blocks with one successor and only phi instructions
> into more complex blocks.
>
> Modified:
>    llvm/trunk/lib/CodeGen/TailDuplication.cpp
>
> Modified: llvm/trunk/lib/CodeGen/TailDuplication.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/TailDuplication.cpp?rev=133415&r1=133414&r2=133415&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/TailDuplication.cpp (original)
> +++ llvm/trunk/lib/CodeGen/TailDuplication.cpp Sun Jun 19 23:16:35 2011
> @@ -96,6 +96,12 @@
>     bool TailDuplicateBlocks(MachineFunction &MF);
>     bool shouldTailDuplicate(const MachineFunction &MF,
>                              MachineBasicBlock &TailBB);
> +    bool isSimpleBB(MachineBasicBlock *TailBB);
> +    bool canCompletelyDuplicateSimpleBB(MachineBasicBlock &BB);
> +    bool duplicateSimpleBB(MachineBasicBlock *TailBB,
> +                           SmallVector<MachineBasicBlock*, 8> &TDBBs,
> +                           const DenseSet<unsigned> &RegsUsedByPhi,
> +                           SmallVector<MachineInstr*, 16> &Copies);
>     bool TailDuplicate(MachineBasicBlock *TailBB, MachineFunction &MF,
>                        SmallVector<MachineBasicBlock*, 8> &TDBBs,
>                        SmallVector<MachineInstr*, 16> &Copies);
> @@ -557,6 +563,136 @@
>   return true;
>  }
>
> +/// isSimpleBB - True if this BB has only one unconditional jump.
> +bool
> +TailDuplicatePass::isSimpleBB(MachineBasicBlock *TailBB) {
> +  if (TailBB->succ_size() != 1)
> +    return false;
> +  MachineBasicBlock::iterator I = TailBB->getFirstNonPHI();
> +  MachineBasicBlock::iterator E = TailBB->end();
> +  while (I->isDebugValue() && I != E)
> +    ++I;
> +  if (I == E)
> +    return true;
> +  return I->getDesc().isUnconditionalBranch();
> +}
> +
> +static bool
> +bothUsedInPHI(const MachineBasicBlock &A,
> +              SmallPtrSet<MachineBasicBlock*, 8> SuccsB) {
> +  for (MachineBasicBlock::const_succ_iterator SI = A.succ_begin(),
> +         SE = A.succ_end(); SI != SE; ++SI) {
> +    MachineBasicBlock *BB = *SI;
> +    if (SuccsB.count(BB) && !BB->empty() && BB->begin()->isPHI())
> +      return true;
> +  }
> +
> +  return false;
> +}
> +
> +bool
> +TailDuplicatePass::canCompletelyDuplicateSimpleBB(MachineBasicBlock &BB) {
> +  SmallPtrSet<MachineBasicBlock*, 8> Succs(BB.succ_begin(), BB.succ_end());
> +
> +  for (MachineBasicBlock::pred_iterator PI = BB.pred_begin(),
> +       PE = BB.pred_end(); PI != PE; ++PI) {
> +    MachineBasicBlock *PredBB = *PI;
> +    if (PredBB->getLandingPadSuccessor())
> +      return false;
> +    if (bothUsedInPHI(*PredBB, Succs))
> +      return false;
> +    MachineBasicBlock *PredTBB = NULL, *PredFBB = NULL;
> +    SmallVector<MachineOperand, 4> PredCond;
> +    if (TII->AnalyzeBranch(*PredBB, PredTBB, PredFBB, PredCond, true))
> +      return false;
> +  }
> +  return true;
> +}
> +
> +bool
> +TailDuplicatePass::duplicateSimpleBB(MachineBasicBlock *TailBB,
> +                                     SmallVector<MachineBasicBlock*, 8> &TDBBs,
> +                                     const DenseSet<unsigned> &UsedByPhi,
> +                                     SmallVector<MachineInstr*, 16> &Copies) {
> +  if (!canCompletelyDuplicateSimpleBB(*TailBB))
> +    return false;
> +
> +  bool Changed = false;
> +  SmallVector<MachineBasicBlock*, 8> Preds(TailBB->pred_begin(),
> +                                           TailBB->pred_end());
> +  for (SmallSetVector<MachineBasicBlock *, 8>::iterator PI = Preds.begin(),
> +       PE = Preds.end(); PI != PE; ++PI) {
> +    MachineBasicBlock *PredBB = *PI;
> +
> +    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!");
> +
> +    DEBUG(dbgs() << "\nTail-duplicating into PredBB: " << *PredBB
> +                 << "From simple Succ: " << *TailBB);
> +
> +    MachineBasicBlock *NewTarget = *TailBB->succ_begin();
> +    MachineBasicBlock *NextBB = next(MachineFunction::iterator(PredBB));

Hi,
I made a small change here for MSVC compatibility, See r133416




More information about the llvm-commits mailing list