1 //===- llvm/CodeGen/GlobalMerge.h -------------------------------*- 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 #ifndef LLVM_CODEGEN_GLOBALMERGE_H 10 #define LLVM_CODEGEN_GLOBALMERGE_H 11 12 #include "llvm/IR/PassManager.h" 13 14 namespace llvm { 15 16 class TargetMachine; 17 18 struct GlobalMergeOptions { 19 // FIXME: Infer the maximum possible offset depending on the actual users 20 // (these max offsets are different for the users inside Thumb or ARM 21 // functions), see the code that passes in the offset in the ARM backend 22 // for more information. 23 unsigned MaxOffset = 0; 24 // The minimum size in bytes of each global that should considered in merging. 25 unsigned MinSize = 0; 26 bool GroupByUse = true; 27 bool IgnoreSingleUse = true; 28 /// Whether we should merge global variables that have external linkage. 29 bool MergeExternal = true; 30 /// Whether we should merge constant global variables. 31 bool MergeConstantGlobals = false; 32 /// Whether we should merge constant global variables aggressively without 33 /// looking at use. 34 bool MergeConstAggressive = false; 35 /// Whether we should try to optimize for size only. 36 /// Currently, this applies a dead simple heuristic: only consider globals 37 /// used in minsize functions for merging. 38 /// FIXME: This could learn about optsize, and be used in the cost model. 39 bool SizeOnly = false; 40 }; 41 42 // FIXME: This pass must run before AsmPrinterPass::doInitialization! 43 class GlobalMergePass : public PassInfoMixin<GlobalMergePass> { 44 const TargetMachine *TM; 45 GlobalMergeOptions Options; 46 47 public: GlobalMergePass(const TargetMachine * TM,GlobalMergeOptions Options)48 GlobalMergePass(const TargetMachine *TM, GlobalMergeOptions Options) 49 : TM(TM), Options(Options) {} 50 51 PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM); 52 }; 53 54 } // namespace llvm 55 56 #endif // LLVM_CODEGEN_GLOBALMERGE_H 57