1 | //== ----- llvm/CodeGen/GlobalISel/Combiner.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 | /// \file |
9 | /// This contains the base class for all Combiners generated by TableGen. |
10 | /// Backends need to create class that inherits from "Combiner" and put all of |
11 | /// the TableGen-erated code in there, as it implements the virtual functions. |
12 | /// |
13 | //===----------------------------------------------------------------------===// |
14 | |
15 | #ifndef LLVM_CODEGEN_GLOBALISEL_COMBINER_H |
16 | #define LLVM_CODEGEN_GLOBALISEL_COMBINER_H |
17 | |
18 | #include "llvm/CodeGen/GlobalISel/GIMatchTableExecutor.h" |
19 | #include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h" |
20 | #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h" |
21 | |
22 | namespace llvm { |
23 | class MachineRegisterInfo; |
24 | struct CombinerInfo; |
25 | class GISelCSEInfo; |
26 | class TargetPassConfig; |
27 | class MachineFunction; |
28 | class MachineIRBuilder; |
29 | |
30 | /// Combiner implementation. This is per-function, so passes need to recreate |
31 | /// one of these each time they enter a new function. |
32 | /// |
33 | /// TODO: Is it worth making this module-wide? |
34 | class Combiner : public GIMatchTableExecutor { |
35 | private: |
36 | class WorkListMaintainer; |
37 | GISelWorkList<512> WorkList; |
38 | |
39 | // We have a little hack here where keep the owned pointers private, and only |
40 | // expose a reference. This has two purposes: |
41 | // - Avoid derived classes messing with those pointers. |
42 | // - Keep the API consistent. CInfo, MF, MRI, etc. are all accessed as |
43 | // references. Accessing Observer/B as pointers unnecessarily leaks |
44 | // implementation details into derived classes. |
45 | std::unique_ptr<MachineIRBuilder> Builder; |
46 | std::unique_ptr<WorkListMaintainer> WLObserver; |
47 | std::unique_ptr<GISelObserverWrapper> ObserverWrapper; |
48 | |
49 | bool HasSetupMF = false; |
50 | |
51 | public: |
52 | /// If CSEInfo is not null, then the Combiner will use CSEInfo as the observer |
53 | /// and also create a CSEMIRBuilder. Pass nullptr if CSE is not needed. |
54 | Combiner(MachineFunction &MF, CombinerInfo &CInfo, |
55 | const TargetPassConfig *TPC, GISelKnownBits *KB, |
56 | GISelCSEInfo *CSEInfo = nullptr); |
57 | virtual ~Combiner(); |
58 | |
59 | virtual bool tryCombineAll(MachineInstr &I) const = 0; |
60 | |
61 | bool combineMachineInstrs(); |
62 | |
63 | protected: |
64 | CombinerInfo &CInfo; |
65 | GISelChangeObserver &Observer; |
66 | MachineIRBuilder &B; |
67 | MachineFunction &MF; |
68 | MachineRegisterInfo &MRI; |
69 | GISelKnownBits *KB; |
70 | |
71 | const TargetPassConfig *TPC; |
72 | GISelCSEInfo *CSEInfo; |
73 | }; |
74 | |
75 | } // End namespace llvm. |
76 | |
77 | #endif // LLVM_CODEGEN_GLOBALISEL_COMBINER_H |
78 | |