30 cl::desc(
"Whether or not to compute detailed function properties."));
34 cl::desc(
"The minimum number of instructions a basic block should contain "
35 "before being considered big."));
39 cl::desc(
"The minimum number of instructions a basic block should contain "
40 "before being considered medium-sized."));
44 cl::desc(
"The minimum number of arguments a function call must have before "
45 "it is considered having many arguments."));
48int64_t getNrBlocksFromCond(
const BasicBlock &BB) {
50 if (
const auto *BI = dyn_cast<BranchInst>(BB.
getTerminator())) {
51 if (BI->isConditional())
52 Ret += BI->getNumSuccessors();
53 }
else if (
const auto *SI = dyn_cast<SwitchInst>(BB.
getTerminator())) {
54 Ret += (
SI->getNumCases() + (
nullptr !=
SI->getDefaultDest()));
60 return ((!
F.hasLocalLinkage()) ? 1 : 0) +
F.getNumUses();
64void FunctionPropertiesInfo::reIncludeBB(
const BasicBlock &BB) {
68void FunctionPropertiesInfo::updateForBB(
const BasicBlock &BB,
74 for (
const auto &
I : BB) {
75 if (
auto *CS = dyn_cast<CallBase>(&
I)) {
76 const auto *
Callee = CS->getCalledFunction();
77 if (Callee && !
Callee->isIntrinsic() && !
Callee->isDeclaration())
80 if (
I.getOpcode() == Instruction::Load) {
82 }
else if (
I.getOpcode() == Instruction::Store) {
90 if (SuccessorCount == 1)
92 else if (SuccessorCount == 2)
94 else if (SuccessorCount > 2)
97 unsigned PredecessorCount =
pred_size(&BB);
98 if (PredecessorCount == 1)
100 else if (PredecessorCount == 2)
102 else if (PredecessorCount > 2)
115 if (SuccessorCount > 1) {
124 if (
const auto *BI = dyn_cast<BranchInst>(BB.getTerminator())) {
125 if (!BI->isConditional())
129 for (
const Instruction &
I : BB.instructionsWithoutDebug()) {
133 if (
I.getType()->isFloatTy())
135 else if (
I.getType()->isIntegerTy())
138 if (isa<IntrinsicInst>(
I))
141 if (
const auto *Call = dyn_cast<CallInst>(&
I)) {
142 if (
Call->isIndirectCall())
147 if (
Call->getType()->isIntegerTy())
149 else if (
Call->getType()->isFloatingPointTy())
151 else if (
Call->getType()->isPointerTy())
153 else if (
Call->getType()->isVectorTy()) {
154 if (
Call->getType()->getScalarType()->isIntegerTy())
156 else if (
Call->getType()->getScalarType()->isFloatingPointTy())
158 else if (
Call->getType()->getScalarType()->isPointerTy())
165 for (
const auto &Arg :
Call->args()) {
166 if (Arg->getType()->isPointerTy()) {
173#define COUNT_OPERAND(OPTYPE) \
174 if (isa<OPTYPE>(Operand)) { \
175 OPTYPE##OperandCount += Direction; \
179 for (
unsigned int OperandIndex = 0; OperandIndex <
I.getNumOperands();
181 Value *Operand =
I.getOperand(OperandIndex);
201void FunctionPropertiesInfo::updateAggregateStats(
const Function &
F,
207 std::deque<const Loop *> Worklist;
209 while (!Worklist.empty()) {
210 const auto *
L = Worklist.front();
212 std::max(
MaxLoopDepth,
static_cast<int64_t
>(
L->getLoopDepth()));
213 Worklist.pop_front();
228 for (
const auto &BB :
F)
231 FPI.updateAggregateStats(
F, LI);
236#define PRINT_PROPERTY(PROP_NAME) OS << #PROP_NAME ": " << PROP_NAME << "\n";
300 OS <<
"Printing analysis results of CFA for function "
301 <<
"'" <<
F.getName() <<
"':"
310 assert(isa<CallInst>(CB) || isa<InvokeInst>(CB));
317 LikelyToChangeBBs.
insert(&CallSiteBB);
334 if (
const auto *II = dyn_cast<InvokeInst>(&CB)) {
335 const auto *UnwindDest = II->getUnwindDest();
344 Successors.erase(&CallSiteBB);
346 for (
const auto *BB : Successors)
347 LikelyToChangeBBs.
insert(BB);
353 for (
const auto *BB : LikelyToChangeBBs)
354 FPI.updateForBB(*BB, -1);
387 if (&CallSiteBB != &*Caller.
begin())
391 for (
const auto *Succ : Successors)
392 if (DT.isReachableFromEntry(Succ))
401 const auto IncludeSuccessorsMark = Reinclude.
size();
402 bool CSInsertion = Reinclude.
insert(&CallSiteBB);
405 for (
size_t I = 0;
I < Reinclude.
size(); ++
I) {
406 const auto *BB = Reinclude[
I];
407 FPI.reIncludeBB(*BB);
408 if (
I >= IncludeSuccessorsMark)
416 const auto AlreadyExcludedMark = Unreachable.
size();
417 for (
size_t I = 0;
I < Unreachable.
size(); ++
I) {
418 const auto *U = Unreachable[
I];
419 if (
I >= AlreadyExcludedMark)
420 FPI.updateForBB(*U, -1);
422 if (!DT.isReachableFromEntry(Succ))
427 FPI.updateAggregateStats(Caller, LI);
430bool FunctionPropertiesUpdater::isUpdateValid(
Function &
F,
static const Function * getParent(const Value *V)
This file contains the declarations for the subclasses of Constant, which represent the different fla...
#define PRINT_PROPERTY(PROP_NAME)
cl::opt< unsigned > CallWithManyArgumentsThreshold("call-with-many-arguments-threshold", cl::Hidden, cl::init(4), cl::desc("The minimum number of arguments a function call must have before " "it is considered having many arguments."))
#define COUNT_OPERAND(OPTYPE)
cl::opt< unsigned > BigBasicBlockInstructionThreshold("big-basic-block-instruction-threshold", cl::Hidden, cl::init(500), cl::desc("The minimum number of instructions a basic block should contain " "before being considered big."))
cl::opt< unsigned > MediumBasicBlockInstructionThreshold("medium-basic-block-instruction-threshold", cl::Hidden, cl::init(15), cl::desc("The minimum number of instructions a basic block should contain " "before being considered medium-sized."))
cl::opt< bool > EnableDetailedFunctionProperties("enable-detailed-function-properties", cl::Hidden, cl::init(false), cl::desc("Whether or not to compute detailed function properties."))
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Loop::LoopBounds::Direction Direction
FunctionAnalysisManager FAM
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file implements a set that has insertion order iteration characteristics.
A container for analyses that lazily runs them and caches their results.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
This class represents an incoming formal argument to a Function.
LLVM Basic Block Representation.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
ConstantFP - Floating Point Values [float, double].
This is the shared class of boolean and integer constants.
This is an important base class in LLVM.
Analysis pass which computes a DominatorTree.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
bool isReachableFromEntry(const Use &U) const
Provide an overload for a Use.
FunctionPropertiesInfo run(Function &F, FunctionAnalysisManager &FAM)
int64_t BasicBlocksWithMoreThanTwoSuccessors
int64_t BasicBlocksWithSinglePredecessor
int64_t CallReturnsVectorPointerCount
int64_t CallReturnsPointerCount
int64_t CallWithManyArgumentsCount
int64_t CallReturnsVectorIntCount
int64_t CallReturnsVectorFloatCount
int64_t CastInstructionCount
int64_t BasicBlockCount
Number of basic blocks.
int64_t CriticalEdgeCount
int64_t Uses
Number of uses of this function, plus 1 if the function is callable outside the module.
int64_t InlineAsmOperandCount
int64_t ConstantFPOperandCount
int64_t BasicBlocksWithTwoSuccessors
int64_t InstructionOperandCount
int64_t CallWithPointerArgumentCount
int64_t FloatingPointInstructionCount
int64_t TopLevelLoopCount
int64_t CallReturnsIntegerCount
int64_t BlocksReachedFromConditionalInstruction
Number of blocks reached from a conditional instruction, or that are 'cases' of a SwitchInstr.
static FunctionPropertiesInfo getFunctionPropertiesInfo(const Function &F, const DominatorTree &DT, const LoopInfo &LI)
int64_t GlobalValueOperandCount
int64_t UnconditionalBranchCount
int64_t ArgumentOperandCount
int64_t BasicBlocksWithSingleSuccessor
int64_t BasicBlockOperandCount
int64_t ControlFlowEdgeCount
int64_t BasicBlocksWithTwoPredecessors
int64_t MediumBasicBlocks
int64_t IntegerInstructionCount
int64_t CallReturnsFloatCount
void print(raw_ostream &OS) const
int64_t TotalInstructionCount
int64_t BasicBlocksWithMoreThanTwoPredecessors
int64_t ConstantOperandCount
int64_t ConstantIntOperandCount
int64_t UnknownOperandCount
int64_t DirectCallsToDefinedFunctions
Number of direct calls made from this function to other functions defined in this module.
int64_t IndirectCallCount
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
FunctionPropertiesUpdater(FunctionPropertiesInfo &FPI, CallBase &CB)
void finish(FunctionAnalysisManager &FAM) const
Analysis pass that exposes the LoopInfo for a function.
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
A vector that has set insertion semantics.
size_type size() const
Determine the number of elements in the SetVector.
bool insert(const value_type &X)
Insert a new element into the SetVector.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
LLVM Value Representation.
This class implements an extremely fast bulk output stream that can only output to a stream.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
Interval::succ_iterator succ_end(Interval *I)
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
auto successors(const MachineBasicBlock *BB)
Interval::succ_iterator succ_begin(Interval *I)
succ_begin/succ_end - define methods so that Intervals may be used just like BasicBlocks can with the...
void append_range(Container &C, Range &&R)
Wrapper function to append a range to a container.
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr)
unsigned succ_size(const MachineBasicBlock *BB)
unsigned pred_size(const MachineBasicBlock *BB)
A special type used by analysis passes to provide an address that identifies that particular analysis...
Direction
An enum for the direction of the loop.