diff options
Diffstat (limited to 'lib/CodeGen/AggressiveAntiDepBreaker.cpp')
| -rw-r--r-- | lib/CodeGen/AggressiveAntiDepBreaker.cpp | 68 | 
1 files changed, 40 insertions, 28 deletions
| diff --git a/lib/CodeGen/AggressiveAntiDepBreaker.cpp b/lib/CodeGen/AggressiveAntiDepBreaker.cpp index 2ee776711587..44345addbcb6 100644 --- a/lib/CodeGen/AggressiveAntiDepBreaker.cpp +++ b/lib/CodeGen/AggressiveAntiDepBreaker.cpp @@ -14,7 +14,6 @@  //  //===----------------------------------------------------------------------===// -#define DEBUG_TYPE "post-RA-sched"  #include "AggressiveAntiDepBreaker.h"  #include "llvm/CodeGen/MachineBasicBlock.h"  #include "llvm/CodeGen/MachineFrameInfo.h" @@ -29,6 +28,8 @@  #include "llvm/Target/TargetRegisterInfo.h"  using namespace llvm; +#define DEBUG_TYPE "post-RA-sched" +  // If DebugDiv > 0 then only break antidep with (ID % DebugDiv) == DebugMod  static cl::opt<int>  DebugDiv("agg-antidep-debugdiv", @@ -121,7 +122,7 @@ AggressiveAntiDepBreaker(MachineFunction& MFi,    TII(MF.getTarget().getInstrInfo()),    TRI(MF.getTarget().getRegisterInfo()),    RegClassInfo(RCI), -  State(NULL) { +  State(nullptr) {    /* 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) { @@ -144,7 +145,7 @@ AggressiveAntiDepBreaker::~AggressiveAntiDepBreaker() {  }  void AggressiveAntiDepBreaker::StartBlock(MachineBasicBlock *BB) { -  assert(State == NULL); +  assert(!State);    State = new AggressiveAntiDepState(TRI->getNumRegs(), BB);    bool IsReturnBlock = (!BB->empty() && BB->back().isReturn()); @@ -169,7 +170,7 @@ void AggressiveAntiDepBreaker::StartBlock(MachineBasicBlock *BB) {    // callee-saved register that is not saved in the prolog.    const MachineFrameInfo *MFI = MF.getFrameInfo();    BitVector Pristine = MFI->getPristineRegs(BB); -  for (const uint16_t *I = TRI->getCalleeSavedRegs(&MF); *I; ++I) { +  for (const MCPhysReg *I = TRI->getCalleeSavedRegs(&MF); *I; ++I) {      unsigned Reg = *I;      if (!IsReturnBlock && !Pristine.test(Reg)) continue;      for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI) { @@ -183,7 +184,7 @@ void AggressiveAntiDepBreaker::StartBlock(MachineBasicBlock *BB) {  void AggressiveAntiDepBreaker::FinishBlock() {    delete State; -  State = NULL; +  State = nullptr;  }  void AggressiveAntiDepBreaker::Observe(MachineInstr *MI, unsigned Count, @@ -230,13 +231,13 @@ bool AggressiveAntiDepBreaker::IsImplicitDefUse(MachineInstr *MI,    if (Reg == 0)      return false; -  MachineOperand *Op = NULL; +  MachineOperand *Op = nullptr;    if (MO.isDef())      Op = MI->findRegisterUseOperand(Reg, true);    else      Op = MI->findRegisterDefOperand(Reg); -  return((Op != NULL) && Op->isImplicit()); +  return(Op && Op->isImplicit());  }  void AggressiveAntiDepBreaker::GetPassthruRegs(MachineInstr *MI, @@ -273,10 +274,10 @@ static void AntiDepEdges(const SUnit *SU, std::vector<const SDep*>& Edges) {  /// CriticalPathStep - Return the next SUnit after SU on the bottom-up  /// critical path.  static const SUnit *CriticalPathStep(const SUnit *SU) { -  const SDep *Next = 0; +  const SDep *Next = nullptr;    unsigned NextDepth = 0;    // Find the predecessor edge with the greatest depth. -  if (SU != 0) { +  if (SU) {      for (SUnit::const_pred_iterator P = SU->Preds.begin(), PE = SU->Preds.end();           P != PE; ++P) {        const SUnit *PredSU = P->getSUnit(); @@ -292,7 +293,7 @@ static const SUnit *CriticalPathStep(const SUnit *SU) {      }    } -  return (Next) ? Next->getSUnit() : 0; +  return (Next) ? Next->getSUnit() : nullptr;  }  void AggressiveAntiDepBreaker::HandleLastUse(unsigned Reg, unsigned KillIdx, @@ -309,8 +310,8 @@ void AggressiveAntiDepBreaker::HandleLastUse(unsigned Reg, unsigned KillIdx,      DefIndices[Reg] = ~0u;      RegRefs.erase(Reg);      State->LeaveGroup(Reg); -    DEBUG(if (header != NULL) { -        dbgs() << header << TRI->getName(Reg); header = NULL; }); +    DEBUG(if (header) { +        dbgs() << header << TRI->getName(Reg); header = nullptr; });      DEBUG(dbgs() << "->g" << State->GetGroup(Reg) << tag);    }    // Repeat for subregisters. @@ -321,14 +322,14 @@ void AggressiveAntiDepBreaker::HandleLastUse(unsigned Reg, unsigned KillIdx,        DefIndices[SubregReg] = ~0u;        RegRefs.erase(SubregReg);        State->LeaveGroup(SubregReg); -      DEBUG(if (header != NULL) { -          dbgs() << header << TRI->getName(Reg); header = NULL; }); +      DEBUG(if (header) { +          dbgs() << header << TRI->getName(Reg); header = nullptr; });        DEBUG(dbgs() << " " << TRI->getName(SubregReg) << "->g" <<              State->GetGroup(SubregReg) << tag);      }    } -  DEBUG(if ((header == NULL) && (footer != NULL)) dbgs() << footer); +  DEBUG(if (!header && footer) dbgs() << footer);  }  void AggressiveAntiDepBreaker::PrescanInstruction(MachineInstr *MI, @@ -382,7 +383,7 @@ void AggressiveAntiDepBreaker::PrescanInstruction(MachineInstr *MI,      }      // Note register reference... -    const TargetRegisterClass *RC = NULL; +    const TargetRegisterClass *RC = nullptr;      if (i < MI->getDesc().getNumOperands())        RC = TII->getRegClass(MI->getDesc(), i, TRI, MF);      AggressiveAntiDepState::RegisterReference RR = { &MO, RC }; @@ -403,8 +404,18 @@ void AggressiveAntiDepBreaker::PrescanInstruction(MachineInstr *MI,        continue;      // Update def for Reg and aliases. -    for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI) +    for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI) { +      // We need to be careful here not to define already-live super registers. +      // If the super register is already live, then this definition is not +      // a definition of the whole super register (just a partial insertion +      // into it). Earlier subregister definitions (which we've not yet visited +      // because we're iterating bottom-up) need to be linked to the same group +      // as this definition. +      if (TRI->isSuperRegister(Reg, *AI) && State->IsLive(*AI)) +        continue; +        DefIndices[*AI] = Count; +    }    }  } @@ -456,7 +467,7 @@ void AggressiveAntiDepBreaker::ScanInstruction(MachineInstr *MI,      }      // Note register reference... -    const TargetRegisterClass *RC = NULL; +    const TargetRegisterClass *RC = nullptr;      if (i < MI->getDesc().getNumOperands())        RC = TII->getRegClass(MI->getDesc(), i, TRI, MF);      AggressiveAntiDepState::RegisterReference RR = { &MO, RC }; @@ -506,7 +517,7 @@ BitVector AggressiveAntiDepBreaker::GetRenameRegisters(unsigned Reg) {         AggressiveAntiDepState::RegisterReference>::iterator Q = Range.first,         QE = Range.second; Q != QE; ++Q) {      const TargetRegisterClass *RC = Q->second.RC; -    if (RC == NULL) continue; +    if (!RC) continue;      BitVector RCBV = TRI->getAllocatableSet(MF, RC);      if (first) { @@ -571,7 +582,9 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(      unsigned Reg = Regs[i];      if (Reg == SuperReg) continue;      bool IsSub = TRI->isSubRegister(SuperReg, Reg); -    assert(IsSub && "Expecting group subregister"); +    // FIXME: remove this once PR18663 has been properly fixed. For now, +    // return a conservative answer: +    // assert(IsSub && "Expecting group subregister");      if (!IsSub)        return false;    } @@ -724,8 +737,8 @@ unsigned AggressiveAntiDepBreaker::BreakAntiDependencies(    // Track progress along the critical path through the SUnit graph as    // we walk the instructions. This is needed for regclasses that only    // break critical-path anti-dependencies. -  const SUnit *CriticalPathSU = 0; -  MachineInstr *CriticalPathMI = 0; +  const SUnit *CriticalPathSU = nullptr; +  MachineInstr *CriticalPathMI = nullptr;    if (CriticalPathSet.any()) {      for (unsigned i = 0, e = SUnits.size(); i != e; ++i) {        const SUnit *SU = &SUnits[i]; @@ -778,10 +791,10 @@ unsigned AggressiveAntiDepBreaker::BreakAntiDependencies(      // If MI is not on the critical path, then we don't rename      // registers in the CriticalPathSet. -    BitVector *ExcludeRegs = NULL; +    BitVector *ExcludeRegs = nullptr;      if (MI == CriticalPathMI) {        CriticalPathSU = CriticalPathStep(CriticalPathSU); -      CriticalPathMI = (CriticalPathSU) ? CriticalPathSU->getInstr() : 0; +      CriticalPathMI = (CriticalPathSU) ? CriticalPathSU->getInstr() : nullptr;      } else if (CriticalPathSet.any()) {        ExcludeRegs = &CriticalPathSet;      } @@ -805,7 +818,7 @@ unsigned AggressiveAntiDepBreaker::BreakAntiDependencies(            // Don't break anti-dependencies on non-allocatable registers.            DEBUG(dbgs() << " (non-allocatable)\n");            continue; -        } else if ((ExcludeRegs != NULL) && ExcludeRegs->test(AntiDepReg)) { +        } else if (ExcludeRegs && ExcludeRegs->test(AntiDepReg)) {            // Don't break anti-dependencies for critical path registers            // if not on the critical path            DEBUG(dbgs() << " (not critical-path)\n"); @@ -819,9 +832,8 @@ unsigned AggressiveAntiDepBreaker::BreakAntiDependencies(          } else {            // No anti-dep breaking for implicit deps            MachineOperand *AntiDepOp = MI->findRegisterDefOperand(AntiDepReg); -          assert(AntiDepOp != NULL && -                 "Can't find index for defined register operand"); -          if ((AntiDepOp == NULL) || AntiDepOp->isImplicit()) { +          assert(AntiDepOp && "Can't find index for defined register operand"); +          if (!AntiDepOp || AntiDepOp->isImplicit()) {              DEBUG(dbgs() << " (implicit)\n");              continue;            } | 
