LLVM 22.0.0git
Combiner.h
Go to the documentation of this file.
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
22
23namespace llvm {
25class GISelCSEInfo;
27class MachineFunction;
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?
35private:
36 using WorkListTy = GISelWorkList<512>;
37
39 template <CombinerInfo::ObserverLevel Lvl> class WorkListMaintainerImpl;
40
41 WorkListTy WorkList;
42
43 // We have a little hack here where keep the owned pointers private, and only
44 // expose a reference. This has two purposes:
45 // - Avoid derived classes messing with those pointers.
46 // - Keep the API consistent. CInfo, MF, MRI, etc. are all accessed as
47 // references. Accessing Observer/B as pointers unnecessarily leaks
48 // implementation details into derived classes.
49 std::unique_ptr<MachineIRBuilder> Builder;
50 std::unique_ptr<WorkListMaintainer> WLObserver;
51 std::unique_ptr<GISelObserverWrapper> ObserverWrapper;
52
53 bool HasSetupMF = false;
54
55 static bool tryDCE(MachineInstr &MI, MachineRegisterInfo &MRI);
56
57public:
58 /// If CSEInfo is not null, then the Combiner will use CSEInfo as the observer
59 /// and also create a CSEMIRBuilder. Pass nullptr if CSE is not needed.
62 GISelCSEInfo *CSEInfo = nullptr);
63 virtual ~Combiner();
64
65 virtual bool tryCombineAll(MachineInstr &I) const = 0;
66
68
69protected:
76
79};
80
81} // End namespace llvm.
82
83#endif // LLVM_CODEGEN_GLOBALISEL_COMBINER_H
Option class for Targets to specify which operations are combined how and when.
This contains common code to allow clients to notify changes to machine instr.
IRTranslator LLVM IR MI
#define I(x, y, z)
Definition MD5.cpp:58
This file declares the MachineIRBuilder class.
This class acts as the glue that joins the CombinerHelper to the overall Combine algorithm.
Definition Combiner.cpp:52
Combiner(MachineFunction &MF, CombinerInfo &CInfo, const TargetPassConfig *TPC, GISelValueTracking *VT, GISelCSEInfo *CSEInfo=nullptr)
If CSEInfo is not null, then the Combiner will use CSEInfo as the observer and also create a CSEMIRBu...
Definition Combiner.cpp:224
GISelCSEInfo * CSEInfo
Definition Combiner.h:78
bool combineMachineInstrs()
Definition Combiner.cpp:255
MachineRegisterInfo & MRI
Definition Combiner.h:74
const TargetPassConfig * TPC
Definition Combiner.h:77
virtual ~Combiner()
MachineIRBuilder & B
Definition Combiner.h:72
GISelValueTracking * VT
Definition Combiner.h:75
MachineFunction & MF
Definition Combiner.h:73
CombinerInfo & CInfo
Definition Combiner.h:70
GISelChangeObserver & Observer
Definition Combiner.h:71
virtual bool tryCombineAll(MachineInstr &I) const =0
The CSE Analysis object.
Definition CSEInfo.h:71
Abstract class that contains various methods for clients to notify about changes.
Helper class to build MachineInstr.
Representation of each machine instruction.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Target-Independent Code Generator Pass Configuration Options.
This is an optimization pass for GlobalISel generic memory operations.