LLVM 20.0.0git
CSEInfo.h
Go to the documentation of this file.
1//===- llvm/CodeGen/GlobalISel/CSEInfo.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/// Provides analysis for continuously CSEing during GISel passes.
10///
11//===----------------------------------------------------------------------===//
12#ifndef LLVM_CODEGEN_GLOBALISEL_CSEINFO_H
13#define LLVM_CODEGEN_GLOBALISEL_CSEINFO_H
14
15#include "llvm/ADT/FoldingSet.h"
23
24namespace llvm {
25class MachineBasicBlock;
26
27/// A class that wraps MachineInstrs and derives from FoldingSetNode in order to
28/// be uniqued in a CSEMap. The tradeoff here is extra memory allocations for
29/// UniqueMachineInstr vs making MachineInstr bigger.
31 friend class GISelCSEInfo;
32 const MachineInstr *MI;
33 explicit UniqueMachineInstr(const MachineInstr *MI) : MI(MI) {}
34
35public:
37};
38
39// A CSE config for fully optimized builds.
41public:
42 virtual ~CSEConfigFull() = default;
43 bool shouldCSEOpc(unsigned Opc) override;
44};
45
46// Commonly used for O0 config.
48public:
49 virtual ~CSEConfigConstantOnly() = default;
50 bool shouldCSEOpc(unsigned Opc) override;
51};
52
53// Returns the standard expected CSEConfig for the given optimization level.
54// We have this logic here so targets can make use of it from their derived
55// TargetPassConfig, but can't put this logic into TargetPassConfig directly
56// because the CodeGen library can't depend on GlobalISel.
57std::unique_ptr<CSEConfigBase>
59
60/// The CSE Analysis object.
61/// This installs itself as a delegate to the MachineFunction to track
62/// new instructions as well as deletions. It however will not be able to
63/// track instruction mutations. In such cases, recordNewInstruction should be
64/// called (for eg inside MachineIRBuilder::recordInsertion).
65/// Also because of how just the instruction can be inserted without adding any
66/// operands to the instruction, instructions are uniqued and inserted lazily.
67/// CSEInfo should assert when trying to enter an incomplete instruction into
68/// the CSEMap. There is Opcode level granularity on which instructions can be
69/// CSE'd and for now, only Generic instructions are CSEable.
71 // Make it accessible only to CSEMIRBuilder.
72 friend class CSEMIRBuilder;
73
74 BumpPtrAllocator UniqueInstrAllocator;
76 MachineRegisterInfo *MRI = nullptr;
77 MachineFunction *MF = nullptr;
78 std::unique_ptr<CSEConfigBase> CSEOpt;
79 /// Keep a cache of UniqueInstrs for each MachineInstr. In GISel,
80 /// often instructions are mutated (while their ID has completely changed).
81 /// Whenever mutation happens, invalidate the UniqueMachineInstr for the
82 /// MachineInstr
84
85 /// Store instructions that are not fully formed in TemporaryInsts.
86 /// Also because CSE insertion happens lazily, we can remove insts from this
87 /// list and avoid inserting and then removing from the CSEMap.
88 GISelWorkList<8> TemporaryInsts;
89
90 // Only used in asserts.
91 DenseMap<unsigned, unsigned> OpcodeHitTable;
92
93 bool isUniqueMachineInstValid(const UniqueMachineInstr &UMI) const;
94
95 void invalidateUniqueMachineInstr(UniqueMachineInstr *UMI);
96
97 UniqueMachineInstr *getNodeIfExists(FoldingSetNodeID &ID,
98 MachineBasicBlock *MBB, void *&InsertPos);
99
100 /// Allocate and construct a new UniqueMachineInstr for MI and return.
101 UniqueMachineInstr *getUniqueInstrForMI(const MachineInstr *MI);
102
103 void insertNode(UniqueMachineInstr *UMI, void *InsertPos = nullptr);
104
105 /// Get the MachineInstr(Unique) if it exists already in the CSEMap and the
106 /// same MachineBasicBlock.
107 MachineInstr *getMachineInstrIfExists(FoldingSetNodeID &ID,
109 void *&InsertPos);
110
111 /// Use this method to allocate a new UniqueMachineInstr for MI and insert it
112 /// into the CSEMap. MI should return true for shouldCSE(MI->getOpcode())
113 void insertInstr(MachineInstr *MI, void *InsertPos = nullptr);
114
115 bool HandlingRecordedInstrs = false;
116
117public:
118 GISelCSEInfo() = default;
119
120 virtual ~GISelCSEInfo();
121
122 void setMF(MachineFunction &MF);
123
124 Error verify();
125
126 /// Records a newly created inst in a list and lazily insert it to the CSEMap.
127 /// Sometimes, this method might be called with a partially constructed
128 /// MachineInstr,
129 // (right after BuildMI without adding any operands) - and in such cases,
130 // defer the hashing of the instruction to a later stage.
132
133 /// Use this callback to inform CSE about a newly fully created instruction.
135
136 /// Use this callback to insert all the recorded instructions. At this point,
137 /// all of these insts need to be fully constructed and should not be missing
138 /// any operands.
139 void handleRecordedInsts();
140
141 /// Remove this inst from the CSE map. If this inst has not been inserted yet,
142 /// it will be removed from the Tempinsts list if it exists.
144
145 void releaseMemory();
146
147 void setCSEConfig(std::unique_ptr<CSEConfigBase> Opt) {
148 CSEOpt = std::move(Opt);
149 }
150
151 bool shouldCSE(unsigned Opc) const;
152
153 void analyze(MachineFunction &MF);
154
155 void countOpcodeHit(unsigned Opc);
156
157 void print();
158
159 // Observer API
160 void erasingInstr(MachineInstr &MI) override;
161 void createdInstr(MachineInstr &MI) override;
162 void changingInstr(MachineInstr &MI) override;
163 void changedInstr(MachineInstr &MI) override;
164};
165
166class TargetRegisterClass;
167class RegisterBank;
168
169// Simple builder class to easily profile properties about MIs.
172 const MachineRegisterInfo &MRI;
173
174public:
176 : ID(ID), MRI(MRI) {}
177 // Profiling methods.
178 const GISelInstProfileBuilder &addNodeIDOpcode(unsigned Opc) const;
179 const GISelInstProfileBuilder &addNodeIDRegType(const LLT Ty) const;
183
185 addNodeIDRegType(const TargetRegisterClass *RC) const;
187
189
191
192 const GISelInstProfileBuilder &addNodeIDImmediate(int64_t Imm) const;
194 addNodeIDMBB(const MachineBasicBlock *MBB) const;
195
198
199 const GISelInstProfileBuilder &addNodeIDFlag(unsigned Flag) const;
201};
202
203/// Simple wrapper that does the following.
204/// 1) Lazily evaluate the MachineFunction to compute CSEable instructions.
205/// 2) Allows configuration of which instructions are CSEd through CSEConfig
206/// object. Provides a method called get which takes a CSEConfig object.
208 GISelCSEInfo Info;
209 MachineFunction *MF = nullptr;
210 bool AlreadyComputed = false;
211
212public:
213 /// Takes a CSEConfigBase object that defines what opcodes get CSEd.
214 /// If CSEConfig is already set, and the CSE Analysis has been preserved,
215 /// it will not use the new CSEOpt(use Recompute to force using the new
216 /// CSEOpt).
217 GISelCSEInfo &get(std::unique_ptr<CSEConfigBase> CSEOpt,
218 bool ReCompute = false);
219 void setMF(MachineFunction &MFunc) { MF = &MFunc; }
220 void setComputed(bool Computed) { AlreadyComputed = Computed; }
221 void releaseMemory() { Info.releaseMemory(); }
222};
223
224/// The actual analysis pass wrapper.
227
228public:
229 static char ID;
231
232 void getAnalysisUsage(AnalysisUsage &AU) const override;
233
236
237 bool runOnMachineFunction(MachineFunction &MF) override;
238
239 void releaseMemory() override {
240 Wrapper.releaseMemory();
241 Wrapper.setComputed(false);
242 }
243};
244
245} // namespace llvm
246
247#endif
unsigned const MachineRegisterInfo * MRI
amdgpu aa AMDGPU Address space based Alias Analysis Wrapper
MachineBasicBlock & MBB
This file defines the BumpPtrAllocator interface.
Analysis containing CSE Info
Definition: CSEInfo.cpp:27
This file defines a hash set that can be used to remove duplication of nodes in a graph.
This contains common code to allow clients to notify changes to machine instr.
IRTranslator LLVM IR MI
Load MIR Sample Profile
unsigned Reg
Represent the analysis usage information of a pass.
Allocate memory in an ever growing pool, as if by bump-pointer.
Definition: Allocator.h:66
bool shouldCSEOpc(unsigned Opc) override
Definition: CSEInfo.cpp:73
virtual ~CSEConfigConstantOnly()=default
bool shouldCSEOpc(unsigned Opc) override
------— CSEConfigFull -------— ///
Definition: CSEInfo.cpp:37
virtual ~CSEConfigFull()=default
Defines a builder that does CSE of MachineInstructions using GISelCSEInfo.
Definition: CSEMIRBuilder.h:38
Lightweight error class with error context and mandatory checking.
Definition: Error.h:160
Node - This class is used to maintain the singly linked bucket list in a folding set.
Definition: FoldingSet.h:138
FoldingSetNodeID - This class is used to gather all the unique data bits of a node.
Definition: FoldingSet.h:327
FoldingSet - This template class is used to instantiate a specialized implementation of the folding s...
Definition: FoldingSet.h:536
The actual analysis pass wrapper.
Definition: CSEInfo.h:225
const GISelCSEAnalysisWrapper & getCSEWrapper() const
Definition: CSEInfo.h:234
void releaseMemory() override
releaseMemory() - This member can be implemented by a pass if it wants to be able to release its memo...
Definition: CSEInfo.h:239
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
Definition: CSEInfo.cpp:445
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
Definition: CSEInfo.cpp:450
GISelCSEAnalysisWrapper & getCSEWrapper()
Definition: CSEInfo.h:235
Simple wrapper that does the following.
Definition: CSEInfo.h:207
void setComputed(bool Computed)
Definition: CSEInfo.h:220
void setMF(MachineFunction &MFunc)
Definition: CSEInfo.h:219
GISelCSEInfo & get(std::unique_ptr< CSEConfigBase > CSEOpt, bool ReCompute=false)
Takes a CSEConfigBase object that defines what opcodes get CSEd.
Definition: CSEInfo.cpp:435
The CSE Analysis object.
Definition: CSEInfo.h:70
bool shouldCSE(unsigned Opc) const
Definition: CSEInfo.cpp:230
void changingInstr(MachineInstr &MI) override
This instruction is about to be mutated in some way.
Definition: CSEInfo.cpp:237
void analyze(MachineFunction &MF)
Definition: CSEInfo.cpp:244
void changedInstr(MachineInstr &MI) override
This instruction was mutated in some way.
Definition: CSEInfo.cpp:242
void recordNewInstruction(MachineInstr *MI)
Records a newly created inst in a list and lazily insert it to the CSEMap.
Definition: CSEInfo.cpp:182
void setMF(MachineFunction &MF)
-----— GISelCSEInfo ----------—//
Definition: CSEInfo.cpp:91
virtual ~GISelCSEInfo()
void erasingInstr(MachineInstr &MI) override
An instruction is about to be erased.
Definition: CSEInfo.cpp:235
void countOpcodeHit(unsigned Opc)
Definition: CSEInfo.cpp:172
void setCSEConfig(std::unique_ptr< CSEConfigBase > Opt)
Definition: CSEInfo.h:147
void handleRecordedInsts()
Use this callback to insert all the recorded instructions.
Definition: CSEInfo.cpp:219
void handleRecordedInst(MachineInstr *MI)
Use this callback to inform CSE about a newly fully created instruction.
Definition: CSEInfo.cpp:189
void handleRemoveInst(MachineInstr *MI)
Remove this inst from the CSE map.
Definition: CSEInfo.cpp:211
GISelCSEInfo()=default
void releaseMemory()
Definition: CSEInfo.cpp:256
void createdInstr(MachineInstr &MI) override
An instruction has been created and inserted into the function.
Definition: CSEInfo.cpp:236
Abstract class that contains various methods for clients to notify about changes.
const GISelInstProfileBuilder & addNodeIDOpcode(unsigned Opc) const
Definition: CSEInfo.cpp:335
const GISelInstProfileBuilder & addNodeIDRegNum(Register Reg) const
Definition: CSEInfo.cpp:380
const GISelInstProfileBuilder & addNodeIDFlag(unsigned Flag) const
Definition: CSEInfo.cpp:398
const GISelInstProfileBuilder & addNodeIDImmediate(int64_t Imm) const
Definition: CSEInfo.cpp:374
const GISelInstProfileBuilder & addNodeIDReg(Register Reg) const
Definition: CSEInfo.cpp:405
const GISelInstProfileBuilder & addNodeID(const MachineInstr *MI) const
Definition: CSEInfo.cpp:325
const GISelInstProfileBuilder & addNodeIDMBB(const MachineBasicBlock *MBB) const
Definition: CSEInfo.cpp:392
GISelInstProfileBuilder(FoldingSetNodeID &ID, const MachineRegisterInfo &MRI)
Definition: CSEInfo.h:175
const GISelInstProfileBuilder & addNodeIDRegType(const LLT Ty) const
Definition: CSEInfo.cpp:341
const GISelInstProfileBuilder & addNodeIDMachineOperand(const MachineOperand &MO) const
Definition: CSEInfo.cpp:410
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
Representation of each machine instruction.
Definition: MachineInstr.h:69
MachineOperand class - Representation of each machine instruction operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
This class implements the register bank concept.
Definition: RegisterBank.h:28
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
A class that wraps MachineInstrs and derives from FoldingSetNode in order to be uniqued in a CSEMap.
Definition: CSEInfo.h:30
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
std::unique_ptr< CSEConfigBase > getStandardCSEConfigForOpt(CodeGenOptLevel Level)
Definition: CSEInfo.cpp:79
CodeGenOptLevel
Code generation optimization level.
Definition: CodeGen.h:54
All attributes(register class or bank and low-level type) a virtual register can have.