diff options
Diffstat (limited to 'llvm/lib/Transforms/Instrumentation/ValueProfilePlugins.inc')
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/ValueProfilePlugins.inc | 75 | 
1 files changed, 75 insertions, 0 deletions
| diff --git a/llvm/lib/Transforms/Instrumentation/ValueProfilePlugins.inc b/llvm/lib/Transforms/Instrumentation/ValueProfilePlugins.inc new file mode 100644 index 000000000000..4cc4c6c848c3 --- /dev/null +++ b/llvm/lib/Transforms/Instrumentation/ValueProfilePlugins.inc @@ -0,0 +1,75 @@ +//=== ValueProfilePlugins.inc - set of plugins used by ValueProfileCollector =// +// +// 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 contains a set of plugin classes used in ValueProfileCollectorImpl. +// Each plugin is responsible for collecting Value Profiling candidates for a +// particular optimization. +// Each plugin must satisfy the interface described in ValueProfileCollector.cpp +// +//===----------------------------------------------------------------------===// + +#include "ValueProfileCollector.h" +#include "llvm/Analysis/IndirectCallVisitor.h" +#include "llvm/IR/InstVisitor.h" + +using namespace llvm; +using CandidateInfo = ValueProfileCollector::CandidateInfo; + +///--------------------------- MemIntrinsicPlugin ------------------------------ +class MemIntrinsicPlugin : public InstVisitor<MemIntrinsicPlugin> { +  Function &F; +  std::vector<CandidateInfo> *Candidates; + +public: +  static constexpr InstrProfValueKind Kind = IPVK_MemOPSize; + +  MemIntrinsicPlugin(Function &Fn) : F(Fn), Candidates(nullptr) {} + +  void run(std::vector<CandidateInfo> &Cs) { +    Candidates = &Cs; +    visit(F); +    Candidates = nullptr; +  } +  void visitMemIntrinsic(MemIntrinsic &MI) { +    Value *Length = MI.getLength(); +    // Not instrument constant length calls. +    if (dyn_cast<ConstantInt>(Length)) +      return; + +    Instruction *InsertPt = &MI; +    Instruction *AnnotatedInst = &MI; +    Candidates->emplace_back(CandidateInfo{Length, InsertPt, AnnotatedInst}); +  } +}; + +///------------------------ IndirectCallPromotionPlugin ------------------------ +class IndirectCallPromotionPlugin { +  Function &F; + +public: +  static constexpr InstrProfValueKind Kind = IPVK_IndirectCallTarget; + +  IndirectCallPromotionPlugin(Function &Fn) : F(Fn) {} + +  void run(std::vector<CandidateInfo> &Candidates) { +    std::vector<Instruction *> Result = findIndirectCalls(F); +    for (Instruction *I : Result) { +      Value *Callee = CallSite(I).getCalledValue(); +      Instruction *InsertPt = I; +      Instruction *AnnotatedInst = I; +      Candidates.emplace_back(CandidateInfo{Callee, InsertPt, AnnotatedInst}); +    } +  } +}; + +///----------------------- Registration of the plugins ------------------------- +/// For now, registering a plugin with the ValueProfileCollector is done by +/// adding the plugin type to the VP_PLUGIN_LIST macro. +#define VP_PLUGIN_LIST           \ +    MemIntrinsicPlugin,          \ +    IndirectCallPromotionPlugin | 
