xref: /freebsd/contrib/llvm-project/llvm/include/llvm/CodeGen/GlobalMerge.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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:
GlobalMergePass(const TargetMachine * TM,GlobalMergeOptions Options)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