LLVM  10.0.0svn
Macros | Typedefs | Functions | Variables
CallSiteSplitting.cpp File Reference
#include "llvm/Transforms/Scalar/CallSiteSplitting.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/PatternMatch.h"
#include "llvm/Support/Debug.h"
#include "llvm/Transforms/Scalar.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/Cloning.h"
Include dependency graph for CallSiteSplitting.cpp:

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "callsite-splitting"
 

Typedefs

typedef std::pair< ICmpInst *, unsignedConditionTy
 
typedef SmallVector< ConditionTy, 2 > ConditionsTy
 
using PredsWithCondsTy = SmallVector< std::pair< BasicBlock *, ConditionsTy >, 2 >
 

Functions

 STATISTIC (NumCallSiteSplit, "Number of call-site split")
 
static void addNonNullAttribute (CallSite CS, Value *Op)
 
static void setConstantInArgument (CallSite CS, Value *Op, Constant *ConstValue)
 
static bool isCondRelevantToAnyCallArgument (ICmpInst *Cmp, CallSite CS)
 
static void recordCondition (CallSite CS, BasicBlock *From, BasicBlock *To, ConditionsTy &Conditions)
 If From has a conditional jump to To, add the condition to Conditions, if it is relevant to any argument at CS. More...
 
static void recordConditions (CallSite CS, BasicBlock *Pred, ConditionsTy &Conditions, BasicBlock *StopAt)
 Record ICmp conditions relevant to any argument in CS following Pred's single predecessors. More...
 
static void addConditions (CallSite CS, const ConditionsTy &Conditions)
 
static SmallVector< BasicBlock *, 2 > getTwoPredecessors (BasicBlock *BB)
 
static bool canSplitCallSite (CallSite CS, TargetTransformInfo &TTI)
 
static InstructioncloneInstForMustTail (Instruction *I, Instruction *Before, Value *V)
 
static void copyMustTailReturn (BasicBlock *SplitBB, Instruction *CI, Instruction *NewCI)
 Copy mandatory musttail return sequence that follows original CI, and link it up to NewCI value instead: More...
 
static void splitCallSite (CallSite CS, const SmallVectorImpl< std::pair< BasicBlock *, ConditionsTy >> &Preds, DomTreeUpdater &DTU)
 For each (predecessor, conditions from predecessors) pair, it will split the basic block containing the call site, hook it up to the predecessor and replace the call instruction with new call instructions, which contain constraints based on the conditions from their predecessors. More...
 
static bool isPredicatedOnPHI (CallSite CS)
 
static PredsWithCondsTy shouldSplitOnPHIPredicatedArgument (CallSite CS)
 
static PredsWithCondsTy shouldSplitOnPredicatedArgument (CallSite CS, DomTreeUpdater &DTU)
 
static bool tryToSplitCallSite (CallSite CS, TargetTransformInfo &TTI, DomTreeUpdater &DTU)
 
