diff options
Diffstat (limited to 'clang/lib/CodeGen/CodeGenFunction.h')
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.h | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index 1dd5dab110d..b06f81b417d 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -19,6 +19,7 @@ #include "CGValue.h" #include "EHScopeStack.h" #include "CodeGenModule.h" +#include "CodeGenPGO.h" #include "clang/AST/CharUnits.h" #include "clang/AST/ExprCXX.h" #include "clang/AST/ExprObjC.h" @@ -817,19 +818,36 @@ private: llvm::DenseMap<const LabelDecl*, JumpDest> LabelMap; // BreakContinueStack - This keeps track of where break and continue - // statements should jump to. + // statements should jump to and the associated base counter for + // instrumentation. struct BreakContinue { - BreakContinue(JumpDest Break, JumpDest Continue) - : BreakBlock(Break), ContinueBlock(Continue) {} + BreakContinue(JumpDest Break, JumpDest Continue, RegionCounter *LoopCnt, + bool CountBreak = true) + : BreakBlock(Break), ContinueBlock(Continue), LoopCnt(LoopCnt), + CountBreak(CountBreak) {} JumpDest BreakBlock; JumpDest ContinueBlock; + RegionCounter *LoopCnt; + bool CountBreak; }; SmallVector<BreakContinue, 8> BreakContinueStack; + CodeGenPGO PGO; + +public: + /// Get a counter for instrumentation of the region associated with the given + /// statement. + RegionCounter getPGORegionCounter(const Stmt *S) { + return RegionCounter(PGO, S); + } +private: + /// SwitchInsn - This is nearest current switch instruction. It is null if /// current context is not in a switch. llvm::SwitchInst *SwitchInsn; + /// The branch weights of SwitchInsn when doing instrumentation based PGO. + SmallVector<uint64_t, 16> *SwitchWeights; /// CaseRangeBlock - This block holds if condition check for last case /// statement range in current switch instruction. @@ -2413,8 +2431,10 @@ public: /// EmitBranchOnBoolExpr - Emit a branch on a boolean condition (e.g. for an /// if statement) to the specified blocks. Based on the condition, this might /// try to simplify the codegen of the conditional based on the branch. + /// TrueCount should be the number of times we expect the condition to + /// evaluate to true based on PGO data. void EmitBranchOnBoolExpr(const Expr *Cond, llvm::BasicBlock *TrueBlock, - llvm::BasicBlock *FalseBlock); + llvm::BasicBlock *FalseBlock, uint64_t TrueCount); /// \brief Emit a description of a type in a format suitable for passing to /// a runtime sanitizer handler. |