//=== 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 { Function &F; std::vector *Candidates; public: static constexpr InstrProfValueKind Kind = IPVK_MemOPSize; MemIntrinsicPlugin(Function &Fn) : F(Fn), Candidates(nullptr) {} void run(std::vector &Cs) { Candidates = &Cs; visit(F); Candidates = nullptr; } void visitMemIntrinsic(MemIntrinsic &MI) { Value *Length = MI.getLength(); // Not instrument constant length calls. if (dyn_cast(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 &Candidates) { std::vector 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