[llvm] r265149 - [PGO] Refactor PGOFuncName meta data code to be used in clang

Rong Xu via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 1 09:43:30 PDT 2016


Author: xur
Date: Fri Apr  1 11:43:30 2016
New Revision: 265149

URL: http://llvm.org/viewvc/llvm-project?rev=265149&view=rev
Log:
[PGO] Refactor PGOFuncName meta data code to be used in clang

Refactor the code that gets and creates PGOFuncName meta data so that it can be
used in clang's value profile annotation.

Differential Revision: http://reviews.llvm.org/D18623




Modified:
    llvm/trunk/include/llvm/ProfileData/InstrProf.h
    llvm/trunk/lib/ProfileData/InstrProf.cpp
    llvm/trunk/lib/Transforms/Instrumentation/PGOInstrumentation.cpp

Modified: llvm/trunk/include/llvm/ProfileData/InstrProf.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/InstrProf.h?rev=265149&r1=265148&r2=265149&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ProfileData/InstrProf.h (original)
+++ llvm/trunk/include/llvm/ProfileData/InstrProf.h Fri Apr  1 11:43:30 2016
@@ -19,7 +19,9 @@
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/StringSet.h"
+#include "llvm/IR/Function.h"
 #include "llvm/IR/GlobalValue.h"
+#include "llvm/IR/Metadata.h"
 #include "llvm/ProfileData/InstrProfData.inc"
 #include "llvm/ProfileData/ProfileCommon.h"
 #include "llvm/Support/Endian.h"
@@ -245,6 +247,18 @@ bool getValueProfDataFromInst(const Inst
                               InstrProfValueData ValueData[],
                               uint32_t &ActualNumValueData, uint64_t &TotalC);
 
+inline StringRef getPGOFuncNameMetadataName() { return "PGOFuncName"; }
+
+/// Return the PGOFuncName meta data associated with a function.
+inline MDNode *getPGOFuncNameMetadata(const Function &F) {
+  return F.getMetadata(getPGOFuncNameMetadataName());
+}
+
+/// Create the PGOFuncName meta data if PGOFuncName is different from
+/// function's raw name. This should only apply to internal linkage functions
+/// declared by users only.
+void createPGOFuncNameMetadata(Function &F);
+
 const std::error_category &instrprof_category();
 
 enum class instrprof_error {

Modified: llvm/trunk/lib/ProfileData/InstrProf.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ProfileData/InstrProf.cpp?rev=265149&r1=265148&r2=265149&view=diff
==============================================================================
--- llvm/trunk/lib/ProfileData/InstrProf.cpp (original)
+++ llvm/trunk/lib/ProfileData/InstrProf.cpp Fri Apr  1 11:43:30 2016
@@ -98,9 +98,8 @@ std::string getPGOFuncName(const Functio
     return getPGOFuncName(F.getName(), F.getLinkage(), F.getParent()->getName(),
                           Version);
 
-  // InLTO mode. First check if these is a meta data.
-  MDNode *MD = F.getMetadata("PGOFuncName");
-  if (MD != nullptr) {
+  // In LTO mode (when InLTO is true), first check if there is a meta data.
+  if (MDNode *MD = getPGOFuncNameMetadata(F)) {
     StringRef S = cast<MDString>(MD->getOperand(0))->getString();
     return S.str();
   }
@@ -108,7 +107,7 @@ std::string getPGOFuncName(const Functio
   // If there is no meta data, the function must be a global before the value
   // profile annotation pass. Its current linkage may be internal if it is
   // internalized in LTO mode.
-  return getPGOFuncName (F.getName(), GlobalValue::ExternalLinkage, "");
+  return getPGOFuncName(F.getName(), GlobalValue::ExternalLinkage, "");
 }
 
 StringRef getFuncNameWithoutPrefix(StringRef PGOFuncName, StringRef FileName) {
@@ -720,4 +719,15 @@ bool getValueProfDataFromInst(const Inst
   }
   return true;
 }
+
+void createPGOFuncNameMetadata(Function &F) {
+  const std::string &FuncName = getPGOFuncName(F);
+  if (FuncName == F.getName())
+    return;
+
+  LLVMContext &C = F.getContext();
+  MDNode *N = MDNode::get(C, MDString::get(C, FuncName.c_str()));
+  F.setMetadata(getPGOFuncNameMetadataName(), N);
+}
+
 } // end namespace llvm

Modified: llvm/trunk/lib/Transforms/Instrumentation/PGOInstrumentation.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/PGOInstrumentation.cpp?rev=265149&r1=265148&r2=265149&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Instrumentation/PGOInstrumentation.cpp (original)
+++ llvm/trunk/lib/Transforms/Instrumentation/PGOInstrumentation.cpp Fri Apr  1 11:43:30 2016
@@ -752,14 +752,8 @@ void PGOUseFunc::annotateIndirectCallSit
   if (DisableValueProfiling)
     return;
 
-  // Write out the PGOFuncName if this is different from it's raw name.
-  // This should only apply to internal linkage functions only.
-  const std::string &FuncName = getPGOFuncName(F);
-  if (FuncName != F.getName()) {
-    LLVMContext &C = F.getContext();
-    MDNode *N = MDNode::get(C, MDString::get(C, FuncName.c_str()));
-    F.setMetadata("PGOFuncName", N);
-  }
+  // Create the PGOFuncName meta data.
+  createPGOFuncNameMetadata(F);
 
   unsigned IndirectCallSiteIndex = 0;
   PGOIndirectCallSiteVisitor ICV;




More information about the llvm-commits mailing list