diff --git a/llvm/lib/CodeGen/AggressiveAntiDepBreaker.cpp b/llvm/lib/CodeGen/AggressiveAntiDepBreaker.cpp index d06c4327bda6a..c5367221cae7a 100644 --- a/llvm/lib/CodeGen/AggressiveAntiDepBreaker.cpp +++ b/llvm/lib/CodeGen/AggressiveAntiDepBreaker.cpp @@ -533,9 +533,8 @@ BitVector AggressiveAntiDepBreaker::GetRenameRegisters(unsigned Reg) { } bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters( - unsigned AntiDepGroupIndex, - RenameOrderType& RenameOrder, - std::map &RenameMap) { + unsigned SuperReg, unsigned AntiDepGroupIndex, RenameOrderType &RenameOrder, + std::map &RenameMap) { std::vector &KillIndices = State->GetKillIndices(); std::vector &DefIndices = State->GetDefIndices(); std::multimap& @@ -550,17 +549,12 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters( if (Regs.empty()) return false; - // Find the "superest" register in the group. At the same time, - // collect the BitVector of registers that can be used to rename + // Collect the BitVector of registers that can be used to rename // each register. LLVM_DEBUG(dbgs() << "\tRename Candidates for Group g" << AntiDepGroupIndex << ":\n"); std::map RenameRegisterMap; - unsigned SuperReg = 0; for (unsigned Reg : Regs) { - if ((SuperReg == 0) || TRI->isSuperRegister(SuperReg, Reg)) - SuperReg = Reg; - // If Reg has any references, then collect possible rename regs if (RegRefs.count(Reg) > 0) { LLVM_DEBUG(dbgs() << "\t\t" << printReg(Reg, TRI) << ":"); @@ -892,30 +886,8 @@ unsigned AggressiveAntiDepBreaker::BreakAntiDependencies( } } - if (AntiDepReg == 0) continue; - - // If the definition of the anti-dependency register does not start - // a new live range, bail out. This can happen if the anti-dep - // register is a sub-register of another register whose live range - // spans over PathSU. In such case, PathSU defines only a part of - // the larger register. - RegAliases.reset(); - for (MCRegAliasIterator AI(AntiDepReg, TRI, true); AI.isValid(); ++AI) - RegAliases.set(*AI); - for (SDep S : PathSU->Succs) { - SDep::Kind K = S.getKind(); - if (K != SDep::Data) - continue; - unsigned R = S.getReg(); - if (!RegAliases[R]) - continue; - if (TRI->isSubRegisterEq(AntiDepReg, R)) - continue; - AntiDepReg = 0; - break; - } - - if (AntiDepReg == 0) continue; + if (AntiDepReg == 0) + continue; } assert(AntiDepReg != 0); @@ -931,7 +903,8 @@ unsigned AggressiveAntiDepBreaker::BreakAntiDependencies( // Look for a suitable register to use to break the anti-dependence. std::map RenameMap; - if (FindSuitableFreeRegisters(GroupIndex, RenameOrder, RenameMap)) { + if (FindSuitableFreeRegisters(AntiDepReg, GroupIndex, RenameOrder, + RenameMap)) { LLVM_DEBUG(dbgs() << "\tBreaking anti-dependence edge on " << printReg(AntiDepReg, TRI) << ":"); diff --git a/llvm/lib/CodeGen/AggressiveAntiDepBreaker.h b/llvm/lib/CodeGen/AggressiveAntiDepBreaker.h index cece217e645cd..06c4c6957ba04 100644 --- a/llvm/lib/CodeGen/AggressiveAntiDepBreaker.h +++ b/llvm/lib/CodeGen/AggressiveAntiDepBreaker.h @@ -176,8 +176,9 @@ class LLVM_LIBRARY_VISIBILITY AggressiveAntiDepState { std::set &PassthruRegs); void ScanInstruction(MachineInstr &MI, unsigned Count); BitVector GetRenameRegisters(unsigned Reg); - bool FindSuitableFreeRegisters(unsigned AntiDepGroupIndex, - RenameOrderType& RenameOrder, + bool FindSuitableFreeRegisters(unsigned SuperReg, + unsigned AntiDepGroupIndex, + RenameOrderType &RenameOrder, std::map &RenameMap); };