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