[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