diff options
Diffstat (limited to 'lib/CodeGen/AggressiveAntiDepBreaker.cpp')
| -rw-r--r-- | lib/CodeGen/AggressiveAntiDepBreaker.cpp | 115 | 
1 files changed, 62 insertions, 53 deletions
diff --git a/lib/CodeGen/AggressiveAntiDepBreaker.cpp b/lib/CodeGen/AggressiveAntiDepBreaker.cpp index 5abf50e5bd10..ffcb9a09ad73 100644 --- a/lib/CodeGen/AggressiveAntiDepBreaker.cpp +++ b/lib/CodeGen/AggressiveAntiDepBreaker.cpp @@ -1,4 +1,4 @@ -//===----- AggressiveAntiDepBreaker.cpp - Anti-dep breaker ----------------===// +//===- AggressiveAntiDepBreaker.cpp - Anti-dep breaker --------------------===//  //  //                     The LLVM Compiler Infrastructure  // @@ -15,16 +15,33 @@  //===----------------------------------------------------------------------===//  #include "AggressiveAntiDepBreaker.h" +#include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/BitVector.h" +#include "llvm/ADT/SmallSet.h" +#include "llvm/ADT/iterator_range.h"  #include "llvm/CodeGen/MachineBasicBlock.h"  #include "llvm/CodeGen/MachineFrameInfo.h" +#include "llvm/CodeGen/MachineFunction.h"  #include "llvm/CodeGen/MachineInstr.h" +#include "llvm/CodeGen/MachineOperand.h" +#include "llvm/CodeGen/MachineRegisterInfo.h" +#include "llvm/CodeGen/MachineValueType.h"  #include "llvm/CodeGen/RegisterClassInfo.h" +#include "llvm/CodeGen/ScheduleDAG.h" +#include "llvm/CodeGen/TargetInstrInfo.h" +#include "llvm/CodeGen/TargetRegisterInfo.h" +#include "llvm/CodeGen/TargetSubtargetInfo.h" +#include "llvm/MC/MCInstrDesc.h" +#include "llvm/MC/MCRegisterInfo.h"  #include "llvm/Support/CommandLine.h"  #include "llvm/Support/Debug.h" -#include "llvm/Support/ErrorHandling.h"  #include "llvm/Support/raw_ostream.h" -#include "llvm/Target/TargetInstrInfo.h" -#include "llvm/Target/TargetRegisterInfo.h" +#include <cassert> +#include <map> +#include <set> +#include <utility> +#include <vector> +  using namespace llvm;  #define DEBUG_TYPE "post-RA-sched" @@ -34,18 +51,17 @@ static cl::opt<int>  DebugDiv("agg-antidep-debugdiv",           cl::desc("Debug control for aggressive anti-dep breaker"),           cl::init(0), cl::Hidden); +  static cl::opt<int>  DebugMod("agg-antidep-debugmod",           cl::desc("Debug control for aggressive anti-dep breaker"),           cl::init(0), cl::Hidden);  AggressiveAntiDepState::AggressiveAntiDepState(const unsigned TargetRegs, -                                               MachineBasicBlock *BB) : -  NumTargetRegs(TargetRegs), GroupNodes(TargetRegs, 0), -  GroupNodeIndices(TargetRegs, 0), -  KillIndices(TargetRegs, 0), -  DefIndices(TargetRegs, 0) -{ +                                               MachineBasicBlock *BB) +    : NumTargetRegs(TargetRegs), GroupNodes(TargetRegs, 0), +      GroupNodeIndices(TargetRegs, 0), KillIndices(TargetRegs, 0), +      DefIndices(TargetRegs, 0) {    const unsigned BBSize = BB->size();    for (unsigned i = 0; i < NumTargetRegs; ++i) {      // Initialize all registers to be in their own group. Initially we @@ -76,8 +92,7 @@ void AggressiveAntiDepState::GetGroupRegs(    }  } -unsigned AggressiveAntiDepState::UnionGroups(unsigned Reg1, unsigned Reg2) -{ +unsigned AggressiveAntiDepState::UnionGroups(unsigned Reg1, unsigned Reg2) {    assert(GroupNodes[0] == 0 && "GroupNode 0 not parent!");    assert(GroupNodeIndices[0] == 0 && "Reg 0 not in Group 0!"); @@ -92,8 +107,7 @@ unsigned AggressiveAntiDepState::UnionGroups(unsigned Reg1, unsigned Reg2)    return Parent;  } -unsigned AggressiveAntiDepState::LeaveGroup(unsigned Reg) -{ +unsigned AggressiveAntiDepState::LeaveGroup(unsigned Reg) {    // Create a new GroupNode for Reg. Reg's existing GroupNode must    // stay as is because there could be other GroupNodes referring to    // it. @@ -103,8 +117,7 @@ unsigned AggressiveAntiDepState::LeaveGroup(unsigned Reg)    return idx;  } -bool AggressiveAntiDepState::IsLive(unsigned Reg) -{ +bool AggressiveAntiDepState::IsLive(unsigned Reg) {    // KillIndex must be defined and DefIndex not defined for a register    // to be live.    return((KillIndices[Reg] != ~0u) && (DefIndices[Reg] == ~0u)); @@ -115,8 +128,7 @@ AggressiveAntiDepBreaker::AggressiveAntiDepBreaker(      TargetSubtargetInfo::RegClassVector &CriticalPathRCs)      : AntiDepBreaker(), MF(MFi), MRI(MF.getRegInfo()),        TII(MF.getSubtarget().getInstrInfo()), -      TRI(MF.getSubtarget().getRegisterInfo()), RegClassInfo(RCI), -      State(nullptr) { +      TRI(MF.getSubtarget().getRegisterInfo()), RegClassInfo(RCI) {    /* Collect a bitset of all registers that are only broken if they       are on the critical path. */    for (unsigned i = 0, e = CriticalPathRCs.size(); i < e; ++i) { @@ -129,7 +141,7 @@ AggressiveAntiDepBreaker::AggressiveAntiDepBreaker(    DEBUG(dbgs() << "AntiDep Critical-Path Registers:");    DEBUG(for (unsigned r : CriticalPathSet.set_bits()) -          dbgs() << " " << TRI->getName(r)); +          dbgs() << " " << printReg(r, TRI));    DEBUG(dbgs() << '\n');  } @@ -204,7 +216,7 @@ void AggressiveAntiDepBreaker::Observe(MachineInstr &MI, unsigned Count,      // schedule region).      if (State->IsLive(Reg)) {        DEBUG(if (State->GetGroup(Reg) != 0) -              dbgs() << " " << TRI->getName(Reg) << "=g" << +              dbgs() << " " << printReg(Reg, TRI) << "=g" <<                  State->GetGroup(Reg) << "->g0(region live-out)");        State->UnionGroups(Reg, 0);      } else if ((DefIndices[Reg] < InsertPosIndex) @@ -250,7 +262,7 @@ void AggressiveAntiDepBreaker::GetPassthruRegs(  /// AntiDepEdges - Return in Edges the anti- and output- dependencies  /// in SU that we want to consider for breaking. -static void AntiDepEdges(const SUnit *SU, std::vector<const SDep*>& Edges) { +static void AntiDepEdges(const SUnit *SU, std::vector<const SDep *> &Edges) {    SmallSet<unsigned, 4> RegSet;    for (SUnit::const_pred_iterator P = SU->Preds.begin(), PE = SU->Preds.end();         P != PE; ++P) { @@ -311,7 +323,7 @@ void AggressiveAntiDepBreaker::HandleLastUse(unsigned Reg, unsigned KillIdx,      RegRefs.erase(Reg);      State->LeaveGroup(Reg);      DEBUG(if (header) { -        dbgs() << header << TRI->getName(Reg); header = nullptr; }); +        dbgs() << header << printReg(Reg, TRI); header = nullptr; });      DEBUG(dbgs() << "->g" << State->GetGroup(Reg) << tag);      // Repeat for subregisters. Note that we only do this if the superregister      // was not live because otherwise, regardless whether we have an explicit @@ -325,8 +337,8 @@ void AggressiveAntiDepBreaker::HandleLastUse(unsigned Reg, unsigned KillIdx,          RegRefs.erase(SubregReg);          State->LeaveGroup(SubregReg);          DEBUG(if (header) { -            dbgs() << header << TRI->getName(Reg); header = nullptr; }); -        DEBUG(dbgs() << " " << TRI->getName(SubregReg) << "->g" << +            dbgs() << header << printReg(Reg, TRI); header = nullptr; }); +        DEBUG(dbgs() << " " << printReg(SubregReg, TRI) << "->g" <<                State->GetGroup(SubregReg) << tag);        }      } @@ -362,7 +374,7 @@ void AggressiveAntiDepBreaker::PrescanInstruction(      unsigned Reg = MO.getReg();      if (Reg == 0) continue; -    DEBUG(dbgs() << " " << TRI->getName(Reg) << "=g" << State->GetGroup(Reg)); +    DEBUG(dbgs() << " " << printReg(Reg, TRI) << "=g" << State->GetGroup(Reg));      // If MI's defs have a special allocation requirement, don't allow      // any def registers to be changed. Also assume all registers @@ -381,8 +393,8 @@ void AggressiveAntiDepBreaker::PrescanInstruction(        unsigned AliasReg = *AI;        if (State->IsLive(AliasReg)) {          State->UnionGroups(Reg, AliasReg); -        DEBUG(dbgs() << "->g" << State->GetGroup(Reg) << "(via " << -              TRI->getName(AliasReg) << ")"); +        DEBUG(dbgs() << "->g" << State->GetGroup(Reg) << "(via " +                     << printReg(AliasReg, TRI) << ")");        }      } @@ -436,11 +448,11 @@ void AggressiveAntiDepBreaker::ScanInstruction(MachineInstr &MI,    // FIXME: The issue with predicated instruction is more complex. We are being    // conservatively here because the kill markers cannot be trusted after    // if-conversion: -  // %R6<def> = LDR %SP, %reg0, 92, pred:14, pred:%reg0; mem:LD4[FixedStack14] +  // %r6 = LDR %sp, %reg0, 92, pred:14, pred:%reg0; mem:LD4[FixedStack14]    // ... -  // STR %R0, %R6<kill>, %reg0, 0, pred:0, pred:%CPSR; mem:ST4[%395] -  // %R6<def> = LDR %SP, %reg0, 100, pred:0, pred:%CPSR; mem:LD4[FixedStack12] -  // STR %R0, %R6<kill>, %reg0, 0, pred:14, pred:%reg0; mem:ST4[%396](align=8) +  // STR %r0, killed %r6, %reg0, 0, pred:0, pred:%cpsr; mem:ST4[%395] +  // %r6 = LDR %sp, %reg0, 100, pred:0, pred:%cpsr; mem:LD4[FixedStack12] +  // STR %r0, killed %r6, %reg0, 0, pred:14, pred:%reg0; mem:ST4[%396](align=8)    //    // The first R6 kill is not really a kill since it's killed by a predicated    // instruction which may not be executed. The second R6 def may or may not @@ -457,8 +469,7 @@ void AggressiveAntiDepBreaker::ScanInstruction(MachineInstr &MI,      unsigned Reg = MO.getReg();      if (Reg == 0) continue; -    DEBUG(dbgs() << " " << TRI->getName(Reg) << "=g" << -          State->GetGroup(Reg)); +    DEBUG(dbgs() << " " << printReg(Reg, TRI) << "=g" << State->GetGroup(Reg));      // It wasn't previously live but now it is, this is a kill. Forget      // the previous live-range information and start a new live-range @@ -493,10 +504,10 @@ void AggressiveAntiDepBreaker::ScanInstruction(MachineInstr &MI,        if (Reg == 0) continue;        if (FirstReg != 0) { -        DEBUG(dbgs() << "=" << TRI->getName(Reg)); +        DEBUG(dbgs() << "=" << printReg(Reg, TRI));          State->UnionGroups(FirstReg, Reg);        } else { -        DEBUG(dbgs() << " " << TRI->getName(Reg)); +        DEBUG(dbgs() << " " << printReg(Reg, TRI));          FirstReg = Reg;        }      } @@ -544,8 +555,8 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(    // break the anti-dependence.    std::vector<unsigned> Regs;    State->GetGroupRegs(AntiDepGroupIndex, Regs, &RegRefs); -  assert(Regs.size() > 0 && "Empty register group!"); -  if (Regs.size() == 0) +  assert(!Regs.empty() && "Empty register group!"); +  if (Regs.empty())      return false;    // Find the "superest" register in the group. At the same time, @@ -562,7 +573,7 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(      // If Reg has any references, then collect possible rename regs      if (RegRefs.count(Reg) > 0) { -      DEBUG(dbgs() << "\t\t" << TRI->getName(Reg) << ":"); +      DEBUG(dbgs() << "\t\t" << printReg(Reg, TRI) << ":");        BitVector &BV = RenameRegisterMap[Reg];        assert(BV.empty()); @@ -571,7 +582,7 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(        DEBUG({          dbgs() << " ::";          for (unsigned r : BV.set_bits()) -          dbgs() << " " << TRI->getName(r); +          dbgs() << " " << printReg(r, TRI);          dbgs() << "\n";        });      } @@ -596,8 +607,8 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(      if (renamecnt++ % DebugDiv != DebugMod)        return false; -    dbgs() << "*** Performing rename " << TRI->getName(SuperReg) << -      " for debug ***\n"; +    dbgs() << "*** Performing rename " << printReg(SuperReg, TRI) +           << " for debug ***\n";    }  #endif @@ -634,7 +645,7 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(      // Don't replace a register with itself.      if (NewSuperReg == SuperReg) continue; -    DEBUG(dbgs() << " [" << TRI->getName(NewSuperReg) << ':'); +    DEBUG(dbgs() << " [" << printReg(NewSuperReg, TRI) << ':');      RenameMap.clear();      // For each referenced group register (which must be a SuperReg or @@ -651,7 +662,7 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(            NewReg = TRI->getSubReg(NewSuperReg, NewSubRegIdx);        } -      DEBUG(dbgs() << " " << TRI->getName(NewReg)); +      DEBUG(dbgs() << " " << printReg(NewReg, TRI));        // Check if Reg can be renamed to NewReg.        if (!RenameRegisterMap[Reg].test(NewReg)) { @@ -672,7 +683,7 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(            unsigned AliasReg = *AI;            if (State->IsLive(AliasReg) ||                (KillIndices[Reg] > DefIndices[AliasReg])) { -            DEBUG(dbgs() << "(alias " << TRI->getName(AliasReg) << " live)"); +            DEBUG(dbgs() << "(alias " << printReg(AliasReg, TRI) << " live)");              found = true;              break;            } @@ -732,14 +743,12 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(  /// BreakAntiDependencies - Identifiy anti-dependencies within the  /// ScheduleDAG and break them by renaming registers. -///  unsigned AggressiveAntiDepBreaker::BreakAntiDependencies( -                              const std::vector<SUnit>& SUnits, +                              const std::vector<SUnit> &SUnits,                                MachineBasicBlock::iterator Begin,                                MachineBasicBlock::iterator End,                                unsigned InsertPosIndex,                                DbgValueVector &DbgValues) { -    std::vector<unsigned> &KillIndices = State->GetKillIndices();    std::vector<unsigned> &DefIndices = State->GetDefIndices();    std::multimap<unsigned, AggressiveAntiDepState::RegisterReference>& @@ -783,7 +792,7 @@ unsigned AggressiveAntiDepBreaker::BreakAntiDependencies(    DEBUG(dbgs() << "Available regs:");    for (unsigned Reg = 0; Reg < TRI->getNumRegs(); ++Reg) {      if (!State->IsLive(Reg)) -      DEBUG(dbgs() << " " << TRI->getName(Reg)); +      DEBUG(dbgs() << " " << printReg(Reg, TRI));    }    DEBUG(dbgs() << '\n');  #endif @@ -839,7 +848,7 @@ unsigned AggressiveAntiDepBreaker::BreakAntiDependencies(              (Edge->getKind() != SDep::Output)) continue;          unsigned AntiDepReg = Edge->getReg(); -        DEBUG(dbgs() << "\tAntidep reg: " << TRI->getName(AntiDepReg)); +        DEBUG(dbgs() << "\tAntidep reg: " << printReg(AntiDepReg, TRI));          assert(AntiDepReg != 0 && "Anti-dependence on reg0?");          if (!MRI.isAllocatable(AntiDepReg)) { @@ -942,7 +951,7 @@ unsigned AggressiveAntiDepBreaker::BreakAntiDependencies(          std::map<unsigned, unsigned> RenameMap;          if (FindSuitableFreeRegisters(GroupIndex, RenameOrder, RenameMap)) {            DEBUG(dbgs() << "\tBreaking anti-dependence edge on " -                << TRI->getName(AntiDepReg) << ":"); +                       << printReg(AntiDepReg, TRI) << ":");            // Handle each group register...            for (std::map<unsigned, unsigned>::iterator @@ -950,9 +959,9 @@ unsigned AggressiveAntiDepBreaker::BreakAntiDependencies(              unsigned CurrReg = S->first;              unsigned NewReg = S->second; -            DEBUG(dbgs() << " " << TRI->getName(CurrReg) << "->" << -                  TRI->getName(NewReg) << "(" << -                  RegRefs.count(CurrReg) << " refs)"); +            DEBUG(dbgs() << " " << printReg(CurrReg, TRI) << "->" +                         << printReg(NewReg, TRI) << "(" +                         << RegRefs.count(CurrReg) << " refs)");              // Update the references to the old register CurrReg to              // refer to the new register NewReg.  | 
