LLVM 22.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 Function;
39class Instruction;
40class MachineFunction;
41class MachineInstr;
42class MachineRegisterInfo;
43class MVT;
44class SelectionDAG;
45class TargetLowering;
46
47template <typename T> class GenericSSAContext;
49template <typename T> class GenericUniformityInfo;
51
52//===--------------------------------------------------------------------===//
53/// FunctionLoweringInfo - This contains information that is global to a
54/// function that is used when lowering a region of the function.
55///
57public:
58 const Function *Fn;
64 /// CanLowerReturn - true iff the function's return value can be lowered to
65 /// registers.
67
68 /// True if part of the CSRs will be handled via explicit copies.
70
71 /// DemoteRegister - if CanLowerReturn is false, DemoteRegister is a vreg
72 /// allocated to hold a pointer to the hidden sret parameter.
74
75 /// A mapping from LLVM basic block number to their machine block.
77
78 /// ValueMap - Since we emit code for the function a basic block at a time,
79 /// we must remember which virtual registers hold the values for
80 /// cross-basic-block values.
82
83 /// VirtReg2Value map is needed by the Divergence Analysis driven
84 /// instruction selection. It is reverted ValueMap. It is computed
85 /// in lazy style - on demand. It is used to get the Value corresponding
86 /// to the live in virtual register and is called from the
87 /// TargetLowerinInfo::isSDNodeSourceOfDivergence.
89
90 /// This method is called from TargetLowerinInfo::isSDNodeSourceOfDivergence
91 /// to get the Value corresponding to the live-in virtual register.
93
94 /// Track virtual registers created for exception pointers.
96
97 /// Helper object to track which of three possible relocation mechanisms are
98 /// used for a particular value being relocated over a statepoint.
101 // Value did not need to be relocated and can be used directly.
103 // Value was spilled to stack and needs filled at the gc.relocate.
105 // Value was lowered to tied def and gc.relocate should be replaced with
106 // copy from vreg.
108 // Value was lowered to tied def and gc.relocate should be replaced with
109 // SDValue kept in StatepointLoweringInfo structure. This valid for local
110 // relocates only.
113 // Payload contains either frame index of the stack slot in which the value
114 // was spilled, or virtual register which contains the re-definition.
115 union payload_t {
116 payload_t() : FI(-1) {}
117 int FI;
120 };
121
122 /// Keep track of each value which was relocated and the strategy used to
123 /// relocate that value. This information is required when visiting
124 /// gc.relocates which may appear in following blocks.
128
129 /// StaticAllocaMap - Keep track of frame indices for fixed sized allocas in
130 /// the entry block. This allows the allocas to be efficiently referenced
131 /// anywhere in the function.
133
134 /// ByValArgFrameIndexMap - Keep track of frame indices for byval arguments.
136
137 /// ArgDbgValues - A list of DBG_VALUE instructions created during isel for
138 /// function arguments that are inserted after scheduling is completed.
140
141 /// Bitvector with a bit set if corresponding argument is described in
142 /// ArgDbgValues. Using arg numbers according to Argument numbering.
144
145 /// RegFixups - Registers which need to be replaced after isel is done.
147
149
150 /// StatepointStackSlots - A list of temporary stack slots (frame indices)
151 /// used to spill values at a statepoint. We store them here to enable
152 /// reuse of the same stack slots across different statepoints in different
153 /// basic blocks.
155
156 /// MBB - The current block.
158
159 /// MBB - The current insert position inside the current block.
161
162 struct LiveOutInfo {
163 unsigned NumSignBits : 31;
164 unsigned IsValid : 1;
166
168 };
169
170 /// Record the preferred extend type (ISD::SIGN_EXTEND or ISD::ZERO_EXTEND)
171 /// for a value.
173
174 /// The set of basic blocks visited thus far by instruction selection. Indexed
175 /// by basic block number.
177
178 /// PHINodesToUpdate - A list of phi instructions whose operand list will
179 /// be updated after processing the current basic block.
180 /// TODO: This isn't per-function state, it's per-basic-block state. But
181 /// there's no other convenient place for it to live right now.
182 std::vector<std::pair<MachineInstr*, Register>> PHINodesToUpdate;
184
185 /// If the current MBB is a landing pad, the exception pointer and exception
186 /// selector registers are copied into these virtual registers by
187 /// SelectionDAGISel::PrepareEHLandingPad().
189
190 /// The current call site index being processed, if any. 0 if none.
191 unsigned CurCallSite = 0;
192
193 /// Collection of dbg_declare instructions handled after argument
194 /// lowering and before ISel proper.
196
197 /// set - Initialize this FunctionLoweringInfo with the given Function
198 /// and its associated MachineFunction.
199 ///
200 void set(const Function &Fn, MachineFunction &MF, SelectionDAG *DAG);
201
202 /// clear - Clear out all the function-specific state. This returns this
203 /// FunctionLoweringInfo to an empty state, ready to be used for a
204 /// different function.
205 void clear();
206
207 /// isExportedInst - Return true if the specified value is an instruction
208 /// exported from its block.
209 bool isExportedInst(const Value *V) const {
210 return ValueMap.count(V);
211 }
212
214 assert(BB->getNumber() < MBBMap.size() && "uninitialized MBBMap?");
215 return MBBMap[BB->getNumber()];
216 }
217
218 Register CreateReg(MVT VT, bool isDivergent = false);
219
220 Register CreateRegs(const Value *V);
221
222 Register CreateRegs(Type *Ty, bool isDivergent = false);
223
225
226 /// GetLiveOutRegInfo - Gets LiveOutInfo for a register, returning NULL if the
227 /// register is a PHI destination and the PHI's LiveOutInfo is not valid.
229 if (!LiveOutRegInfo.inBounds(Reg))
230 return nullptr;
231
232 const LiveOutInfo *LOI = &LiveOutRegInfo[Reg];
233 if (!LOI->IsValid)
234 return nullptr;
235
236 return LOI;
237 }
238
239 /// GetLiveOutRegInfo - Gets LiveOutInfo for a register, returning NULL if the
240 /// register is a PHI destination and the PHI's LiveOutInfo is not valid. If
241 /// the register's LiveOutInfo is for a smaller bit width, it is extended to
242 /// the larger bit width by zero extension. The bit width must be no smaller
243 /// than the LiveOutInfo's existing bit width.
244 const LiveOutInfo *GetLiveOutRegInfo(Register Reg, unsigned BitWidth);
245
246 /// AddLiveOutRegInfo - Adds LiveOutInfo for a register.
247 void AddLiveOutRegInfo(Register Reg, unsigned NumSignBits,
248 const KnownBits &Known) {
249 // Only install this information if it tells us something.
250 if (NumSignBits == 1 && Known.isUnknown())
251 return;
252
253 LiveOutRegInfo.grow(Reg);
254 LiveOutInfo &LOI = LiveOutRegInfo[Reg];
255 LOI.NumSignBits = NumSignBits;
256 LOI.Known.One = Known.One;
257 LOI.Known.Zero = Known.Zero;
258 }
259
260 /// ComputePHILiveOutRegInfo - Compute LiveOutInfo for a PHI's destination
261 /// register based on the LiveOutInfo of its operands.
263
264 /// InvalidatePHILiveOutRegInfo - Invalidates a PHI's LiveOutInfo, to be
265 /// called when a block is visited before all of its predecessors.
267 // PHIs with no uses have no ValueMap entry.
269 if (It == ValueMap.end())
270 return;
271
272 Register Reg = It->second;
273 if (Reg == 0)
274 return;
275
276 LiveOutRegInfo.grow(Reg);
277 LiveOutRegInfo[Reg].IsValid = false;
278 }
279
280 /// setArgumentFrameIndex - Record frame index for the byval
281 /// argument.
282 void setArgumentFrameIndex(const Argument *A, int FI);
283
284 /// getArgumentFrameIndex - Get frame index for the byval argument.
285 int getArgumentFrameIndex(const Argument *A);
286
288 const TargetRegisterClass *RC);
289
290 /// Set the call site currently being processed.
291 void setCurrentCallSite(unsigned Site) { CurCallSite = Site; }
292
293 /// Get the call site currently being processed, if any. Return zero if none.
294 unsigned getCurrentCallSite() { return CurCallSite; }
295
296private:
297 /// LiveOutRegInfo - Information about live out vregs.
299};
300
301} // end namespace llvm
302
303#endif // LLVM_CODEGEN_FUNCTIONLOWERINGINFO_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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.
Register 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:32
LLVM Basic Block Representation.
Definition: BasicBlock.h:62
unsigned getNumber() const
Definition: BasicBlock.h:95
Analysis providing branch probability information.
Implements a dense probed hash-table based set.
Definition: DenseSet.h:263
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
Collection of dbg_declare instructions handled after argument lowering and before ISel proper.
void clear()
clear - Clear out all the function-specific state.
MachineBasicBlock * getMBB(const BasicBlock *BB) const
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.
SmallVector< bool > VisitedBBs
The set of basic blocks visited thus far by instruction selection.
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
DenseMap< const Instruction *, StatepointSpillMapTy > StatepointRelocationMaps
unsigned CurCallSite
The current call site index being processed, if any. 0 if none.
int getArgumentFrameIndex(const Argument *A)
getArgumentFrameIndex - Get frame index for the byval argument.
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)
bool SplitCSR
True if part of the CSRs will be handled via explicit copies.
DenseMap< const Value *, Register > ValueMap
ValueMap - Since we emit code for the function a basic block at a time, we must remember which virtua...
Register ExceptionPointerVirtReg
If the current MBB is a landing pad, the exception pointer and exception selector registers are copie...
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.
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...
std::vector< std::pair< MachineInstr *, Register > > PHINodesToUpdate
PHINodesToUpdate - A list of phi instructions whose operand list will be updated after processing the...
unsigned getCurrentCallSite()
Get the call site currently being processed, if any. Return zero if none.
void ComputePHILiveOutRegInfo(const PHINode *)
ComputePHILiveOutRegInfo - Compute LiveOutInfo for a PHI's destination register based on the LiveOutI...
SmallVector< MachineBasicBlock * > MBBMap
A mapping from LLVM basic block number to their machine block.
const TargetLowering * TLI
const Value * getValueFromVirtualReg(Register Vreg)
This method is called from TargetLowerinInfo::isSDNodeSourceOfDivergence to get the Value correspondi...
void setCurrentCallSite(unsigned Site)
Set the call site currently being processed.
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:229
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:541
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
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:156
iterator find(const KeyT &Val)
Definition: ValueMap.h:160
iterator end()
Definition: ValueMap.h:139
LLVM Value Representation.
Definition: Value.h:75
@ BasicBlock
Various leaf nodes.
Definition: ISDOpcodes.h:81
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
constexpr unsigned BitWidth
Definition: BitmaskEnum.h:223
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:66