From 4794797f1213c4096a6f5ff2b6841dd5866b22ba Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 30 Sep 2005 06:44:45 +0000 Subject: [PATCH] Compute a preferred spill register class for each callee-save register git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23553 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/TableGen/RegisterInfoEmitter.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/utils/TableGen/RegisterInfoEmitter.cpp b/utils/TableGen/RegisterInfoEmitter.cpp index 10ff3f3f8e0..3d778d16c6d 100644 --- a/utils/TableGen/RegisterInfoEmitter.cpp +++ b/utils/TableGen/RegisterInfoEmitter.cpp @@ -59,6 +59,7 @@ void RegisterInfoEmitter::runHeader(std::ostream &OS) { << " " << ClassName << "(int CallFrameSetupOpcode = -1, int CallFrameDestroyOpcode = -1);\n" << " const unsigned* getCalleeSaveRegs() const;\n" + << "const TargetRegisterClass* const *getCalleeSaveRegClasses() const;\n" << "};\n\n"; const std::vector &RegisterClasses = @@ -244,7 +245,7 @@ void RegisterInfoEmitter::run(std::ostream &OS) { << ", RegisterClasses, RegisterClasses+" << RegisterClasses.size() <<",\n " << " CallFrameSetupOpcode, CallFrameDestroyOpcode) {}\n\n"; - // Emit the getCalleeSaveRegs method... + // Emit the getCalleeSaveRegs method. OS << "const unsigned* " << ClassName << "::getCalleeSaveRegs() const {\n" << " static const unsigned CalleeSaveRegs[] = {\n "; @@ -252,5 +253,27 @@ void RegisterInfoEmitter::run(std::ostream &OS) { for (unsigned i = 0, e = CSR.size(); i != e; ++i) OS << getQualifiedName(CSR[i]) << ", "; OS << " 0\n };\n return CalleeSaveRegs;\n}\n\n"; + + // Emit information about the callee saved register classes. + OS << "const TargetRegisterClass* const*\n" << ClassName + << "::getCalleeSaveRegClasses() const {\n" + << " static const TargetRegisterClass * const " + << "CalleeSaveRegClasses[] = {\n "; + + for (unsigned i = 0, e = CSR.size(); i != e; ++i) { + Record *R = CSR[i]; + std::multimap::iterator I, E; + tie(I, E) = RegClassesBelongedTo.equal_range(R); + if (I == E) + throw "Callee saved register '" + R->getName() + + "' must belong to a register class for spilling.\n"; + const CodeGenRegisterClass *RC = (I++)->second; + for (; I != E; ++I) + if (RC->SpillSize < I->second->SpillSize) + RC = I->second; + OS << "&" << getQualifiedName(RC->TheDef) << "RegClass, "; + } + OS << " 0\n };\n return CalleeSaveRegClasses;\n}\n\n"; + OS << "} // End llvm namespace \n"; }