LLVM 24.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"
30#include <cassert>
31#include <utility>
32#include <vector>
33
34namespace llvm {
35
36class Argument;
37class BasicBlock;
39class Function;
40class Instruction;
41class MachineFunction;
42class MachineInstr;
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 /// A mapping from LLVM basic block number to their machine block.
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.
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 /// The set of basic blocks visited thus far by instruction selection. Indexed
176 /// by basic block number.
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*, Register>> 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 /// The exception model in effect, resolved once per function.
193
194 /// The current call site index being processed, if any. 0 if none.
195 unsigned CurCallSite = 0;
196
197 /// Collection of dbg_declare instructions handled after argument
198 /// lowering and before ISel proper.
200
201 /// set - Initialize this FunctionLoweringInfo with the given Function
202 /// and its associated MachineFunction.
203 ///
205
206 /// clear - Clear out all the function-specific state. This returns this
207 /// FunctionLoweringInfo to an empty state, ready to be used for a
208 /// different function.
209 LLVM_ABI void clear();
210
211 /// isExportedInst - Return true if the specified value is an instruction
212 /// exported from its block.
213 bool isExportedInst(const Value *V) const {
214 return ValueMap.count(V);
215 }
216
218 assert(BB->getNumber() < MBBMap.size() && "uninitialized MBBMap?");
219 return MBBMap[BB->getNumber()];
220 }
221
222 LLVM_ABI Register CreateReg(MVT VT, bool isDivergent = false);
223
225
226 LLVM_ABI Register CreateRegs(Type *Ty, bool isDivergent = false);
227
229
230 /// GetLiveOutRegInfo - Gets LiveOutInfo for a register, returning NULL if the
231 /// register is a PHI destination and the PHI's LiveOutInfo is not valid.
233 if (!LiveOutRegInfo.inBounds(Reg))
234 return nullptr;
235
236 const LiveOutInfo *LOI = &LiveOutRegInfo[Reg];
237 if (!LOI->IsValid)
238 return nullptr;
239
240 return LOI;
241 }
242
243 /// GetLiveOutRegInfo - Gets LiveOutInfo for a register, returning NULL if the
244 /// register is a PHI destination and the PHI's LiveOutInfo is not valid. If
245 /// the register's LiveOutInfo is for a smaller bit width, it is extended to
246 /// the larger bit width by zero extension. The bit width must be no smaller
247 /// than the LiveOutInfo's existing bit width.
248 LLVM_ABI const LiveOutInfo *GetLiveOutRegInfo(Register Reg,
249 unsigned BitWidth);
250
251 /// AddLiveOutRegInfo - Adds LiveOutInfo for a register.
252 void AddLiveOutRegInfo(Register Reg, unsigned NumSignBits,
253 const KnownBits &Known) {
254 // Only install this information if it tells us something.
255 if (NumSignBits == 1 && Known.isUnknown())
256 return;
257
258 LiveOutRegInfo.grow(Reg);
259 LiveOutInfo &LOI = LiveOutRegInfo[Reg];
260 LOI.NumSignBits = NumSignBits;
261 LOI.Known.One = Known.One;
262 LOI.Known.Zero = Known.Zero;
263 }
264
265 /// ComputePHILiveOutRegInfo - Compute LiveOutInfo for a PHI's destination
266 /// register based on the LiveOutInfo of its operands.
268
269 /// InvalidatePHILiveOutRegInfo - Invalidates a PHI's LiveOutInfo, to be
270 /// called when a block is visited before all of its predecessors.
272 // PHIs with no uses have no ValueMap entry.
273 auto It = ValueMap.find(PN);
274 if (It == ValueMap.end())
275 return;
276
277 Register Reg = It->second;
278 if (Reg == 0)
279 return;
280
281 LiveOutRegInfo.grow(Reg);
282 LiveOutRegInfo[Reg].IsValid = false;
283 }
284
285 /// setArgumentFrameIndex - Record frame index for the byval
286 /// argument.
287 LLVM_ABI void setArgumentFrameIndex(const Argument *A, int FI);
288
289 /// getArgumentFrameIndex - Get frame index for the byval argument.
291
293 const Value *CPI, const TargetRegisterClass *RC);
294
295 /// Set the call site currently being processed.
296 void setCurrentCallSite(unsigned Site) { CurCallSite = Site; }
297
298 /// Get the call site currently being processed, if any. Return zero if none.
299 unsigned getCurrentCallSite() { return CurCallSite; }
300
301private:
302 /// LiveOutRegInfo - Information about live out vregs.
304};
305
306} // end namespace llvm
307
308#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")
#define LLVM_ABI
Definition Compiler.h:215
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:281
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
BranchProbabilityInfo * BPI
LLVM_ABI Register CreateRegs(const Value *V)
DenseMap< const Value *, StatepointRelocationRecord > StatepointSpillMapTy
Keep track of each value which was relocated and the strategy used to relocate that value.
SmallPtrSet< const DbgVariableRecord *, 8 > PreprocessedDVRDeclares
Collection of dbg_declare instructions handled after argument lowering and before ISel proper.
LLVM_ABI 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 ...
LLVM_ABI 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.
DenseMap< const Instruction *, StatepointSpillMapTy > StatepointRelocationMaps
unsigned CurCallSite
The current call site index being processed, if any. 0 if none.
LLVM_ABI 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...
LLVM_ABI 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...
LLVM_ABI 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.
ExceptionHandling ExceptionModel
The exception model in effect, resolved once per function.
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.
LLVM_ABI 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.
LLVM_ABI 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
LLVM_ABI 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.
LLVM_ABI Register getCatchPadExceptionPointerVReg(const Value *CPI, const TargetRegisterClass *RC)
DenseMap< const Value *, Register > CatchPadExceptionPointers
Track virtual registers created for exception pointers.
Machine Value Type.
MachineInstrBundleIterator< MachineInstr > iterator
Representation of each machine instruction.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Wrapper class representing virtual and physical registers.
Definition Register.h:20
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
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:46
LLVM Value Representation.
Definition Value.h:75
This is an optimization pass for GlobalISel generic memory operations.
GenericUniformityInfo< SSAContext > UniformityInfo
GenericSSAContext< Function > SSAContext
@ Known
Known to have no common set bits.
constexpr unsigned BitWidth
ExceptionHandling
Definition CodeGen.h:54
@ Default
Not specified; resolve to the target's default model.
Definition CodeGen.h:55
MCRegisterClass TargetRegisterClass
Definition FastISel.h:58
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