Index: llvm/include/llvm/CodeGen/RegisterClassInfo.h =================================================================== --- llvm/include/llvm/CodeGen/RegisterClassInfo.h +++ llvm/include/llvm/CodeGen/RegisterClassInfo.h @@ -60,6 +60,10 @@ // Map register alias to the callee saved Register. SmallVector CalleeSavedAliases; + // Indicate if a specified callee saved register be in the allocation order + // exactly as written in the tablegen descriptions or listed later. + BitVector IgnoreCSRForAllocOrder; + // Reserved registers in the current MF. BitVector Reserved; Index: llvm/lib/CodeGen/RegisterClassInfo.cpp =================================================================== --- llvm/lib/CodeGen/RegisterClassInfo.cpp +++ llvm/lib/CodeGen/RegisterClassInfo.cpp @@ -43,9 +43,11 @@ bool Update = false; MF = &mf; + auto &STI = MF->getSubtarget(); + // Allocate new array the first time we see a new target. - if (MF->getSubtarget().getRegisterInfo() != TRI) { - TRI = MF->getSubtarget().getRegisterInfo(); + if (STI.getRegisterInfo() != TRI) { + TRI = STI.getRegisterInfo(); RegClass.reset(new RCInfo[TRI->getNumRegClasses()]); Update = true; } @@ -67,6 +69,18 @@ } CalleeSavedRegs = CSR; + // Even if CSR list is same, we could have had a different allocation order + // if ignoreCSRForAllocationOrder is evaluated differently. + BitVector CSRHintsForAllocOrder(TRI->getNumRegs()); + for (const MCPhysReg *I = CSR; *I; ++I) + for (MCRegAliasIterator AI(*I, TRI, true); AI.isValid(); ++AI) + CSRHintsForAllocOrder[*AI] = STI.ignoreCSRForAllocationOrder(mf, *AI); + if (IgnoreCSRForAllocOrder.size() != CSRHintsForAllocOrder.size() || + IgnoreCSRForAllocOrder != CSRHintsForAllocOrder) { + Update = true; + IgnoreCSRForAllocOrder = CSRHintsForAllocOrder; + } + RegCosts = TRI->getRegisterCosts(*MF); // Different reserved registers?