xref: /freebsd/contrib/llvm-project/llvm/include/llvm/Transforms/IPO/MemProfContextDisambiguation.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
1*06c3fb27SDimitry Andric //==- MemProfContextDisambiguation.h - Context Disambiguation ----*- C++ -*-==//
2*06c3fb27SDimitry Andric //
3*06c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*06c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*06c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*06c3fb27SDimitry Andric //
7*06c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
8*06c3fb27SDimitry Andric //
9*06c3fb27SDimitry Andric // Implements support for context disambiguation of allocation calls for profile
10*06c3fb27SDimitry Andric // guided heap optimization using memprof metadata. See implementation file for
11*06c3fb27SDimitry Andric // details.
12*06c3fb27SDimitry Andric //
13*06c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
14*06c3fb27SDimitry Andric 
15*06c3fb27SDimitry Andric #ifndef LLVM_TRANSFORMS_IPO_MEMPROF_CONTEXT_DISAMBIGUATION_H
16*06c3fb27SDimitry Andric #define LLVM_TRANSFORMS_IPO_MEMPROF_CONTEXT_DISAMBIGUATION_H
17*06c3fb27SDimitry Andric 
18*06c3fb27SDimitry Andric #include "llvm/IR/GlobalValue.h"
19*06c3fb27SDimitry Andric #include "llvm/IR/ModuleSummaryIndex.h"
20*06c3fb27SDimitry Andric #include "llvm/IR/PassManager.h"
21*06c3fb27SDimitry Andric #include <functional>
22*06c3fb27SDimitry Andric 
23*06c3fb27SDimitry Andric namespace llvm {
24*06c3fb27SDimitry Andric class GlobalValueSummary;
25*06c3fb27SDimitry Andric class Module;
26*06c3fb27SDimitry Andric class OptimizationRemarkEmitter;
27*06c3fb27SDimitry Andric 
28*06c3fb27SDimitry Andric class MemProfContextDisambiguation
29*06c3fb27SDimitry Andric     : public PassInfoMixin<MemProfContextDisambiguation> {
30*06c3fb27SDimitry Andric   /// Run the context disambiguator on \p M, returns true if any changes made.
31*06c3fb27SDimitry Andric   bool processModule(
32*06c3fb27SDimitry Andric       Module &M,
33*06c3fb27SDimitry Andric       function_ref<OptimizationRemarkEmitter &(Function *)> OREGetter);
34*06c3fb27SDimitry Andric 
35*06c3fb27SDimitry Andric   /// In the ThinLTO backend, apply the cloning decisions in ImportSummary to
36*06c3fb27SDimitry Andric   /// the IR.
37*06c3fb27SDimitry Andric   bool applyImport(Module &M);
38*06c3fb27SDimitry Andric 
39*06c3fb27SDimitry Andric   /// Import summary containing cloning decisions for the ThinLTO backend.
40*06c3fb27SDimitry Andric   const ModuleSummaryIndex *ImportSummary;
41*06c3fb27SDimitry Andric 
42*06c3fb27SDimitry Andric   // Owns the import summary specified by internal options for testing the
43*06c3fb27SDimitry Andric   // ThinLTO backend via opt (to simulate distributed ThinLTO).
44*06c3fb27SDimitry Andric   std::unique_ptr<ModuleSummaryIndex> ImportSummaryForTesting;
45*06c3fb27SDimitry Andric 
46*06c3fb27SDimitry Andric public:
47*06c3fb27SDimitry Andric   MemProfContextDisambiguation(const ModuleSummaryIndex *Summary = nullptr);
48*06c3fb27SDimitry Andric 
49*06c3fb27SDimitry Andric   PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
50*06c3fb27SDimitry Andric 
51*06c3fb27SDimitry Andric   void run(ModuleSummaryIndex &Index,
52*06c3fb27SDimitry Andric            function_ref<bool(GlobalValue::GUID, const GlobalValueSummary *)>
53*06c3fb27SDimitry Andric                isPrevailing);
54*06c3fb27SDimitry Andric };
55*06c3fb27SDimitry Andric } // end namespace llvm
56*06c3fb27SDimitry Andric 
57*06c3fb27SDimitry Andric #endif // LLVM_TRANSFORMS_IPO_MEMPROF_CONTEXT_DISAMBIGUATION_H
58