diff --git a/llvm/include/llvm/CodeGen/RegisterClassInfo.h b/llvm/include/llvm/CodeGen/RegisterClassInfo.h --- a/llvm/include/llvm/CodeGen/RegisterClassInfo.h +++ b/llvm/include/llvm/CodeGen/RegisterClassInfo.h @@ -56,7 +56,7 @@ // Used only to determine if an update for CalleeSavedAliases is necessary. SmallVector LastCalleeSavedRegs; - // Map register alias to the callee saved Register. + // Map regunit to the callee saved Register. SmallVector CalleeSavedAliases; // Indicate if a specified callee saved register be in the allocation order @@ -113,12 +113,16 @@ } /// getLastCalleeSavedAlias - Returns the last callee saved register that - /// overlaps PhysReg, or NoRegister if Reg doesn't overlap a + /// overlaps PhysReg, or NoRegister if PhysReg doesn't overlap a /// CalleeSavedAliases. MCRegister getLastCalleeSavedAlias(MCRegister PhysReg) const { - if (PhysReg.id() < CalleeSavedAliases.size()) - return CalleeSavedAliases[PhysReg]; - return MCRegister::NoRegister; + MCRegister CSR; + for (MCRegUnitIterator UI(PhysReg, TRI); UI.isValid(); ++UI) { + CSR = CalleeSavedAliases[*UI]; + if (CSR) + break; + } + return CSR; } /// Get the minimum register cost in RC's allocation order. diff --git a/llvm/lib/CodeGen/RegisterClassInfo.cpp b/llvm/lib/CodeGen/RegisterClassInfo.cpp --- a/llvm/lib/CodeGen/RegisterClassInfo.cpp +++ b/llvm/lib/CodeGen/RegisterClassInfo.cpp @@ -80,10 +80,10 @@ LastCalleeSavedRegs.clear(); // Build a CSRAlias map. Every CSR alias saves the last // overlapping CSR. - CalleeSavedAliases.assign(TRI->getNumRegs(), 0); + CalleeSavedAliases.assign(TRI->getNumRegUnits(), 0); for (const MCPhysReg *I = CSR; *I; ++I) { - for (MCRegAliasIterator AI(*I, TRI, true); AI.isValid(); ++AI) - CalleeSavedAliases[*AI] = *I; + for (MCRegUnitIterator UI(*I, TRI); UI.isValid(); ++UI) + CalleeSavedAliases[*UI] = *I; LastCalleeSavedRegs.push_back(*I); } @@ -150,7 +150,7 @@ uint8_t Cost = RegCosts[PhysReg]; MinCost = std::min(MinCost, Cost); - if (CalleeSavedAliases[PhysReg] && + if (getLastCalleeSavedAlias(PhysReg) && !STI.ignoreCSRForAllocationOrder(*MF, PhysReg)) // PhysReg aliases a CSR, save it for later. CSRAlias.push_back(PhysReg);