<div dir="ltr">Hi Rong,<div><br></div><div>This revision caused failure in clang bootstrap with ThinLTO. I have reverted this and r297909 with r297951. I'll send you the link to the internal build failure. </div><div><br></div><div>- Eric<br></div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Mar 15, 2017 at 10:59 PM Rong Xu via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: xur<br class="gmail_msg">
Date: Wed Mar 15 16:47:27 2017<br class="gmail_msg">
New Revision: 297897<br class="gmail_msg">
<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=297897&view=rev" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=297897&view=rev</a><br class="gmail_msg">
Log:<br class="gmail_msg">
[PGO] Value profile for size of memory intrinsic calls<br class="gmail_msg">
<br class="gmail_msg">
This patch adds the value profile support to profile the size parameter of<br class="gmail_msg">
memory intrinsic calls: memcpy, memcmp, and memmov.<br class="gmail_msg">
<br class="gmail_msg">
Differential Revision: <a href="http://reviews.llvm.org/D28965" rel="noreferrer" class="gmail_msg" target="_blank">http://reviews.llvm.org/D28965</a><br class="gmail_msg">
<br class="gmail_msg">
Modified:<br class="gmail_msg">
    llvm/trunk/docs/CommandGuide/llvm-profdata.rst<br class="gmail_msg">
    llvm/trunk/include/llvm/ProfileData/InstrProf.h<br class="gmail_msg">
    llvm/trunk/include/llvm/ProfileData/InstrProfData.inc<br class="gmail_msg">
    llvm/trunk/include/llvm/Transforms/InstrProfiling.h<br class="gmail_msg">
    llvm/trunk/lib/Transforms/Instrumentation/InstrProfiling.cpp<br class="gmail_msg">
    llvm/trunk/lib/Transforms/Instrumentation/PGOInstrumentation.cpp<br class="gmail_msg">
    llvm/trunk/test/Instrumentation/InstrProfiling/PR23499.ll<br class="gmail_msg">
    llvm/trunk/test/Instrumentation/InstrProfiling/icall.ll<br class="gmail_msg">
    llvm/trunk/test/Transforms/PGOProfile/comdat_internal.ll<br class="gmail_msg">
    llvm/trunk/tools/llvm-profdata/llvm-profdata.cpp<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/docs/CommandGuide/llvm-profdata.rst<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/CommandGuide/llvm-profdata.rst?rev=297897&r1=297896&r2=297897&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/CommandGuide/llvm-profdata.rst?rev=297897&r1=297896&r2=297897&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/docs/CommandGuide/llvm-profdata.rst (original)<br class="gmail_msg">
+++ llvm/trunk/docs/CommandGuide/llvm-profdata.rst Wed Mar 15 16:47:27 2017<br class="gmail_msg">
@@ -196,6 +196,10 @@ OPTIONS<br class="gmail_msg">
<br class="gmail_msg">
  Specify that the input profile is a sample-based profile.<br class="gmail_msg">
<br class="gmail_msg">
+.. option:: -memop-sizes<br class="gmail_msg">
+<br class="gmail_msg">
+ Show the profiled sizes of the memory intrinsic calls for shown functions.<br class="gmail_msg">
+<br class="gmail_msg">
 EXIT STATUS<br class="gmail_msg">
 -----------<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/include/llvm/ProfileData/InstrProf.h<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/InstrProf.h?rev=297897&r1=297896&r2=297897&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/InstrProf.h?rev=297897&r1=297896&r2=297897&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/include/llvm/ProfileData/InstrProf.h (original)<br class="gmail_msg">
+++ llvm/trunk/include/llvm/ProfileData/InstrProf.h Wed Mar 15 16:47:27 2017<br class="gmail_msg">
@@ -94,6 +94,11 @@ inline StringRef getInstrProfValueProfFu<br class="gmail_msg">
   return INSTR_PROF_VALUE_PROF_FUNC_STR;<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
