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 | |