Vedant Kumar <v...@apple.com> writes: > vsk created this revision. > vsk added a reviewer: bogner. > vsk added a subscriber: cfe-commits. > > Cons: 1 extra malloc per CodeGenFunction instantiation. > > Pros: This makes incremental builds noticeably faster, especially on > my laptop. E.g with this patch there's no need to re-compile > clang/lib/CodeGen/CGCUDARuntime.cpp InstrProfReader.h changes.
I doubt this is worthwhile. Mildly opposed. If you do do this, use a unique_ptr rather than raw new/delete. > http://reviews.llvm.org/D19243 > > Files: > lib/CodeGen/CGBlocks.cpp > lib/CodeGen/CGCall.cpp > lib/CodeGen/CGExpr.cpp > lib/CodeGen/CGObjC.cpp > lib/CodeGen/CGStmt.cpp > lib/CodeGen/CGStmtOpenMP.cpp > lib/CodeGen/CodeGenFunction.cpp > lib/CodeGen/CodeGenFunction.h > lib/CodeGen/CodeGenPGO.cpp > > Index: lib/CodeGen/CodeGenPGO.cpp > =================================================================== > --- lib/CodeGen/CodeGenPGO.cpp > +++ lib/CodeGen/CodeGenPGO.cpp > @@ -878,12 +878,33 @@ > > llvm::MDNode *CodeGenFunction::createProfileWeightsForLoop(const Stmt *Cond, > uint64_t > LoopCount) { > - if (!PGO.haveRegionCounts()) > + if (!PGO->haveRegionCounts()) > return nullptr; > - Optional<uint64_t> CondCount = PGO.getStmtCount(Cond); > + Optional<uint64_t> CondCount = PGO->getStmtCount(Cond); > assert(CondCount.hasValue() && "missing expected loop condition count"); > if (*CondCount == 0) > return nullptr; > return createProfileWeights(LoopCount, > std::max(*CondCount, LoopCount) - LoopCount); > } > + > +void CodeGenFunction::incrementProfileCounter(const Stmt *S) { > + if (CGM.getCodeGenOpts().hasProfileClangInstr()) > + PGO->emitCounterIncrement(Builder, S); > + PGO->setCurrentStmt(S); > +} > + > +uint64_t CodeGenFunction::getProfileCount(const Stmt *S) { > + Optional<uint64_t> Count = PGO->getStmtCount(S); > + if (!Count.hasValue()) > + return 0; > + return *Count; > +} > + > +void CodeGenFunction::setCurrentProfileCount(uint64_t Count) { > + PGO->setCurrentRegionCount(Count); > +} > + > +uint64_t CodeGenFunction::getCurrentProfileCount() { > + return PGO->getCurrentRegionCount(); > +} > Index: lib/CodeGen/CodeGenFunction.h > =================================================================== > --- lib/CodeGen/CodeGenFunction.h > +++ lib/CodeGen/CodeGenFunction.h > @@ -19,7 +19,6 @@ > #include "CGLoopInfo.h" > #include "CGValue.h" > #include "CodeGenModule.h" > -#include "CodeGenPGO.h" > #include "EHScopeStack.h" > #include "clang/AST/CharUnits.h" > #include "clang/AST/ExprCXX.h" > @@ -76,6 +75,7 @@ > class ObjCAutoreleasePoolStmt; > > namespace CodeGen { > +class CodeGenPGO; > class CodeGenTypes; > class CGFunctionInfo; > class CGRecordLayout; > @@ -692,7 +692,7 @@ > /// block through the normal cleanup handling code (if any) and then > /// on to \arg Dest. > void EmitBranchThroughCleanup(JumpDest Dest); > - > + > /// isObviouslyBranchWithoutCleanups - Return true if a branch to the > /// specified destination obviously has no cleanups to run. 'false' is > always > /// a conservatively correct answer for this method. > @@ -900,7 +900,7 @@ > if (Data.isValid()) Data.unbind(CGF); > } > }; > - > + > private: > CGDebugInfo *DebugInfo; > bool DisableDebugInfo; > @@ -943,7 +943,7 @@ > }; > SmallVector<BreakContinue, 8> BreakContinueStack; > > - CodeGenPGO PGO; > + CodeGenPGO *PGO; > > /// Calculate branch weights appropriate for PGO data > llvm::MDNode *createProfileWeights(uint64_t TrueCount, uint64_t > FalseCount); > @@ -953,30 +953,17 @@ > > public: > /// Increment the profiler's counter for the given statement. > - void incrementProfileCounter(const Stmt *S) { > - if (CGM.getCodeGenOpts().hasProfileClangInstr()) > - PGO.emitCounterIncrement(Builder, S); > - PGO.setCurrentStmt(S); > - } > + void incrementProfileCounter(const Stmt *S); > > /// Get the profiler's count for the given statement. > - uint64_t getProfileCount(const Stmt *S) { > - Optional<uint64_t> Count = PGO.getStmtCount(S); > - if (!Count.hasValue()) > - return 0; > - return *Count; > - } > + uint64_t getProfileCount(const Stmt *S); > > /// Set the profiler's current count. > - void setCurrentProfileCount(uint64_t Count) { > - PGO.setCurrentRegionCount(Count); > - } > + void setCurrentProfileCount(uint64_t Count); > > /// Get the profiler's current count. This is generally the count for the > most > /// recently incremented counter. > - uint64_t getCurrentProfileCount() { > - return PGO.getCurrentRegionCount(); > - } > + uint64_t getCurrentProfileCount(); > > private: > > Index: lib/CodeGen/CodeGenFunction.cpp > =================================================================== > --- lib/CodeGen/CodeGenFunction.cpp > +++ lib/CodeGen/CodeGenFunction.cpp > @@ -52,7 +52,7 @@ > ExceptionSlot(nullptr), EHSelectorSlot(nullptr), > DebugInfo(CGM.getModuleDebugInfo()), > DisableDebugInfo(false), DidCallStackSave(false), > IndirectBranch(nullptr), > - PGO(cgm), SwitchInsn(nullptr), SwitchWeights(nullptr), > + PGO(new CodeGenPGO(cgm)), SwitchInsn(nullptr), SwitchWeights(nullptr), > CaseRangeBlock(nullptr), UnreachableBlock(nullptr), NumReturnExprs(0), > NumSimpleReturnExprs(0), CXXABIThisDecl(nullptr), > CXXABIThisValue(nullptr), CXXThisValue(nullptr), > @@ -94,6 +94,8 @@ > if (getLangOpts().OpenMP) { > CGM.getOpenMPRuntime().functionFinished(*this); > } > + > + delete PGO; > } > > CharUnits CodeGenFunction::getNaturalPointeeTypeAlignment(QualType T, > @@ -988,7 +990,7 @@ > StartFunction(GD, ResTy, Fn, FnInfo, Args, Loc, BodyRange.getBegin()); > > // Generate the body of the function. > - PGO.assignRegionCounters(GD, CurFn); > + PGO->assignRegionCounters(GD, CurFn); > if (isa<CXXDestructorDecl>(FD)) > EmitDestructorBody(Args); > else if (isa<CXXConstructorDecl>(FD)) > Index: lib/CodeGen/CGStmtOpenMP.cpp > =================================================================== > --- lib/CodeGen/CGStmtOpenMP.cpp > +++ lib/CodeGen/CGStmtOpenMP.cpp > @@ -15,6 +15,7 @@ > #include "CGOpenMPRuntime.h" > #include "CodeGenFunction.h" > #include "CodeGenModule.h" > +#include "CodeGenPGO.h" > #include "TargetInfo.h" > #include "clang/AST/Stmt.h" > #include "clang/AST/StmtOpenMP.h" > @@ -259,7 +260,7 @@ > ++I; > } > > - PGO.assignRegionCounters(GlobalDecl(CD), F); > + PGO->assignRegionCounters(GlobalDecl(CD), F); > CapturedStmtInfo->EmitBody(*this, CD->getBody()); > FinishFunction(CD->getBodyRBrace()); > > Index: lib/CodeGen/CGStmt.cpp > =================================================================== > --- lib/CodeGen/CGStmt.cpp > +++ lib/CodeGen/CGStmt.cpp > @@ -14,6 +14,7 @@ > #include "CodeGenFunction.h" > #include "CGDebugInfo.h" > #include "CodeGenModule.h" > +#include "CodeGenPGO.h" > #include "TargetInfo.h" > #include "clang/AST/StmtVisitor.h" > #include "clang/Basic/Builtins.h" > @@ -47,7 +48,7 @@ > > void CodeGenFunction::EmitStmt(const Stmt *S) { > assert(S && "Null statement?"); > - PGO.setCurrentStmt(S); > + PGO->setCurrentStmt(S); > > // These statements have their own debug info handling. > if (EmitSimpleStmt(S)) > @@ -1488,7 +1489,7 @@ > // failure. > llvm::BasicBlock *DefaultBlock = createBasicBlock("sw.default"); > SwitchInsn = Builder.CreateSwitch(CondV, DefaultBlock); > - if (PGO.haveRegionCounts()) { > + if (PGO->haveRegionCounts()) { > // Walk the SwitchCase list to find how many there are. > uint64_t DefaultCount = 0; > unsigned NumCases = 0; > @@ -2197,7 +2198,7 @@ > CXXThisValue = EmitLoadOfLValue(ThisLValue, Loc).getScalarVal(); > } > > - PGO.assignRegionCounters(GlobalDecl(CD), F); > + PGO->assignRegionCounters(GlobalDecl(CD), F); > CapturedStmtInfo->EmitBody(*this, CD->getBody()); > FinishFunction(CD->getBodyRBrace()); > > Index: lib/CodeGen/CGObjC.cpp > =================================================================== > --- lib/CodeGen/CGObjC.cpp > +++ lib/CodeGen/CGObjC.cpp > @@ -15,6 +15,7 @@ > #include "CGObjCRuntime.h" > #include "CodeGenFunction.h" > #include "CodeGenModule.h" > +#include "CodeGenPGO.h" > #include "TargetInfo.h" > #include "clang/AST/ASTContext.h" > #include "clang/AST/DeclObjC.h" > @@ -557,7 +558,7 @@ > /// its pointer, name, and types registered in the class struture. > void CodeGenFunction::GenerateObjCMethod(const ObjCMethodDecl *OMD) { > StartObjCMethod(OMD, OMD->getClassInterface()); > - PGO.assignRegionCounters(GlobalDecl(OMD), CurFn); > + PGO->assignRegionCounters(GlobalDecl(OMD), CurFn); > assert(isa<CompoundStmt>(OMD->getBody())); > incrementProfileCounter(OMD->getBody()); > EmitCompoundStmtWithoutScope(*cast<CompoundStmt>(OMD->getBody())); > Index: lib/CodeGen/CGExpr.cpp > =================================================================== > --- lib/CodeGen/CGExpr.cpp > +++ lib/CodeGen/CGExpr.cpp > @@ -19,6 +19,7 @@ > #include "CGOpenMPRuntime.h" > #include "CGRecordLayout.h" > #include "CodeGenModule.h" > +#include "CodeGenPGO.h" > #include "TargetInfo.h" > #include "clang/AST/ASTContext.h" > #include "clang/AST/Attr.h" > @@ -106,7 +107,7 @@ > /// EvaluateExprAsBool - Perform the usual unary conversions on the specified > /// expression and compare the result against zero, returning an Int1Ty > value. > llvm::Value *CodeGenFunction::EvaluateExprAsBool(const Expr *E) { > - PGO.setCurrentStmt(E); > + PGO->setCurrentStmt(E); > if (const MemberPointerType *MPT = > E->getType()->getAs<MemberPointerType>()) { > llvm::Value *MemPtr = EmitScalarExpr(E); > return CGM.getCXXABI().EmitMemberPointerIsNotNull(*this, MemPtr, MPT); > Index: lib/CodeGen/CGCall.cpp > =================================================================== > --- lib/CodeGen/CGCall.cpp > +++ lib/CodeGen/CGCall.cpp > @@ -19,6 +19,7 @@ > #include "CGCleanup.h" > #include "CodeGenFunction.h" > #include "CodeGenModule.h" > +#include "CodeGenPGO.h" > #include "TargetInfo.h" > #include "clang/AST/Decl.h" > #include "clang/AST/DeclCXX.h" > @@ -3944,8 +3945,8 @@ > // For more details, see the comment before the definition of > // IPVK_IndirectCallTarget in InstrProfData.inc. > if (!CS.getCalledFunction()) > - PGO.valueProfile(Builder, llvm::IPVK_IndirectCallTarget, > - CS.getInstruction(), Callee); > + PGO->valueProfile(Builder, llvm::IPVK_IndirectCallTarget, > + CS.getInstruction(), Callee); > > // In ObjC ARC mode with no ObjC ARC exception safety, tell the ARC > // optimizer it can aggressively ignore unwind edges. > Index: lib/CodeGen/CGBlocks.cpp > =================================================================== > --- lib/CodeGen/CGBlocks.cpp > +++ lib/CodeGen/CGBlocks.cpp > @@ -16,6 +16,7 @@ > #include "CGObjCRuntime.h" > #include "CodeGenFunction.h" > #include "CodeGenModule.h" > +#include "CodeGenPGO.h" > #include "clang/AST/DeclObjC.h" > #include "llvm/ADT/SmallSet.h" > #include "llvm/IR/CallSite.h" > @@ -1240,7 +1241,7 @@ > if (IsLambdaConversionToBlock) > EmitLambdaBlockInvokeBody(); > else { > - PGO.assignRegionCounters(GlobalDecl(blockDecl), fn); > + PGO->assignRegionCounters(GlobalDecl(blockDecl), fn); > incrementProfileCounter(blockDecl->getBody()); > EmitStmt(blockDecl->getBody()); > } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits