summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Instrumentation/CGProfile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Transforms/Instrumentation/CGProfile.cpp')
-rw-r--r--llvm/lib/Transforms/Instrumentation/CGProfile.cpp100
1 files changed, 0 insertions, 100 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/CGProfile.cpp b/llvm/lib/Transforms/Instrumentation/CGProfile.cpp
deleted file mode 100644
index 9606b3da247..00000000000
--- a/llvm/lib/Transforms/Instrumentation/CGProfile.cpp
+++ /dev/null
@@ -1,100 +0,0 @@
-//===-- CGProfile.cpp -----------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/Transforms/Instrumentation/CGProfile.h"
-
-#include "llvm/ADT/MapVector.h"
-#include "llvm/Analysis/BlockFrequencyInfo.h"
-#include "llvm/Analysis/TargetTransformInfo.h"
-#include "llvm/IR/CallSite.h"
-#include "llvm/IR/Constants.h"
-#include "llvm/IR/Instructions.h"
-#include "llvm/IR/MDBuilder.h"
-#include "llvm/IR/PassManager.h"
-#include "llvm/ProfileData/InstrProf.h"
-#include "llvm/Transforms/Instrumentation.h"
-
-#include <array>
-
-using namespace llvm;
-
-PreservedAnalyses CGProfilePass::run(Module &M, ModuleAnalysisManager &MAM) {
- MapVector<std::pair<Function *, Function *>, uint64_t> Counts;
- FunctionAnalysisManager &FAM =
- MAM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
- InstrProfSymtab Symtab;
- auto UpdateCounts = [&](TargetTransformInfo &TTI, Function *F,
- Function *CalledF, uint64_t NewCount) {
- if (!CalledF || !TTI.isLoweredToCall(CalledF))
- return;
- uint64_t &Count = Counts[std::make_pair(F, CalledF)];
- Count = SaturatingAdd(Count, NewCount);
- };
- // Ignore error here. Indirect calls are ignored if this fails.
- (void)(bool)Symtab.create(M);
- for (auto &F : M) {
- if (F.isDeclaration())
- continue;
- auto &BFI = FAM.getResult<BlockFrequencyAnalysis>(F);
- if (BFI.getEntryFreq() == 0)
- continue;
- TargetTransformInfo &TTI = FAM.getResult<TargetIRAnalysis>(F);
- for (auto &BB : F) {
- Optional<uint64_t> BBCount = BFI.getBlockProfileCount(&BB);
- if (!BBCount)
- continue;
- for (auto &I : BB) {
- CallSite CS(&I);
- if (!CS)
- continue;
- if (CS.isIndirectCall()) {
- InstrProfValueData ValueData[8];
- uint32_t ActualNumValueData;
- uint64_t TotalC;
- if (!getValueProfDataFromInst(*CS.getInstruction(),
- IPVK_IndirectCallTarget, 8, ValueData,
- ActualNumValueData, TotalC))
- continue;
- for (const auto &VD :
- ArrayRef<InstrProfValueData>(ValueData, ActualNumValueData)) {
- UpdateCounts(TTI, &F, Symtab.getFunction(VD.Value), VD.Count);
- }
- continue;
- }
- UpdateCounts(TTI, &F, CS.getCalledFunction(), *BBCount);
- }
- }
- }
-
- addModuleFlags(M, Counts);
-
- return PreservedAnalyses::all();
-}
-
-void CGProfilePass::addModuleFlags(
- Module &M,
- MapVector<std::pair<Function *, Function *>, uint64_t> &Counts) const {
- if (Counts.empty())
- return;
-
- LLVMContext &Context = M.getContext();
- MDBuilder MDB(Context);
- std::vector<Metadata *> Nodes;
-
- for (auto E : Counts) {
- SmallVector<Metadata *, 3> Vals;
- Vals.push_back(ValueAsMetadata::get(E.first.first));
- Vals.push_back(ValueAsMetadata::get(E.first.second));
- Vals.push_back(MDB.createConstant(
- ConstantInt::get(Type::getInt64Ty(Context), E.second)));
- Nodes.push_back(MDNode::get(Context, Vals));
- }
-
- M.addModuleFlag(Module::Append, "CG Profile", MDNode::get(Context, Nodes));
-}
OpenPOWER on IntegriCloud