diff options
Diffstat (limited to 'llvm/tools/llvm-exegesis')
| -rw-r--r-- | llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp index 1dd413a2912..c7a0c8470bb 100644 --- a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp +++ b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp @@ -32,7 +32,8 @@ struct YamlContext { YamlContext(const exegesis::LLVMState &State) : State(&State), ErrorStream(LastError), OpcodeNameToOpcodeIdx( - generateOpcodeNameToOpcodeIdxMapping(State.getInstrInfo())) {} + generateOpcodeNameToOpcodeIdxMapping(State.getInstrInfo())), + RegNameToRegNo(generateRegNameToRegNoMapping(State.getRegInfo())) {} static llvm::StringMap<unsigned> generateOpcodeNameToOpcodeIdxMapping(const llvm::MCInstrInfo &InstrInfo) { @@ -43,6 +44,15 @@ struct YamlContext { return Map; }; + llvm::StringMap<unsigned> + generateRegNameToRegNoMapping(const llvm::MCRegisterInfo &RegInfo) { + llvm::StringMap<unsigned> Map(RegInfo.getNumRegs()); + for (unsigned I = 0, E = RegInfo.getNumRegs(); I < E; ++I) + Map[RegInfo.getName(I)] = I; + assert(Map.size() == RegInfo.getNumRegs() && "Size prediction failed"); + return Map; + }; + void serializeMCInst(const llvm::MCInst &MCInst, llvm::raw_ostream &OS) { OS << getInstrName(MCInst.getOpcode()); for (const auto &Op : MCInst) { @@ -80,10 +90,9 @@ struct YamlContext { } unsigned getRegNo(llvm::StringRef RegName) { - const llvm::MCRegisterInfo &RegInfo = State->getRegInfo(); - for (unsigned E = RegInfo.getNumRegs(), I = 0; I < E; ++I) - if (RegInfo.getName(I) == RegName) - return I; + auto Iter = RegNameToRegNo.find(RegName); + if (Iter != RegNameToRegNo.end()) + return Iter->second; ErrorStream << "No register with name " << RegName; return 0; } @@ -159,6 +168,7 @@ private: std::string LastError; llvm::raw_string_ostream ErrorStream; const llvm::StringMap<unsigned> OpcodeNameToOpcodeIdx; + const llvm::StringMap<unsigned> RegNameToRegNo; }; } // namespace |

