From: Bob Wilson Date: Thu, 6 Mar 2014 04:55:35 +0000 (+0000) Subject: Refactor PGO code in preparation for handling non-C/C++ code. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=83717113c57b1f9f7be295b007d60b44ac13f404;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203073 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp index c550aaded7..d0f1cb6b25 100644 --- a/lib/CodeGen/CodeGenFunction.cpp +++ b/lib/CodeGen/CodeGenFunction.cpp @@ -589,7 +589,6 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, 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(GlobalDecl GD, llvm::Function *Fn, StartFunction(GD, ResTy, Fn, FnInfo, Args, BodyRange.getBegin()); // Generate the body of the function. + PGO.assignRegionCounters(GD.getDecl(), CGM.getMangledName(GD)); if (isa(FD)) EmitDestructorBody(Args); else if (isa(FD)) @@ -831,7 +831,7 @@ void CodeGenFunction::GenerateCode(GlobalDecl GD, llvm::Function *Fn, if (!CurFn->doesNotThrow()) TryMarkNoThrow(CurFn); - PGO.emitWriteoutFunction(CurGD); + PGO.emitWriteoutFunction(CGM.getMangledName(CurGD)); PGO.destroyRegionCounters(); } diff --git a/lib/CodeGen/CodeGenPGO.cpp b/lib/CodeGen/CodeGenPGO.cpp index 38bb4c00aa..a918658b47 100644 --- a/lib/CodeGen/CodeGenPGO.cpp +++ b/lib/CodeGen/CodeGenPGO.cpp @@ -162,7 +162,7 @@ bool PGOProfileData::getFunctionCounts(StringRef MangledName, return false; } -void CodeGenPGO::emitWriteoutFunction(GlobalDecl &GD) { +void CodeGenPGO::emitWriteoutFunction(StringRef Name) { if (!CGM.getCodeGenOpts().ProfileInstrGenerate) return; @@ -207,7 +207,7 @@ void CodeGenPGO::emitWriteoutFunction(GlobalDecl &GD) { 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(CGBuilderTy &Builder, unsigned Counter) { 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(); - if (PGOData->getFunctionCounts(CGM.getMangledName(GD), *RegionCounts) || + if (PGOData->getFunctionCounts(Name, *RegionCounts) || RegionCounts->size() != NumRegionCounters) { delete RegionCounts; RegionCounts = 0; diff --git a/lib/CodeGen/CodeGenPGO.h b/lib/CodeGen/CodeGenPGO.h index 5f7da4c79a..6af25b4205 100644 --- a/lib/CodeGen/CodeGenPGO.h +++ b/lib/CodeGen/CodeGenPGO.h @@ -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