Index: llvm/trunk/tools/llvm-exegesis/lib/BenchmarkResult.cpp =================================================================== --- llvm/trunk/tools/llvm-exegesis/lib/BenchmarkResult.cpp +++ llvm/trunk/tools/llvm-exegesis/lib/BenchmarkResult.cpp @@ -32,7 +32,8 @@ YamlContext(const exegesis::LLVMState &State) : State(&State), ErrorStream(LastError), OpcodeNameToOpcodeIdx( - generateOpcodeNameToOpcodeIdxMapping(State.getInstrInfo())) {} + generateOpcodeNameToOpcodeIdxMapping(State.getInstrInfo())), + RegNameToRegNo(generateRegNameToRegNoMapping(State.getRegInfo())) {} static llvm::StringMap generateOpcodeNameToOpcodeIdxMapping(const llvm::MCInstrInfo &InstrInfo) { @@ -43,6 +44,15 @@ return Map; }; + llvm::StringMap + generateRegNameToRegNoMapping(const llvm::MCRegisterInfo &RegInfo) { + llvm::StringMap 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 @@ } 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 @@ std::string LastError; llvm::raw_string_ostream ErrorStream; const llvm::StringMap OpcodeNameToOpcodeIdx; + const llvm::StringMap RegNameToRegNo; }; } // namespace