<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Feb 5, 2016 at 2:32 PM, Xinliang David Li via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: davidxl<br>
Date: Fri Feb  5 16:32:01 2016<br>
New Revision: 259941<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=259941&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=259941&view=rev</a><br>
Log:<br>
[PGO] Speed up name tab reading<br>
 The change allows skipping duplicate strings<br>
 early to avoid redundant md5 computation and<br>
 string copying/swapping.<br>
<br>
<br>
<br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/ProfileData/InstrProf.h<br>
<br>
Modified: llvm/trunk/include/llvm/ProfileData/InstrProf.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/InstrProf.h?rev=259941&r1=259940&r2=259941&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/InstrProf.h?rev=259941&r1=259940&r2=259941&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ProfileData/InstrProf.h (original)<br>
+++ llvm/trunk/include/llvm/ProfileData/InstrProf.h Fri Feb  5 16:32:01 2016<br>
@@ -269,17 +269,20 @@ public:<br>
 private:<br>
   StringRef Data;<br>
   uint64_t Address;<br>
-  // A map from MD5 hash keys to function name strings.<br>
-  std::vector<std::pair<uint64_t, std::string>> HashNameMap;<br>
+  // Unique name strings.<br>
+  StringSet<> NameTab;<br>
+  // A map from MD5 keys to function name strings.<br>
+  std::vector<std::pair<uint64_t, StringRef>> MD5NameMap;<br>
   // A map from function runtime address to function name MD5 hash.<br>
   // This map is only populated and used by raw instr profile reader.<br>
   AddrHashMap AddrToMD5Map;<br>
<br>
 public:<br>
-  InstrProfSymtab() : Data(), Address(0), HashNameMap(), AddrToMD5Map() {}<br>
+  InstrProfSymtab()<br>
+      : Data(), Address(0), NameTab(), MD5NameMap(), AddrToMD5Map() {}<br>
<br>
   /// Create InstrProfSymtab from an object file section which<br>
-  /// contains function PGO names. When section may contain raw<br>
+  /// contains function PGO names. When section may contain raw<br>
   /// string data or string data in compressed form. This method<br>
   /// only initialize the symtab with reference to the data and<br>
   /// the section base address. The decompression will be delayed<br>
@@ -307,8 +310,10 @@ public:<br>
   /// Update the symtab by adding \p FuncName to the table. This interface<br>
   /// is used by the raw and text profile readers.<br>
   void addFuncName(StringRef FuncName) {<br>
-    HashNameMap.push_back(std::make_pair(<br>
-        IndexedInstrProf::ComputeHash(FuncName), FuncName.str()));<br>
+    auto ins = NameTab.insert(FuncName);<br></blockquote><div><br></div><div><a href="http://llvm.org/docs/CodingStandards.html#name-types-functions-variables-and-enumerators-properly">http://llvm.org/docs/CodingStandards.html#name-types-functions-variables-and-enumerators-properly</a></div><div><br></div><div>-- Sean Silva</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
+    if (ins.second)<br>
+      MD5NameMap.push_back(std::make_pair(<br>
+          IndexedInstrProf::ComputeHash(FuncName), ins.first->getKey()));<br>
   }<br>
   /// Map a function address to its name's MD5 hash. This interface<br>
   /// is only used by the raw profiler reader.<br>
@@ -346,15 +351,13 @@ std::error_code InstrProfSymtab::create(<br>
 template <typename NameIterRange><br>
 void InstrProfSymtab::create(const NameIterRange &IterRange) {<br>
   for (auto Name : IterRange)<br>
-    HashNameMap.push_back(<br>
-        std::make_pair(IndexedInstrProf::ComputeHash(Name), Name.str()));<br>
+    addFuncName(Name);<br>
+<br>
   finalizeSymtab();<br>
 }<br>
<br>
 void InstrProfSymtab::finalizeSymtab() {<br>
-  std::sort(HashNameMap.begin(), HashNameMap.end(), less_first());<br>
-  HashNameMap.erase(std::unique(HashNameMap.begin(), HashNameMap.end()),<br>
-                    HashNameMap.end());<br>
+  std::sort(MD5NameMap.begin(), MD5NameMap.end(), less_first());<br>
   std::sort(AddrToMD5Map.begin(), AddrToMD5Map.end(), less_first());<br>
   AddrToMD5Map.erase(std::unique(AddrToMD5Map.begin(), AddrToMD5Map.end()),<br>
                      AddrToMD5Map.end());<br>
@@ -362,10 +365,10 @@ void InstrProfSymtab::finalizeSymtab() {<br>
<br>
 StringRef InstrProfSymtab::getFuncName(uint64_t FuncMD5Hash) {<br>
   auto Result =<br>
-      std::lower_bound(HashNameMap.begin(), HashNameMap.end(), FuncMD5Hash,<br>
+      std::lower_bound(MD5NameMap.begin(), MD5NameMap.end(), FuncMD5Hash,<br>
                        [](const std::pair<uint64_t, std::string> &LHS,<br>
                           uint64_t RHS) { return LHS.first < RHS; });<br>
-  if (Result != HashNameMap.end())<br>
+  if (Result != MD5NameMap.end())<br>
     return Result->second;<br>
   return StringRef();<br>
 }<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>