static bool doCallSiteSplitting (Function &F, TargetLibraryInfo &TLI, TargetTransformInfo &TTI, DominatorTree &DT)
 
 INITIALIZE_PASS_BEGIN (CallSiteSplittingLegacyPass, "callsite-splitting", "Call-site splitting", false, false) INITIALIZE_PASS_END(CallSiteSplittingLegacyPass
 

Variables

static cl::opt< unsignedDuplicationThreshold ("callsite-splitting-duplication-threshold", cl::Hidden, cl::desc("Only allow instructions before a call, if " "their cost is below DuplicationThreshold"), cl::init(5))
 Only allow instructions before a call, if their CodeSize cost is below DuplicationThreshold. More...
 
callsite splitting
 
callsite Call site false
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "callsite-splitting"

Definition at line 73 of file CallSiteSplitting.cpp.

Typedef Documentation

◆ ConditionsTy

Definition at line 126 of file CallSiteSplitting.cpp.

◆ ConditionTy

typedef std::pair<ICmpInst *, unsigned> ConditionTy

Definition at line 125 of file CallSiteSplitting.cpp.

◆ PredsWithCondsTy

Definition at line 445 of file CallSiteSplitting.cpp.

Function Documentation

◆ addConditions()

static void addConditions ( CallSite  CS,
const ConditionsTy Conditions 
)
static

Definition at line 166 of file CallSiteSplitting.cpp.

Referenced by splitCallSite().

◆ addNonNullAttribute()

static void addNonNullAttribute ( CallSite  CS,
Value Op 
)
static

◆ canSplitCallSite()

static bool canSplitCallSite ( CallSite  CS,
TargetTransformInfo TTI 
)
static

◆ cloneInstForMustTail()

static Instruction* cloneInstForMustTail ( Instruction I,
Instruction Before,
Value V 
)
static

◆ copyMustTailReturn()

static void copyMustTailReturn ( BasicBlock SplitBB,
Instruction CI,
Instruction NewCI 
)
static

Copy mandatory musttail return sequence that follows original CI, and link it up to NewCI value instead:

  • (optional) bitcast NewCI to ...
  • ret bitcast or NewCI

Insert this sequence right before SplitBB's terminator, which will be cleaned up later in splitCallSite below.

Definition at line 241 of file CallSiteSplitting.cpp.

References assert(), cloneInstForMustTail(), llvm::dyn_cast(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::BasicBlock::getParent(), llvm::Function::getReturnType(), llvm::BasicBlock::getTerminator(), and llvm::Type::isVoidTy().

Referenced by splitCallSite().

◆ doCallSiteSplitting()

static bool doCallSiteSplitting ( Function F,
TargetLibraryInfo TLI,
TargetTransformInfo TTI,
DominatorTree DT 
)
static

◆ getTwoPredecessors()

static SmallVector<BasicBlock *, 2> getTwoPredecessors ( BasicBlock BB)
static

◆ INITIALIZE_PASS_BEGIN()

INITIALIZE_PASS_BEGIN ( CallSiteSplittingLegacyPass  ,
"callsite-splitting ,
"Call-site splitting ,
false  ,
false   
)

Referenced by doCallSiteSplitting().

◆ isCondRelevantToAnyCallArgument()

static bool isCondRelevantToAnyCallArgument ( ICmpInst Cmp,
CallSite  CS 
)
static

◆ isPredicatedOnPHI()

static bool isPredicatedOnPHI ( CallSite  CS)
static

◆ recordCondition()

static void recordCondition ( CallSite  CS,
BasicBlock From,
BasicBlock To,
ConditionsTy Conditions 
)
static

If From has a conditional jump to To, add the condition to Conditions, if it is relevant to any argument at CS.

Definition at line 130 of file CallSiteSplitting.cpp.

References llvm::dyn_cast(), and llvm::BasicBlock::getTerminator().

Referenced by recordConditions(), and shouldSplitOnPredicatedArgument().

◆ recordConditions()

static void recordConditions ( CallSite  CS,
BasicBlock Pred,
ConditionsTy Conditions,
BasicBlock StopAt 
)
static

Record ICmp conditions relevant to any argument in CS following Pred's single predecessors.

If there are conflicting conditions along a path, like x == 1 and x == 0, the first condition will be used. We stop once we reach an edge to StopAt.

Definition at line 153 of file CallSiteSplitting.cpp.

References llvm::SmallPtrSetImpl< PtrType >::count(), From, llvm::BasicBlock::getSinglePredecessor(), llvm::SmallPtrSetImpl< PtrType >::insert(), and recordCondition().

Referenced by shouldSplitOnPredicatedArgument().

◆ setConstantInArgument()

static void setConstantInArgument ( CallSite  CS,
Value Op,
Constant ConstValue 
)
static

◆ shouldSplitOnPHIPredicatedArgument()

static PredsWithCondsTy shouldSplitOnPHIPredicatedArgument ( CallSite  CS)
static

◆ shouldSplitOnPredicatedArgument()

static PredsWithCondsTy shouldSplitOnPredicatedArgument ( CallSite  CS,
DomTreeUpdater DTU 
)
static

◆ splitCallSite()

static void splitCallSite ( CallSite  CS,
const SmallVectorImpl< std::pair< BasicBlock *, ConditionsTy >> &  Preds,
DomTreeUpdater DTU 
)
static

For each (predecessor, conditions from predecessors) pair, it will split the basic block containing the call site, hook it up to the predecessor and replace the call instruction with new call instructions, which contain constraints based on the conditions from their predecessors.

For example, in the IR below with an OR condition, the call-site can be split. In this case, Preds for Tail is [(Header, a == null), (TBB, a != null, b == null)]. Tail is replaced by 2 split blocks, containing CallInst1, which has constraints based on the conditions from Head and CallInst2, which has constraints based on the conditions coming from TBB.

From :

Header: c = icmp eq i32* a, null br i1 c Tail, TBB TBB: c2 = icmp eq i32* b, null br i1 c Tail, End Tail: ca = call i1 (i32* a, i32* b)

to :

Header: // PredBB1 is Header c = icmp eq i32* a, null br i1 c Tail-split1, TBB TBB: // PredBB2 is TBB c2 = icmp eq i32* b, null br i1 c Tail-split2, End Tail-split1: ca1 = call (i32* null, i32* b) // CallInst1 br Tail Tail-split2: ca2 = call (i32* nonnull a, i32* null) // CallInst2 br Tail Tail: p = phi i1 [ca1, Tail-split1],[ca2, Tail-split2]

Note that in case any arguments at the call-site are constrained by its predecessors, new call-sites with more constrained arguments will be created in createCallSitesOnPredicatedArgument().

Definition at line 304 of file CallSiteSplitting.cpp.

References addConditions(), llvm::PHINode::addIncoming(), llvm::DomTreeUpdater::applyUpdatesPermissive(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, CallBrTy, IterTy >::args(), assert(), llvm::BasicBlock::begin(), copyMustTailReturn(), llvm::PHINode::Create(), llvm::dbgs(), llvm::DominatorTreeBase< BasicBlock, false >::Delete, llvm::DomTreeUpdater::deleteBB(), llvm::DuplicateInstructionsInSplitBetween(), llvm::Instruction::eraseFromParent(), llvm::Instruction::getDebugLoc(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, CallBrTy, IterTy >::getInstruction(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::Value::getName(), llvm::Instruction::getParent(), getParent(), llvm::ilist_node_impl< OptionsT >::getReverseIterator(), llvm::BasicBlock::getTerminator(), llvm::Value::getType(), I, llvm::Instruction::insertBefore(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, CallBrTy, IterTy >::isMustTailCall(), LLVM_DEBUG, llvm::BasicBlock::phis(), llvm::predecessors(), llvm::BasicBlock::rend(), llvm::Value::replaceAllUsesWith(), second, llvm::Instruction::setDebugLoc(), llvm::SmallVectorBase::size(), llvm::SplitBlock(), and llvm::Value::use_empty().

Referenced by tryToSplitCallSite().

◆ STATISTIC()

STATISTIC ( NumCallSiteSplit  ,
"Number of call-site split  
)

◆ tryToSplitCallSite()

static bool tryToSplitCallSite ( CallSite  CS,
TargetTransformInfo TTI,
DomTreeUpdater DTU 
)
static

Variable Documentation

◆ DuplicationThreshold

cl::opt<unsigned> DuplicationThreshold("callsite-splitting-duplication-threshold", cl::Hidden, cl::desc("Only allow instructions before a call, if " "their cost is below DuplicationThreshold"), cl::init(5))
static

Only allow instructions before a call, if their CodeSize cost is below DuplicationThreshold.

Those instructions need to be duplicated in all split blocks.

Referenced by canSplitCallSite().

◆ false

callsite Call site false

Definition at line 579 of file CallSiteSplitting.cpp.

◆ splitting

callsite Call site splitting

Definition at line 579 of file CallSiteSplitting.cpp.