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