r203073 - Refactor PGO code in preparation for handling non-C/C++ code.

Bob Wilson bob.wilson at apple.com
Wed Mar 5 20:55:35 PST 2014


Author: bwilson
Date: Wed Mar  5 22:55:35 2014
New Revision: 203073

URL: http://llvm.org/viewvc/llvm-project?rev=203073&view=rev
Log:
Refactor PGO code in preparation for handling non-C/C++ code.

Move the PGO.assignRegionCounters() call out of StartFunction, because that
function is called from many places where it does not make sense to do PGO
instrumentation (e.g., compiler-generated helper functions). Change several
functions to take a StringRef argument for the unique name associated with
a function, so that the name can be set differently for things like Objective-C
methods and block literals.

Modified:
    cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
    cfe/trunk/lib/CodeGen/CodeGenPGO.cpp
    cfe/trunk/lib/CodeGen/CodeGenPGO.h

Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=203073&r1=203072&r2=203073&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Wed Mar  5 22:55:35 2014
@@ -589,7 +589,6 @@ void CodeGenFunction::StartFunction(Glob
   if (CGM.getCodeGenOpts().InstrumentForProfiling)
     EmitMCountInstrumentation();
 
-  PGO.assignRegionCounters(GD);
   if (CGM.getPGOData() && D) {
     // Turn on InlineHint attribute for hot functions.
     if (CGM.getPGOData()->isHotFunction(CGM.getMangledName(GD)))
@@ -771,6 +770,7 @@ void CodeGenFunction::GenerateCode(Globa
   StartFunction(GD, ResTy, Fn, FnInfo, Args, BodyRange.getBegin());
 
   // Generate the body of the function.
+  PGO.assignRegionCounters(GD.getDecl(), CGM.getMangledName(GD));
   if (isa<CXXDestructorDecl>(FD))
     EmitDestructorBody(Args);
   else if (isa<CXXConstructorDecl>(FD))
@@ -831,7 +831,7 @@ void CodeGenFunction::GenerateCode(Globa
   if (!CurFn->doesNotThrow())
     TryMarkNoThrow(CurFn);
 
-  PGO.emitWriteoutFunction(CurGD);
+  PGO.emitWriteoutFunction(CGM.getMangledName(CurGD));
   PGO.destroyRegionCounters();
 }
 

Modified: cfe/trunk/lib/CodeGen/CodeGenPGO.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenPGO.cpp?rev=203073&r1=203072&r2=203073&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenPGO.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenPGO.cpp Wed Mar  5 22:55:35 2014
@@ -162,7 +162,7 @@ bool PGOProfileData::getFunctionCounts(S
   return false;
 }
 
-void CodeGenPGO::emitWriteoutFunction(GlobalDecl &GD) {
+void CodeGenPGO::emitWriteoutFunction(StringRef Name) {
   if (!CGM.getCodeGenOpts().ProfileInstrGenerate)
     return;
 
@@ -207,7 +207,7 @@ void CodeGenPGO::emitWriteoutFunction(Gl
     CGM.getModule().getOrInsertFunction("llvm_pgo_emit", FTy);
 
   llvm::Constant *MangledName =
-    CGM.GetAddrOfConstantCString(CGM.getMangledName(GD), "__llvm_pgo_name");
+    CGM.GetAddrOfConstantCString(Name, "__llvm_pgo_name");
   MangledName = llvm::ConstantExpr::getBitCast(MangledName, Int8PtrTy);
   PGOBuilder.CreateCall3(EmitFunc, MangledName,
                          PGOBuilder.getInt32(NumRegionCounters),
@@ -728,19 +728,18 @@ namespace {
   };
 }
 
-void CodeGenPGO::assignRegionCounters(GlobalDecl &GD) {
+void CodeGenPGO::assignRegionCounters(const Decl *D, StringRef Name) {
   bool InstrumentRegions = CGM.getCodeGenOpts().ProfileInstrGenerate;
   PGOProfileData *PGOData = CGM.getPGOData();
   if (!InstrumentRegions && !PGOData)
     return;
-  const Decl *D = GD.getDecl();
   if (!D)
     return;
   mapRegionCounters(D);
   if (InstrumentRegions)
     emitCounterVariables();
   if (PGOData) {
-    loadRegionCounts(GD, PGOData);
+    loadRegionCounts(Name, PGOData);
     computeRegionCounts(D);
   }
 }
@@ -781,13 +780,13 @@ void CodeGenPGO::emitCounterIncrement(CG
   Builder.CreateStore(Count, Addr);
 }
 
-void CodeGenPGO::loadRegionCounts(GlobalDecl &GD, PGOProfileData *PGOData) {
+void CodeGenPGO::loadRegionCounts(StringRef Name, PGOProfileData *PGOData) {
   // For now, ignore the counts from the PGO data file only if the number of
   // counters does not match. This could be tightened down in the future to
   // ignore counts when the input changes in various ways, e.g., by comparing a
   // hash value based on some characteristics of the input.
   RegionCounts = new std::vector<uint64_t>();
-  if (PGOData->getFunctionCounts(CGM.getMangledName(GD), *RegionCounts) ||
+  if (PGOData->getFunctionCounts(Name, *RegionCounts) ||
       RegionCounts->size() != NumRegionCounters) {
     delete RegionCounts;
     RegionCounts = 0;

Modified: cfe/trunk/lib/CodeGen/CodeGenPGO.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenPGO.h?rev=203073&r1=203072&r2=203073&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenPGO.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenPGO.h Wed Mar  5 22:55:35 2014
@@ -118,9 +118,9 @@ public:
   /// function. Does nothing if instrumentation is not enabled and either
   /// generates global variables or associates PGO data with each of the
   /// counters depending on whether we are generating or using instrumentation.
-  void assignRegionCounters(GlobalDecl &GD);
+  void assignRegionCounters(const Decl *D, StringRef Name);
   /// Emit code to write counts for a given function to disk, if necessary.
-  void emitWriteoutFunction(GlobalDecl &GD);
+  void emitWriteoutFunction(StringRef Name);
   /// Clean up region counter state. Must be called if assignRegionCounters is
   /// used.
   void destroyRegionCounters();
@@ -131,7 +131,7 @@ public:
 private:
   void mapRegionCounters(const Decl *D);
   void computeRegionCounts(const Decl *D);
-  void loadRegionCounts(GlobalDecl &GD, PGOProfileData *PGOData);
+  void loadRegionCounts(StringRef Name, PGOProfileData *PGOData);
   void emitCounterVariables();
 
   /// Emit code to increment the counter at the given index





More information about the cfe-commits mailing list