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 bool MergeConst = false; 29 /// Whether we should merge global variables that have external linkage. 30 bool MergeExternal = true; 31 /// Whether we should try to optimize for size only. 32 /// Currently, this applies a dead simple heuristic: only consider globals 33 /// used in minsize functions for merging. 34 /// FIXME: This could learn about optsize, and be used in the cost model. 35 bool SizeOnly = false; 36 }; 37 38 // FIXME: This pass must run before AsmPrinterPass::doInitialization! 39 class GlobalMergePass : public PassInfoMixin<GlobalMergePass> { 40 const TargetMachine *TM; 41 GlobalMergeOptions Options; 42 43 public: 44 GlobalMergePass(const TargetMachine *TM, GlobalMergeOptions Options) 45 : TM(TM), Options(Options) {} 46 47 PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM); 48 }; 49 50 } // namespace llvm 51 52 #endif // LLVM_CODEGEN_GLOBALMERGE_H 53