xref: /freebsd/contrib/llvm-project/llvm/include/llvm/CodeGen/GlobalMerge.h (revision 700637cbb5e582861067a11aaca4d053546871d2)
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