LLVM 19.0.0git
FunctionLoweringInfo.h
Go to the documentation of this file.
1//===- FunctionLoweringInfo.h - Lower functions from LLVM IR ---*- 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// This implements routines for translating functions from LLVM IR into
10// Machine IR.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CODEGEN_FUNCTIONLOWERINGINFO_H
15#define LLVM_CODEGEN_FUNCTIONLOWERINGINFO_H
16
17#include "llvm/ADT/BitVector.h"
18#include "llvm/ADT/DenseMap.h"
19#include "llvm/ADT/IndexedMap.h"
26#include "llvm/IR/Type.h"
27#include "llvm/IR/Value.h"
29#include <cassert>
30#include <utility>
31#include <vector>
32
33namespace llvm {
34
35class Argument;
36class BasicBlock;
37class BranchProbabilityInfo;
38class DbgDeclareInst;
39class Function;
40class Instruction;
41class MachineFunction;
42class MachineInstr;
43class MachineRegisterInfo;
44class MVT;
45class SelectionDAG;
46class TargetLowering;
47
48template <typename T> class GenericSSAContext;
50template <typename T> class GenericUniformityInfo;
52
53//===--------------------------------------------------------------------===//
54/// FunctionLoweringInfo - This contains information that is global to a
55/// function that is used when lowering a region of the function.
56///
58public:
59 const Function *Fn;
65 /// CanLowerReturn - true iff the function's return value can be lowered to
66 /// registers.
68
69 /// True if part of the CSRs will be handled via explicit copies.
71
72 /// DemoteRegister - if CanLowerReturn is false, DemoteRegister is a vreg
73 /// allocated to hold a pointer to the hidden sret parameter.
75
76 /// MBBMap - A mapping from LLVM basic blocks to their machine code entry.
78
79 /// ValueMap - Since we emit code for the function a basic block at a time,
80 /// we must remember which virtual registers hold the values for
81 /// cross-basic-block values.
83
84 /// VirtReg2Value map is needed by the Divergence Analysis driven
85 /// instruction selection. It is reverted ValueMap. It is computed
86 /// in lazy style - on demand. It is used to get the Value corresponding
87 /// to the live in virtual register and is called from the
88 /// TargetLowerinInfo::isSDNodeSourceOfDivergence.
90
91 /// This method is called from TargetLowerinInfo::isSDNodeSourceOfDivergence
92 /// to get the Value corresponding to the live-in virtual register.
94
95 /// Track virtual registers created for exception pointers.
97
98 /// Helper object to track which of three possible relocation mechanisms are
99 /// used for a particular value being relocated over a statepoint.
102 // Value did not need to be relocated and can be used directly.
104 // Value was spilled to stack and needs filled at the gc.relocate.
106 // Value was lowered to tied def and gc.relocate should be replaced with
107 // copy from vreg.
109 // Value was lowered to tied def and gc.relocate should be replaced with
110 // SDValue kept in StatepointLoweringInfo structure. This valid for local
111 // relocates only.
114 // Payload contains either frame index of the stack slot in which the value
115 // was spilled, or virtual register which contains the re-definition.
116 union payload_t {
117 payload_t() : FI(-1) {}
118 int FI;
121 };
122
123 /// Keep track of each value which was relocated and the strategy used to
124 /// relocate that value. This information is required when visiting
125 /// gc.relocates which may appear in following blocks.
129
130 /// StaticAllocaMap - Keep track of frame indices for fixed sized allocas in
131 /// the entry block. This allows the allocas to be efficiently referenced
132 /// anywhere in the function.
134
135 /// ByValArgFrameIndexMap - Keep track of frame indices for byval arguments.
137
138 /// ArgDbgValues - A list of DBG_VALUE instructions created during isel for
139 /// function arguments that are inserted after scheduling is completed.
141
142 /// Bitvector with a bit set if corresponding argument is described in
143 /// ArgDbgValues. Using arg numbers according to Argument numbering.
145
146 /// RegFixups - Registers which need to be replaced after isel is done.
148
150
151 /// StatepointStackSlots - A list of temporary stack slots (frame indices)
152 /// used to spill values at a statepoint. We store them here to enable
153 /// reuse of the same stack slots across different statepoints in different
154 /// basic blocks.
156
157 /// MBB - The current block.
159
160 /// MBB - The current insert position inside the current block.
162
163 struct LiveOutInfo {
164 unsigned NumSignBits : 31;
165 unsigned IsValid : 1;
167
169 };
170
171 /// Record the preferred extend type (ISD::SIGN_EXTEND or ISD::ZERO_EXTEND)
172 /// for a value.
174
175 /// VisitedBBs - The set of basic blocks visited thus far by instruction
176 /// selection.
178
179 /// PHINodesToUpdate - A list of phi instructions whose operand list will
180 /// be updated after processing the current basic block.
181 /// TODO: This isn't per-function state, it's per-basic-block state. But
182 /// there's no other convenient place for it to live right now.
183 std::vector<std::pair<MachineInstr*, unsigned> > PHINodesToUpdate;
185
186 /// If the current MBB is a landing pad, the exception pointer and exception
187 /// selector registers are copied into these virtual registers by
188 /// SelectionDAGISel::PrepareEHLandingPad().
190
191 /// Collection of dbg.declare instructions handled after argument
192 /// lowering and before ISel proper.
195
196 /// set - Initialize this FunctionLoweringInfo with the given Function
197 /// and its associated MachineFunction.
198 ///
199 void set(const Function &Fn, MachineFunction &MF, SelectionDAG *DAG);
200
201 /// clear - Clear out all the function-specific state. This returns this
202 /// FunctionLoweringInfo to an empty state, ready to be used for a
203 /// different function.
204 void clear();
205
206 /// isExportedInst - Return true if the specified value is an instruction
207 /// exported from its block.
208 bool isExportedInst(const Value *V) const {
209 return ValueMap.count(V);
210 }
211
212 Register CreateReg(MVT VT, bool isDivergent = false);
213
214 Register CreateRegs(const Value *V);
215
216 Register CreateRegs(Type *Ty, bool isDivergent = false);
217
219
220 /// GetLiveOutRegInfo - Gets LiveOutInfo for a register, returning NULL if the
221 /// register is a PHI destination and the PHI's LiveOutInfo is not valid.
223 if (!LiveOutRegInfo.inBounds(Reg))
224 return nullptr;
225
226 const LiveOutInfo *LOI = &LiveOutRegInfo[Reg];
227 if (!LOI->IsValid)
228 return nullptr;
229
230 return LOI;
231 }
232
233 /// GetLiveOutRegInfo - Gets LiveOutInfo for a register, returning NULL if the
234 /// register is a PHI destination and the PHI's LiveOutInfo is not valid. If
235 /// the register's LiveOutInfo is for a smaller bit width, it is extended to
236 /// the larger bit width by zero extension. The bit width must be no smaller
237 /// than the LiveOutInfo's existing bit width.
238 const LiveOutInfo *GetLiveOutRegInfo(Register Reg, unsigned BitWidth);
239
240 /// AddLiveOutRegInfo - Adds LiveOutInfo for a register.
241 void AddLiveOutRegInfo(Register Reg, unsigned NumSignBits,
242 const KnownBits &Known) {
243 // Only install this information if it tells us something.
244 if (NumSignBits == 1 && Known.isUnknown())
245 return;
246
247 LiveOutRegInfo.grow(Reg);
248 LiveOutInfo &LOI = LiveOutRegInfo[Reg];
249 LOI.NumSignBits = NumSignBits;
250 LOI.Known.One = Known.One;
251 LOI.Known.Zero = Known.Zero;
252 }
253
254 /// ComputePHILiveOutRegInfo - Compute LiveOutInfo for a PHI's destination
255 /// register based on the LiveOutInfo of its operands.
257
258 /// InvalidatePHILiveOutRegInfo - Invalidates a PHI's LiveOutInfo, to be
259 /// called when a block is visited before all of its predecessors.
261 // PHIs with no uses have no ValueMap entry.
263 if (It == ValueMap.end())
264 return;
265
266 Register Reg = It->second;
267 if (Reg == 0)
268 return;
269
270 LiveOutRegInfo.grow(Reg);
271 LiveOutRegInfo[Reg].IsValid = false;
272 }
273
274 /// setArgumentFrameIndex - Record frame index for the byval
275 /// argument.
276 void setArgumentFrameIndex(const Argument *A, int FI);
277
278 /// getArgumentFrameIndex - Get frame index for the byval argument.
279 int getArgumentFrameIndex(const Argument *A);
280
282 const TargetRegisterClass *RC);
283
284private:
285 /// LiveOutRegInfo - Information about live out vregs.
287};
288
289} // end namespace llvm
290
291#endif // LLVM_CODEGEN_FUNCTIONLOWERINGINFO_H
basic Basic Alias true
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This file defines the DenseMap class.
This file implements an indexed map.
unsigned Reg
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This class represents an incoming formal argument to a Function.
Definition: Argument.h:31
Analysis providing branch probability information.
Implements a dense probed hash-table based set.
Definition: DenseSet.h:271
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
BranchProbabilityInfo * BPI
Register CreateRegs(const Value *V)
SmallPtrSet< const DbgVariableRecord *, 8 > PreprocessedDVRDeclares
void clear()
clear - Clear out all the function-specific state.
DenseSet< Register > RegsWithFixups
Register DemoteRegister
DemoteRegister - if CanLowerReturn is false, DemoteRegister is a vreg allocated to hold a pointer to ...
void setArgumentFrameIndex(const Argument *A, int FI)
setArgumentFrameIndex - Record frame index for the byval argument.
void InvalidatePHILiveOutRegInfo(const PHINode *PN)
InvalidatePHILiveOutRegInfo - Invalidates a PHI's LiveOutInfo, to be called when a block is visited b...
BitVector DescribedArgs
Bitvector with a bit set if corresponding argument is described in ArgDbgValues.
DenseMap< const AllocaInst *, int > StaticAllocaMap
StaticAllocaMap - Keep track of frame indices for fixed sized allocas in the entry block.
const UniformityInfo * UA
SmallPtrSet< const BasicBlock *, 4 > VisitedBBs
VisitedBBs - The set of basic blocks visited thus far by instruction selection.
DenseMap< const Instruction *, StatepointSpillMapTy > StatepointRelocationMaps
int getArgumentFrameIndex(const Argument *A)
getArgumentFrameIndex - Get frame index for the byval argument.
DenseMap< const BasicBlock *, MachineBasicBlock * > MBBMap
MBBMap - A mapping from LLVM basic blocks to their machine code entry.
bool isExportedInst(const Value *V) const
isExportedInst - Return true if the specified value is an instruction exported from its block.
void AddLiveOutRegInfo(Register Reg, unsigned NumSignBits, const KnownBits &Known)
AddLiveOutRegInfo - Adds LiveOutInfo for a register.
const LiveOutInfo * GetLiveOutRegInfo(Register Reg)
GetLiveOutRegInfo - Gets LiveOutInfo for a register, returning NULL if the register is a PHI destinat...
Register InitializeRegForValue(const Value *V)
unsigned ExceptionPointerVirtReg
If the current MBB is a landing pad, the exception pointer and exception selector registers are copie...
bool SplitCSR
True if part of the CSRs will be handled via explicit copies.
SmallPtrSet< const DbgDeclareInst *, 8 > PreprocessedDbgDeclares
Collection of dbg.declare instructions handled after argument lowering and before ISel proper.
DenseMap< const Value *, Register > ValueMap
ValueMap - Since we emit code for the function a basic block at a time, we must remember which virtua...
MachineBasicBlock::iterator InsertPt
MBB - The current insert position inside the current block.
SmallVector< unsigned, 50 > StatepointStackSlots
StatepointStackSlots - A list of temporary stack slots (frame indices) used to spill values at a stat...
void set(const Function &Fn, MachineFunction &MF, SelectionDAG *DAG)
set - Initialize this FunctionLoweringInfo with the given Function and its associated MachineFunction...
MachineBasicBlock * MBB
MBB - The current block.
std::vector< std::pair< MachineInstr *, unsigned > > PHINodesToUpdate
PHINodesToUpdate - A list of phi instructions whose operand list will be updated after processing the...
DenseMap< const Argument *, int > ByValArgFrameIndexMap
ByValArgFrameIndexMap - Keep track of frame indices for byval arguments.
DenseMap< Register, Register > RegFixups
RegFixups - Registers which need to be replaced after isel is done.
SmallVector< MachineInstr *, 8 > ArgDbgValues
ArgDbgValues - A list of DBG_VALUE instructions created during isel for function arguments that are i...
void ComputePHILiveOutRegInfo(const PHINode *)
ComputePHILiveOutRegInfo - Compute LiveOutInfo for a PHI's destination register based on the LiveOutI...
const TargetLowering * TLI
const Value * getValueFromVirtualReg(Register Vreg)
This method is called from TargetLowerinInfo::isSDNodeSourceOfDivergence to get the Value correspondi...
DenseMap< Register, const Value * > VirtReg2Value
VirtReg2Value map is needed by the Divergence Analysis driven instruction selection.
MachineRegisterInfo * RegInfo
Register CreateReg(MVT VT, bool isDivergent=false)
CreateReg - Allocate a single virtual register for the given type.
bool CanLowerReturn
CanLowerReturn - true iff the function's return value can be lowered to registers.
DenseMap< const Value *, ISD::NodeType > PreferredExtendType
Record the preferred extend type (ISD::SIGN_EXTEND or ISD::ZERO_EXTEND) for a value.
Register getCatchPadExceptionPointerVReg(const Value *CPI, const TargetRegisterClass *RC)
DenseMap< const Value *, Register > CatchPadExceptionPointers
Track virtual registers created for exception pointers.
Machine Value Type.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
Definition: SelectionDAG.h:225
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:427
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1209
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
See the file comment.
Definition: ValueMap.h:84
size_type count(const KeyT &Val) const
Return 1 if the specified key is in the map, 0 otherwise.
Definition: ValueMap.h:151
iterator find(const KeyT &Val)
Definition: ValueMap.h:155
iterator end()
Definition: ValueMap.h:135
LLVM Value Representation.
Definition: Value.h:74
@ BasicBlock
Various leaf nodes.
Definition: ISDOpcodes.h:71
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
constexpr unsigned BitWidth
Definition: BitmaskEnum.h:191
Helper object to track which of three possible relocation mechanisms are used for a particular value ...
union llvm::FunctionLoweringInfo::StatepointRelocationRecord::payload_t payload
enum llvm::FunctionLoweringInfo::StatepointRelocationRecord::RelocType type
bool isUnknown() const
Returns true if we don't know any bits.
Definition: KnownBits.h:63