LLVM 20.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 {
24class MachineRegisterInfo;
25class GISelCSEInfo;
26class TargetPassConfig;
27class MachineFunction;
28class 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?
35private:
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 implementation.
Definition: Combiner.h:34
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
GISelKnownBits * KB
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
Provides the logic to execute GlobalISel match tables, which are used by the instruction selector and...
The CSE Analysis object.
Definition: CSEInfo.h:70
Abstract class that contains various methods for clients to notify about changes.
Helper class to build MachineInstr.
Representation of each machine instruction.
Definition: MachineInstr.h:69
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.
Definition: AddressRanges.h:18