LLVM  4.0.0
Macros | Functions | Variables
IndirectCallPromotion.cpp File Reference
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/IndirectCallPromotionAnalysis.h"
#include "llvm/Analysis/IndirectCallSiteVisitor.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/CallSite.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/MDBuilder.h"
#include "llvm/IR/PassManager.h"
#include "llvm/IR/Type.h"
#include "llvm/Pass.h"
#include "llvm/PassRegistry.h"
#include "llvm/PassSupport.h"
#include "llvm/ProfileData/InstrProf.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Transforms/Instrumentation.h"
#include "llvm/Transforms/PGOInstrumentation.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include <cassert>
#include <cstdint>
#include <vector>
Include dependency graph for IndirectCallPromotion.cpp:

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "pgo-icall-prom"
 

Functions

 STATISTIC (NumOfPGOICallPromotion,"Number of indirect call promotions.")
 
 STATISTIC (NumOfPGOICallsites,"Number of indirect call candidate sites.")
 
 INITIALIZE_PASS (PGOIndirectCallPromotionLegacyPass,"pgo-icall-prom","Use PGO instrumentation profile to promote indirect calls to ""direct calls.", false, false) ModulePass *llvm
 
static void createIfThenElse (Instruction *Inst, Function *DirectCallee, uint64_t Count, uint64_t TotalCount, BasicBlock **DirectCallBB, BasicBlock **IndirectCallBB, BasicBlock **MergeBB)
 
static bool getCallRetPHINode (BasicBlock *BB, Instruction *Inst)
 
static void fixupPHINodeForUnwind (Instruction *Inst, BasicBlock *BB, BasicBlock *OrigBB, BasicBlock *IndirectCallBB, BasicBlock *DirectCallBB)
 
static void fixupPHINodeForNormalDest (Instruction *Inst, BasicBlock *BB, BasicBlock *OrigBB, BasicBlock *IndirectCallBB, Instruction *NewInst)
 
static InstructioninsertCallRetCast (const Instruction *Inst, Instruction *DirectCallInst, Function *DirectCallee)
 
static InstructioncreateDirectCallInst (const Instruction *Inst, Function *DirectCallee, BasicBlock *DirectCallBB, BasicBlock *MergeBB)
 
static void insertCallRetPHI (Instruction *Inst, Instruction *CallResult, Function *DirectCallee)
 
static bool promoteIndirectCalls (Module &M, bool InLTO)
 

Variables

static cl::opt< boolDisableICP ("disable-icp", cl::init(false), cl::Hidden, cl::desc("Disable indirect call promotion"))
 
static cl::opt< unsignedICPCutOff ("icp-cutoff", cl::init(0), cl::Hidden, cl::ZeroOrMore, cl::desc("Max number of promotions for this compilaiton"))
 
static cl::opt< unsignedICPCSSkip ("icp-csskip", cl::init(0), cl::Hidden, cl::ZeroOrMore, cl::desc("Skip Callsite up to this number for this compilaiton"))
 
static cl::opt< boolICPLTOMode ("icp-lto", cl::init(false), cl::Hidden, cl::desc("Run indirect-call promotion in LTO ""mode"))
 
static cl::opt< boolICPCallOnly ("icp-call-only", cl::init(false), cl::Hidden, cl::desc("Run indirect-call promotion for call instructions ""only"))
 
static cl::opt< boolICPInvokeOnly ("icp-invoke-only", cl::init(false), cl::Hidden, cl::desc("Run indirect-call promotion for ""invoke instruction only"))
 
static cl::opt< boolICPDUMPAFTER ("icp-dumpafter", cl::init(false), cl::Hidden, cl::desc("Dump IR after transformation happens"))
 

Macro Definition Documentation

#define DEBUG_TYPE   "pgo-icall-prom"

Definition at line 52 of file IndirectCallPromotion.cpp.

Function Documentation

static Instruction* createDirectCallInst ( const Instruction Inst,
Function DirectCallee,
BasicBlock DirectCallBB,
BasicBlock MergeBB 
)
static
static void createIfThenElse ( Instruction Inst,
Function DirectCallee,
uint64_t  Count,
uint64_t  TotalCount,
BasicBlock **  DirectCallBB,
BasicBlock **  IndirectCallBB,
BasicBlock **  MergeBB 
)
static
static void fixupPHINodeForNormalDest ( Instruction Inst,
BasicBlock BB,
BasicBlock OrigBB,
BasicBlock IndirectCallBB,
Instruction NewInst 
)
static
static void fixupPHINodeForUnwind ( Instruction Inst,
BasicBlock BB,
BasicBlock OrigBB,
BasicBlock IndirectCallBB,
BasicBlock DirectCallBB 
)
static
static bool getCallRetPHINode ( BasicBlock BB,
Instruction Inst 
)
static
INITIALIZE_PASS ( PGOIndirectCallPromotionLegacyPass  ,
"pgo-icall-prom"  ,
"Use PGO instrumentation profile to promote indirect calls to ""direct calls."  ,
false  ,
false   
)

Definition at line 126 of file IndirectCallPromotion.cpp.

static Instruction* insertCallRetCast ( const Instruction Inst,
Instruction DirectCallInst,
Function DirectCallee 
)
static
static void insertCallRetPHI ( Instruction Inst,
Instruction CallResult,
Function DirectCallee 
)
static
static bool promoteIndirectCalls ( Module M,
bool  InLTO 
)
static
STATISTIC ( NumOfPGOICallPromotion  ,
"Number of indirect call promotions."   
)
STATISTIC ( NumOfPGOICallsites  ,
"Number of indirect call candidate sites."   
)

Variable Documentation

cl::opt<bool> DisableICP("disable-icp", cl::init(false), cl::Hidden, cl::desc("Disable indirect call promotion"))
static

Referenced by promoteIndirectCalls().

cl::opt<bool> ICPCallOnly("icp-call-only", cl::init(false), cl::Hidden, cl::desc("Run indirect-call promotion for call instructions ""only"))
static
cl::opt<unsigned> ICPCSSkip("icp-csskip", cl::init(0), cl::Hidden, cl::ZeroOrMore, cl::desc("Skip Callsite up to this number for this compilaiton"))
static
cl::opt<unsigned> ICPCutOff("icp-cutoff", cl::init(0), cl::Hidden, cl::ZeroOrMore, cl::desc("Max number of promotions for this compilaiton"))
static

Referenced by promoteIndirectCalls().

cl::opt<bool> ICPDUMPAFTER("icp-dumpafter", cl::init(false), cl::Hidden, cl::desc("Dump IR after transformation happens"))
static

Referenced by promoteIndirectCalls().

cl::opt<bool> ICPInvokeOnly("icp-invoke-only", cl::init(false), cl::Hidden, cl::desc("Run indirect-call promotion for ""invoke instruction only"))
static
cl::opt<bool> ICPLTOMode("icp-lto", cl::init(false), cl::Hidden, cl::desc("Run indirect-call promotion in LTO ""mode"))
static