+/// Return the name profile runtime entry point to do value range profiling.<br class="gmail_msg">
+inline StringRef getInstrProfValueRangeProfFuncName() {<br class="gmail_msg">
+  return INSTR_PROF_VALUE_RANGE_PROF_FUNC_STR;<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
 /// Return the name of the section containing function coverage mapping<br class="gmail_msg">
 /// data.<br class="gmail_msg">
 inline StringRef getInstrProfCoverageSectionName(bool AddSegment) {<br class="gmail_msg">
@@ -689,12 +694,15 @@ struct InstrProfRecord {<br class="gmail_msg">
<br class="gmail_msg">
 private:<br class="gmail_msg">
   std::vector<InstrProfValueSiteRecord> IndirectCallSites;<br class="gmail_msg">
+  std::vector<InstrProfValueSiteRecord> MemOPSizes;<br class="gmail_msg">
   const std::vector<InstrProfValueSiteRecord> &<br class="gmail_msg">
<br class="gmail_msg">
   getValueSitesForKind(uint32_t ValueKind) const {<br class="gmail_msg">
     switch (ValueKind) {<br class="gmail_msg">
     case IPVK_IndirectCallTarget:<br class="gmail_msg">
       return IndirectCallSites;<br class="gmail_msg">
+    case IPVK_MemOPSize:<br class="gmail_msg">
+      return MemOPSizes;<br class="gmail_msg">
     default:<br class="gmail_msg">
       llvm_unreachable("Unknown value kind!");<br class="gmail_msg">
     }<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/include/llvm/ProfileData/InstrProfData.inc<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/InstrProfData.inc?rev=297897&r1=297896&r2=297897&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/InstrProfData.inc?rev=297897&r1=297896&r2=297897&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/include/llvm/ProfileData/InstrProfData.inc (original)<br class="gmail_msg">
+++ llvm/trunk/include/llvm/ProfileData/InstrProfData.inc Wed Mar 15 16:47:27 2017<br class="gmail_msg">
@@ -153,7 +153,17 @@ INSTR_PROF_RAW_HEADER(uint64_t, ValueKin<br class="gmail_msg">
 VALUE_PROF_FUNC_PARAM(uint64_t, TargetValue, Type::getInt64Ty(Ctx)) \<br class="gmail_msg">
                       INSTR_PROF_COMMA<br class="gmail_msg">
 VALUE_PROF_FUNC_PARAM(void *, Data, Type::getInt8PtrTy(Ctx)) INSTR_PROF_COMMA<br class="gmail_msg">
+#ifndef VALUE_RANGE_PROF<br class="gmail_msg">
 VALUE_PROF_FUNC_PARAM(uint32_t, CounterIndex, Type::getInt32Ty(Ctx))<br class="gmail_msg">
+#else /* VALUE_RANGE_PROF */<br class="gmail_msg">
+VALUE_PROF_FUNC_PARAM(uint32_t, CounterIndex, Type::getInt32Ty(Ctx)) \<br class="gmail_msg">
+                      INSTR_PROF_COMMA<br class="gmail_msg">
+VALUE_PROF_FUNC_PARAM(uint64_t, PreciseRangeStart, Type::getInt64Ty(Ctx)) \<br class="gmail_msg">
+                      INSTR_PROF_COMMA<br class="gmail_msg">
+VALUE_PROF_FUNC_PARAM(uint64_t, PreciseRangeLast, Type::getInt64Ty(Ctx)) \<br class="gmail_msg">
+                      INSTR_PROF_COMMA<br class="gmail_msg">
+VALUE_PROF_FUNC_PARAM(uint64_t, LargeValue, Type::getInt64Ty(Ctx))<br class="gmail_msg">
+#endif /*VALUE_RANGE_PROF */<br class="gmail_msg">
 #undef VALUE_PROF_FUNC_PARAM<br class="gmail_msg">
 #undef INSTR_PROF_COMMA<br class="gmail_msg">
 /* VALUE_PROF_FUNC_PARAM end */<br class="gmail_msg">
@@ -174,13 +184,15 @@ VALUE_PROF_FUNC_PARAM(uint32_t, CounterI<br class="gmail_msg">
  * name hash and the function address.<br class="gmail_msg">
  */<br class="gmail_msg">
 VALUE_PROF_KIND(IPVK_IndirectCallTarget, 0)<br class="gmail_msg">
+/* For memory intrinsic functions size profiling. */<br class="gmail_msg">
+VALUE_PROF_KIND(IPVK_MemOPSize, 1)<br class="gmail_msg">
 /* These two kinds must be the last to be<br class="gmail_msg">
  * declared. This is to make sure the string<br class="gmail_msg">
  * array created with the template can be<br class="gmail_msg">
  * indexed with the kind value.<br class="gmail_msg">
  */<br class="gmail_msg">
 VALUE_PROF_KIND(IPVK_First, IPVK_IndirectCallTarget)<br class="gmail_msg">
-VALUE_PROF_KIND(IPVK_Last, IPVK_IndirectCallTarget)<br class="gmail_msg">
+VALUE_PROF_KIND(IPVK_Last, IPVK_MemOPSize)<br class="gmail_msg">
<br class="gmail_msg">
 #undef VALUE_PROF_KIND<br class="gmail_msg">
 /* VALUE_PROF_KIND end */<br class="gmail_msg">
@@ -649,6 +661,9 @@ serializeValueProfDataFrom(ValueProfReco<br class="gmail_msg">
 #define INSTR_PROF_VALUE_PROF_FUNC __llvm_profile_instrument_target<br class="gmail_msg">
 #define INSTR_PROF_VALUE_PROF_FUNC_STR \<br class="gmail_msg">
         INSTR_PROF_QUOTE(INSTR_PROF_VALUE_PROF_FUNC)<br class="gmail_msg">
+#define INSTR_PROF_VALUE_RANGE_PROF_FUNC __llvm_profile_instrument_range<br class="gmail_msg">
+#define INSTR_PROF_VALUE_RANGE_PROF_FUNC_STR \<br class="gmail_msg">
+        INSTR_PROF_QUOTE(INSTR_PROF_VALUE_RANGE_PROF_FUNC)<br class="gmail_msg">
<br class="gmail_msg">
 /* InstrProfile per-function control data alignment.  */<br class="gmail_msg">
 #define INSTR_PROF_DATA_ALIGNMENT 8<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/include/llvm/Transforms/InstrProfiling.h<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/InstrProfiling.h?rev=297897&r1=297896&r2=297897&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/InstrProfiling.h?rev=297897&r1=297896&r2=297897&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/include/llvm/Transforms/InstrProfiling.h (original)<br class="gmail_msg">
+++ llvm/trunk/include/llvm/Transforms/InstrProfiling.h Wed Mar 15 16:47:27 2017<br class="gmail_msg">
@@ -59,6 +59,14 @@ private:<br class="gmail_msg">
   GlobalVariable *NamesVar;<br class="gmail_msg">
   size_t NamesSize;<br class="gmail_msg">
<br class="gmail_msg">
+  // The start value of precise value profile range for memory intrinsic sizes.<br class="gmail_msg">
+  const int64_t DefaultMemOPSizeRangeStart = 0;<br class="gmail_msg">
+  int64_t MemOPSizeRangeStart;<br class="gmail_msg">
+  // The end value of precise value profile range for memory intrinsic sizes.<br class="gmail_msg">
+  const int64_t DefaultMemOPSizeRangeLast = 8;<br class="gmail_msg">
+  int64_t MemOPSizeRangeLast;<br class="gmail_msg">
+  int64_t MemOPSizeLargeVal;<br class="gmail_msg">
+<br class="gmail_msg">
   bool isMachO() const;<br class="gmail_msg">
<br class="gmail_msg">
   /// Get the section name for the counter variables.<br class="gmail_msg">
@@ -109,6 +117,9 @@ private:<br class="gmail_msg">
   /// Create a static initializer for our data, on platforms that need it,<br class="gmail_msg">
   /// and for any profile output file that was specified.<br class="gmail_msg">
   void emitInitialization();<br class="gmail_msg">
+<br class="gmail_msg">
+  /// Helper funtion that parsing the MemOPSize value profile options<br class="gmail_msg">
+  void getMemOPSizeOptions();<br class="gmail_msg">
 };<br class="gmail_msg">
<br class="gmail_msg">
 } // end namespace llvm<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/lib/Transforms/Instrumentation/InstrProfiling.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/InstrProfiling.cpp?rev=297897&r1=297896&r2=297897&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/InstrProfiling.cpp?rev=297897&r1=297896&r2=297897&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/lib/Transforms/Instrumentation/InstrProfiling.cpp (original)<br class="gmail_msg">
+++ llvm/trunk/lib/Transforms/Instrumentation/InstrProfiling.cpp Wed Mar 15 16:47:27 2017<br class="gmail_msg">
@@ -77,6 +77,17 @@ cl::opt<double> NumCountersPerValueSite(<br class="gmail_msg">
     // is usually smaller than 2.<br class="gmail_msg">
     cl::init(1.0));<br class="gmail_msg">
<br class="gmail_msg">
+cl::opt<std::string> MemOPSizeRange(<br class="gmail_msg">
+    "memop-size-range",<br class="gmail_msg">
+    cl::desc("Set the range of size in memory intrinsic calls to be profiled "<br class="gmail_msg">
+             "precisely, in a format of <start_val>:<end_val>"),<br class="gmail_msg">
+    cl::init(""));<br class="gmail_msg">
+cl::opt<unsigned> MemOPSizeLarge(<br class="gmail_msg">
+    "memop-size-large",<br class="gmail_msg">
+    cl::desc("Set large value thresthold in memory intrinsic size profiling. "<br class="gmail_msg">
+             "Value of 0 disables the large value profiling."),<br class="gmail_msg">
+    cl::init(8192));<br class="gmail_msg">
+<br class="gmail_msg">
 class InstrProfilingLegacyPass : public ModulePass {<br class="gmail_msg">
   InstrProfiling InstrProf;<br class="gmail_msg">
<br class="gmail_msg">
@@ -165,6 +176,7 @@ bool InstrProfiling::run(Module &M, cons<br class="gmail_msg">
   NamesSize = 0;<br class="gmail_msg">
   ProfileDataMap.clear();<br class="gmail_msg">
   UsedVars.clear();<br class="gmail_msg">
+  getMemOPSizeOptions();<br class="gmail_msg">
<br class="gmail_msg">
   // We did not know how many value sites there would be inside<br class="gmail_msg">
   // the instrumented function. This is counting the number of instrumented<br class="gmail_msg">
@@ -217,17 +229,34 @@ bool InstrProfiling::run(Module &M, cons<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
 static Constant *getOrInsertValueProfilingCall(Module &M,<br class="gmail_msg">
-                                               const TargetLibraryInfo &TLI) {<br class="gmail_msg">
+                                               const TargetLibraryInfo &TLI,<br class="gmail_msg">
+                                               bool IsRange = false) {<br class="gmail_msg">
   LLVMContext &Ctx = M.getContext();<br class="gmail_msg">
   auto *ReturnTy = Type::getVoidTy(M.getContext());<br class="gmail_msg">
-  Type *ParamTypes[] = {<br class="gmail_msg">
+<br class="gmail_msg">
+  Constant *Res;<br class="gmail_msg">
+  if (!IsRange) {<br class="gmail_msg">
+    Type *ParamTypes[] = {<br class="gmail_msg">
 #define VALUE_PROF_FUNC_PARAM(ParamType, ParamName, ParamLLVMType) ParamLLVMType<br class="gmail_msg">
 #include "llvm/ProfileData/InstrProfData.inc"<br class="gmail_msg">
-  };<br class="gmail_msg">
-  auto *ValueProfilingCallTy =<br class="gmail_msg">
-      FunctionType::get(ReturnTy, makeArrayRef(ParamTypes), false);<br class="gmail_msg">
-  Constant *Res = M.getOrInsertFunction(getInstrProfValueProfFuncName(),<br class="gmail_msg">
-                                        ValueProfilingCallTy);<br class="gmail_msg">
+    };<br class="gmail_msg">
+    auto *ValueProfilingCallTy =<br class="gmail_msg">
+        FunctionType::get(ReturnTy, makeArrayRef(ParamTypes), false);<br class="gmail_msg">
+    Res = M.getOrInsertFunction(getInstrProfValueProfFuncName(),<br class="gmail_msg">
+                                ValueProfilingCallTy);<br class="gmail_msg">
+  } else {<br class="gmail_msg">
+    Type *RangeParamTypes[] = {<br class="gmail_msg">
+#define VALUE_RANGE_PROF 1<br class="gmail_msg">
+#define VALUE_PROF_FUNC_PARAM(ParamType, ParamName, ParamLLVMType) ParamLLVMType<br class="gmail_msg">
+#include "llvm/ProfileData/InstrProfData.inc"<br class="gmail_msg">
+#undef VALUE_RANGE_PROF<br class="gmail_msg">
+    };<br class="gmail_msg">
+    auto *ValueRangeProfilingCallTy =<br class="gmail_msg">
+        FunctionType::get(ReturnTy, makeArrayRef(RangeParamTypes), false);<br class="gmail_msg">
+    Res = M.getOrInsertFunction(getInstrProfValueRangeProfFuncName(),<br class="gmail_msg">
+                                ValueRangeProfilingCallTy);<br class="gmail_msg">
+  }<br class="gmail_msg">
+<br class="gmail_msg">
   if (Function *FunRes = dyn_cast<Function>(Res)) {<br class="gmail_msg">
     if (auto AK = TLI.getExtAttrForI32Param(false))<br class="gmail_msg">
       FunRes->addAttribute(3, AK);<br class="gmail_msg">
@@ -261,11 +290,24 @@ void InstrProfiling::lowerValueProfileIn<br class="gmail_msg">
     Index += It->second.NumValueSites[Kind];<br class="gmail_msg">
<br class="gmail_msg">
   IRBuilder<> Builder(Ind);<br class="gmail_msg">
-  Value *Args[3] = {Ind->getTargetValue(),<br class="gmail_msg">
-                    Builder.CreateBitCast(DataVar, Builder.getInt8PtrTy()),<br class="gmail_msg">
-                    Builder.getInt32(Index)};<br class="gmail_msg">
-  CallInst *Call = Builder.CreateCall(getOrInsertValueProfilingCall(*M, *TLI),<br class="gmail_msg">
-                                      Args);<br class="gmail_msg">
+  bool IsRange = (Ind->getValueKind()->getZExtValue() ==<br class="gmail_msg">
+                  llvm::InstrProfValueKind::IPVK_MemOPSize);<br class="gmail_msg">
+  CallInst *Call = nullptr;<br class="gmail_msg">
+  if (!IsRange) {<br class="gmail_msg">
+    Value *Args[3] = {Ind->getTargetValue(),<br class="gmail_msg">
+                      Builder.CreateBitCast(DataVar, Builder.getInt8PtrTy()),<br class="gmail_msg">
+                      Builder.getInt32(Index)};<br class="gmail_msg">
+    Call = Builder.CreateCall(getOrInsertValueProfilingCall(*M, *TLI), Args);<br class="gmail_msg">
+  } else {<br class="gmail_msg">
+    Value *Args[6] = {Ind->getTargetValue(),<br class="gmail_msg">
+                      Builder.CreateBitCast(DataVar, Builder.getInt8PtrTy()),<br class="gmail_msg">
+                      Builder.getInt32(Index),<br class="gmail_msg">
+                      Builder.getInt64(MemOPSizeRangeStart),<br class="gmail_msg">
+                      Builder.getInt64(MemOPSizeRangeLast),<br class="gmail_msg">
+                      Builder.getInt64(MemOPSizeLargeVal)};<br class="gmail_msg">
+    Call =<br class="gmail_msg">
+        Builder.CreateCall(getOrInsertValueProfilingCall(*M, *TLI, true), Args);<br class="gmail_msg">
+  }<br class="gmail_msg">
   if (auto AK = TLI->getExtAttrForI32Param(false))<br class="gmail_msg">
     Call->addAttribute(3, AK);<br class="gmail_msg">
   Ind->replaceAllUsesWith(Call);<br class="gmail_msg">
@@ -658,3 +700,24 @@ void InstrProfiling::emitInitialization(<br class="gmail_msg">
<br class="gmail_msg">
   appendToGlobalCtors(*M, F, 0);<br class="gmail_msg">
 }<br class="gmail_msg">
+<br class="gmail_msg">
+void InstrProfiling::getMemOPSizeOptions() {<br class="gmail_msg">
+  // Parse the value profile options.<br class="gmail_msg">
+  MemOPSizeRangeStart = DefaultMemOPSizeRangeStart;<br class="gmail_msg">
+  MemOPSizeRangeLast = DefaultMemOPSizeRangeLast;<br class="gmail_msg">
+  if (!MemOPSizeRange.empty()) {<br class="gmail_msg">
+    auto Pos = MemOPSizeRange.find(":");<br class="gmail_msg">
+    if (Pos != std::string::npos) {<br class="gmail_msg">
+      if (Pos > 0)<br class="gmail_msg">
+        MemOPSizeRangeStart = std::stoi(MemOPSizeRange.substr(0, Pos));<br class="gmail_msg">
+      if (Pos < MemOPSizeRange.size() - 1)<br class="gmail_msg">
+        MemOPSizeRangeLast = std::stoi(MemOPSizeRange.substr(Pos + 1));<br class="gmail_msg">
+    } else<br class="gmail_msg">
+      MemOPSizeRangeLast = std::stoi(MemOPSizeRange);<br class="gmail_msg">
+  }<br class="gmail_msg">
+  assert(MemOPSizeRangeLast >= MemOPSizeRangeStart);<br class="gmail_msg">
+<br class="gmail_msg">
+  MemOPSizeLargeVal = MemOPSizeLarge;<br class="gmail_msg">
+  if (MemOPSizeLargeVal == 0)<br class="gmail_msg">
+    MemOPSizeLargeVal = INT64_MIN;<br class="gmail_msg">
+}<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/lib/Transforms/Instrumentation/PGOInstrumentation.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/PGOInstrumentation.cpp?rev=297897&r1=297896&r2=297897&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/PGOInstrumentation.cpp?rev=297897&r1=297896&r2=297897&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/lib/Transforms/Instrumentation/PGOInstrumentation.cpp (original)<br class="gmail_msg">
+++ llvm/trunk/lib/Transforms/Instrumentation/PGOInstrumentation.cpp Wed Mar 15 16:47:27 2017<br class="gmail_msg">
@@ -91,6 +91,7 @@ using namespace llvm;<br class="gmail_msg">
<br class="gmail_msg">
 STATISTIC(NumOfPGOInstrument, "Number of edges instrumented.");<br class="gmail_msg">
 STATISTIC(NumOfPGOSelectInsts, "Number of select instruction instrumented.");<br class="gmail_msg">
+STATISTIC(NumOfPGOMemIntrinsics, "Number of mem intrinsics instrumented.");<br class="gmail_msg">
 STATISTIC(NumOfPGOEdge, "Number of edges.");<br class="gmail_msg">
 STATISTIC(NumOfPGOBB, "Number of basic-blocks.");<br class="gmail_msg">
 STATISTIC(NumOfPGOSplit, "Number of critical edge splits.");<br class="gmail_msg">
@@ -168,6 +169,10 @@ static cl::opt<bool><br class="gmail_msg">
                               "display to only one function, use "<br class="gmail_msg">
                               "filtering option -view-bfi-func-name."));<br class="gmail_msg">
<br class="gmail_msg">
+// Command line option to enable/disable memop intrinsic calls..<br class="gmail_msg">
+static cl::opt<bool> PGOInstrMemOP("pgo-instr-memop", cl::init(true),<br class="gmail_msg">
+                                   cl::Hidden);<br class="gmail_msg">
+<br class="gmail_msg">
 // Command line option to turn on CFG dot dump after profile annotation.<br class="gmail_msg">
 // Defined in Analysis/BlockFrequencyInfo.cpp:  -pgo-view-counts<br class="gmail_msg">
 extern cl::opt<bool> PGOViewCounts;<br class="gmail_msg">
@@ -235,6 +240,40 @@ struct SelectInstVisitor : public InstVi<br class="gmail_msg">
   unsigned getNumOfSelectInsts() const { return NSIs; }<br class="gmail_msg">
 };<br class="gmail_msg">
<br class="gmail_msg">
+/// Instruction Visitor class to visit memory intrinsic calls.<br class="gmail_msg">
+struct MemIntrinsicVisitor : public InstVisitor<MemIntrinsicVisitor> {<br class="gmail_msg">
+  Function &F;<br class="gmail_msg">
+  unsigned NMemIs = 0;          // Number of memIntrinsics instrumented.<br class="gmail_msg">
+  VisitMode Mode = VM_counting; // Visiting mode.<br class="gmail_msg">
+  unsigned CurCtrId = 0;        // Current counter index.<br class="gmail_msg">
+  unsigned TotalNumCtrs = 0;    // Total number of counters<br class="gmail_msg">
+  GlobalVariable *FuncNameVar = nullptr;<br class="gmail_msg">
+  uint64_t FuncHash = 0;<br class="gmail_msg">
+  PGOUseFunc *UseFunc = nullptr;<br class="gmail_msg">
+<br class="gmail_msg">
+  MemIntrinsicVisitor(Function &Func) : F(Func) {}<br class="gmail_msg">
+<br class="gmail_msg">
+  void countMemIntrinsics(Function &Func) {<br class="gmail_msg">
+    NMemIs = 0;<br class="gmail_msg">
+    Mode = VM_counting;<br class="gmail_msg">
+    visit(Func);<br class="gmail_msg">
+  }<br class="gmail_msg">
+  void instrumentMemIntrinsics(Function &Func, unsigned TotalNC,<br class="gmail_msg">
+                               GlobalVariable *FNV, uint64_t FHash) {<br class="gmail_msg">
+    Mode = VM_instrument;<br class="gmail_msg">
+    TotalNumCtrs = TotalNC;<br class="gmail_msg">
+    FuncHash = FHash;<br class="gmail_msg">
+    FuncNameVar = FNV;<br class="gmail_msg">
+    visit(Func);<br class="gmail_msg">
+  }<br class="gmail_msg">
+<br class="gmail_msg">
+  // Visit the IR stream and annotate all mem intrinsic call instructions.<br class="gmail_msg">
+  void instrumentOneMemIntrinsic(MemIntrinsic &MI);<br class="gmail_msg">
+  // Visit \p MI instruction and perform tasks according to visit mode.<br class="gmail_msg">
+  void visitMemIntrinsic(MemIntrinsic &SI);<br class="gmail_msg">
+  unsigned getNumOfMemIntrinsics() const { return NMemIs; }<br class="gmail_msg">
+};<br class="gmail_msg">
+<br class="gmail_msg">
 class PGOInstrumentationGenLegacyPass : public ModulePass {<br class="gmail_msg">
 public:<br class="gmail_msg">
   static char ID;<br class="gmail_msg">
@@ -354,6 +393,7 @@ private:<br class="gmail_msg">
 public:<br class="gmail_msg">
   std::vector<std::vector<Instruction *>> ValueSites;<br class="gmail_msg">
   SelectInstVisitor SIVisitor;<br class="gmail_msg">
+  MemIntrinsicVisitor MIVisitor;<br class="gmail_msg">
   std::string FuncName;<br class="gmail_msg">
   GlobalVariable *FuncNameVar;<br class="gmail_msg">
   // CFG hash value for this function.<br class="gmail_msg">
@@ -384,11 +424,13 @@ public:<br class="gmail_msg">
       bool CreateGlobalVar = false, BranchProbabilityInfo *BPI = nullptr,<br class="gmail_msg">
       BlockFrequencyInfo *BFI = nullptr)<br class="gmail_msg">
       : F(Func), ComdatMembers(ComdatMembers), ValueSites(IPVK_Last + 1),<br class="gmail_msg">
-        SIVisitor(Func), FunctionHash(0), MST(F, BPI, BFI) {<br class="gmail_msg">
+        SIVisitor(Func), MIVisitor(Func), FunctionHash(0), MST(F, BPI, BFI) {<br class="gmail_msg">
<br class="gmail_msg">
     // This should be done before CFG hash computation.<br class="gmail_msg">
     SIVisitor.countSelects(Func);<br class="gmail_msg">
+    MIVisitor.countMemIntrinsics(Func);<br class="gmail_msg">
     NumOfPGOSelectInsts += SIVisitor.getNumOfSelectInsts();<br class="gmail_msg">
+    NumOfPGOMemIntrinsics += MIVisitor.getNumOfMemIntrinsics();<br class="gmail_msg">
     ValueSites[IPVK_IndirectCallTarget] = findIndirectCallSites(Func);<br class="gmail_msg">
<br class="gmail_msg">
     FuncName = getPGOFuncName(F);<br class="gmail_msg">
@@ -605,6 +647,10 @@ static void instrumentOneFunc(<br class="gmail_msg">
          Builder.getInt32(NumIndirectCallSites++)});<br class="gmail_msg">
   }<br class="gmail_msg">
   NumOfPGOICall += NumIndirectCallSites;<br class="gmail_msg">
+<br class="gmail_msg">
+  // Now instrument memop intrinsic calls.<br class="gmail_msg">
+  FuncInfo.MIVisitor.instrumentMemIntrinsics(<br class="gmail_msg">
+      F, NumCounters, FuncInfo.FuncNameVar, FuncInfo.FunctionHash);<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
 // This class represents a CFG edge in profile use compilation.<br class="gmail_msg">
@@ -1076,6 +1122,42 @@ void SelectInstVisitor::visitSelectInst(<br class="gmail_msg">
   llvm_unreachable("Unknown visiting mode");<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
+void MemIntrinsicVisitor::instrumentOneMemIntrinsic(MemIntrinsic &MI) {<br class="gmail_msg">
+  Module *M = F.getParent();<br class="gmail_msg">
+  IRBuilder<> Builder(&MI);<br class="gmail_msg">
+  Type *Int64Ty = Builder.getInt64Ty();<br class="gmail_msg">
+  Type *I8PtrTy = Builder.getInt8PtrTy();<br class="gmail_msg">
+  Value *Length = MI.getLength();<br class="gmail_msg">
+  assert(!dyn_cast<ConstantInt>(Length));<br class="gmail_msg">
+  Builder.CreateCall(<br class="gmail_msg">
+      Intrinsic::getDeclaration(M, Intrinsic::instrprof_value_profile),<br class="gmail_msg">
+      {llvm::ConstantExpr::getBitCast(FuncNameVar, I8PtrTy),<br class="gmail_msg">
+       Builder.getInt64(FuncHash), Builder.CreatePtrToInt(Length, Int64Ty),<br class="gmail_msg">
+       Builder.getInt32(IPVK_MemOPSize), Builder.getInt32(CurCtrId)});<br class="gmail_msg">
+  ++CurCtrId;<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+void MemIntrinsicVisitor::visitMemIntrinsic(MemIntrinsic &MI) {<br class="gmail_msg">
+  if (!PGOInstrMemOP)<br class="gmail_msg">
+    return;<br class="gmail_msg">
+  Value *Length = MI.getLength();<br class="gmail_msg">
+  // Not instrument constant length calls.<br class="gmail_msg">
+  if (dyn_cast<ConstantInt>(Length))<br class="gmail_msg">
+    return;<br class="gmail_msg">
+<br class="gmail_msg">
+  NMemIs++;<br class="gmail_msg">
+  switch (Mode) {<br class="gmail_msg">
+  case VM_counting:<br class="gmail_msg">
+    return;<br class="gmail_msg">
+  case VM_instrument:<br class="gmail_msg">
+    instrumentOneMemIntrinsic(MI);<br class="gmail_msg">
+    return;<br class="gmail_msg">
+  case VM_annotate:<br class="gmail_msg">
+    break;<br class="gmail_msg">
+  }<br class="gmail_msg">
+  llvm_unreachable("Unknown visiting mode");<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
 // Traverse all valuesites and annotate the instructions for all value kind.<br class="gmail_msg">
 void PGOUseFunc::annotateValueSites() {<br class="gmail_msg">
   if (DisableValueProfiling)<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/test/Instrumentation/InstrProfiling/PR23499.ll<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/InstrProfiling/PR23499.ll?rev=297897&r1=297896&r2=297897&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/InstrProfiling/PR23499.ll?rev=297897&r1=297896&r2=297897&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/test/Instrumentation/InstrProfiling/PR23499.ll (original)<br class="gmail_msg">
+++ llvm/trunk/test/Instrumentation/InstrProfiling/PR23499.ll Wed Mar 15 16:47:27 2017<br class="gmail_msg">
@@ -15,13 +15,13 @@ $_Z3barIvEvv = comdat any<br class="gmail_msg">
<br class="gmail_msg">
 ; CHECK-NOT: __profn__Z3barIvEvv<br class="gmail_msg">
 ; CHECK: @__profc__Z3barIvEvv = linkonce_odr hidden global [1 x i64] zeroinitializer, section "{{.*}}__llvm_prf_cnts", comdat($__profv__Z3barIvEvv), align 8<br class="gmail_msg">
-; CHECK: @__profd__Z3barIvEvv = linkonce_odr hidden global { i64, i64, i64*, i8*, i8*, i32, [1 x i16] } { i64 4947693190065689389, i64 0, i64* getelementptr inbounds ([1 x i64], [1 x i64]* @__profc__Z3barIvEvv, i32 0, i32 0), i8*{{.*}}, i8* null, i32 1, [1 x i16] zeroinitializer }, section "{{.*}}__llvm_prf_data{{.*}}", comdat($__profv__Z3barIvEvv), align 8<br class="gmail_msg">
+; CHECK: @__profd__Z3barIvEvv = linkonce_odr hidden global { i64, i64, i64*, i8*, i8*, i32, [2 x i16] } { i64 4947693190065689389, i64 0, i64* getelementptr inbounds ([1 x i64], [1 x i64]* @__profc__Z3barIvEvv, i32 0, i32 0), i8*{{.*}}, i8* null, i32 1, [2 x i16] zeroinitializer }, section "{{.*}}__llvm_prf_data{{.*}}", comdat($__profv__Z3barIvEvv), align 8<br class="gmail_msg">
 ; CHECK: @__llvm_prf_nm = private constant [{{.*}} x i8] c"{{.*}}", section "{{.*}}__llvm_prf_names"<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
 ; COFF-NOT: __profn__Z3barIvEvv<br class="gmail_msg">
 ; COFF: @__profc__Z3barIvEvv = linkonce_odr hidden global [1 x i64] zeroinitializer, section "{{.*}}__llvm_prf_cnts", comdat, align 8<br class="gmail_msg">
-; COFF: @__profd__Z3barIvEvv = linkonce_odr hidden global { i64, i64, i64*, i8*, i8*, i32, [1 x i16] } { i64 4947693190065689389, i64 0, i64* getelementptr inbounds ([1 x i64], [1 x i64]* @__profc__Z3barIvEvv, i32 0, i32 0), i8*{{.*}}, i8* null, i32 1, [1 x i16] zeroinitializer }, section "{{.*}}__llvm_prf_data{{.*}}", comdat($__profc__Z3barIvEvv), align 8<br class="gmail_msg">
+; COFF: @__profd__Z3barIvEvv = linkonce_odr hidden global { i64, i64, i64*, i8*, i8*, i32, [2 x i16] } { i64 4947693190065689389, i64 0, i64* getelementptr inbounds ([1 x i64], [1 x i64]* @__profc__Z3barIvEvv, i32 0, i32 0), i8*{{.*}}, i8* null, i32 1, [2 x i16] zeroinitializer }, section "{{.*}}__llvm_prf_data{{.*}}", comdat($__profc__Z3barIvEvv), align 8<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
 declare void @llvm.instrprof.increment(i8*, i64, i32, i32) #1<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/test/Instrumentation/InstrProfiling/icall.ll<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/InstrProfiling/icall.ll?rev=297897&r1=297896&r2=297897&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/InstrProfiling/icall.ll?rev=297897&r1=297896&r2=297897&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/test/Instrumentation/InstrProfiling/icall.ll (original)<br class="gmail_msg">
+++ llvm/trunk/test/Instrumentation/InstrProfiling/icall.ll Wed Mar 15 16:47:27 2017<br class="gmail_msg">
@@ -37,9 +37,9 @@ attributes #0 = { nounwind }<br class="gmail_msg">
 ; DYN-NOT: @__profvp_foo<br class="gmail_msg">
 ; DYN-NOT: @__llvm_prf_vnodes<br class="gmail_msg">
<br class="gmail_msg">
-; STATIC: call void @__llvm_profile_instrument_target(i64 %3, i8* bitcast ({ i64, i64, i64*, i8*, i8*, i32, [1 x i16] }* @__profd_foo to i8*), i32 0)<br class="gmail_msg">
-; STATIC-EXT: call void @__llvm_profile_instrument_target(i64 %3, i8* bitcast ({ i64, i64, i64*, i8*, i8*, i32, [1 x i16] }* @__profd_foo to i8*), i32 zeroext 0)<br class="gmail_msg">
-; STATIC-SEXT: call void @__llvm_profile_instrument_target(i64 %3, i8* bitcast ({ i64, i64, i64*, i8*, i8*, i32, [1 x i16] }* @__profd_foo to i8*), i32 signext 0)<br class="gmail_msg">
+; STATIC: call void @__llvm_profile_instrument_target(i64 %3, i8* bitcast ({ i64, i64, i64*, i8*, i8*, i32, [2 x i16] }* @__profd_foo to i8*), i32 0)<br class="gmail_msg">
+; STATIC-EXT: call void @__llvm_profile_instrument_target(i64 %3, i8* bitcast ({ i64, i64, i64*, i8*, i8*, i32, [2 x i16] }* @__profd_foo to i8*), i32 zeroext 0)<br class="gmail_msg">
+; STATIC-SEXT: call void @__llvm_profile_instrument_target(i64 %3, i8* bitcast ({ i64, i64, i64*, i8*, i8*, i32, [2 x i16] }* @__profd_foo to i8*), i32 signext 0)<br class="gmail_msg">
<br class="gmail_msg">
 ; STATIC: declare void @__llvm_profile_instrument_target(i64, i8*, i32)<br class="gmail_msg">
 ; STATIC-EXT: declare void @__llvm_profile_instrument_target(i64, i8*, i32 zeroext)<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/test/Transforms/PGOProfile/comdat_internal.ll<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/PGOProfile/comdat_internal.ll?rev=297897&r1=297896&r2=297897&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/PGOProfile/comdat_internal.ll?rev=297897&r1=297896&r2=297897&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/test/Transforms/PGOProfile/comdat_internal.ll (original)<br class="gmail_msg">
+++ llvm/trunk/test/Transforms/PGOProfile/comdat_internal.ll Wed Mar 15 16:47:27 2017<br class="gmail_msg">
@@ -14,9 +14,9 @@ $foo = comdat any<br class="gmail_msg">
 ; CHECK: @__llvm_profile_raw_version = constant i64 {{[0-9]+}}, comdat<br class="gmail_msg">
 ; CHECK-NOT: __profn__stdin__foo<br class="gmail_msg">
 ; CHECK: @__profc__stdin__foo.[[FOO_HASH]] = private global [1 x i64] zeroinitializer, section "__llvm_prf_cnts", comdat($__profv__stdin__foo.[[FOO_HASH]]), align 8<br class="gmail_msg">
-; CHECK: @__profd__stdin__foo.[[FOO_HASH]] = private global { i64, i64, i64*, i8*, i8*, i32, [1 x i16] } { i64 -5640069336071256030, i64 [[FOO_HASH]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @__profc__stdin__foo.[[FOO_HASH]], i32 0, i32 0), i8* null<br class="gmail_msg">
+; CHECK: @__profd__stdin__foo.[[FOO_HASH]] = private global { i64, i64, i64*, i8*, i8*, i32, [2 x i16] } { i64 -5640069336071256030, i64 [[FOO_HASH]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @__profc__stdin__foo.[[FOO_HASH]], i32 0, i32 0), i8* null<br class="gmail_msg">
 ; CHECK-NOT: bitcast (i32 ()* @foo to i8*)<br class="gmail_msg">
-; CHECK-SAME: , i8* null, i32 1, [1 x i16] zeroinitializer }, section "__llvm_prf_data", comdat($__profv__stdin__foo.[[FOO_HASH]]), align 8<br class="gmail_msg">
+; CHECK-SAME: , i8* null, i32 1, [2 x i16] zeroinitializer }, section "__llvm_prf_data", comdat($__profv__stdin__foo.[[FOO_HASH]]), align 8<br class="gmail_msg">
 ; CHECK: @__llvm_prf_nm<br class="gmail_msg">
 ; CHECK: @llvm.used<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/tools/llvm-profdata/llvm-profdata.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-profdata/llvm-profdata.cpp?rev=297897&r1=297896&r2=297897&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-profdata/llvm-profdata.cpp?rev=297897&r1=297896&r2=297897&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/tools/llvm-profdata/llvm-profdata.cpp (original)<br class="gmail_msg">
+++ llvm/trunk/tools/llvm-profdata/llvm-profdata.cpp Wed Mar 15 16:47:27 2017<br class="gmail_msg">
@@ -458,7 +458,7 @@ typedef struct ValueSitesStats {<br class="gmail_msg">
<br class="gmail_msg">
 static void traverseAllValueSites(const InstrProfRecord &Func, uint32_t VK,<br class="gmail_msg">
                                   ValueSitesStats &Stats, raw_fd_ostream &OS,<br class="gmail_msg">
-                                  InstrProfSymtab &Symtab) {<br class="gmail_msg">
+                                  InstrProfSymtab *Symtab) {<br class="gmail_msg">
   uint32_t NS = Func.getNumValueSites(VK);<br class="gmail_msg">
   Stats.TotalNumValueSites += NS;<br class="gmail_msg">
   for (size_t I = 0; I < NS; ++I) {<br class="gmail_msg">
@@ -473,8 +473,11 @@ static void traverseAllValueSites(const<br class="gmail_msg">
     }<br class="gmail_msg">
     for (uint32_t V = 0; V < NV; V++) {<br class="gmail_msg">
       OS << "\t[ " << I << ", ";<br class="gmail_msg">
-      OS << Symtab.getFuncName(VD[V].Value) << ", " << VD[V].Count;<br class="gmail_msg">
-      OS << " ]\n";<br class="gmail_msg">
+      if (Symtab == nullptr)<br class="gmail_msg">
+        OS << VD[V].Value;<br class="gmail_msg">
+      else<br class="gmail_msg">
+        OS << Symtab->getFuncName(VD[V].Value);<br class="gmail_msg">
+      OS << ", " << VD[V].Count << " ]\n";<br class="gmail_msg">
     }<br class="gmail_msg">
   }<br class="gmail_msg">
 }<br class="gmail_msg">
@@ -494,7 +497,7 @@ static void showValueSitesStats(raw_fd_o<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
 static int showInstrProfile(const std::string &Filename, bool ShowCounts,<br class="gmail_msg">
-                            bool ShowIndirectCallTargets,<br class="gmail_msg">
+                            bool ShowIndirectCallTargets, bool ShowMemOPSizes,<br class="gmail_msg">
                             bool ShowDetailedSummary,<br class="gmail_msg">
                             std::vector<uint32_t> DetailedSummaryCutoffs,<br class="gmail_msg">
                             bool ShowAllFunctions,<br class="gmail_msg">
@@ -547,6 +550,11 @@ static int showInstrProfile(const std::s<br class="gmail_msg">
         OS << "    Indirect Call Site Count: "<br class="gmail_msg">
            << Func.getNumValueSites(IPVK_IndirectCallTarget) << "\n";<br class="gmail_msg">
<br class="gmail_msg">
+      uint32_t NumMemOPCalls = Func.getNumValueSites(IPVK_MemOPSize);<br class="gmail_msg">
+      if (ShowMemOPSizes && NumMemOPCalls > 0)<br class="gmail_msg">
+        OS << "    Number of Memory Intrinsics Calls: " << NumMemOPCalls<br class="gmail_msg">
+           << "\n";<br class="gmail_msg">
+<br class="gmail_msg">
       if (ShowCounts) {<br class="gmail_msg">
         OS << "    Block counts: [";<br class="gmail_msg">
         size_t Start = (IsIRInstr ? 0 : 1);<br class="gmail_msg">
@@ -560,7 +568,13 @@ static int showInstrProfile(const std::s<br class="gmail_msg">
         OS << "    Indirect Target Results:\n";<br class="gmail_msg">
         traverseAllValueSites(Func, IPVK_IndirectCallTarget,<br class="gmail_msg">
                               VPStats[IPVK_IndirectCallTarget], OS,<br class="gmail_msg">
-                              Reader->getSymtab());<br class="gmail_msg">
+                              &(Reader->getSymtab()));<br class="gmail_msg">
+      }<br class="gmail_msg">
+<br class="gmail_msg">
+      if (ShowMemOPSizes && NumMemOPCalls > 0) {<br class="gmail_msg">
+        OS << "    Memory Instrinsic Size Results:\n";<br class="gmail_msg">
+        traverseAllValueSites(Func, IPVK_MemOPSize, VPStats[IPVK_MemOPSize], OS,<br class="gmail_msg">
+                              nullptr);<br class="gmail_msg">
       }<br class="gmail_msg">
     }<br class="gmail_msg">
   }<br class="gmail_msg">
@@ -575,12 +589,18 @@ static int showInstrProfile(const std::s<br class="gmail_msg">
   OS << "Total functions: " << PS->getNumFunctions() << "\n";<br class="gmail_msg">
   OS << "Maximum function count: " << PS->getMaxFunctionCount() << "\n";<br class="gmail_msg">
   OS << "Maximum internal block count: " << PS->getMaxInternalCount() << "\n";<br class="gmail_msg">
+<br class="gmail_msg">
   if (ShownFunctions && ShowIndirectCallTargets) {<br class="gmail_msg">
     OS << "Statistics for indirect call sites profile:\n";<br class="gmail_msg">
     showValueSitesStats(OS, IPVK_IndirectCallTarget,<br class="gmail_msg">
                         VPStats[IPVK_IndirectCallTarget]);<br class="gmail_msg">
   }<br class="gmail_msg">
<br class="gmail_msg">
+  if (ShownFunctions && ShowMemOPSizes) {<br class="gmail_msg">
+    OS << "Statistics for memory intrinsic calls sizes profile:\n";<br class="gmail_msg">
+    showValueSitesStats(OS, IPVK_MemOPSize, VPStats[IPVK_MemOPSize]);<br class="gmail_msg">
+  }<br class="gmail_msg">
+<br class="gmail_msg">
   if (ShowDetailedSummary) {<br class="gmail_msg">
     OS << "Detailed summary:\n";<br class="gmail_msg">
     OS << "Total number of blocks: " << PS->getNumCounts() << "\n";<br class="gmail_msg">
@@ -629,6 +649,10 @@ static int show_main(int argc, const cha<br class="gmail_msg">
   cl::opt<bool> ShowIndirectCallTargets(<br class="gmail_msg">
       "ic-targets", cl::init(false),<br class="gmail_msg">
       cl::desc("Show indirect call site target values for shown functions"));<br class="gmail_msg">
+  cl::opt<bool> ShowMemOPSizes(<br class="gmail_msg">
+      "memop-sizes", cl::init(false),<br class="gmail_msg">
+      cl::desc("Show the profiled sizes of the memory intrinsic calls "<br class="gmail_msg">
+               "for shown functions"));<br class="gmail_msg">
   cl::opt<bool> ShowDetailedSummary("detailed-summary", cl::init(false),<br class="gmail_msg">
                                     cl::desc("Show detailed profile summary"));<br class="gmail_msg">
   cl::list<uint32_t> DetailedSummaryCutoffs(<br class="gmail_msg">
@@ -667,8 +691,9 @@ static int show_main(int argc, const cha<br class="gmail_msg">
                                 DetailedSummaryCutoffs.end());<br class="gmail_msg">
   if (ProfileKind == instr)<br class="gmail_msg">
     return showInstrProfile(Filename, ShowCounts, ShowIndirectCallTargets,<br class="gmail_msg">
-                            ShowDetailedSummary, DetailedSummaryCutoffs,<br class="gmail_msg">
-                            ShowAllFunctions, ShowFunction, TextFormat, OS);<br class="gmail_msg">
+                            ShowMemOPSizes, ShowDetailedSummary,<br class="gmail_msg">
+                            DetailedSummaryCutoffs, ShowAllFunctions,<br class="gmail_msg">
+                            ShowFunction, TextFormat, OS);<br class="gmail_msg">
   else<br class="gmail_msg">
     return showSampleProfile(Filename, ShowCounts, ShowAllFunctions,<br class="gmail_msg">
                              ShowFunction, OS);<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
llvm-commits mailing list<br class="gmail_msg">
<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="gmail_msg">
</blockquote></div>