llvm-project/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
Tarindu Jayatilaka 418121c30a Reapply "Rename InlineFeatureAnalysis to FunctionPropertiesAnalysis"
(This reverts commit a5e0194709c40212694370e0ea789a1ca14548b5, and
corrects author).

Rename the pass to be able to extend it to function properties other than inliner features.

    Reviewed By: mtrofin

    Differential Revision: https://reviews.llvm.org/D82044
2020-07-22 10:07:35 -07:00

42 lines
1.6 KiB
C++

//===- FunctionPropertiesAnalysis.cpp - Function properties extraction ----===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file implements an analysis extracting function features, which may be
// used by ML-driven policies, for example.
//
//===----------------------------------------------------------------------===//
#include "llvm/Analysis/FunctionPropertiesAnalysis.h"
#include "llvm/IR/Instructions.h"
using namespace llvm;
AnalysisKey FunctionPropertiesAnalysis::Key;
FunctionPropertiesAnalysis::Result
FunctionPropertiesAnalysis::run(const Function &F,
FunctionAnalysisManager &FAM) {
Result Ret;
Ret.Uses = ((!F.hasLocalLinkage()) ? 1 : 0) + F.getNumUses();
for (const auto &BB : F) {
++Ret.BasicBlockCount;
if (const auto *BI = dyn_cast<BranchInst>(BB.getTerminator())) {
if (BI->isConditional())
Ret.BlocksReachedFromConditionalInstruction += BI->getNumSuccessors();
} else if (const auto *SI = dyn_cast<SwitchInst>(BB.getTerminator()))
Ret.BlocksReachedFromConditionalInstruction +=
(SI->getNumCases() + (nullptr != SI->getDefaultDest()));
for (const auto &I : BB)
if (auto *CS = dyn_cast<CallBase>(&I)) {
const auto *Callee = CS->getCalledFunction();
if (Callee && !Callee->isIntrinsic() && !Callee->isDeclaration())
++Ret.DirectCallsToDefinedFunctions;
}
}
return Ret;
}