LLVM 23.0.0git
LegalizerHelper.h
Go to the documentation of this file.
1//== llvm/CodeGen/GlobalISel/LegalizerHelper.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//
9/// \file A pass to convert the target-illegal operations created by IR -> MIR
10/// translation into ones the target expects to be able to select. This may
11/// occur in multiple phases, for example G_ADD <2 x i8> -> G_ADD <2 x i16> ->
12/// G_ADD <4 x i16>.
13///
14/// The LegalizerHelper class is where most of the work happens, and is
15/// designed to be callable from other passes that find themselves with an
16/// illegal instruction.
17//
18//===----------------------------------------------------------------------===//
19
20#ifndef LLVM_CODEGEN_GLOBALISEL_LEGALIZERHELPER_H
21#define LLVM_CODEGEN_GLOBALISEL_LEGALIZERHELPER_H
22
29
30namespace llvm {
31// Forward declarations.
32class APInt;
33class GAnyLoad;
34class GLoadStore;
35class GStore;
37class MachineFunction;
39class MachineInstr;
42template <typename T> class SmallVectorImpl;
43class LegalizerInfo;
47class TargetLowering;
48
50public:
51 /// Expose MIRBuilder so clients can set their own RecordInsertInstruction
52 /// functions
54
55 /// To keep track of changes made by the LegalizerHelper.
57
58private:
60 const LegalizerInfo &LI;
61 const TargetLowering &TLI;
62
63 const LibcallLoweringInfo *Libcalls = nullptr;
64 GISelValueTracking *VT = nullptr;
65
66public:
68 /// Instruction was already legal and no change was made to the
69 /// MachineFunction.
71
72 /// Instruction has been legalized and the MachineFunction changed.
74
75 /// Some kind of error has occurred and we could not legalize this
76 /// instruction.
78 };
79
80 /// Expose LegalizerInfo so the clients can re-use.
81 const LegalizerInfo &getLegalizerInfo() const { return LI; }
82 const TargetLowering &getTargetLowering() const { return TLI; }
83 const LibcallLoweringInfo *getLibcallLoweringInfo() { return Libcalls; }
84 GISelValueTracking *getValueTracking() const { return VT; }
85
86 // FIXME: Should probably make Libcalls mandatory
89 const LibcallLoweringInfo *Libcalls = nullptr);
92 const LibcallLoweringInfo *Libcalls = nullptr,
93 GISelValueTracking *VT = nullptr);
94
95 /// Replace \p MI by a sequence of legal instructions that can implement the
96 /// same operation. Note that this means \p MI may be deleted, so any iterator
97 /// steps should be performed before calling this function. \p Helper should
98 /// be initialized to the MachineFunction containing \p MI.
99 ///
100 /// Considered as an opaque blob, the legal code will use and define the same
101 /// registers as \p MI.
103 LostDebugLocObserver &LocObserver);
104
105 /// Legalize an instruction by emiting a runtime library call instead.
107 LostDebugLocObserver &LocObserver);
108
109 /// Legalize an instruction by reducing the width of the underlying scalar
110 /// type.
112 LLT NarrowTy);
113
114 /// Legalize an instruction by performing the operation on a wider scalar type
115 /// (for example a 16-bit addition can be safely performed at 32-bits
116 /// precision, ignoring the unused bits).
118 LLT WideTy);
119
120 /// Legalize an instruction by replacing the value type
121 LLVM_ABI LegalizeResult bitcast(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
122
123 /// Legalize an instruction by splitting it into simpler parts, hopefully
124 /// understood by the target.
125 LLVM_ABI LegalizeResult lower(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
126
127 /// Legalize a vector instruction by splitting into multiple components, each
128 /// acting on the same scalar type as the original but with fewer elements.
130 unsigned TypeIdx, LLT NarrowTy);
131
132 /// Legalize a vector instruction by increasing the number of vector elements
133 /// involved and ignoring the added elements later.
135 LLT MoreTy);
136
137 /// Cast the given value to an LLT::scalar with an equivalent size. Returns
138 /// the register to use if an instruction was inserted. Returns the original
139 /// register if no coercion was necessary.
140 //
141 // This may also fail and return Register() if there is no legal way to cast.
143
144 /// Legalize a single operand \p OpIdx of the machine instruction \p MI as a
145 /// Use by extending the operand's type to \p WideTy using the specified \p
146 /// ExtOpcode for the extension instruction, and replacing the vreg of the
147 /// operand in place.
148 LLVM_ABI void widenScalarSrc(MachineInstr &MI, LLT WideTy, unsigned OpIdx,
149 unsigned ExtOpcode);
150
151 /// Legalize a single operand \p OpIdx of the machine instruction \p MI as a
152 /// Use by truncating the operand's type to \p NarrowTy using G_TRUNC, and
153 /// replacing the vreg of the operand in place.
154 LLVM_ABI void narrowScalarSrc(MachineInstr &MI, LLT NarrowTy, unsigned OpIdx);
155
156 /// Legalize a single operand \p OpIdx of the machine instruction \p MI as a
157 /// Def by extending the operand's type to \p WideTy and truncating it back
158 /// with the \p TruncOpcode, and replacing the vreg of the operand in place.
159 LLVM_ABI void widenScalarDst(MachineInstr &MI, LLT WideTy, unsigned OpIdx = 0,
160 unsigned TruncOpcode = TargetOpcode::G_TRUNC);
161
162 // Legalize a single operand \p OpIdx of the machine instruction \p MI as a
163 // Def by truncating the operand's type to \p NarrowTy, replacing in place and
164 // extending back with \p ExtOpcode.
165 LLVM_ABI void narrowScalarDst(MachineInstr &MI, LLT NarrowTy, unsigned OpIdx,
166 unsigned ExtOpcode);
167 /// Legalize a single operand \p OpIdx of the machine instruction \p MI as a
168 /// Def by performing it with additional vector elements and extracting the
169 /// result elements, and replacing the vreg of the operand in place.
171 unsigned OpIdx);
172
173 /// Legalize a single operand \p OpIdx of the machine instruction \p MI as a
174 /// Use by producing a vector with undefined high elements, extracting the
175 /// original vector type, and replacing the vreg of the operand in place.
177 unsigned OpIdx);
178
179 /// Legalize a single operand \p OpIdx of the machine instruction \p MI as a
180 /// use by inserting a G_BITCAST to \p CastTy
181 LLVM_ABI void bitcastSrc(MachineInstr &MI, LLT CastTy, unsigned OpIdx);
182
183 /// Legalize a single operand \p OpIdx of the machine instruction \p MI as a
184 /// def by inserting a G_BITCAST from \p CastTy
185 LLVM_ABI void bitcastDst(MachineInstr &MI, LLT CastTy, unsigned OpIdx);
186
187 // Useful for libcalls where all operands have the same type.
190 Type *OpType, LostDebugLocObserver &LocObserver) const;
191
192 /// Helper function that creates a libcall to the given \p Name using the
193 /// given calling convention \p CC.
194 LLVM_ABI LegalizeResult createLibcall(const char *Name,
195 const CallLowering::ArgInfo &Result,
198 LostDebugLocObserver &LocObserver,
199 MachineInstr *MI = nullptr) const;
200
201 /// Helper function that creates the given libcall.
202 LLVM_ABI LegalizeResult createLibcall(RTLIB::Libcall Libcall,
203 const CallLowering::ArgInfo &Result,
205 LostDebugLocObserver &LocObserver,
206 MachineInstr *MI = nullptr) const;
207
209 Type *FromType,
210 LostDebugLocObserver &LocObserver,
211 bool IsSigned = false) const;
212
213 /// Create a libcall to memcpy et al.
216 LostDebugLocObserver &LocObserver) const;
217
218private:
220 widenScalarMergeValues(MachineInstr &MI, unsigned TypeIdx, LLT WideTy);
222 widenScalarUnmergeValues(MachineInstr &MI, unsigned TypeIdx, LLT WideTy);
224 widenScalarExtract(MachineInstr &MI, unsigned TypeIdx, LLT WideTy);
226 widenScalarInsert(MachineInstr &MI, unsigned TypeIdx, LLT WideTy);
227 LegalizeResult widenScalarAddSubOverflow(MachineInstr &MI, unsigned TypeIdx,
228 LLT WideTy);
229 LegalizeResult widenScalarAddSubShlSat(MachineInstr &MI, unsigned TypeIdx,
230 LLT WideTy);
231 LegalizeResult widenScalarMulo(MachineInstr &MI, unsigned TypeIdx,
232 LLT WideTy);
233
234 /// Helper function to build a wide generic register \p DstReg of type \p
235 /// RegTy from smaller parts. This will produce a G_MERGE_VALUES,
236 /// G_BUILD_VECTOR, G_CONCAT_VECTORS, or sequence of G_INSERT as appropriate
237 /// for the types.
238 ///
239 /// \p PartRegs must be registers of type \p PartTy.
240 ///
241 /// If \p ResultTy does not evenly break into \p PartTy sized pieces, the
242 /// remainder must be specified with \p LeftoverRegs of type \p LeftoverTy.
243 void insertParts(Register DstReg, LLT ResultTy,
244 LLT PartTy, ArrayRef<Register> PartRegs,
245 LLT LeftoverTy = LLT(), ArrayRef<Register> LeftoverRegs = {});
246
247 /// Merge \p PartRegs with different types into \p DstReg.
248 void mergeMixedSubvectors(Register DstReg, ArrayRef<Register> PartRegs);
249
250 void appendVectorElts(SmallVectorImpl<Register> &Elts, Register Reg);
251
252 /// Unmerge \p SrcReg into smaller sized values, and append them to \p
253 /// Parts. The elements of \p Parts will be the greatest common divisor type
254 /// of \p DstTy, \p NarrowTy and the type of \p SrcReg. This will compute and
255 /// return the GCD type.
256 LLT extractGCDType(SmallVectorImpl<Register> &Parts, LLT DstTy,
257 LLT NarrowTy, Register SrcReg);
258
259 /// Unmerge \p SrcReg into \p GCDTy typed registers. This will append all of
260 /// the unpacked registers to \p Parts. This version is if the common unmerge
261 /// type is already known.
262 void extractGCDType(SmallVectorImpl<Register> &Parts, LLT GCDTy,
263 Register SrcReg);
264
265 /// Produce a merge of values in \p VRegs to define \p DstReg. Perform a merge
266 /// from the least common multiple type, and convert as appropriate to \p
267 /// DstReg.
268 ///
269 /// \p VRegs should each have type \p GCDTy. This type should be greatest
270 /// common divisor type of \p DstReg, \p NarrowTy, and an undetermined source
271 /// type.
272 ///
273 /// \p NarrowTy is the desired result merge source type. If the source value
274 /// needs to be widened to evenly cover \p DstReg, inserts high bits
275 /// corresponding to the extension opcode \p PadStrategy.
276 ///
277 /// \p VRegs will be cleared, and the result \p NarrowTy register pieces
278 /// will replace it. Returns The complete LCMTy that \p VRegs will cover when
279 /// merged.
280 LLT buildLCMMergePieces(LLT DstTy, LLT NarrowTy, LLT GCDTy,
281 SmallVectorImpl<Register> &VRegs,
282 unsigned PadStrategy = TargetOpcode::G_ANYEXT);
283
284 /// Merge the values in \p RemergeRegs to an \p LCMTy typed value. Extract the
285 /// low bits into \p DstReg. This is intended to use the outputs from
286 /// buildLCMMergePieces after processing.
287 void buildWidenedRemergeToDst(Register DstReg, LLT LCMTy,
288 ArrayRef<Register> RemergeRegs);
289
290 /// Perform generic multiplication of values held in multiple registers.
291 /// Generated instructions use only types NarrowTy and i1.
292 /// Destination can be same or two times size of the source.
293 void multiplyRegisters(SmallVectorImpl<Register> &DstRegs,
294 ArrayRef<Register> Src1Regs,
295 ArrayRef<Register> Src2Regs, LLT NarrowTy);
296
297 void changeOpcode(MachineInstr &MI, unsigned NewOpcode);
298
299 LegalizeResult tryNarrowPow2Reduction(MachineInstr &MI, Register SrcReg,
300 LLT SrcTy, LLT NarrowTy,
301 unsigned ScalarOpc);
302
303 // Memcpy family legalization helpers.
304 LegalizeResult lowerMemset(MachineInstr &MI, Register Dst, Register Val,
305 uint64_t KnownLen, Align Alignment,
306 bool IsVolatile);
307 LegalizeResult lowerMemcpyInline(MachineInstr &MI, Register Dst, Register Src,
308 uint64_t KnownLen, Align DstAlign,
309 Align SrcAlign, bool IsVolatile);
310 LegalizeResult lowerMemcpy(MachineInstr &MI, Register Dst, Register Src,
311 uint64_t KnownLen, uint64_t Limit, Align DstAlign,
312 Align SrcAlign, bool IsVolatile);
313 LegalizeResult lowerMemmove(MachineInstr &MI, Register Dst, Register Src,
314 uint64_t KnownLen, Align DstAlign, Align SrcAlign,
315 bool IsVolatile);
316
317 // Implements floating-point environment read/write via library function call.
318 LegalizeResult createGetStateLibcall(MachineInstr &MI,
319 LostDebugLocObserver &LocObserver);
320 LegalizeResult createSetStateLibcall(MachineInstr &MI,
321 LostDebugLocObserver &LocObserver);
322 LegalizeResult createResetStateLibcall(MachineInstr &MI,
323 LostDebugLocObserver &LocObserver);
324 LegalizeResult createFCMPLibcall(MachineInstr &MI,
325 LostDebugLocObserver &LocObserver);
326
327 MachineInstrBuilder
328 getNeutralElementForVecReduce(unsigned Opcode, MachineIRBuilder &MIRBuilder,
329 LLT Ty);
330
331 LegalizeResult emitSincosLibcall(MachineInstr &MI,
332 MachineIRBuilder &MIRBuilder, unsigned Size,
333 Type *OpType,
334 LostDebugLocObserver &LocObserver);
335
336 LegalizeResult emitModfLibcall(MachineInstr &MI, MachineIRBuilder &MIRBuilder,
337 unsigned Size, Type *OpType,
338 LostDebugLocObserver &LocObserver);
339
340public:
341 /// Return the alignment to use for a stack temporary object with the given
342 /// type.
344 Align MinAlign = Align()) const;
345
346 /// Create a stack temporary based on the size in bytes and the alignment
347 LLVM_ABI MachineInstrBuilder createStackTemporary(
348 TypeSize Bytes, Align Alignment, MachinePointerInfo &PtrInfo);
349
350 /// Create a store of \p Val to a stack temporary and return a load as the
351 /// same type as \p Res.
352 LLVM_ABI MachineInstrBuilder createStackStoreLoad(const DstOp &Res,
353 const SrcOp &Val);
354
355 /// Given a store of a boolean vector, scalarize it.
357
358 /// Get a pointer to vector element \p Index located in memory for a vector of
359 /// type \p VecTy starting at a base address of \p VecPtr. If \p Index is out
360 /// of bounds the returned pointer is unspecified, but will be within the
361 /// vector bounds.
363 Register Index);
364
365 /// Handles most opcodes. Split \p MI into same instruction on sub-vectors or
366 /// scalars with \p NumElts elements (1 for scalar). Supports uneven splits:
367 /// there can be leftover sub-vector with fewer then \p NumElts or a leftover
368 /// scalar. To avoid this use moreElements first and set MI number of elements
369 /// to multiple of \p NumElts. Non-vector operands that should be used on all
370 /// sub-instructions without split are listed in \p NonVecOpIndices.
372 GenericMachineInstr &MI, unsigned NumElts,
373 std::initializer_list<unsigned> NonVecOpIndices = {});
374
376 unsigned NumElts);
377
379 unsigned TypeIdx, LLT MoreTy);
381 unsigned TypeIdx,
382 LLT MoreTy);
383
385 unsigned TypeIdx,
386 LLT NarrowTy);
388 unsigned TypeIdx,
389 LLT NarrowTy);
391 MachineInstr &MI, unsigned TypeIdx, LLT NarrowTy);
392
393 /// Equalize source and destination vector sizes of G_SHUFFLE_VECTOR.
395
396 LLVM_ABI LegalizeResult reduceLoadStoreWidth(GLoadStore &MI, unsigned TypeIdx,
397 LLT NarrowTy);
398
400 const APInt &Amt,
401 LLT HalfTy,
402 LLT ShiftAmtTy);
403
404 /// Multi-way shift legalization: directly split wide shifts into target-sized
405 /// parts in a single step, avoiding recursive binary splitting.
407 LLT TargetTy);
408
409 /// Optimized path for constant shift amounts using static indexing.
410 /// Directly calculates which source parts contribute to each output part
411 /// without generating runtime select chains.
413 const APInt &Amt,
414 LLT TargetTy,
415 LLT ShiftAmtTy);
416
417 struct ShiftParams {
418 Register WordShift; // Number of complete words to shift
419 Register BitShift; // Number of bits to shift within words
420 Register InvBitShift; // Complement bit shift (TargetBits - BitShift)
421 Register Zero; // Zero constant for SHL/LSHR fill
422 Register SignBit; // Sign extension value for ASHR fill
423 };
424
425 /// Generates a single output part for constant shifts using direct indexing.
426 /// Calculates which source parts contribute and how they're combined.
427 LLVM_ABI Register buildConstantShiftPart(unsigned Opcode, unsigned PartIdx,
428 unsigned NumParts,
429 ArrayRef<Register> SrcParts,
430 const ShiftParams &Params,
431 LLT TargetTy, LLT ShiftAmtTy);
432
433 /// Generates a shift part with carry for variable shifts.
434 /// Combines main operand shifted by BitShift with carry bits from adjacent
435 /// operand.
437 Register MainOperand,
438 Register ShiftAmt, LLT TargetTy,
439 Register CarryOperand = Register());
440
442 unsigned TypeIdx,
443 LLT NarrowTy);
445 unsigned TypeIdx,
446 LLT NarrowTy);
447
448 // Fewer Elements for bitcast, ensuring that the size of the Src and Dst
449 // registers will be the same
451 unsigned TypeIdx, LLT NarrowTy);
452
454 unsigned TypeIdx,
455 LLT NarrowTy);
456
458 LLT Ty);
460 LLT NarrowTy);
463 LLT Ty);
465 unsigned TypeIdx, LLT Ty);
467 LLT Ty);
468
470 LLT Ty);
472 LLT Ty);
474 LLT Ty);
476 LLT Ty);
478 LLT Ty);
480 LLT Ty);
482 LLT Ty);
484 LLT Ty);
485
486 /// Perform Bitcast legalize action on G_EXTRACT_VECTOR_ELT.
488 unsigned TypeIdx, LLT CastTy);
489
490 /// Perform Bitcast legalize action on G_INSERT_VECTOR_ELT.
492 unsigned TypeIdx, LLT CastTy);
494 unsigned TypeIdx, LLT CastTy);
496 unsigned TypeIdx, LLT CastTy);
498 unsigned TypeIdx, LLT CastTy);
500 unsigned TypeIdx, LLT CastTy);
501
515
524
528
530
545 Register AllocSize,
546 Align Alignment, LLT PtrTy);
571 LLVM_ABI LegalizeResult lowerMemcpyInline(MachineInstr &MI);
573 unsigned MaxLen = 0);
575};
576
577} // End namespace llvm.
578
579#endif
unsigned const MachineRegisterInfo * MRI
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file describes how to lower LLVM calls to machine code calls.
#define LLVM_ABI
Definition Compiler.h:213
Provides analysis for querying information about KnownBits during GISel passes.
IRTranslator LLVM IR MI
This file declares the MachineIRBuilder class.
Register Reg
Promote Memory to Register
Definition Mem2Reg.cpp:110
MachineInstr unsigned OpIdx
static constexpr MCPhysReg SPReg
Class for arbitrary precision integers.
Definition APInt.h:78
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
Represents any generic load, including sign/zero extending variants.
Abstract class that contains various methods for clients to notify about changes.
Represents any type of generic load or store.
Represents a G_STORE.
A base class for all GenericMachineInstrs.
LLVM_ABI LegalizeResult lowerShlSat(MachineInstr &MI)
LLVM_ABI LegalizeResult narrowScalarCTPOP(MachineInstr &MI, unsigned TypeIdx, LLT Ty)
LLVM_ABI LegalizeResult lowerThreewayCompare(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerFPTRUNC_F64_TO_F16(MachineInstr &MI)
LLVM_ABI LegalizeResult equalizeVectorShuffleLengths(MachineInstr &MI)
Equalize source and destination vector sizes of G_SHUFFLE_VECTOR.
LLVM_ABI LegalizeResult bitcastInsertVectorElt(MachineInstr &MI, unsigned TypeIdx, LLT CastTy)
Perform Bitcast legalize action on G_INSERT_VECTOR_ELT.
LLVM_ABI LegalizeResult lowerSITOFP(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerDynStackAlloc(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerBitCount(MachineInstr &MI)
LLVM_ABI LegalizeResult narrowScalarMul(MachineInstr &MI, LLT Ty)
LLVM_ABI LegalizeResult lowerFMinNumMaxNum(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerU64ToF64BitFloatOps(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerSSUBE(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerIntrinsicRound(MachineInstr &MI)
LLVM_ABI void widenScalarSrc(MachineInstr &MI, LLT WideTy, unsigned OpIdx, unsigned ExtOpcode)
Legalize a single operand OpIdx of the machine instruction MI as a Use by extending the operand's typ...
LLVM_ABI LegalizeResult moreElementsVectorShuffle(MachineInstr &MI, unsigned TypeIdx, LLT MoreTy)
LLVM_ABI LegalizeResult lowerSMULH_UMULH(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerLoad(GAnyLoad &MI)
LLVM_ABI LegalizeResult fewerElementsVectorShuffle(MachineInstr &MI, unsigned TypeIdx, LLT NarrowTy)
LLVM_ABI LegalizeResult lowerAbsToAddXor(MachineInstr &MI)
LLVM_ABI void moreElementsVectorDst(MachineInstr &MI, LLT MoreTy, unsigned OpIdx)
Legalize a single operand OpIdx of the machine instruction MI as a Def by performing it with addition...
LLVM_ABI LegalizeResult lowerFConstant(MachineInstr &MI)
LLVM_ABI LegalizeResult narrowScalarCTTZ(MachineInstr &MI, unsigned TypeIdx, LLT Ty)
LLVM_ABI LegalizeResult lowerBitreverse(MachineInstr &MI)
LLVM_ABI LegalizeResult narrowScalarShift(MachineInstr &MI, unsigned TypeIdx, LLT Ty)
LLVM_ABI LegalizeResult lowerExtractInsertVectorElt(MachineInstr &MI)
Lower a vector extract or insert by writing the vector to a stack temporary and reloading the element...
LLVM_ABI LegalizeResult moreElementsVector(MachineInstr &MI, unsigned TypeIdx, LLT MoreTy)
Legalize a vector instruction by increasing the number of vector elements involved and ignoring the a...
LLVM_ABI LegalizeResult lowerFunnelShiftWithInverse(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerAbsToMaxNeg(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerFPTOINT_SAT(MachineInstr &MI)
LLVM_ABI LegalizeResult narrowScalarCTLS(MachineInstr &MI, unsigned TypeIdx, LLT Ty)
LLVM_ABI LegalizeResult lowerEXT(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerStore(GStore &MI)
LLVM_ABI LegalizeResult lowerAbsToCNeg(MachineInstr &MI)
LLVM_ABI LegalizeResult bitcastExtractSubvector(MachineInstr &MI, unsigned TypeIdx, LLT CastTy)
This attempts to bitcast G_EXTRACT_SUBVECTOR to CastTy.
LLVM_ABI LegalizeResult narrowScalarShiftMultiway(MachineInstr &MI, LLT TargetTy)
Multi-way shift legalization: directly split wide shifts into target-sized parts in a single step,...
LLVM_ABI LegalizeResult lowerSADDO_SSUBO(MachineInstr &MI)
LLVM_ABI MachineInstrBuilder createStackTemporary(TypeSize Bytes, Align Alignment, MachinePointerInfo &PtrInfo)
Create a stack temporary based on the size in bytes and the alignment.
LLVM_ABI Register buildConstantShiftPart(unsigned Opcode, unsigned PartIdx, unsigned NumParts, ArrayRef< Register > SrcParts, const ShiftParams &Params, LLT TargetTy, LLT ShiftAmtTy)
Generates a single output part for constant shifts using direct indexing.
LLVM_ABI void narrowScalarSrc(MachineInstr &MI, LLT NarrowTy, unsigned OpIdx)
Legalize a single operand OpIdx of the machine instruction MI as a Use by truncating the operand's ty...
LLVM_ABI LegalizeResult fewerElementsVectorPhi(GenericMachineInstr &MI, unsigned NumElts)
LLVM_ABI LegalizeResult lowerFPTOUI(MachineInstr &MI)
const TargetLowering & getTargetLowering() const
LLVM_ABI LegalizeResult narrowScalar(MachineInstr &MI, unsigned TypeIdx, LLT NarrowTy)
Legalize an instruction by reducing the width of the underlying scalar type.
LLVM_ABI LegalizeResult narrowScalarFPTOI(MachineInstr &MI, unsigned TypeIdx, LLT Ty)
LLVM_ABI LegalizeResult bitcastInsertSubvector(MachineInstr &MI, unsigned TypeIdx, LLT CastTy)
This attempts to bitcast G_INSERT_SUBVECTOR to CastTy.
LLVM_ABI LegalizerHelper(MachineFunction &MF, GISelChangeObserver &Observer, MachineIRBuilder &B, const LibcallLoweringInfo *Libcalls=nullptr)
LLVM_ABI LegalizeResult lowerUnmergeValues(MachineInstr &MI)
LLVM_ABI LegalizeResult bitcast(MachineInstr &MI, unsigned TypeIdx, LLT Ty)
Legalize an instruction by replacing the value type.
LLVM_ABI LegalizeResult scalarizeVectorBooleanStore(GStore &MI)
Given a store of a boolean vector, scalarize it.
LLVM_ABI LegalizeResult lowerBitcast(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerMinMax(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerFunnelShiftAsShifts(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerInsert(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerReadWriteRegister(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerExtract(MachineInstr &MI)
LLVM_ABI LegalizeResult fewerElementsBitcast(MachineInstr &MI, unsigned TypeIdx, LLT NarrowTy)
LLVM_ABI LegalizeResult narrowScalarShiftByConstant(MachineInstr &MI, const APInt &Amt, LLT HalfTy, LLT ShiftAmtTy)
LLVM_ABI LegalizeResult lowerISFPCLASS(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerAbsDiffToSelect(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerAddSubSatToMinMax(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerFPOWI(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerFAbs(MachineInstr &MI)
LLVM_ABI LegalizeResult narrowScalarBasic(MachineInstr &MI, unsigned TypeIdx, LLT Ty)
GISelValueTracking * getValueTracking() const
LLVM_ABI LegalizeResult lowerVectorReduction(MachineInstr &MI)
const LegalizerInfo & getLegalizerInfo() const
Expose LegalizerInfo so the clients can re-use.
LLVM_ABI LegalizeResult reduceLoadStoreWidth(GLoadStore &MI, unsigned TypeIdx, LLT NarrowTy)
LLVM_ABI LegalizeResult fewerElementsVectorMultiEltType(GenericMachineInstr &MI, unsigned NumElts, std::initializer_list< unsigned > NonVecOpIndices={})
Handles most opcodes.
LLVM_ABI LegalizeResult narrowScalarSelect(MachineInstr &MI, unsigned TypeIdx, LLT Ty)
LLVM_ABI LegalizeResult narrowScalarShiftByConstantMultiway(MachineInstr &MI, const APInt &Amt, LLT TargetTy, LLT ShiftAmtTy)
Optimized path for constant shift amounts using static indexing.
LLVM_ABI MachineInstrBuilder createStackStoreLoad(const DstOp &Res, const SrcOp &Val)
Create a store of Val to a stack temporary and return a load as the same type as Res.
LLVM_ABI LegalizeResult lowerVAArg(MachineInstr &MI)
@ Legalized
Instruction has been legalized and the MachineFunction changed.
@ AlreadyLegal
Instruction was already legal and no change was made to the MachineFunction.
@ UnableToLegalize
Some kind of error has occurred and we could not legalize this instruction.
LLVM_ABI LegalizeResult moreElementsVectorPhi(MachineInstr &MI, unsigned TypeIdx, LLT MoreTy)
LLVM_ABI LegalizeResult lowerU64ToF32BitOps(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerFCopySign(MachineInstr &MI)
LLVM_ABI LegalizeResult bitcastConcatVector(MachineInstr &MI, unsigned TypeIdx, LLT CastTy)
LLVM_ABI LegalizeResult lowerRotateWithReverseRotate(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerSADDE(MachineInstr &MI)
LLVM_ABI LegalizeResult lower(MachineInstr &MI, unsigned TypeIdx, LLT Ty)
Legalize an instruction by splitting it into simpler parts, hopefully understood by the target.
LLVM_ABI LegalizeResult lowerFunnelShift(MachineInstr &MI)
LLVM_ABI LegalizeResult fewerElementsVector(MachineInstr &MI, unsigned TypeIdx, LLT NarrowTy)
Legalize a vector instruction by splitting into multiple components, each acting on the same scalar t...
GISelChangeObserver & Observer
To keep track of changes made by the LegalizerHelper.
LLVM_ABI LegalizeResult conversionLibcall(MachineInstr &MI, Type *ToType, Type *FromType, LostDebugLocObserver &LocObserver, bool IsSigned=false) const
LLVM_ABI void bitcastDst(MachineInstr &MI, LLT CastTy, unsigned OpIdx)
Legalize a single operand OpIdx of the machine instruction MI as a def by inserting a G_BITCAST from ...
LLVM_ABI LegalizeResult lowerFPTRUNC(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerFMad(MachineInstr &MI)
LLVM_ABI LegalizeResult widenScalar(MachineInstr &MI, unsigned TypeIdx, LLT WideTy)
Legalize an instruction by performing the operation on a wider scalar type (for example a 16-bit addi...
LLVM_ABI LegalizeResult lowerAddSubSatToAddoSubo(MachineInstr &MI)
LLVM_ABI LegalizeResult narrowScalarExtract(MachineInstr &MI, unsigned TypeIdx, LLT Ty)
LLVM_ABI LegalizeResult lowerFFloor(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerAbsDiffToMinMax(MachineInstr &MI)
LLVM_ABI LegalizeResult narrowScalarExt(MachineInstr &MI, unsigned TypeIdx, LLT Ty)
LLVM_ABI LegalizeResult fewerElementsVectorSeqReductions(MachineInstr &MI, unsigned TypeIdx, LLT NarrowTy)
LLVM_ABI Register getDynStackAllocTargetPtr(Register SPReg, Register AllocSize, Align Alignment, LLT PtrTy)
LLVM_ABI LegalizeResult lowerFPTOSI(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerUITOFP(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerShuffleVector(MachineInstr &MI)
LLVM_ABI LegalizeResult fewerElementsVectorMerge(MachineInstr &MI, unsigned TypeIdx, LLT NarrowTy)
LLVM_ABI LegalizeResult lowerMergeValues(MachineInstr &MI)
LLVM_ABI LegalizeResult fewerElementsVectorUnmergeValues(MachineInstr &MI, unsigned TypeIdx, LLT NarrowTy)
LLVM_ABI LegalizeResult createMemLibcall(MachineRegisterInfo &MRI, MachineInstr &MI, LostDebugLocObserver &LocObserver) const
Create a libcall to memcpy et al.
LLVM_ABI LegalizeResult lowerVECTOR_COMPRESS(MachineInstr &MI)
const LibcallLoweringInfo * getLibcallLoweringInfo()
LLVM_ABI void moreElementsVectorSrc(MachineInstr &MI, LLT MoreTy, unsigned OpIdx)
Legalize a single operand OpIdx of the machine instruction MI as a Use by producing a vector with und...
LLVM_ABI LegalizeResult bitcastExtractVectorElt(MachineInstr &MI, unsigned TypeIdx, LLT CastTy)
Perform Bitcast legalize action on G_EXTRACT_VECTOR_ELT.
LLVM_ABI LegalizeResult lowerRotate(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerU64ToF32WithSITOFP(MachineInstr &MI)
LLVM_ABI LegalizeResult createLibcall(const char *Name, const CallLowering::ArgInfo &Result, ArrayRef< CallLowering::ArgInfo > Args, CallingConv::ID CC, LostDebugLocObserver &LocObserver, MachineInstr *MI=nullptr) const
Helper function that creates a libcall to the given Name using the given calling convention CC.
LLVM_ABI LegalizeResult lowerMemCpyFamily(MachineInstr &MI, unsigned MaxLen=0)
LLVM_ABI Register coerceToScalar(Register Val)
Cast the given value to an LLT::scalar with an equivalent size.
LLVM_ABI LegalizeResult bitcastShuffleVector(MachineInstr &MI, unsigned TypeIdx, LLT CastTy)
LLVM_ABI LegalizeResult lowerDIVREM(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerSelect(MachineInstr &MI)
LLVM_ABI LegalizeResult narrowScalarInsert(MachineInstr &MI, unsigned TypeIdx, LLT Ty)
LLVM_ABI LegalizeResult narrowScalarFLDEXP(MachineInstr &MI, unsigned TypeIdx, LLT Ty)
LLVM_ABI Register buildVariableShiftPart(unsigned Opcode, Register MainOperand, Register ShiftAmt, LLT TargetTy, Register CarryOperand=Register())
Generates a shift part with carry for variable shifts.
LLVM_ABI void bitcastSrc(MachineInstr &MI, LLT CastTy, unsigned OpIdx)
Legalize a single operand OpIdx of the machine instruction MI as a use by inserting a G_BITCAST to Ca...
LLVM_ABI void narrowScalarDst(MachineInstr &MI, LLT NarrowTy, unsigned OpIdx, unsigned ExtOpcode)
LLVM_ABI LegalizeResult lowerStackRestore(MachineInstr &MI)
LLVM_ABI LegalizeResult fewerElementsVectorReductions(MachineInstr &MI, unsigned TypeIdx, LLT NarrowTy)
LLVM_ABI LegalizeResult lowerStackSave(MachineInstr &MI)
LLVM_ABI LegalizeResult fewerElementsVectorExtractInsertVectorElt(MachineInstr &MI, unsigned TypeIdx, LLT NarrowTy)
LLVM_ABI LegalizeResult narrowScalarCTLZ(MachineInstr &MI, unsigned TypeIdx, LLT Ty)
MachineIRBuilder & MIRBuilder
Expose MIRBuilder so clients can set their own RecordInsertInstruction functions.
LLVM_ABI LegalizeResult lowerTRUNC(MachineInstr &MI)
LLVM_ABI LegalizeResult lowerBswap(MachineInstr &MI)
LLVM_ABI Register getVectorElementPointer(Register VecPtr, LLT VecTy, Register Index)
Get a pointer to vector element Index located in memory for a vector of type VecTy starting at a base...
LLVM_ABI LegalizeResult narrowScalarAddSub(MachineInstr &MI, unsigned TypeIdx, LLT NarrowTy)
LLVM_ABI Align getStackTemporaryAlignment(LLT Type, Align MinAlign=Align()) const
Return the alignment to use for a stack temporary object with the given type.
LLVM_ABI LegalizeResult lowerConstant(MachineInstr &MI)
LLVM_ABI void widenScalarDst(MachineInstr &MI, LLT WideTy, unsigned OpIdx=0, unsigned TruncOpcode=TargetOpcode::G_TRUNC)
Legalize a single operand OpIdx of the machine instruction MI as a Def by extending the operand's typ...
LLVM_ABI LegalizeResult simpleLibcall(MachineInstr &MI, MachineIRBuilder &MIRBuilder, unsigned Size, Type *OpType, LostDebugLocObserver &LocObserver) const
LLVM_ABI LegalizeResult legalizeInstrStep(MachineInstr &MI, LostDebugLocObserver &LocObserver)
Replace MI by a sequence of legal instructions that can implement the same operation.
LLVM_ABI LegalizeResult lowerFMinimumMaximum(MachineInstr &MI)
Tracks which library functions to use for a particular subtarget.
Helper class to build MachineInstr.
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 class consists of common code factored out of the SmallVector class to reduce code duplication b...
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
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
constexpr T MinAlign(U A, V B)
A and B are either alignments or offsets.
Definition MathExtras.h:357
ArrayRef(const T &OneElt) -> ArrayRef< T >
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
This class contains a discriminated union of information about pointers in memory operands,...