diff options
| author | Manman Ren <mren@apple.com> | 2012-07-31 18:10:39 +0000 | 
|---|---|---|
| committer | Manman Ren <mren@apple.com> | 2012-07-31 18:10:39 +0000 | 
| commit | 8c549b586c613753fa40e8cd5e6b5e56308d0f0c (patch) | |
| tree | 13dad8329b3d8c5a457dae7289d7971ef9140786 /llvm/lib/CodeGen | |
| parent | b67d7a3a338b572b375de203f7bd5bca67b5d523 (diff) | |
| download | bcm5719-llvm-8c549b586c613753fa40e8cd5e6b5e56308d0f0c.tar.gz bcm5719-llvm-8c549b586c613753fa40e8cd5e6b5e56308d0f0c.zip | |
MachineSink: Sort the successors before trying to find SuccToSinkTo.
One motivating example is to sink an instruction from a basic block which has
two successors: one outside the loop, the other inside the loop. We should try
to sink the instruction outside the loop.
rdar://11980766
llvm-svn: 161062
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/MachineSink.cpp | 17 | 
1 files changed, 15 insertions, 2 deletions
| diff --git a/llvm/lib/CodeGen/MachineSink.cpp b/llvm/lib/CodeGen/MachineSink.cpp index 1ce546b578a..d02aa6fe601 100644 --- a/llvm/lib/CodeGen/MachineSink.cpp +++ b/llvm/lib/CodeGen/MachineSink.cpp @@ -99,6 +99,16 @@ namespace {      bool PerformTrivialForwardCoalescing(MachineInstr *MI,                                           MachineBasicBlock *MBB);    }; + +  // SuccessorSorter - Sort Successors according to their loop depth.  +  struct SuccessorSorter { +    SuccessorSorter(MachineLoopInfo *LoopInfo) : LI(LoopInfo) {} +    bool operator()(const MachineBasicBlock *LHS, +                    const MachineBasicBlock *RHS) const { +      return LI->getLoopDepth(LHS) < LI->getLoopDepth(RHS); +    } +    MachineLoopInfo *LI; +  };  } // end anonymous namespace  char MachineSinking::ID = 0; @@ -526,8 +536,11 @@ MachineBasicBlock *MachineSinking::FindSuccToSinkTo(MachineInstr *MI,        // Otherwise, we should look at all the successors and decide which one        // we should sink to. -      for (MachineBasicBlock::succ_iterator SI = MBB->succ_begin(), -           E = MBB->succ_end(); SI != E; ++SI) { +      // We give successors with smaller loop depth higher priority. +      SmallVector<MachineBasicBlock*, 4> Succs(MBB->succ_begin(), MBB->succ_end()); +      std::sort(Succs.begin(), Succs.end(), SuccessorSorter(LI)); +      for (SmallVector<MachineBasicBlock*, 4>::iterator SI = Succs.begin(), +           E = Succs.end(); SI != E; ++SI) {          MachineBasicBlock *SuccBlock = *SI;          bool LocalUse = false;          if (AllUsesDominatedByBlock(Reg, SuccBlock, MBB, | 

