diff options
Diffstat (limited to 'llvm/utils/TableGen')
| -rw-r--r-- | llvm/utils/TableGen/CodeGenSchedule.cpp | 14 | ||||
| -rw-r--r-- | llvm/utils/TableGen/CodeGenSchedule.h | 15 | ||||
| -rw-r--r-- | llvm/utils/TableGen/SubtargetEmitter.cpp | 14 |
3 files changed, 33 insertions, 10 deletions
diff --git a/llvm/utils/TableGen/CodeGenSchedule.cpp b/llvm/utils/TableGen/CodeGenSchedule.cpp index f8d7d9ad3d3..e94ed760fc4 100644 --- a/llvm/utils/TableGen/CodeGenSchedule.cpp +++ b/llvm/utils/TableGen/CodeGenSchedule.cpp @@ -1759,6 +1759,10 @@ void CodeGenSchedModels::collectRegisterFiles() { CodeGenProcModel &PM = getProcModel(RF->getValueAsDef("SchedModel")); PM.RegisterFiles.emplace_back(CodeGenRegisterFile(RF->getName(),RF)); CodeGenRegisterFile &CGRF = PM.RegisterFiles.back(); + CGRF.MaxMovesEliminatedPerCycle = + RF->getValueAsInt("MaxMovesEliminatedPerCycle"); + CGRF.AllowZeroMoveEliminationOnly = + RF->getValueAsBit("AllowZeroMoveEliminationOnly"); // Now set the number of physical registers as well as the cost of registers // in each register class. @@ -1770,9 +1774,17 @@ void CodeGenSchedModels::collectRegisterFiles() { RecVec RegisterClasses = RF->getValueAsListOfDefs("RegClasses"); std::vector<int64_t> RegisterCosts = RF->getValueAsListOfInts("RegCosts"); + ListInit *MoveElimInfo = RF->getValueAsListInit("AllowMoveElimination"); for (unsigned I = 0, E = RegisterClasses.size(); I < E; ++I) { int Cost = RegisterCosts.size() > I ? RegisterCosts[I] : 1; - CGRF.Costs.emplace_back(RegisterClasses[I], Cost); + + bool AllowMoveElim = false; + if (MoveElimInfo->size() > I) { + BitInit *Val = cast<BitInit>(MoveElimInfo->getElement(I)); + AllowMoveElim = Val->getValue(); + } + + CGRF.Costs.emplace_back(RegisterClasses[I], Cost, AllowMoveElim); } } } diff --git a/llvm/utils/TableGen/CodeGenSchedule.h b/llvm/utils/TableGen/CodeGenSchedule.h index c2af28bbaa0..39443bb35e9 100644 --- a/llvm/utils/TableGen/CodeGenSchedule.h +++ b/llvm/utils/TableGen/CodeGenSchedule.h @@ -167,8 +167,9 @@ struct CodeGenSchedClass { struct CodeGenRegisterCost { Record *RCDef; unsigned Cost; - CodeGenRegisterCost(Record *RC, unsigned RegisterCost) - : RCDef(RC), Cost(RegisterCost) {} + bool AllowMoveElimination; + CodeGenRegisterCost(Record *RC, unsigned RegisterCost, bool AllowMoveElim = false) + : RCDef(RC), Cost(RegisterCost), AllowMoveElimination(AllowMoveElim) {} CodeGenRegisterCost(const CodeGenRegisterCost &) = default; CodeGenRegisterCost &operator=(const CodeGenRegisterCost &) = delete; }; @@ -181,12 +182,18 @@ struct CodeGenRegisterCost { struct CodeGenRegisterFile { std::string Name; Record *RegisterFileDef; + unsigned MaxMovesEliminatedPerCycle; + bool AllowZeroMoveEliminationOnly; unsigned NumPhysRegs; std::vector<CodeGenRegisterCost> Costs; - CodeGenRegisterFile(StringRef name, Record *def) - : Name(name), RegisterFileDef(def), NumPhysRegs(0) {} + CodeGenRegisterFile(StringRef name, Record *def, unsigned MaxMoveElimPerCy = 0, + bool AllowZeroMoveElimOnly = false) + : Name(name), RegisterFileDef(def), + MaxMovesEliminatedPerCycle(MaxMoveElimPerCy), + AllowZeroMoveEliminationOnly(AllowZeroMoveElimOnly), + NumPhysRegs(0) {} bool hasDefaultCosts() const { return Costs.empty(); } }; diff --git a/llvm/utils/TableGen/SubtargetEmitter.cpp b/llvm/utils/TableGen/SubtargetEmitter.cpp index ef0428eeed0..d1ea968590f 100644 --- a/llvm/utils/TableGen/SubtargetEmitter.cpp +++ b/llvm/utils/TableGen/SubtargetEmitter.cpp @@ -653,7 +653,7 @@ SubtargetEmitter::EmitRegisterFileTables(const CodeGenProcModel &ProcModel, return 0; // Print the RegisterCost table first. - OS << "\n// {RegisterClassID, Register Cost}\n"; + OS << "\n// {RegisterClassID, Register Cost, AllowMoveElimination }\n"; OS << "static const llvm::MCRegisterCostEntry " << ProcModel.ModelName << "RegisterCosts" << "[] = {\n"; @@ -668,24 +668,28 @@ SubtargetEmitter::EmitRegisterFileTables(const CodeGenProcModel &ProcModel, Record *Rec = RC.RCDef; if (Rec->getValue("Namespace")) OS << Rec->getValueAsString("Namespace") << "::"; - OS << Rec->getName() << "RegClassID, " << RC.Cost << "},\n"; + OS << Rec->getName() << "RegClassID, " << RC.Cost << ", " + << RC.AllowMoveElimination << "},\n"; } } OS << "};\n"; // Now generate a table with register file info. - OS << "\n // {Name, #PhysRegs, #CostEntries, IndexToCostTbl}\n"; + OS << "\n // {Name, #PhysRegs, #CostEntries, IndexToCostTbl, " + << "MaxMovesEliminatedPerCycle, AllowZeroMoveEliminationOnly }\n"; OS << "static const llvm::MCRegisterFileDesc " << ProcModel.ModelName << "RegisterFiles" << "[] = {\n" - << " { \"InvalidRegisterFile\", 0, 0, 0 },\n"; + << " { \"InvalidRegisterFile\", 0, 0, 0, 0, 0 },\n"; unsigned CostTblIndex = 0; for (const CodeGenRegisterFile &RD : ProcModel.RegisterFiles) { OS << " { "; OS << '"' << RD.Name << '"' << ", " << RD.NumPhysRegs << ", "; unsigned NumCostEntries = RD.Costs.size(); - OS << NumCostEntries << ", " << CostTblIndex << "},\n"; + OS << NumCostEntries << ", " << CostTblIndex << ", " + << RD.MaxMovesEliminatedPerCycle << ", " + << RD.AllowZeroMoveEliminationOnly << "},\n"; CostTblIndex += NumCostEntries; } OS << "};\n"; |

