LLVM 24.0.0git
TargetLowering.h
Go to the documentation of this file.
1//===- llvm/CodeGen/TargetLowering.h - Target Lowering Info -----*- 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
10/// This file describes how to lower LLVM code to machine code. This has two
11/// main components:
12///
13/// 1. Which ValueTypes are natively supported by the target.
14/// 2. Which operations are supported for supported ValueTypes.
15/// 3. Cost thresholds for alternative implementations of certain operations.
16///
17/// In addition it has a few other components, like information about FP
18/// immediates.
19///
20//===----------------------------------------------------------------------===//
21
22#ifndef LLVM_CODEGEN_TARGETLOWERING_H
23#define LLVM_CODEGEN_TARGETLOWERING_H
24
25#include "llvm/ADT/APInt.h"
26#include "llvm/ADT/ArrayRef.h"
27#include "llvm/ADT/DenseMap.h"
29#include "llvm/ADT/StringRef.h"
42#include "llvm/IR/Attributes.h"
43#include "llvm/IR/CallingConv.h"
44#include "llvm/IR/DataLayout.h"
46#include "llvm/IR/Function.h"
47#include "llvm/IR/InlineAsm.h"
48#include "llvm/IR/Instruction.h"
51#include "llvm/IR/Type.h"
58#include <algorithm>
59#include <cassert>
60#include <climits>
61#include <cstdint>
62#include <map>
63#include <string>
64#include <utility>
65#include <vector>
66
67namespace llvm {
68
69class AssumptionCache;
70class CCState;
71class CCValAssign;
74class Constant;
75enum class ExceptionHandling : int;
76class FastISel;
78class GlobalValue;
79class Loop;
81class IntrinsicInst;
82class IRBuilderBase;
83struct KnownBits;
84class LLVMContext;
86class MachineFunction;
87class MachineInstr;
89class MachineLoop;
91class MCContext;
92class MCExpr;
93class Module;
96class TargetMachine;
97class MCRegisterClass;
101class Value;
102class VPIntrinsic;
103
104namespace Sched {
105
107 None, // No preference
108 Source, // Follow source order.
109 RegPressure, // Scheduling for lowest register pressure.
110 Hybrid, // Scheduling for both latency and register pressure.
111 ILP, // Scheduling for ILP in low register pressure mode.
112 VLIW, // Scheduling for VLIW targets.
113 Fast, // Fast suboptimal list scheduling
114 Linearize, // Linearize DAG, no scheduling
115 Last = Linearize // Marker for the last Sched::Preference
116};
117
118} // end namespace Sched
119
120// MemOp models a memory operation, either memset or memcpy/memmove.
121struct MemOp {
122private:
123 enum class MemOpKind {
124 Memset,
125 MemsetWithZero, // memset the memory with zeros
126 Memcpy, // copy memory from source to destination, source and destination do
127 // not overlap
128 MemcpyStrSrc, // memcpy source is an in-register constant, so it does not
129 // need to be loaded
130 Memmove, // memmove: like memcpy, but source and destination regions may
131 // overlap
132 };
133
134 // Shared
135 uint64_t Size;
136 bool DstAlignCanChange; // true if destination alignment can satisfy any
137 // constraint.
138 Align DstAlign; // Specified alignment of the memory operation.
139
140 bool IsVolatile;
141 MemOpKind Kind;
142 Align SrcAlign; // Inferred alignment of the source or default value if the
143 // memory operation does not need to load the value.
144public:
145 static MemOp Copy(uint64_t Size, bool DstAlignCanChange, Align DstAlign,
146 Align SrcAlign, bool IsVolatile,
147 bool MemcpyStrSrc = false) {
148 MemOp Op;
149 Op.Size = Size;
150 Op.DstAlignCanChange = DstAlignCanChange;
151 Op.DstAlign = DstAlign;
152 Op.IsVolatile = IsVolatile;
153 Op.Kind = MemcpyStrSrc ? MemOpKind::MemcpyStrSrc : MemOpKind::Memcpy;
154 Op.SrcAlign = SrcAlign;
155 return Op;
156 }
157
158 static MemOp Move(uint64_t Size, bool DstAlignCanChange, Align DstAlign,
159 Align SrcAlign, bool IsVolatile) {
160 MemOp Op;
161 Op.Size = Size;
162 Op.DstAlignCanChange = DstAlignCanChange;
163 Op.DstAlign = DstAlign;
164 Op.IsVolatile = IsVolatile;
165 Op.Kind = MemOpKind::Memmove;
166 Op.SrcAlign = SrcAlign;
167 return Op;
168 }
169
170 static MemOp Set(uint64_t Size, bool DstAlignCanChange, Align DstAlign,
171 bool IsZeroMemset, bool IsVolatile) {
172 MemOp Op;
173 Op.Size = Size;
174 Op.DstAlignCanChange = DstAlignCanChange;
175 Op.DstAlign = DstAlign;
176 Op.IsVolatile = IsVolatile;
177 Op.Kind = IsZeroMemset ? MemOpKind::MemsetWithZero : MemOpKind::Memset;
178 return Op;
179 }
180
181 uint64_t size() const { return Size; }
183 assert(!DstAlignCanChange);
184 return DstAlign;
185 }
186 bool isFixedDstAlign() const { return !DstAlignCanChange; }
187 bool isVolatile() const { return IsVolatile; }
188 bool isMemset() const {
189 return Kind == MemOpKind::Memset || Kind == MemOpKind::MemsetWithZero;
190 }
191 bool isMemcpy() const {
192 return Kind == MemOpKind::Memcpy || Kind == MemOpKind::MemcpyStrSrc;
193 }
194 bool isMemmove() const { return Kind == MemOpKind::Memmove; }
195 bool isMemcpyOrMemmove() const { return isMemcpy() || isMemmove(); }
197 return isMemcpyOrMemmove() && !DstAlignCanChange;
198 }
199 bool isZeroMemset() const { return Kind == MemOpKind::MemsetWithZero; }
200 bool isMemcpyStrSrc() const { return Kind == MemOpKind::MemcpyStrSrc; }
202 assert(isMemcpyOrMemmove() && "Must be a memcpy or memmove");
203 return SrcAlign;
204 }
205 bool isSrcAligned(Align AlignCheck) const {
206 return isMemset() || llvm::isAligned(AlignCheck, SrcAlign.value());
207 }
208 bool isDstAligned(Align AlignCheck) const {
209 return DstAlignCanChange || llvm::isAligned(AlignCheck, DstAlign.value());
210 }
211 bool isAligned(Align AlignCheck) const {
212 return isSrcAligned(AlignCheck) && isDstAligned(AlignCheck);
213 }
214};
215
216/// This base class for TargetLowering contains the SelectionDAG-independent
217/// parts that can be used from the rest of CodeGen.
219public:
220 /// This enum indicates whether operations are valid for a target, and if not,
221 /// what action should be used to make them valid.
223 Legal, // The target natively supports this operation.
224 Promote, // This operation should be executed in a larger type.
225 Expand, // Try to expand this to other ops, otherwise use a libcall.
226 LibCall, // Don't try to expand this to other ops, always use a libcall.
227 Custom // Use the LowerOperation hook to implement custom lowering.
228 };
229
230 /// This enum indicates whether a types are legal for a target, and if not,
231 /// what action should be used to make them valid.
233 TypeLegal, // The target natively supports this type.
234 TypePromoteInteger, // Replace this integer with a larger one.
235 TypeExpandInteger, // Split this integer into two of half the size.
236 TypeSoftenFloat, // Convert this float to a same size integer type.
237 TypeExpandFloat, // Split this float into two of half the size.
238 TypeScalarizeVector, // Replace this one-element vector with its element.
239 TypeSplitVector, // Split this vector into two of half the size.
240 TypeWidenVector, // This vector should be widened into a larger vector.
241 TypeSoftPromoteHalf, // Soften half to i16 and use float to do arithmetic.
242 TypeScalarizeScalableVector, // This action is explicitly left
243 // unimplemented. While it is theoretically
244 // possible to legalize operations on scalable
245 // types with a loop that handles the vscale *
246 // #lanes of the vector, this is non-trivial at
247 // SelectionDAG level and these types are
248 // better to be widened or promoted.
249 };
250
251 /// LegalizeKind holds the legalization kind that needs to happen to EVT
252 /// in order to type-legalize it.
253 using LegalizeKind = std::pair<LegalizeTypeAction, EVT>;
254
255 /// Enum that describes how the target represents true/false values.
257 UndefinedBooleanContent, // Only bit 0 counts, the rest can hold garbage.
258 ZeroOrOneBooleanContent, // All bits zero except for bit 0.
259 ZeroOrNegativeOneBooleanContent // All bits equal to bit 0.
260 };
261
262 /// Enum that describes what type of support for selects the target has.
264 ScalarValSelect, // The target supports scalar selects (ex: cmov).
265 ScalarCondVectorVal, // The target supports selects with a scalar condition
266 // and vector values (ex: cmov).
267 VectorMaskSelect // The target supports vector selects with a vector
268 // mask (ex: x86 blends).
269 };
270
271 /// Enum that specifies what an atomic load/AtomicRMWInst is expanded
272 /// to, if at all. Exists because different targets have different levels of
273 /// support for these atomic instructions, and also have different options
274 /// w.r.t. what they should expand to.
276 None, // Don't expand the instruction.
277 CastToInteger, // Cast the atomic instruction to another type, e.g. from
278 // floating-point to integer type.
279 LLSC, // Expand the instruction into loadlinked/storeconditional; used
280 // by ARM/AArch64/PowerPC.
281 LLOnly, // Expand the (load) instruction into just a load-linked, which has
282 // greater atomic guarantees than a normal load.
283 CmpXChg, // Expand the instruction into cmpxchg; used by at least X86.
284 MaskedIntrinsic, // Use a target-specific intrinsic for the LL/SC loop.
285 BitTestIntrinsic, // Use a target-specific intrinsic for special bit
286 // operations; used by X86.
287 CmpArithIntrinsic, // Use a target-specific intrinsic for special compare
288 // operations; used by X86.
289 Expand, // Generic expansion in terms of other atomic operations.
290 CustomExpand, // Custom target-specific expansion using TLI hooks.
291
292 // Rewrite to a non-atomic form for use in a known non-preemptible
293 // environment.
295 };
296
297 /// Enum that specifies when a multiplication should be expanded.
298 enum class MulExpansionKind {
299 Always, // Always expand the instruction.
300 OnlyLegalOrCustom, // Only expand when the resulting instructions are legal
301 // or custom.
302 };
303
304 /// Enum that specifies when a float negation is beneficial.
305 enum class NegatibleCost {
306 Cheaper = 0, // Negated expression is cheaper.
307 Neutral = 1, // Negated expression has the same cost.
308 Expensive = 2 // Negated expression is more expensive.
309 };
310
311 /// Enum that specifies how expensive lowering an EXTRACT_SUBVECTOR is.
313 Free = 0, // Lowers to no instruction at all, e.g. a subregister copy.
314 Cheap = 1, // Lowers to at most one instruction, and may still be free if
315 // the target can fold the extract into the instruction
316 // consuming it (e.g. a widening op that reads the high half of
317 // a register).
318 Expensive = 2 // Needs a shuffle sequence that cannot be folded away.
319 };
320
321 /// Enum of different potentially desirable ways to fold (and/or (setcc ...),
322 /// (setcc ...)).
324 None = 0, // No fold is preferable.
325 AddAnd = 1, // Fold with `Add` op and `And` op is preferable.
326 NotAnd = 2, // Fold with `Not` op and `And` op is preferable.
327 ABS = 4, // Fold with `llvm.abs` op is preferable.
328 };
329
331 public:
334 /// Original unlegalized argument type.
336 /// Same as OrigTy, or partially legalized for soft float libcalls.
338 bool IsSExt : 1;
339 bool IsZExt : 1;
340 bool IsNoExt : 1;
341 bool IsInReg : 1;
342 bool IsSRet : 1;
343 bool IsNest : 1;
344 bool IsByVal : 1;
345 bool IsByRef : 1;
346 bool IsInAlloca : 1;
348 bool IsReturned : 1;
349 bool IsSwiftSelf : 1;
350 bool IsSwiftAsync : 1;
351 bool IsSwiftError : 1;
353 MaybeAlign Alignment = std::nullopt;
354 Type *IndirectType = nullptr;
355
362
365
367
368 LLVM_ABI void setAttributes(const CallBase *Call, unsigned ArgIdx);
369 };
370 using ArgListTy = std::vector<ArgListEntry>;
371
373 switch (Content) {
375 // Extend by adding rubbish bits.
376 return ISD::ANY_EXTEND;
378 // Extend by adding zero bits.
379 return ISD::ZERO_EXTEND;
381 // Extend by copying the sign bit.
382 return ISD::SIGN_EXTEND;
383 }
384 llvm_unreachable("Invalid content kind");
385 }
386
387 explicit TargetLoweringBase(const TargetMachine &TM,
388 const TargetSubtargetInfo &STI);
392
393 /// Return true if the target support strict float operation
394 bool isStrictFPEnabled() const {
395 return IsStrictFPEnabled;
396 }
397
398protected:
399 /// Initialize all of the actions to default values.
400 void initActions();
401
402public:
403 const TargetMachine &getTargetMachine() const { return TM; }
404
405 virtual bool useSoftFloat() const { return false; }
406
407 /// Return the pointer type for the given address space, defaults to
408 /// the pointer type from the data layout.
409 /// FIXME: The default needs to be removed once all the code is updated.
410 virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS = 0) const {
411 return MVT::getIntegerVT(DL.getPointerSizeInBits(AS));
412 }
413
414 /// Return the in-memory pointer type for the given address space, defaults to
415 /// the pointer type from the data layout.
416 /// FIXME: The default needs to be removed once all the code is updated.
417 virtual MVT getPointerMemTy(const DataLayout &DL, uint32_t AS = 0) const {
418 return MVT::getIntegerVT(DL.getPointerSizeInBits(AS));
419 }
420
421 /// Return the type for frame index, which is determined by
422 /// the alloca address space specified through the data layout.
424 return getPointerTy(DL, DL.getAllocaAddrSpace());
425 }
426
427 /// Return the type for code pointers, which is determined by the program
428 /// address space specified through the data layout.
430 return getPointerTy(DL, DL.getProgramAddressSpace());
431 }
432
433 /// Return the type for operands of fence.
434 /// TODO: Let fence operands be of i32 type and remove this.
435 virtual MVT getFenceOperandTy(const DataLayout &DL) const {
436 return getPointerTy(DL);
437 }
438
439 /// Return the type to use for a scalar shift opcode, given the shifted amount
440 /// type. Targets should return a legal type if the input type is legal.
441 /// Targets can return a type that is too small if the input type is illegal.
442 virtual MVT getScalarShiftAmountTy(const DataLayout &, EVT) const;
443
444 /// Returns the type for the shift amount of a shift opcode. For vectors,
445 /// returns the input type. For scalars, calls getScalarShiftAmountTy.
446 /// If getScalarShiftAmountTy type cannot represent all possible shift
447 /// amounts, returns MVT::i32.
448 EVT getShiftAmountTy(EVT LHSTy, const DataLayout &DL) const;
449
450 /// Return the preferred type to use for a shift opcode, given the shifted
451 /// amount type is \p ShiftValueTy.
453 virtual LLT getPreferredShiftAmountTy(LLT ShiftValueTy) const {
454 return ShiftValueTy;
455 }
456
457 /// Returns the type to be used for the index operand vector operations. By
458 /// default we assume it will have the same size as an address space 0
459 /// pointer.
460 virtual unsigned getVectorIdxWidth(const DataLayout &DL) const {
461 return DL.getPointerSizeInBits(0);
462 }
463
464 /// Returns the type to be used for the index operand of:
465 /// ISD::INSERT_VECTOR_ELT, ISD::EXTRACT_VECTOR_ELT,
466 /// ISD::INSERT_SUBVECTOR, and ISD::EXTRACT_SUBVECTOR
470
471 /// Returns the type to be used for the index operand of:
472 /// G_INSERT_VECTOR_ELT, G_EXTRACT_VECTOR_ELT,
473 /// G_INSERT_SUBVECTOR, and G_EXTRACT_SUBVECTOR
476 }
477
478 /// Returns the type to be used for the EVL/AVL operand of VP nodes:
479 /// ISD::VP_UDIV, ISD::VP_SDIV, etc. It must be a legal scalar integer type,
480 /// and must be at least as large as i32. The EVL is implicitly zero-extended
481 /// to any larger type.
482 virtual MVT getVPExplicitVectorLengthTy() const { return MVT::i32; }
483
484 /// This callback is used to inspect load/store instructions and add
485 /// target-specific MachineMemOperand flags to them. The default
486 /// implementation does nothing.
490
491 /// This callback is used to inspect load/store SDNode.
492 /// The default implementation does nothing.
497
498 MachineMemOperand::Flags getLoadMemOperandFlags(
499 const LoadInst &LI, const DataLayout &DL, AssumptionCache *AC = nullptr,
500 const TargetLibraryInfo *LibInfo = nullptr,
502 MachineMemOperand::Flags getStoreMemOperandFlags(const StoreInst &SI,
503 const DataLayout &DL) const;
504 MachineMemOperand::Flags getAtomicMemOperandFlags(const Instruction &AI,
505 const DataLayout &DL) const;
507 getVPIntrinsicMemOperandFlags(const VPIntrinsic &VPIntrin) const;
508
509 virtual bool isSelectSupported(SelectSupportKind /*kind*/) const {
510 return true;
511 }
512
513 /// Return true if the @llvm.get.active.lane.mask intrinsic should be expanded
514 /// using generic code in SelectionDAGBuilder.
515 virtual bool shouldExpandGetActiveLaneMask(EVT VT, EVT OpVT) const {
516 return true;
517 }
518
519 virtual bool shouldExpandGetVectorLength(EVT CountVT, unsigned VF,
520 bool IsScalable) const {
521 return true;
522 }
523
524 /// Return the minimum number of bits required to hold the maximum possible
525 /// number of trailing zero vector elements.
526 unsigned getBitWidthForCttzElements(EVT RetVT, ElementCount EC,
527 bool ZeroIsPoison,
528 const ConstantRange *VScaleRange) const;
529
530 // Return true if op(vecreduce(x), vecreduce(y)) should be reassociated to
531 // vecreduce(op(x, y)) for the reduction opcode RedOpc.
532 virtual bool shouldReassociateReduction(unsigned RedOpc, EVT VT) const {
533 return true;
534 }
535
536 /// Return true if it is profitable to convert a select of FP constants into
537 /// a constant pool load whose address depends on the select condition. The
538 /// parameter may be used to differentiate a select with FP compare from
539 /// integer compare.
540 virtual bool reduceSelectOfFPConstantLoads(EVT CmpOpVT) const {
541 return true;
542 }
543
544 /// Does the target have multiple (allocatable) condition registers that
545 /// can be used to store the results of comparisons for use by selects
546 /// and conditional branches. With multiple condition registers, the code
547 /// generator will not aggressively sink comparisons into the blocks of their
548 /// users. \p VT is the type of the condition value, e.g. the type of the
549 /// result of a comparison.
550 virtual bool hasMultipleConditionRegisters(EVT VT) const { return false; }
551
552 /// Return true if the target has BitExtract instructions.
553 bool hasExtractBitsInsn() const { return HasExtractBitsInsn; }
554
555 /// Return the preferred vector type legalization action.
558 // The default action for one element vectors is to scalarize
560 return TypeScalarizeVector;
561 // The default action for an odd-width vector is to widen.
562 if (!VT.isPow2VectorType())
563 return TypeWidenVector;
564 // The default action for other vectors is to promote
565 return TypePromoteInteger;
566 }
567
568 // Return true if, for soft-promoted half, the half type should be passed to
569 // and returned from functions as f32. The default behavior is to pass as
570 // i16. If soft-promoted half is not used, this function is ignored and
571 // values are always passed and returned as f32.
572 virtual bool useFPRegsForHalfType() const { return false; }
573
574 // There are two general methods for expanding a BUILD_VECTOR node:
575 // 1. Use SCALAR_TO_VECTOR on the defined scalar values and then shuffle
576 // them together.
577 // 2. Build the vector on the stack and then load it.
578 // If this function returns true, then method (1) will be used, subject to
579 // the constraint that all of the necessary shuffles are legal (as determined
580 // by isShuffleMaskLegal). If this function returns false, then method (2) is
581 // always used. The vector type, and the number of defined values, are
582 // provided.
583 virtual bool
585 unsigned DefinedValues) const {
586 return DefinedValues < 3;
587 }
588
589 /// Return true if integer divide is usually cheaper than a sequence of
590 /// several shifts, adds, and multiplies for this target.
591 /// The definition of "cheaper" may depend on whether we're optimizing
592 /// for speed or for size.
593 virtual bool isIntDivCheap(EVT VT, AttributeList Attr) const { return false; }
594
595 /// Return true if the target can handle a standalone remainder operation.
596 virtual bool hasStandaloneRem(EVT VT) const {
597 return true;
598 }
599
600 /// Return true if SQRT(X) shouldn't be replaced with X*RSQRT(X).
601 virtual bool isFsqrtCheap(SDValue X, SelectionDAG &DAG) const {
602 // Default behavior is to replace SQRT(X) with X*RSQRT(X).
603 return false;
604 }
605
606 /// Reciprocal estimate status values used by the functions below.
611 };
612
613 /// Return a ReciprocalEstimate enum value for a square root of the given type
614 /// based on the function's attributes. If the operation is not overridden by
615 /// the function's attributes, "Unspecified" is returned and target defaults
616 /// are expected to be used for instruction selection.
617 int getRecipEstimateSqrtEnabled(EVT VT, MachineFunction &MF) const;
618
619 /// Return a ReciprocalEstimate enum value for a division of the given type
620 /// based on the function's attributes. If the operation is not overridden by
621 /// the function's attributes, "Unspecified" is returned and target defaults
622 /// are expected to be used for instruction selection.
623 int getRecipEstimateDivEnabled(EVT VT, MachineFunction &MF) const;
624
625 /// Return the refinement step count for a square root of the given type based
626 /// on the function's attributes. If the operation is not overridden by
627 /// the function's attributes, "Unspecified" is returned and target defaults
628 /// are expected to be used for instruction selection.
629 int getSqrtRefinementSteps(EVT VT, MachineFunction &MF) const;
630
631 /// Return the refinement step count for a division of the given type based
632 /// on the function's attributes. If the operation is not overridden by
633 /// the function's attributes, "Unspecified" is returned and target defaults
634 /// are expected to be used for instruction selection.
635 int getDivRefinementSteps(EVT VT, MachineFunction &MF) const;
636
637 /// Returns true if target has indicated at least one type should be bypassed.
638 bool isSlowDivBypassed() const { return !BypassSlowDivWidths.empty(); }
639
640 /// Returns map of slow types for division or remainder with corresponding
641 /// fast types
643 return BypassSlowDivWidths;
644 }
645
646 /// Return true if Flow Control is an expensive operation that should be
647 /// avoided.
648 bool isJumpExpensive() const { return JumpIsExpensive; }
649
650 // Costs parameters used by
651 // SelectionDAGBuilder::shouldKeepJumpConditionsTogether.
652 // shouldKeepJumpConditionsTogether will use these parameter value to
653 // determine if two conditions in the form `br (and/or cond1, cond2)` should
654 // be split into two branches or left as one.
655 //
656 // BaseCost is the cost threshold (in latency). If the estimated latency of
657 // computing both `cond1` and `cond2` is below the cost of just computing
658 // `cond1` + BaseCost, the two conditions will be kept together. Otherwise
659 // they will be split.
660 //
661 // LikelyBias increases BaseCost if branch probability info indicates that it
662 // is likely that both `cond1` and `cond2` will be computed.
663 //
664 // UnlikelyBias decreases BaseCost if branch probability info indicates that
665 // it is likely that both `cond1` and `cond2` will be computed.
666 //
667 // Set any field to -1 to make it ignored (setting BaseCost to -1 results in
668 // `shouldKeepJumpConditionsTogether` always returning false).
674 // Return params for deciding if we should keep two branch conditions merged
675 // or split them into two separate branches.
676 // Arg0: The binary op joining the two conditions (and/or).
677 // Arg1: The first condition (cond1)
678 // Arg2: The second condition (cond2)
679 // Arg3: The containing function.
680 virtual CondMergingParams
682 const Value *, const Function *) const {
683 // -1 will always result in splitting.
684 return {-1, -1, -1};
685 }
686
687 /// Return true if selects are only cheaper than branches if the branch is
688 /// unlikely to be predicted right.
692
693 virtual bool fallBackToDAGISel(const Instruction &Inst) const {
694 return false;
695 }
696
697 /// Return true if the following transform is beneficial:
698 /// fold (conv (load x)) -> (load (conv*)x)
699 /// On architectures that don't natively support some vector loads
700 /// efficiently, casting the load to a smaller vector of larger types and
701 /// loading is more efficient, however, this can be undone by optimizations in
702 /// dag combiner.
703 virtual bool isLoadBitCastBeneficial(EVT LoadVT, EVT BitcastVT,
704 const SelectionDAG &DAG,
705 const MachineMemOperand &MMO) const;
706
707 /// Return true if the following transform is beneficial:
708 /// (store (y (conv x)), y*)) -> (store x, (x*))
709 virtual bool isStoreBitCastBeneficial(EVT StoreVT, EVT BitcastVT,
710 const SelectionDAG &DAG,
711 const MachineMemOperand &MMO) const {
712 // Default to the same logic as loads.
713 return isLoadBitCastBeneficial(StoreVT, BitcastVT, DAG, MMO);
714 }
715
716 /// Return true if it is expected to be cheaper to do a store of vector
717 /// constant with the given size and type for the address space than to
718 /// store the individual scalar element constants.
719 virtual bool storeOfVectorConstantIsCheap(bool IsZero, EVT MemVT,
720 unsigned NumElem,
721 unsigned AddrSpace) const {
722 return IsZero;
723 }
724
725 /// Allow store merging for the specified type after legalization in addition
726 /// to before legalization. This may transform stores that do not exist
727 /// earlier (for example, stores created from intrinsics).
728 virtual bool mergeStoresAfterLegalization(EVT MemVT) const {
729 return true;
730 }
731
732 /// Returns if it's reasonable to merge stores to MemVT size.
733 virtual bool canMergeStoresTo(unsigned AS, EVT MemVT,
734 const MachineFunction &MF) const {
735 return true;
736 }
737
738 /// Return true if it is cheap to speculate a call to intrinsic cttz.
739 virtual bool isCheapToSpeculateCttz(Type *Ty) const {
740 return false;
741 }
742
743 /// Return true if it is cheap to speculate a call to intrinsic ctlz.
744 virtual bool isCheapToSpeculateCtlz(Type *Ty) const {
745 return false;
746 }
747
748 /// Return true if ctlz instruction is fast.
749 virtual bool isCtlzFast() const {
750 return false;
751 }
752
753 /// Return true if ctpop instruction is fast.
754 virtual bool isCtpopFast(EVT VT) const {
755 return isOperationLegal(ISD::CTPOP, VT);
756 }
757
758 /// Return the maximum number of "x & (x - 1)" operations that can be done
759 /// instead of deferring to a custom CTPOP.
760 virtual unsigned getCustomCtpopCost(EVT VT, ISD::CondCode Cond) const {
761 return 1;
762 }
763
764 /// Return true if instruction generated for equality comparison is folded
765 /// with instruction generated for signed comparison.
766 virtual bool isEqualityCmpFoldedWithSignedCmp() const { return true; }
767
768 /// Return true if the heuristic to prefer icmp eq zero should be used in code
769 /// gen prepare.
770 virtual bool preferZeroCompareBranch() const { return false; }
771
772 /// Return true if it is cheaper to split the store of a merged int val
773 /// from a pair of smaller values into multiple stores.
774 virtual bool isMultiStoresCheaperThanBitsMerge(EVT LTy, EVT HTy) const {
775 return false;
776 }
777
778 /// Return if the target supports combining a
779 /// chain like:
780 /// \code
781 /// %andResult = and %val1, #mask
782 /// %icmpResult = icmp %andResult, 0
783 /// \endcode
784 /// into a single machine instruction of a form like:
785 /// \code
786 /// cc = test %register, #mask
787 /// \endcode
788 virtual bool isMaskAndCmp0FoldingBeneficial(const Instruction &AndI) const {
789 return false;
790 }
791
792 /// Return true if it is valid to merge the TargetMMOFlags in two SDNodes.
793 virtual bool
795 const MemSDNode &NodeY) const {
796 return true;
797 }
798
799 /// Use bitwise logic to make pairs of compares more efficient. For example:
800 /// and (seteq A, B), (seteq C, D) --> seteq (or (xor A, B), (xor C, D)), 0
801 /// This should be true when it takes more than one instruction to lower
802 /// setcc (cmp+set on x86 scalar), when bitwise ops are faster than logic on
803 /// condition bits (crand on PowerPC), and/or when reducing cmp+br is a win.
804 virtual bool convertSetCCLogicToBitwiseLogic(EVT VT) const {
805 return false;
806 }
807
808 /// Return the preferred operand type if the target has a quick way to compare
809 /// integer values of the given size. Assume that any legal integer type can
810 /// be compared efficiently. Targets may override this to allow illegal wide
811 /// types to return a vector type if there is support to compare that type.
812 virtual MVT hasFastEqualityCompare(unsigned NumBits) const {
813 MVT VT = MVT::getIntegerVT(NumBits);
815 }
816
817 /// Return true if the target should transform:
818 /// (X & Y) == Y ---> (~X & Y) == 0
819 /// (X & Y) != Y ---> (~X & Y) != 0
820 ///
821 /// This may be profitable if the target has a bitwise and-not operation that
822 /// sets comparison flags. A target may want to limit the transformation based
823 /// on the type of Y or if Y is a constant.
824 ///
825 /// Note that the transform will not occur if Y is known to be a power-of-2
826 /// because a mask and compare of a single bit can be handled by inverting the
827 /// predicate, for example:
828 /// (X & 8) == 8 ---> (X & 8) != 0
829 virtual bool hasAndNotCompare(SDValue Y) const {
830 return false;
831 }
832
833 /// Return true if the target has a bitwise and-not operation:
834 /// X = ~A & B
835 /// This can be used to simplify select or other instructions.
836 virtual bool hasAndNot(SDValue X) const {
837 // If the target has the more complex version of this operation, assume that
838 // it has this operation too.
839 return hasAndNotCompare(X);
840 }
841
842 /// Return true if the target has a bit-test instruction:
843 /// (X & (1 << Y)) ==/!= 0
844 /// This knowledge can be used to prevent breaking the pattern,
845 /// or creating it if it could be recognized.
846 virtual bool hasBitTest(SDValue X, SDValue Y) const { return false; }
847
848 /// There are two ways to clear extreme bits (either low or high):
849 /// Mask: x & (-1 << y) (the instcombine canonical form)
850 /// Shifts: x >> y << y
851 /// Return true if the variant with 2 variable shifts is preferred.
852 /// Return false if there is no preference.
854 // By default, let's assume that no one prefers shifts.
855 return false;
856 }
857
858 /// Return true if it is profitable to fold a pair of shifts into a mask.
859 /// This is usually true on most targets. But some targets, like Thumb1,
860 /// have immediate shift instructions, but no immediate "and" instruction;
861 /// this makes the fold unprofitable.
862 virtual bool shouldFoldConstantShiftPairToMask(const SDNode *N) const {
863 return true;
864 }
865
866 /// Should we tranform the IR-optimal check for whether given truncation
867 /// down into KeptBits would be truncating or not:
868 /// (add %x, (1 << (KeptBits-1))) srccond (1 << KeptBits)
869 /// Into it's more traditional form:
870 /// ((%x << C) a>> C) dstcond %x
871 /// Return true if we should transform.
872 /// Return false if there is no preference.
874 unsigned KeptBits) const {
875 // By default, let's assume that no one prefers shifts.
876 return false;
877 }
878
879 /// Given the pattern
880 /// (X & (C l>>/<< Y)) ==/!= 0
881 /// return true if it should be transformed into:
882 /// ((X <</l>> Y) & C) ==/!= 0
883 /// WARNING: if 'X' is a constant, the fold may deadlock!
884 /// FIXME: we could avoid passing XC, but we can't use isConstOrConstSplat()
885 /// here because it can end up being not linked in.
888 unsigned OldShiftOpcode, unsigned NewShiftOpcode,
889 SelectionDAG &DAG) const {
890 if (hasBitTest(X, Y)) {
891 // One interesting pattern that we'd want to form is 'bit test':
892 // ((1 << Y) & C) ==/!= 0
893 // But we also need to be careful not to try to reverse that fold.
894
895 // Is this '1 << Y' ?
896 if (OldShiftOpcode == ISD::SHL && CC->isOne())
897 return false; // Keep the 'bit test' pattern.
898
899 // Will it be '1 << Y' after the transform ?
900 if (XC && NewShiftOpcode == ISD::SHL && XC->isOne())
901 return true; // Do form the 'bit test' pattern.
902 }
903
904 // If 'X' is a constant, and we transform, then we will immediately
905 // try to undo the fold, thus causing endless combine loop.
906 // So by default, let's assume everyone prefers the fold
907 // iff 'X' is not a constant.
908 return !XC;
909 }
910
911 // Return true if its desirable to perform the following transform:
912 // (fmul C, (uitofp Pow2))
913 // -> (bitcast_to_FP (add (bitcast_to_INT C), Log2(Pow2) << mantissa))
914 // (fdiv C, (uitofp Pow2))
915 // -> (bitcast_to_FP (sub (bitcast_to_INT C), Log2(Pow2) << mantissa))
916 //
917 // This is only queried after we have verified the transform will be bitwise
918 // equals.
919 //
920 // SDNode *N : The FDiv/FMul node we want to transform.
921 // SDValue FPConst: The Float constant operand in `N`.
922 // SDValue IntPow2: The Integer power of 2 operand in `N`.
924 SDValue IntPow2) const {
925 // Default to avoiding fdiv which is often very expensive.
926 return N->getOpcode() == ISD::FDIV;
927 }
928
929 // Given:
930 // (icmp eq/ne (and X, C0), (shift X, C1))
931 // or
932 // (icmp eq/ne X, (rotate X, CPow2))
933
934 // If C0 is a mask or shifted mask and the shift amt (C1) isolates the
935 // remaining bits (i.e something like `(x64 & UINT32_MAX) == (x64 >> 32)`)
936 // Do we prefer the shift to be shift-right, shift-left, or rotate.
937 // Note: Its only valid to convert the rotate version to the shift version iff
938 // the shift-amt (`C1`) is a power of 2 (including 0).
939 // If ShiftOpc (current Opcode) is returned, do nothing.
941 EVT VT, unsigned ShiftOpc, bool MayTransformRotate,
942 const APInt &ShiftOrRotateAmt,
943 const std::optional<APInt> &AndMask) const {
944 return ShiftOpc;
945 }
946
947 /// These two forms are equivalent:
948 /// sub %y, (xor %x, -1)
949 /// add (add %x, 1), %y
950 /// The variant with two add's is IR-canonical.
951 /// Some targets may prefer one to the other.
952 virtual bool preferIncOfAddToSubOfNot(EVT VT) const {
953 // By default, let's assume that everyone prefers the form with two add's.
954 return true;
955 }
956
957 // By default prefer folding (abs (sub nsw x, y)) -> abds(x, y). Some targets
958 // may want to avoid this to prevent loss of sub_nsw pattern.
959 virtual bool preferABDSToABSWithNSW(EVT VT) const {
960 return true;
961 }
962
963 // Return true if the target wants to transform Op(Splat(X)) -> Splat(Op(X))
964 virtual bool preferScalarizeSplat(SDNode *N) const { return true; }
965
966 // Return true if the target wants to transform:
967 // (TruncVT truncate(sext_in_reg(VT X, ExtVT))
968 // -> (TruncVT sext_in_reg(truncate(VT X), ExtVT))
969 // Some targets might prefer pre-sextinreg to improve truncation/saturation.
970 virtual bool preferSextInRegOfTruncate(EVT TruncVT, EVT VT, EVT ExtVT) const {
971 return true;
972 }
973
974 /// Return true if the target wants to use the optimization that
975 /// turns ext(promotableInst1(...(promotableInstN(load)))) into
976 /// promotedInst1(...(promotedInstN(ext(load)))).
978
979 /// Return true if the target can combine store(extractelement VectorTy,
980 /// Idx).
981 /// \p Cost[out] gives the cost of that transformation when this is true.
982 virtual bool canCombineStoreAndExtract(Type *VectorTy, Value *Idx,
983 unsigned &Cost) const {
984 return false;
985 }
986
987 /// Return true if the target shall perform extract vector element and store
988 /// given that the vector is known to be splat of constant.
989 /// \p Index[out] gives the index of the vector element to be extracted when
990 /// this is true.
992 Type *VectorTy, unsigned ElemSizeInBits, unsigned &Index) const {
993 return false;
994 }
995
996 /// Return true if inserting a scalar into a variable element of an undef
997 /// vector is more efficiently handled by splatting the scalar instead.
998 virtual bool shouldSplatInsEltVarIndex(EVT) const {
999 return false;
1000 }
1001
1002 /// Return true if target always benefits from combining into FMA for a
1003 /// given value type. This must typically return false on targets where FMA
1004 /// takes more cycles to execute than FADD.
1005 virtual bool enableAggressiveFMAFusion(EVT VT) const { return false; }
1006
1007 /// Return true if target always benefits from combining into FMA for a
1008 /// given value type. This must typically return false on targets where FMA
1009 /// takes more cycles to execute than FADD.
1010 virtual bool enableAggressiveFMAFusion(LLT Ty) const { return false; }
1011
1012 /// Return the ValueType of the result of SETCC operations.
1013 virtual EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context,
1014 EVT VT) const;
1015
1016 /// Return the ValueType for comparison libcalls. Comparison libcalls include
1017 /// floating point comparison calls, and Ordered/Unordered check calls on
1018 /// floating point numbers.
1020 return MVT::i32; // return the default value
1021 }
1022
1023 /// For targets without i1 registers, this gives the nature of the high-bits
1024 /// of boolean values held in types wider than i1.
1025 ///
1026 /// "Boolean values" are special true/false values produced by nodes like
1027 /// SETCC and consumed (as the condition) by nodes like SELECT and BRCOND.
1028 /// Not to be confused with general values promoted from i1. Some cpus
1029 /// distinguish between vectors of boolean and scalars; the isVec parameter
1030 /// selects between the two kinds. For example on X86 a scalar boolean should
1031 /// be zero extended from i1, while the elements of a vector of booleans
1032 /// should be sign extended from i1.
1033 ///
1034 /// Some cpus also treat floating point types the same way as they treat
1035 /// vectors instead of the way they treat scalars.
1036 BooleanContent getBooleanContents(bool isVec, bool isFloat) const {
1037 if (isVec)
1038 return BooleanVectorContents;
1039 return isFloat ? BooleanFloatContents : BooleanContents;
1040 }
1041
1043 return getBooleanContents(Type.isVector(), Type.isFloatingPoint());
1044 }
1045
1046 /// Promote the given target boolean to a target boolean of the given type.
1047 /// A target boolean is an integer value, not necessarily of type i1, the bits
1048 /// of which conform to getBooleanContents.
1049 ///
1050 /// ValVT is the type of values that produced the boolean.
1052 EVT ValVT) const {
1053 SDLoc dl(Bool);
1054 EVT BoolVT =
1055 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), ValVT);
1057 return DAG.getNode(ExtendCode, dl, BoolVT, Bool);
1058 }
1059
1060 /// Return target scheduling preference.
1062 return SchedPreferenceInfo;
1063 }
1064
1065 /// Some scheduler, e.g. hybrid, can switch to different scheduling heuristics
1066 /// for different nodes. This function returns the preference (or none) for
1067 /// the given node.
1069 return Sched::None;
1070 }
1071
1072 /// Return the register class that should be used for the specified value
1073 /// type.
1074 virtual const TargetRegisterClass *getRegClassFor(MVT VT, bool isDivergent = false) const {
1075 (void)isDivergent;
1076 const TargetRegisterClass *RC = RegClassForVT[VT.SimpleTy];
1077 assert(RC && "This value type is not natively supported!");
1078 return RC;
1079 }
1080
1081 /// Allows target to decide about the register class of the
1082 /// specific value that is live outside the defining block.
1083 /// Returns true if the value needs uniform register class.
1085 const Value *) const {
1086 return false;
1087 }
1088
1089 /// Return the 'representative' register class for the specified value
1090 /// type.
1091 ///
1092 /// The 'representative' register class is the largest legal super-reg
1093 /// register class for the register class of the value type. For example, on
1094 /// i386 the rep register class for i8, i16, and i32 are GR32; while the rep
1095 /// register class is GR64 on x86_64.
1096 virtual const TargetRegisterClass *getRepRegClassFor(MVT VT) const {
1097 const TargetRegisterClass *RC = RepRegClassForVT[VT.SimpleTy];
1098 return RC;
1099 }
1100
1101 /// Return the cost of the 'representative' register class for the specified
1102 /// value type.
1104 return RepRegClassCostForVT[VT.SimpleTy];
1105 }
1106
1107 /// Return the preferred strategy to legalize tihs SHIFT instruction, with
1108 /// \p ExpansionFactor being the recursion depth - how many expansion needed.
1114 virtual ShiftLegalizationStrategy
1116 unsigned ExpansionFactor) const {
1117 if (ExpansionFactor == 1)
1120 }
1121
1122 /// Return true if the target has native support for the specified value type.
1123 /// This means that it has a register that directly holds it without
1124 /// promotions or expansions.
1125 bool isTypeLegal(EVT VT) const {
1126 assert(!VT.isSimple() ||
1127 (unsigned)VT.getSimpleVT().SimpleTy < std::size(RegClassForVT));
1128 return VT.isSimple() && RegClassForVT[VT.getSimpleVT().SimpleTy] != nullptr;
1129 }
1130
1132 /// ValueTypeActions - For each value type, keep a LegalizeTypeAction enum
1133 /// that indicates how instruction selection should deal with the type.
1134 LegalizeTypeAction ValueTypeActions[MVT::VALUETYPE_SIZE];
1135
1136 public:
1137 ValueTypeActionImpl() { llvm::fill(ValueTypeActions, TypeLegal); }
1138
1140 return ValueTypeActions[VT.SimpleTy];
1141 }
1142
1144 ValueTypeActions[VT.SimpleTy] = Action;
1145 }
1146 };
1147
1149 return ValueTypeActions;
1150 }
1151
1152 /// Return pair that represents the legalization kind (first) that needs to
1153 /// happen to EVT (second) in order to type-legalize it.
1154 ///
1155 /// First: how we should legalize values of this type, either it is already
1156 /// legal (return 'Legal') or we need to promote it to a larger type (return
1157 /// 'Promote'), or we need to expand it into multiple registers of smaller
1158 /// integer type (return 'Expand'). 'Custom' is not an option.
1159 ///
1160 /// Second: for types supported by the target, this is an identity function.
1161 /// For types that must be promoted to larger types, this returns the larger
1162 /// type to promote to. For integer types that are larger than the largest
1163 /// integer register, this contains one step in the expansion to get to the
1164 /// smaller register. For illegal floating point types, this returns the
1165 /// integer type to transform to.
1166 LegalizeKind getTypeConversion(LLVMContext &Context, EVT VT) const;
1167
1168 /// Return how we should legalize values of this type, either it is already
1169 /// legal (return 'Legal') or we need to promote it to a larger type (return
1170 /// 'Promote'), or we need to expand it into multiple registers of smaller
1171 /// integer type (return 'Expand'). 'Custom' is not an option.
1173 return getTypeConversion(Context, VT).first;
1174 }
1176 return ValueTypeActions.getTypeAction(VT);
1177 }
1178
1179 /// For types supported by the target, this is an identity function. For
1180 /// types that must be promoted to larger types, this returns the larger type
1181 /// to promote to. For integer types that are larger than the largest integer
1182 /// register, this contains one step in the expansion to get to the smaller
1183 /// register. For illegal floating point types, this returns the integer type
1184 /// to transform to.
1185 virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const {
1186 return getTypeConversion(Context, VT).second;
1187 }
1188
1189 /// Perform getTypeToTransformTo repeatedly until a legal type is obtained.
1190 /// Useful for vector operations that might take multiple steps to legalize.
1192 EVT LegalVT = getTypeToTransformTo(Context, VT);
1193 while (LegalVT != VT) {
1194 VT = LegalVT;
1195 LegalVT = getTypeToTransformTo(Context, VT);
1196 }
1197 return LegalVT;
1198 }
1199
1200 /// For types supported by the target, this is an identity function. For
1201 /// types that must be expanded (i.e. integer types that are larger than the
1202 /// largest integer register or illegal floating point types), this returns
1203 /// the largest legal type it will be expanded to.
1204 EVT getTypeToExpandTo(LLVMContext &Context, EVT VT) const {
1205 assert(!VT.isVector());
1206 while (true) {
1207 switch (getTypeAction(Context, VT)) {
1208 case TypeLegal:
1209 return VT;
1210 case TypeExpandInteger:
1211 VT = getTypeToTransformTo(Context, VT);
1212 break;
1213 default:
1214 llvm_unreachable("Type is not legal nor is it to be expanded!");
1215 }
1216 }
1217 }
1218
1219 /// Vector types are broken down into some number of legal first class types.
1220 /// For example, EVT::v8f32 maps to 2 EVT::v4f32 with Altivec or SSE1, or 8
1221 /// promoted EVT::f64 values with the X86 FP stack. Similarly, EVT::v2i64
1222 /// turns into 4 EVT::i32 values with both PPC and X86.
1223 ///
1224 /// This method returns the number of registers needed, and the VT for each
1225 /// register. It also returns the VT and quantity of the intermediate values
1226 /// before they are promoted/expanded.
1228 EVT &IntermediateVT,
1229 unsigned &NumIntermediates,
1230 MVT &RegisterVT) const {
1231 return getVectorTypeBreakdownImpl(Context, VT, IntermediateVT,
1232 NumIntermediates, RegisterVT,
1233 /*ForCallingConv=*/false);
1234 }
1235
1236 /// Return true if fixed-length, non-power-of-two vectors should be broken
1237 /// down into legal vector parts instead of scalars for internal values.
1239 return false;
1240 }
1241
1242 bool shouldUseDynamicVectorTypeBreakdown(EVT VT, bool ForCallingConv) const {
1243 return preferVectorizedNonPowerOfTwoTypeBreakdown() && !ForCallingConv &&
1244 VT.isFixedLengthVector() &&
1246 }
1247
1248 /// Certain targets such as MIPS require that some types such as vectors are
1249 /// always broken down into scalars in some contexts. This occurs even if the
1250 /// vector type is legal.
1252 LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT,
1253 unsigned &NumIntermediates, MVT &RegisterVT) const {
1254 return getVectorTypeBreakdownImpl(Context, VT, IntermediateVT,
1255 NumIntermediates, RegisterVT,
1256 /*ForCallingConv=*/true);
1257 }
1258
1260 unsigned opc = 0; // target opcode
1261 EVT memVT; // memory VT
1262
1263 // value representing memory location
1265
1266 // Fallback address space for use if ptrVal is nullptr. std::nullopt means
1267 // unknown address space.
1268 std::optional<unsigned> fallbackAddressSpace;
1269
1270 int offset = 0; // offset off of ptrVal
1271 uint64_t size = 0; // the size of the memory location
1272 // (taken from memVT if zero)
1273 MaybeAlign align = Align(1); // alignment
1274
1279 IntrinsicInfo() = default;
1280 };
1281
1282 /// Given an intrinsic, checks if on the target the intrinsic will need to map
1283 /// to a MemIntrinsicNode (touches memory). If this is the case, it stores
1284 /// the intrinsic information into the IntrinsicInfo vector passed to the
1285 /// function. The vector may contain multiple entries for intrinsics that
1286 /// access multiple memory locations.
1288 const CallBase &I, MachineFunction &MF,
1289 unsigned Intrinsic) const {}
1290
1291 /// Returns true if the target can instruction select the specified FP
1292 /// immediate natively. If false, the legalizer will materialize the FP
1293 /// immediate as a load from a constant pool.
1294 virtual bool isFPImmLegal(const APFloat & /*Imm*/, EVT /*VT*/,
1295 bool ForCodeSize = false) const {
1296 return false;
1297 }
1298
1299 /// Targets can use this to indicate that they only support *some*
1300 /// VECTOR_SHUFFLE operations, those with specific masks. By default, if a
1301 /// target supports the VECTOR_SHUFFLE node, all mask values are assumed to be
1302 /// legal.
1303 virtual bool isShuffleMaskLegal(ArrayRef<int> /*Mask*/, EVT /*VT*/) const {
1304 return true;
1305 }
1306
1307 /// Returns true if the operation can trap for the value type.
1308 ///
1309 /// VT must be a legal type. By default, we optimistically assume most
1310 /// operations don't trap except for integer divide and remainder.
1311 virtual bool canOpTrap(unsigned Op, EVT VT) const;
1312
1313 /// Similar to isShuffleMaskLegal. Targets can use this to indicate if there
1314 /// is a suitable VECTOR_SHUFFLE that can be used to replace a VAND with a
1315 /// constant pool entry.
1317 EVT /*VT*/) const {
1318 return false;
1319 }
1320
1321 /// How to legalize this custom operation?
1323 return Legal;
1324 }
1325
1326 /// Return how this operation should be treated: either it is legal, needs to
1327 /// be promoted to a larger size, needs to be expanded to some other code
1328 /// sequence, or the target has a custom expander for it.
1330 // If a target-specific SDNode requires legalization, require the target
1331 // to provide custom legalization for it.
1332 if (Op >= std::size(OpActions[0]))
1333 return Custom;
1334 if (VT.isExtended())
1335 return Expand;
1336 return OpActions[(unsigned)VT.getSimpleVT().SimpleTy][Op];
1337 }
1338
1339 /// Custom method defined by each target to indicate if an operation which
1340 /// may require a scale is supported natively by the target.
1341 /// If not, the operation is illegal.
1342 virtual bool isSupportedFixedPointOperation(unsigned Op, EVT VT,
1343 unsigned Scale) const {
1344 return false;
1345 }
1346
1347 /// Some fixed point operations may be natively supported by the target but
1348 /// only for specific scales. This method allows for checking
1349 /// if the width is supported by the target for a given operation that may
1350 /// depend on scale.
1352 unsigned Scale) const {
1353 auto Action = getOperationAction(Op, VT);
1354 if (Action != Legal)
1355 return Action;
1356
1357 // This operation is supported in this type but may only work on specific
1358 // scales.
1359 bool Supported;
1360 switch (Op) {
1361 default:
1362 llvm_unreachable("Unexpected fixed point operation.");
1363 case ISD::SMULFIX:
1364 case ISD::SMULFIXSAT:
1365 case ISD::UMULFIX:
1366 case ISD::UMULFIXSAT:
1367 case ISD::SDIVFIX:
1368 case ISD::SDIVFIXSAT:
1369 case ISD::UDIVFIX:
1370 case ISD::UDIVFIXSAT:
1371 Supported = isSupportedFixedPointOperation(Op, VT, Scale);
1372 break;
1373 }
1374
1375 return Supported ? Action : Expand;
1376 }
1377
1378 // If Op is a strict floating-point operation, return the result
1379 // of getOperationAction for the equivalent non-strict operation.
1381 unsigned EqOpc;
1382 switch (Op) {
1383 default: llvm_unreachable("Unexpected FP pseudo-opcode");
1384#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
1385 case ISD::STRICT_##DAGN: EqOpc = ISD::DAGN; break;
1386#define CMP_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
1387 case ISD::STRICT_##DAGN: EqOpc = ISD::SETCC; break;
1388#include "llvm/IR/ConstrainedOps.def"
1389 }
1390
1391 return getOperationAction(EqOpc, VT);
1392 }
1393
1394 /// Return true if the specified operation is legal on this target or can be
1395 /// made legal with custom lowering. This is used to help guide high-level
1396 /// lowering decisions. LegalOnly is an optional convenience for code paths
1397 /// traversed pre and post legalisation.
1399 bool LegalOnly = false) const {
1400 if (LegalOnly)
1401 return isOperationLegal(Op, VT);
1402
1403 return (VT == MVT::Other || isTypeLegal(VT)) &&
1404 (getOperationAction(Op, VT) == Legal ||
1405 getOperationAction(Op, VT) == Custom);
1406 }
1407
1408 /// Return true if the specified operation is legal on this target or can be
1409 /// made legal using promotion. This is used to help guide high-level lowering
1410 /// decisions. LegalOnly is an optional convenience for code paths traversed
1411 /// pre and post legalisation.
1413 bool LegalOnly = false) const {
1414 if (LegalOnly)
1415 return isOperationLegal(Op, VT);
1416
1417 return (VT == MVT::Other || isTypeLegal(VT)) &&
1418 (getOperationAction(Op, VT) == Legal ||
1419 getOperationAction(Op, VT) == Promote);
1420 }
1421
1422 /// Return true if the specified operation is legal on this target or can be
1423 /// made legal with custom lowering or using promotion. This is used to help
1424 /// guide high-level lowering decisions. LegalOnly is an optional convenience
1425 /// for code paths traversed pre and post legalisation.
1427 bool LegalOnly = false) const {
1428 if (LegalOnly)
1429 return isOperationLegal(Op, VT);
1430
1431 return (VT == MVT::Other || isTypeLegal(VT)) &&
1432 (getOperationAction(Op, VT) == Legal ||
1433 getOperationAction(Op, VT) == Custom ||
1434 getOperationAction(Op, VT) == Promote);
1435 }
1436
1437 /// Return true if the operation uses custom lowering, regardless of whether
1438 /// the type is legal or not.
1439 bool isOperationCustom(unsigned Op, EVT VT) const {
1440 return getOperationAction(Op, VT) == Custom;
1441 }
1442
1443 /// Return true if lowering to a jump table is allowed.
1444 virtual bool areJTsAllowed(const Function *Fn) const {
1445 if (Fn->getFnAttribute("no-jump-tables").getValueAsBool())
1446 return false;
1447
1448 return isOperationLegalOrCustom(ISD::BR_JT, MVT::Other) ||
1450 }
1451
1452 /// Check whether the range [Low,High] fits in a machine word.
1453 bool rangeFitsInWord(const APInt &Low, const APInt &High,
1454 const DataLayout &DL) const {
1455 // FIXME: Using the pointer type doesn't seem ideal.
1456 uint64_t BW = DL.getIndexSizeInBits(0u);
1457 uint64_t Range = (High - Low).getLimitedValue(UINT64_MAX - 1) + 1;
1458 return Range <= BW;
1459 }
1460
1461 /// Return true if lowering to a jump table is suitable for a set of case
1462 /// clusters which may contain \p NumCases cases, \p Range range of values.
1463 virtual bool isSuitableForJumpTable(const SwitchInst *SI, uint64_t NumCases,
1465 BlockFrequencyInfo *BFI) const;
1466
1467 /// Returns preferred type for switch condition.
1468 virtual MVT getPreferredSwitchConditionType(LLVMContext &Context,
1469 EVT ConditionVT) const;
1470
1471 /// Return true if lowering to a bit test is suitable for a set of case
1472 /// clusters which contains \p NumDests unique destinations, \p Low and
1473 /// \p High as its lowest and highest case values, and expects \p NumCmps
1474 /// case value comparisons. Check if the number of destinations, comparison
1475 /// metric, and range are all suitable.
1478 const APInt &Low, const APInt &High, const DataLayout &DL) const {
1479 // FIXME: I don't think NumCmps is the correct metric: a single case and a
1480 // range of cases both require only one branch to lower. Just looking at the
1481 // number of clusters and destinations should be enough to decide whether to
1482 // build bit tests.
1483
1484 // To lower a range with bit tests, the range must fit the bitwidth of a
1485 // machine word.
1486 if (!rangeFitsInWord(Low, High, DL))
1487 return false;
1488
1489 unsigned NumDests = DestCmps.size();
1490 unsigned NumCmps = 0;
1491 unsigned int MaxBitTestEntry = 0;
1492 for (auto &DestCmp : DestCmps) {
1493 NumCmps += DestCmp.second;
1494 if (DestCmp.second > MaxBitTestEntry)
1495 MaxBitTestEntry = DestCmp.second;
1496 }
1497
1498 // Comparisons might be cheaper for small number of comparisons, which can
1499 // be Arch Target specific.
1500 if (MaxBitTestEntry < getMinimumBitTestCmps())
1501 return false;
1502
1503 // Decide whether it's profitable to lower this range with bit tests. Each
1504 // destination requires a bit test and branch, and there is an overall range
1505 // check branch. For a small number of clusters, separate comparisons might
1506 // be cheaper, and for many destinations, splitting the range might be
1507 // better.
1508 return (NumDests == 1 && NumCmps >= 3) || (NumDests == 2 && NumCmps >= 5) ||
1509 (NumDests == 3 && NumCmps >= 6);
1510 }
1511
1512 /// Return true if the specified operation is illegal on this target or
1513 /// unlikely to be made legal with custom lowering. This is used to help guide
1514 /// high-level lowering decisions.
1515 bool isOperationExpand(unsigned Op, EVT VT) const {
1516 return (!isTypeLegal(VT) || getOperationAction(Op, VT) == Expand);
1517 }
1518
1519 /// Return true if the specified operation is legal on this target.
1520 bool isOperationLegal(unsigned Op, EVT VT) const {
1521 return (VT == MVT::Other || isTypeLegal(VT)) &&
1522 getOperationAction(Op, VT) == Legal;
1523 }
1524
1525 bool isOperationExpandOrLibCall(unsigned Op, EVT VT) const {
1526 return isOperationExpand(Op, VT) || getOperationAction(Op, VT) == LibCall;
1527 }
1528
1529 /// Returns an alternative action to use when the coarser lookups (configured
1530 /// through `setLoadExtAction` and `setAtomicLoadExtAction`) yield
1531 /// `LegalizeAction::Custom`. Allows targets to use builtin behaviors (e.g.
1532 /// Legal, Promote) specialized by Alignment and AddrSpace, rather than just
1533 /// types.
1534 virtual LegalizeAction
1535 getCustomLoadAction(EVT ValVT, EVT MemVT, Align Alignment, unsigned AddrSpace,
1536 unsigned ExtType, bool Atomic) const {
1538 }
1539
1540 /// Return how this load with extension should be treated: either it is legal,
1541 /// needs to be promoted to a larger size, needs to be expanded to some other
1542 /// code sequence, or the target has a custom expander for it.
1543 LegalizeAction getLoadAction(EVT ValVT, EVT MemVT, Align Alignment,
1544 unsigned AddrSpace, unsigned ExtType,
1545 bool Atomic) const {
1546 if (ValVT.isExtended() || MemVT.isExtended())
1547 return Expand;
1548 unsigned ValI = (unsigned)ValVT.getSimpleVT().SimpleTy;
1549 unsigned MemI = (unsigned)MemVT.getSimpleVT().SimpleTy;
1551 MemI < MVT::VALUETYPE_SIZE && "Table isn't big enough!");
1552 unsigned Shift = 4 * ExtType;
1553
1554 LegalizeAction Action;
1555 if (Atomic) {
1556 Action =
1557 (LegalizeAction)((AtomicLoadExtActions[ValI][MemI] >> Shift) & 0xf);
1558 assert((Action == Legal || Action == Expand) &&
1559 "Unsupported atomic load extension action.");
1560 } else {
1561 Action = (LegalizeAction)((LoadExtActions[ValI][MemI] >> Shift) & 0xf);
1562 }
1563
1564 if (Action == LegalizeAction::Custom) {
1565 return getCustomLoadAction(ValVT, MemVT, Alignment, AddrSpace, ExtType,
1566 Atomic);
1567 }
1568
1569 return Action;
1570 }
1571
1572 /// Return true if the specified load with extension is legal on this target.
1573 bool isLoadLegal(EVT ValVT, EVT MemVT, Align Alignment, unsigned AddrSpace,
1574 unsigned ExtType, bool Atomic) const {
1575 return getLoadAction(ValVT, MemVT, Alignment, AddrSpace, ExtType, Atomic) ==
1576 Legal;
1577 }
1578
1579 /// Return true if the specified load with extension is legal or custom
1580 /// on this target.
1581 bool isLoadLegalOrCustom(EVT ValVT, EVT MemVT, Align Alignment,
1582 unsigned AddrSpace, unsigned ExtType,
1583 bool Atomic) const {
1584 LegalizeAction Action =
1585 getLoadAction(ValVT, MemVT, Alignment, AddrSpace, ExtType, Atomic);
1586 return Action == Legal || Action == Custom;
1587 }
1588
1589 /// Returns an alternative action to use when the coarser lookups (configured
1590 /// through `setTruncStoreAction` yield
1591 /// `LegalizeAction::Custom`. Allows targets to use builtin behaviors (e.g.
1592 /// Legal, Promote) specialized by Alignment and AddrSpace, rather than just
1593 /// types.
1595 Align Alignment,
1596 unsigned AddrSpace) const {
1598 }
1599
1600 /// Return how this store with truncation should be treated: either it is
1601 /// legal, needs to be promoted to a larger size, needs to be expanded to some
1602 /// other code sequence, or the target has a custom expander for it.
1604 unsigned AddrSpace) const {
1605 if (ValVT.isExtended() || MemVT.isExtended())
1606 return Expand;
1607 unsigned ValI = (unsigned)ValVT.getSimpleVT().SimpleTy;
1608 unsigned MemI = (unsigned)MemVT.getSimpleVT().SimpleTy;
1610 "Table isn't big enough!");
1611
1612 LegalizeAction Action = TruncStoreActions[ValI][MemI];
1613
1614 if (Action == LegalizeAction::Custom) {
1615 return getCustomTruncStoreAction(ValVT, MemVT, Alignment, AddrSpace);
1616 }
1617
1618 return Action;
1619 }
1620
1621 /// Return true if the specified store with truncation is legal on this
1622 /// target.
1623 bool isTruncStoreLegal(EVT ValVT, EVT MemVT, Align Alignment,
1624 unsigned AddrSpace) const {
1625 return isTypeLegal(ValVT) &&
1626 getTruncStoreAction(ValVT, MemVT, Alignment, AddrSpace) == Legal;
1627 }
1628
1629 /// Return true if the specified store with truncation has solution on this
1630 /// target.
1631 bool isTruncStoreLegalOrCustom(EVT ValVT, EVT MemVT, Align Alignment,
1632 unsigned AddrSpace) const {
1633 if (!isTypeLegal(ValVT))
1634 return false;
1635
1636 LegalizeAction Action =
1637 getTruncStoreAction(ValVT, MemVT, Alignment, AddrSpace);
1638 return (Action == Legal || Action == Custom);
1639 }
1640
1641 virtual bool canCombineTruncStore(EVT ValVT, EVT MemVT, Align Alignment,
1642 unsigned AddrSpace, bool LegalOnly) const {
1643 if (LegalOnly)
1644 return isTruncStoreLegal(ValVT, MemVT, Alignment, AddrSpace);
1645
1646 return isTruncStoreLegalOrCustom(ValVT, MemVT, Alignment, AddrSpace);
1647 }
1648
1649 /// Return how the indexed load should be treated: either it is legal, needs
1650 /// to be promoted to a larger size, needs to be expanded to some other code
1651 /// sequence, or the target has a custom expander for it.
1652 LegalizeAction getIndexedLoadAction(unsigned IdxMode, MVT VT) const {
1653 return getIndexedModeAction(IdxMode, VT, IMAB_Load);
1654 }
1655
1656 /// Return true if the specified indexed load is legal on this target.
1657 bool isIndexedLoadLegal(unsigned IdxMode, EVT VT) const {
1658 return VT.isSimple() &&
1659 (getIndexedLoadAction(IdxMode, VT.getSimpleVT()) == Legal ||
1660 getIndexedLoadAction(IdxMode, VT.getSimpleVT()) == Custom);
1661 }
1662
1663 /// Return how the indexed store should be treated: either it is legal, needs
1664 /// to be promoted to a larger size, needs to be expanded to some other code
1665 /// sequence, or the target has a custom expander for it.
1666 LegalizeAction getIndexedStoreAction(unsigned IdxMode, MVT VT) const {
1667 return getIndexedModeAction(IdxMode, VT, IMAB_Store);
1668 }
1669
1670 /// Return true if the specified indexed load is legal on this target.
1671 bool isIndexedStoreLegal(unsigned IdxMode, EVT VT) const {
1672 return VT.isSimple() &&
1673 (getIndexedStoreAction(IdxMode, VT.getSimpleVT()) == Legal ||
1674 getIndexedStoreAction(IdxMode, VT.getSimpleVT()) == Custom);
1675 }
1676
1677 /// Return how the indexed load should be treated: either it is legal, needs
1678 /// to be promoted to a larger size, needs to be expanded to some other code
1679 /// sequence, or the target has a custom expander for it.
1680 LegalizeAction getIndexedMaskedLoadAction(unsigned IdxMode, MVT VT) const {
1681 return getIndexedModeAction(IdxMode, VT, IMAB_MaskedLoad);
1682 }
1683
1684 /// Return true if the specified indexed load is legal on this target.
1685 bool isIndexedMaskedLoadLegal(unsigned IdxMode, EVT VT) const {
1686 return VT.isSimple() &&
1687 (getIndexedMaskedLoadAction(IdxMode, VT.getSimpleVT()) == Legal ||
1689 }
1690
1691 /// Return how the indexed store should be treated: either it is legal, needs
1692 /// to be promoted to a larger size, needs to be expanded to some other code
1693 /// sequence, or the target has a custom expander for it.
1694 LegalizeAction getIndexedMaskedStoreAction(unsigned IdxMode, MVT VT) const {
1695 return getIndexedModeAction(IdxMode, VT, IMAB_MaskedStore);
1696 }
1697
1698 /// Return true if the specified indexed load is legal on this target.
1699 bool isIndexedMaskedStoreLegal(unsigned IdxMode, EVT VT) const {
1700 return VT.isSimple() &&
1701 (getIndexedMaskedStoreAction(IdxMode, VT.getSimpleVT()) == Legal ||
1703 }
1704
1705 /// Returns true if the index type for a masked gather/scatter requires
1706 /// extending
1707 virtual bool shouldExtendGSIndex(EVT VT, EVT &EltTy) const { return false; }
1708
1709 // Returns true if Extend can be folded into the index of a masked gathers/scatters
1710 // on this target.
1711 virtual bool shouldRemoveExtendFromGSIndex(SDValue Extend, EVT DataVT) const {
1712 return false;
1713 }
1714
1715 // Return true if the target supports a scatter/gather instruction with
1716 // indices which are scaled by the particular value. Note that all targets
1717 // must by definition support scale of 1.
1719 uint64_t ElemSize) const {
1720 // MGATHER/MSCATTER are only required to support scaling by one or by the
1721 // element size.
1722 if (Scale != ElemSize && Scale != 1)
1723 return false;
1724 return true;
1725 }
1726
1727 /// Return how the condition code should be treated: either it is legal, needs
1728 /// to be expanded to some other code sequence, or the target has a custom
1729 /// expander for it.
1732 assert((unsigned)CC < std::size(CondCodeActions) &&
1733 ((unsigned)VT.SimpleTy >> 3) < std::size(CondCodeActions[0]) &&
1734 "Table isn't big enough!");
1735 // See setCondCodeAction for how this is encoded.
1736 uint32_t Shift = 4 * (VT.SimpleTy & 0x7);
1737 uint32_t Value = CondCodeActions[CC][VT.SimpleTy >> 3];
1738 LegalizeAction Action = (LegalizeAction) ((Value >> Shift) & 0xF);
1739 assert(Action != Promote && "Can't promote condition code!");
1740 return Action;
1741 }
1742
1743 /// Return true if the specified condition code is legal for a comparison of
1744 /// the specified types on this target.
1745 bool isCondCodeLegal(ISD::CondCode CC, MVT VT) const {
1746 return getCondCodeAction(CC, VT) == Legal;
1747 }
1748
1749 /// Return true if the specified condition code is legal or custom for a
1750 /// comparison of the specified types on this target.
1752 return getCondCodeAction(CC, VT) == Legal ||
1753 getCondCodeAction(CC, VT) == Custom;
1754 }
1755
1756 /// Return how a PARTIAL_REDUCE_U/SMLA node with Acc type AccVT and Input type
1757 /// InputVT should be treated. Either it's legal, needs to be promoted to a
1758 /// larger size, needs to be expanded to some other code sequence, or the
1759 /// target has a custom expander for it.
1761 EVT InputVT) const {
1764 PartialReduceActionTypes Key = {Opc, AccVT.getSimpleVT().SimpleTy,
1765 InputVT.getSimpleVT().SimpleTy};
1766 auto It = PartialReduceMLAActions.find(Key);
1767 return It != PartialReduceMLAActions.end() ? It->second : Expand;
1768 }
1769
1770 /// Return true if a PARTIAL_REDUCE_U/SMLA node with the specified types is
1771 /// legal or custom for this target.
1773 EVT InputVT) const {
1774 LegalizeAction Action = getPartialReduceMLAAction(Opc, AccVT, InputVT);
1775 return Action == Legal || Action == Custom;
1776 }
1777
1778 /// Return how a VECTOR_INTERLEAVE or VECTOR_DEINTERLEAVE node with the
1779 /// given interleave factor and VT should be handled.
1781 EVT VT) const {
1783 VectorInterleaveActionKey Key = {Opc, Factor, VT.getSimpleVT().SimpleTy};
1784 auto It = VectorInterleaveActions.find(Key);
1785 return It != VectorInterleaveActions.end() ? It->second : Expand;
1786 }
1787
1788 /// Return true if a VECTOR_INTERLEAVE or VECTOR_DEINTERLEAVE node with the
1789 /// given interleave factor and fragment type is legal or custom.
1790 bool isVectorInterleaveLegalOrCustom(unsigned Opc, unsigned Factor,
1791 EVT VT) const {
1792 LegalizeAction Action = getVectorInterleaveAction(Opc, Factor, VT);
1793 return Action == Legal || Action == Custom;
1794 }
1795
1796 /// If the action for this operation is to promote, this method returns the
1797 /// ValueType to promote to.
1798 MVT getTypeToPromoteTo(unsigned Op, MVT VT) const {
1800 "This operation isn't promoted!");
1801
1802 // See if this has an explicit type specified.
1803 std::map<std::pair<unsigned, MVT::SimpleValueType>,
1805 PromoteToType.find(std::make_pair(Op, VT.SimpleTy));
1806 if (PTTI != PromoteToType.end()) return PTTI->second;
1807
1808 assert((VT.isInteger() || VT.isFloatingPoint()) &&
1809 "Cannot autopromote this type, add it with AddPromotedToType.");
1810
1811 uint64_t VTBits = VT.getScalarSizeInBits();
1812 MVT NVT = VT;
1813 do {
1814 NVT = (MVT::SimpleValueType)(NVT.SimpleTy+1);
1815 assert(NVT.isInteger() == VT.isInteger() &&
1816 NVT.isFloatingPoint() == VT.isFloatingPoint() &&
1817 "Didn't find type to promote to!");
1818 } while (VTBits >= NVT.getScalarSizeInBits() || !isTypeLegal(NVT) ||
1819 getOperationAction(Op, NVT) == Promote);
1820 return NVT;
1821 }
1822
1824 bool AllowUnknown = false) const {
1825 return getValueType(DL, Ty, AllowUnknown);
1826 }
1827
1828 /// Return the EVT corresponding to this LLVM type. This is fixed by the LLVM
1829 /// operations except for the pointer size. If AllowUnknown is true, this
1830 /// will return MVT::Other for types with no EVT counterpart (e.g. structs),
1831 /// otherwise it will assert.
1833 bool AllowUnknown = false) const {
1834 // Lower scalar pointers to native pointer types.
1835 if (auto *PTy = dyn_cast<PointerType>(Ty))
1836 return getPointerTy(DL, PTy->getAddressSpace());
1837
1838 if (auto *VTy = dyn_cast<VectorType>(Ty)) {
1839 Type *EltTy = VTy->getElementType();
1840 // Lower vectors of pointers to native pointer types.
1841 EVT EltVT;
1842 if (auto *PTy = dyn_cast<PointerType>(EltTy))
1843 EltVT = getPointerTy(DL, PTy->getAddressSpace());
1844 else
1845 EltVT = EVT::getEVT(EltTy, false);
1846 return EVT::getVectorVT(Ty->getContext(), EltVT, VTy->getElementCount());
1847 }
1848
1849 return EVT::getEVT(Ty, AllowUnknown);
1850 }
1851
1853 bool AllowUnknown = false) const {
1854 // Lower scalar pointers to native pointer types.
1855 if (auto *PTy = dyn_cast<PointerType>(Ty))
1856 return getPointerMemTy(DL, PTy->getAddressSpace());
1857
1858 if (auto *VTy = dyn_cast<VectorType>(Ty)) {
1859 Type *EltTy = VTy->getElementType();
1860 EVT EltVT;
1861 if (auto *PTy = dyn_cast<PointerType>(EltTy))
1862 EltVT = getPointerMemTy(DL, PTy->getAddressSpace());
1863 else
1864 EltVT = EVT::getEVT(EltTy, false);
1865 return EVT::getVectorVT(Ty->getContext(), EltVT, VTy->getElementCount());
1866 }
1867
1868 return getValueType(DL, Ty, AllowUnknown);
1869 }
1870
1871
1872 /// Return the MVT corresponding to this LLVM type. See getValueType.
1874 bool AllowUnknown = false) const {
1875 return getValueType(DL, Ty, AllowUnknown).getSimpleVT();
1876 }
1877
1878 /// Returns the desired alignment for ByVal or InAlloca aggregate function
1879 /// arguments in the caller parameter area.
1880 virtual Align getByValTypeAlignment(Type *Ty, const DataLayout &DL) const;
1881
1882 /// Return the type of registers that this ValueType will eventually require.
1883 MVT getRegisterType(LLVMContext &Context, EVT VT) const {
1884 return getRegisterTypeImpl(Context, VT, /*ForCallingConv=*/false);
1885 }
1886
1887 /// Return the number of registers that this ValueType will eventually
1888 /// require.
1889 ///
1890 /// This is one for any types promoted to live in larger registers, but may be
1891 /// more than one for types (like i64) that are split into pieces. For types
1892 /// like i140, which are first promoted then expanded, it is the number of
1893 /// registers needed to hold all the bits of the original type. For an i140
1894 /// on a 32 bit machine this means 5 registers.
1895 ///
1896 /// RegisterVT may be passed as a way to override the default settings, for
1897 /// instance with i128 inline assembly operands on SystemZ.
1898 virtual unsigned
1900 std::optional<MVT> RegisterVT = std::nullopt) const {
1901 return getNumRegistersImpl(Context, VT, /*ForCallingConv=*/false);
1902 }
1903
1904 /// Certain combinations of ABIs, Targets and features require that types
1905 /// are legal for some operations and not for other operations.
1906 /// For MIPS all vector types must be passed through the integer register set.
1908 CallingConv::ID CC, EVT VT) const {
1909 return getRegisterTypeImpl(Context, VT, /*ForCallingConv=*/true);
1910 }
1911
1912 /// Certain targets require unusual breakdowns of certain types. For MIPS,
1913 /// this occurs when a vector type is used, as vector are passed through the
1914 /// integer register set.
1916 CallingConv::ID CC,
1917 EVT VT) const {
1918 return getNumRegistersImpl(Context, VT, /*ForCallingConv=*/true);
1919 }
1920
1921 /// Certain targets have context sensitive alignment requirements, where one
1922 /// type has the alignment requirement of another type.
1924 const DataLayout &DL) const {
1925 return DL.getABITypeAlign(ArgTy);
1926 }
1927
1928 /// If true, then instruction selection should seek to shrink the FP constant
1929 /// of the specified type to a smaller type in order to save space and / or
1930 /// reduce runtime.
1931 virtual bool ShouldShrinkFPConstant(EVT) const { return true; }
1932
1933 /// Return true if it is profitable to reduce a load to a smaller type.
1934 /// \p ByteOffset is only set if we know the pointer offset at compile time
1935 /// otherwise we should assume that additional pointer math is required.
1936 /// Example: (i16 (trunc (i32 (load x))) -> i16 load x
1937 /// Example: (i16 (trunc (srl (i32 (load x)), 16)) -> i16 load x+2
1939 SDNode *Load, ISD::LoadExtType ExtTy, EVT NewVT,
1940 std::optional<unsigned> ByteOffset = std::nullopt) const {
1941 // By default, assume that it is cheaper to extract a subvector from a wide
1942 // vector load rather than creating multiple narrow vector loads.
1943 if (NewVT.isVector() && !SDValue(Load, 0).hasOneUse())
1944 return false;
1945
1946 return true;
1947 }
1948
1949 /// Return true (the default) if it is profitable to remove a sext_inreg(x)
1950 /// where the sext is redundant, and use x directly.
1951 virtual bool shouldRemoveRedundantExtend(SDValue Op) const { return true; }
1952
1953 /// Indicates if any padding is guaranteed to go at the most significant bits
1954 /// when storing the type to memory and the type size isn't equal to the store
1955 /// size.
1957 return VT.isScalarInteger() && !VT.isByteSized();
1958 }
1959
1960 /// When splitting a value of the specified type into parts, does the Lo
1961 /// or Hi part come first? This usually follows the endianness, except
1962 /// for ppcf128, where the Hi part always comes first.
1964 return DL.isBigEndian() || VT == MVT::ppcf128;
1965 }
1966
1967 /// If true, the target has custom DAG combine transformations that it can
1968 /// perform for the specified node.
1970 assert(unsigned(NT >> 3) < std::size(TargetDAGCombineArray));
1971 return TargetDAGCombineArray[NT >> 3] & (1 << (NT&7));
1972 }
1973
1976 }
1977
1978 /// Returns the size of the platform's va_list object.
1979 virtual unsigned getVaListSizeInBits(const DataLayout &DL) const {
1980 return getPointerTy(DL).getSizeInBits();
1981 }
1982
1983 /// Get maximum # of store operations permitted for llvm.memset
1984 ///
1985 /// This function returns the maximum number of store operations permitted
1986 /// to replace a call to llvm.memset. The value is set by the target at the
1987 /// performance threshold for such a replacement. If OptSize is true,
1988 /// return the limit for functions that have OptSize attribute.
1989 unsigned getMaxStoresPerMemset(bool OptSize) const;
1990
1991 /// Get maximum # of store operations permitted for llvm.memcpy
1992 ///
1993 /// This function returns the maximum number of store operations permitted
1994 /// to replace a call to llvm.memcpy. The value is set by the target at the
1995 /// performance threshold for such a replacement. If OptSize is true,
1996 /// return the limit for functions that have OptSize attribute.
1997 unsigned getMaxStoresPerMemcpy(bool OptSize) const;
1998
1999 /// \brief Get maximum # of store operations to be glued together
2000 ///
2001 /// This function returns the maximum number of store operations permitted
2002 /// to glue together during lowering of llvm.memcpy. The value is set by
2003 // the target at the performance threshold for such a replacement.
2004 virtual unsigned getMaxGluedStoresPerMemcpy() const {
2006 }
2007
2008 /// Get maximum # of load operations permitted for memcmp
2009 ///
2010 /// This function returns the maximum number of load operations permitted
2011 /// to replace a call to memcmp. The value is set by the target at the
2012 /// performance threshold for such a replacement. If OptSize is true,
2013 /// return the limit for functions that have OptSize attribute.
2014 unsigned getMaxExpandSizeMemcmp(bool OptSize) const {
2016 }
2017
2018 /// Get maximum # of store operations permitted for llvm.memmove
2019 ///
2020 /// This function returns the maximum number of store operations permitted
2021 /// to replace a call to llvm.memmove. The value is set by the target at the
2022 /// performance threshold for such a replacement. If OptSize is true,
2023 /// return the limit for functions that have OptSize attribute.
2024 unsigned getMaxStoresPerMemmove(bool OptSize) const;
2025
2026 /// Determine if the target supports unaligned memory accesses.
2027 ///
2028 /// This function returns true if the target allows unaligned memory accesses
2029 /// of the specified type in the given address space. If true, it also returns
2030 /// a relative speed of the unaligned memory access in the last argument by
2031 /// reference. The higher the speed number the faster the operation comparing
2032 /// to a number returned by another such call. This is used, for example, in
2033 /// situations where an array copy/move/set is converted to a sequence of
2034 /// store operations. Its use helps to ensure that such replacements don't
2035 /// generate code that causes an alignment error (trap) on the target machine.
2037 EVT, unsigned AddrSpace = 0, Align Alignment = Align(1),
2039 unsigned * /*Fast*/ = nullptr) const {
2040 return false;
2041 }
2042
2043 /// LLT handling variant.
2045 LLT, unsigned AddrSpace = 0, Align Alignment = Align(1),
2047 unsigned * /*Fast*/ = nullptr) const {
2048 return false;
2049 }
2050
2051 /// This function returns true if the memory access is aligned or if the
2052 /// target allows this specific unaligned memory access. If the access is
2053 /// allowed, the optional final parameter returns a relative speed of the
2054 /// access (as defined by the target).
2055 bool allowsMemoryAccessForAlignment(
2056 LLVMContext &Context, const DataLayout &DL, EVT VT,
2057 unsigned AddrSpace = 0, Align Alignment = Align(1),
2059 unsigned *Fast = nullptr) const;
2060
2061 /// Return true if the memory access of this type is aligned or if the target
2062 /// allows this specific unaligned access for the given MachineMemOperand.
2063 /// If the access is allowed, the optional final parameter returns a relative
2064 /// speed of the access (as defined by the target).
2065 bool allowsMemoryAccessForAlignment(LLVMContext &Context,
2066 const DataLayout &DL, EVT VT,
2067 const MachineMemOperand &MMO,
2068 unsigned *Fast = nullptr) const;
2069
2070 /// Return true if the target supports a memory access of this type for the
2071 /// given address space and alignment. If the access is allowed, the optional
2072 /// final parameter returns the relative speed of the access (as defined by
2073 /// the target).
2074 virtual bool
2075 allowsMemoryAccess(LLVMContext &Context, const DataLayout &DL, EVT VT,
2076 unsigned AddrSpace = 0, Align Alignment = Align(1),
2078 unsigned *Fast = nullptr) const;
2079
2080 /// Return true if the target supports a memory access of this type for the
2081 /// given MachineMemOperand. If the access is allowed, the optional
2082 /// final parameter returns the relative access speed (as defined by the
2083 /// target).
2084 bool allowsMemoryAccess(LLVMContext &Context, const DataLayout &DL, EVT VT,
2085 const MachineMemOperand &MMO,
2086 unsigned *Fast = nullptr) const;
2087
2088 /// LLT handling variant.
2089 bool allowsMemoryAccess(LLVMContext &Context, const DataLayout &DL, LLT Ty,
2090 const MachineMemOperand &MMO,
2091 unsigned *Fast = nullptr) const;
2092
2093 /// Returns the target specific optimal type for load and store operations as
2094 /// a result of memset, memcpy, and memmove lowering.
2095 /// It returns EVT::Other if the type should be determined using generic
2096 /// target-independent logic.
2097 virtual EVT
2099 const AttributeList & /*FuncAttributes*/) const {
2100 return MVT::Other;
2101 }
2102
2103 /// LLT returning variant.
2104 virtual LLT
2106 const AttributeList & /*FuncAttributes*/) const {
2107 return LLT();
2108 }
2109
2110 /// Returns true if it's safe to use load / store of the specified type to
2111 /// expand memcpy / memset inline.
2112 ///
2113 /// This is mostly true for all types except for some special cases. For
2114 /// example, on X86 targets without SSE2 f64 load / store are done with fldl /
2115 /// fstpl which also does type conversion. Note the specified type doesn't
2116 /// have to be legal as the hook is used before type legalization.
2117 virtual bool isSafeMemOpType(MVT /*VT*/) const { return true; }
2118
2119 /// Return lower limit for number of blocks in a jump table.
2120 virtual unsigned getMinimumJumpTableEntries() const;
2121
2122 /// Return lower limit of the density in a jump table.
2123 unsigned getMinimumJumpTableDensity(bool OptForSize) const;
2124
2125 /// Return upper limit for number of entries in a jump table.
2126 /// Zero if no limit.
2127 unsigned getMaximumJumpTableSize() const;
2128
2129 virtual bool isJumpTableRelative() const;
2130
2131 /// Retuen the minimum of largest number of comparisons in BitTest.
2132 unsigned getMinimumBitTestCmps() const;
2133
2134 /// Return maximum known-legal store size, which can be guaranteed for
2135 /// scalable vectors.
2137 return MaximumLegalStoreInBits;
2138 }
2139
2140 /// If a physical register, this specifies the register that
2141 /// llvm.savestack/llvm.restorestack should save and restore.
2143 return StackPointerRegisterToSaveRestore;
2144 }
2145
2146 /// If a physical register, this returns the register that receives the
2147 /// exception address on entry to an EH pad.
2148 virtual Register
2150 const Constant *PersonalityFn) const {
2151 return Register();
2152 }
2153
2154 /// If a physical register, this returns the register that receives the
2155 /// exception typeid on entry to a landing pad.
2156 virtual Register
2158 const Constant *PersonalityFn) const {
2159 return Register();
2160 }
2161
2162 virtual bool needsFixedCatchObjects() const {
2163 reportFatalUsageError("Funclet EH is not implemented for this target");
2164 }
2165
2166 /// Return the minimum stack alignment of an argument.
2168 return MinStackArgumentAlignment;
2169 }
2170
2171 /// Return the minimum function alignment.
2172 Align getMinFunctionAlignment() const { return MinFunctionAlignment; }
2173
2174 /// Return the preferred function alignment.
2175 Align getPrefFunctionAlignment() const { return PrefFunctionAlignment; }
2176
2177 /// Return the preferred loop alignment.
2178 virtual Align getPrefLoopAlignment(MachineLoop *ML = nullptr) const;
2179
2180 /// Return the maximum amount of bytes allowed to be emitted when padding for
2181 /// alignment
2182 virtual unsigned
2183 getMaxPermittedBytesForAlignment(MachineBasicBlock *MBB) const;
2184
2185 /// Should loops be aligned even when the function is marked OptSize (but not
2186 /// MinSize).
2187 virtual bool alignLoopsWithOptSize() const { return false; }
2188
2189 /// If the target has a standard location for the stack protector guard,
2190 /// returns the address of that location. Otherwise, returns nullptr.
2191 /// DEPRECATED: please override useLoadStackGuardNode and customize
2192 /// LOAD_STACK_GUARD, or customize \@llvm.stackguard().
2193 virtual Value *getIRStackGuard(IRBuilderBase &IRB,
2194 const LibcallLoweringInfo &Libcalls) const;
2195
2196 /// Inserts necessary declarations for SSP (stack protection) purpose.
2197 /// Should be used only when getIRStackGuard returns nullptr.
2198 virtual void insertSSPDeclarations(Module &M,
2199 const LibcallLoweringInfo &Libcalls) const;
2200
2201 /// Return the variable that's previously inserted by insertSSPDeclarations,
2202 /// if any, otherwise return nullptr. Should be used only when
2203 /// getIRStackGuard returns nullptr.
2204 virtual Value *getSDagStackGuard(const Module &M,
2205 const LibcallLoweringInfo &Libcalls) const;
2206
2207 /// If this function returns true, stack protection checks should mix the
2208 /// frame pointer (or whichever pointer is used to address locals) into the
2209 /// stack guard value before checking it. getIRStackGuard must return nullptr
2210 /// if this returns true.
2211 virtual bool useStackGuardMixFP() const { return false; }
2212
2213 /// If the target has a standard stack protection check function that
2214 /// performs validation and error handling, returns the function. Otherwise,
2215 /// returns nullptr. Must be previously inserted by insertSSPDeclarations.
2216 /// Should be used only when getIRStackGuard returns nullptr.
2217 Function *getSSPStackGuardCheck(const Module &M,
2218 const LibcallLoweringInfo &Libcalls) const;
2219
2220protected:
2221 Value *getDefaultSafeStackPointerLocation(IRBuilderBase &IRB,
2222 bool UseTLS) const;
2223
2224public:
2225 /// Returns the target-specific address of the unsafe stack pointer.
2226 virtual Value *
2227 getSafeStackPointerLocation(IRBuilderBase &IRB,
2228 const LibcallLoweringInfo &Libcalls) const;
2229
2230 /// Returns the name of the symbol used to emit stack probes or the empty
2231 /// string if not applicable.
2232 virtual bool hasStackProbeSymbol(const MachineFunction &MF) const { return false; }
2233
2234 virtual bool hasInlineStackProbe(const MachineFunction &MF) const { return false; }
2235
2237 return "";
2238 }
2239
2240 /// Returns true if a cast from SrcAS to DestAS is "cheap", such that e.g. we
2241 /// are happy to sink it into basic blocks. A cast may be free, but not
2242 /// necessarily a no-op. e.g. a free truncate from a 64-bit to 32-bit pointer.
2243 virtual bool isFreeAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const;
2244
2245 /// Return true if the pointer arguments to CI should be aligned by aligning
2246 /// the object whose address is being passed. If so then MinSize is set to the
2247 /// minimum size the object must be to be aligned and PrefAlign is set to the
2248 /// preferred alignment.
2249 virtual bool shouldAlignPointerArgs(CallInst * /*CI*/, unsigned & /*MinSize*/,
2250 Align & /*PrefAlign*/) const {
2251 return false;
2252 }
2253
2254 //===--------------------------------------------------------------------===//
2255 /// \name Helpers for TargetTransformInfo implementations
2256 /// @{
2257
2258 /// Get the ISD node that corresponds to the Instruction class opcode.
2259 int InstructionOpcodeToISD(unsigned Opcode) const;
2260
2261 /// Get the ISD node that corresponds to the Intrinsic ID. Returns
2262 /// ISD::DELETED_NODE by default for an unsupported Intrinsic ID.
2263 int IntrinsicIDToISD(Intrinsic::ID ID) const;
2264
2265 /// @}
2266
2267 //===--------------------------------------------------------------------===//
2268 /// \name Helpers for atomic expansion.
2269 /// @{
2270
2271 /// Returns the maximum atomic operation size (in bits) supported by
2272 /// the backend. Atomic operations greater than this size (as well
2273 /// as ones that are not naturally aligned), will be expanded by
2274 /// AtomicExpandPass into an __atomic_* library call.
2276 return MaxAtomicSizeInBitsSupported;
2277 }
2278
2279 /// Returns the size in bits of the maximum div/rem the backend supports.
2280 /// Larger operations will be expanded by ExpandIRInsts.
2282 return MaxDivRemBitWidthSupported;
2283 }
2284
2285 /// Returns the size in bits of the maximum fp to/from int conversion the
2286 /// backend supports. Larger operations will be expanded by ExpandIRInsts.
2288 return MaxLargeFPConvertBitWidthSupported;
2289 }
2290
2291 /// Returns the size of the smallest cmpxchg or ll/sc instruction
2292 /// the backend supports. Any smaller operations are widened in
2293 /// AtomicExpandPass.
2294 ///
2295 /// Note that *unlike* operations above the maximum size, atomic ops
2296 /// are still natively supported below the minimum; they just
2297 /// require a more complex expansion.
2298 unsigned getMinCmpXchgSizeInBits() const { return MinCmpXchgSizeInBits; }
2299
2300 /// Return true if the target supports an atomic access of \p SizeInBytes
2301 /// bytes at the given \p Alignment. The default implementation only allows
2302 /// naturally aligned atomics, unless setSupportsUnalignedAtomics(true) was
2303 /// called.
2304 virtual bool isAtomicAlignmentSupported(Align Alignment,
2305 uint64_t SizeInBytes) const {
2306 return SupportsUnalignedAtomics || Alignment.value() >= SizeInBytes;
2307 }
2308
2309 /// Whether AtomicExpandPass should automatically insert fences and reduce
2310 /// ordering for this atomic. This should be true for most architectures with
2311 /// weak memory ordering. Defaults to false.
2312 virtual bool shouldInsertFencesForAtomic(const Instruction *I) const {
2313 return false;
2314 }
2315
2316 /// Whether AtomicExpandPass should automatically insert a seq_cst trailing
2317 /// fence without reducing the ordering for this atomic store. Defaults to
2318 /// false.
2319 virtual bool
2321 return false;
2322 }
2323
2324 // The memory ordering that AtomicExpandPass should assign to a atomic
2325 // instruction that it has lowered by adding fences. This can be used
2326 // to "fold" one of the fences into the atomic instruction.
2327 virtual AtomicOrdering
2331
2332 // Whether to issue an atomic load for the initial word value before the
2333 // atomicrmw/cmpxchg emulation loop.
2334 // TODO: For correctness, an atomic load should be issued for all targets.
2335 // Remove this API once this is achieved
2337 return true;
2338 }
2339
2340 /// Perform a load-linked operation on Addr, returning a "Value *" with the
2341 /// corresponding pointee type. This may entail some non-trivial operations to
2342 /// truncate or reconstruct types that will be illegal in the backend. See
2343 /// ARMISelLowering for an example implementation.
2344 virtual Value *emitLoadLinked(IRBuilderBase &Builder, Type *ValueTy,
2345 Value *Addr, AtomicOrdering Ord) const {
2346 llvm_unreachable("Load linked unimplemented on this target");
2347 }
2348
2349 /// Perform a store-conditional operation to Addr. Return the status of the
2350 /// store. This should be 0 if the store succeeded, non-zero otherwise.
2352 Value *Addr, AtomicOrdering Ord) const {
2353 llvm_unreachable("Store conditional unimplemented on this target");
2354 }
2355
2356 /// Perform a masked atomicrmw using a target-specific intrinsic. This
2357 /// represents the core LL/SC loop which will be lowered at a late stage by
2358 /// the backend. The target-specific intrinsic returns the loaded value and
2359 /// is not responsible for masking and shifting the result.
2361 AtomicRMWInst *AI,
2362 Value *AlignedAddr, Value *Incr,
2363 Value *Mask, Value *ShiftAmt,
2364 AtomicOrdering Ord) const {
2365 llvm_unreachable("Masked atomicrmw expansion unimplemented on this target");
2366 }
2367
2368 /// Perform a atomicrmw expansion using a target-specific way. This is
2369 /// expected to be called when masked atomicrmw and bit test atomicrmw don't
2370 /// work, and the target supports another way to lower atomicrmw.
2371 virtual void emitExpandAtomicRMW(AtomicRMWInst *AI) const {
2373 "Generic atomicrmw expansion unimplemented on this target");
2374 }
2375
2376 /// Perform a atomic store using a target-specific way.
2377 virtual void emitExpandAtomicStore(StoreInst *SI) const {
2379 "Generic atomic store expansion unimplemented on this target");
2380 }
2381
2382 /// Perform a atomic load using a target-specific way.
2383 virtual void emitExpandAtomicLoad(LoadInst *LI) const {
2385 "Generic atomic load expansion unimplemented on this target");
2386 }
2387
2388 /// Perform a cmpxchg expansion using a target-specific method.
2390 llvm_unreachable("Generic cmpxchg expansion unimplemented on this target");
2391 }
2392
2393 /// Perform a bit test atomicrmw using a target-specific intrinsic. This
2394 /// represents the combined bit test intrinsic which will be lowered at a late
2395 /// stage by the backend.
2398 "Bit test atomicrmw expansion unimplemented on this target");
2399 }
2400
2401 /// Perform a atomicrmw which the result is only used by comparison, using a
2402 /// target-specific intrinsic. This represents the combined atomic and compare
2403 /// intrinsic which will be lowered at a late stage by the backend.
2406 "Compare arith atomicrmw expansion unimplemented on this target");
2407 }
2408
2409 /// Perform a masked cmpxchg using a target-specific intrinsic. This
2410 /// represents the core LL/SC loop which will be lowered at a late stage by
2411 /// the backend. The target-specific intrinsic returns the loaded value and
2412 /// is not responsible for masking and shifting the result.
2414 IRBuilderBase &Builder, AtomicCmpXchgInst *CI, Value *AlignedAddr,
2415 Value *CmpVal, Value *NewVal, Value *Mask, AtomicOrdering Ord) const {
2416 llvm_unreachable("Masked cmpxchg expansion unimplemented on this target");
2417 }
2418
2419 //===--------------------------------------------------------------------===//
2420 /// \name KCFI check lowering.
2421 /// @{
2422
2425 const TargetInstrInfo *TII) const {
2426 llvm_unreachable("KCFI is not supported on this target");
2427 }
2428
2429 /// @}
2430
2431 /// Inserts in the IR a target-specific intrinsic specifying a fence.
2432 /// It is called by AtomicExpandPass before expanding an
2433 /// AtomicRMW/AtomicCmpXchg/AtomicStore/AtomicLoad
2434 /// if shouldInsertFencesForAtomic returns true.
2435 ///
2436 /// Inst is the original atomic instruction, prior to other expansions that
2437 /// may be performed.
2438 ///
2439 /// This function should either return a nullptr, or a pointer to an IR-level
2440 /// Instruction*. Even complex fence sequences can be represented by a
2441 /// single Instruction* through an intrinsic to be lowered later.
2442 ///
2443 /// The default implementation emits an IR fence before any release (or
2444 /// stronger) operation that stores, and after any acquire (or stronger)
2445 /// operation. This is generally a correct implementation, but backends may
2446 /// override if they wish to use alternative schemes (e.g. the PowerPC
2447 /// standard ABI uses a fence before a seq_cst load instead of after a
2448 /// seq_cst store).
2449 /// @{
2450 virtual Instruction *emitLeadingFence(IRBuilderBase &Builder,
2451 Instruction *Inst,
2452 AtomicOrdering Ord) const;
2453
2454 virtual Instruction *emitTrailingFence(IRBuilderBase &Builder,
2455 Instruction *Inst,
2456 AtomicOrdering Ord) const;
2457 /// @}
2458
2459 // Emits code that executes when the comparison result in the ll/sc
2460 // expansion of a cmpxchg instruction is such that the store-conditional will
2461 // not execute. This makes it possible to balance out the load-linked with
2462 // a dedicated instruction, if desired.
2463 // E.g., on ARM, if ldrex isn't followed by strex, the exclusive monitor would
2464 // be unnecessarily held, except if clrex, inserted by this hook, is executed.
2465 virtual void emitAtomicCmpXchgNoStoreLLBalance(IRBuilderBase &Builder) const {}
2466
2467 /// Returns true if arguments should be sign-extended in lib calls.
2468 virtual bool shouldSignExtendTypeInLibCall(Type *Ty, bool IsSigned) const {
2469 return IsSigned;
2470 }
2471
2472 /// Returns true if arguments should be extended in lib calls.
2473 virtual bool shouldExtendTypeInLibCall(EVT Type) const {
2474 return true;
2475 }
2476
2477 /// Returns how the given (atomic) load should be expanded by the
2478 /// IR-level AtomicExpand pass.
2482
2483 /// Returns how the given (atomic) load should be cast by the IR-level
2484 /// AtomicExpand pass.
2490
2491 /// Returns how the given (atomic) store should be expanded by the IR-level
2492 /// AtomicExpand pass into. For instance AtomicExpansionKind::CustomExpand
2493 /// will try to use an atomicrmw xchg.
2497
2498 /// Returns how the given (atomic) store should be cast by the IR-level
2499 /// AtomicExpand pass into. For instance AtomicExpansionKind::CastToInteger
2500 /// will try to cast the operands to integer values.
2502 if (SI->getValueOperand()->getType()->isFloatingPointTy())
2505 }
2506
2507 /// Returns how the given atomic cmpxchg should be expanded by the IR-level
2508 /// AtomicExpand pass.
2509 virtual AtomicExpansionKind
2513
2514 /// Returns how the IR-level AtomicExpand pass should expand the given
2515 /// AtomicRMW, if at all. Default is to never expand.
2516 virtual AtomicExpansionKind
2518 if (RMW->isFloatingPointOperation())
2520 if (RMW->getType()->isVectorTy())
2523 }
2524
2525 /// Returns how the given atomic atomicrmw should be cast by the IR-level
2526 /// AtomicExpand pass.
2527 virtual AtomicExpansionKind
2529 Type *ValTy = RMWI->getValOperand()->getType();
2530 if (RMWI->getOperation() == AtomicRMWInst::Xchg &&
2531 (ValTy->isFloatingPointTy() || ValTy->isPointerTy() ||
2532 ValTy->isVectorTy()))
2534
2536 }
2537
2538 /// On some platforms, an AtomicRMW that never actually modifies the value
2539 /// (such as fetch_add of 0) can be turned into a fence followed by an
2540 /// atomic load. This may sound useless, but it makes it possible for the
2541 /// processor to keep the cacheline shared, dramatically improving
2542 /// performance. And such idempotent RMWs are useful for implementing some
2543 /// kinds of locks, see for example (justification + benchmarks):
2544 /// http://www.hpl.hp.com/techreports/2012/HPL-2012-68.pdf
2545 /// This method tries doing that transformation, returning the atomic load if
2546 /// it succeeds, and nullptr otherwise.
2547 /// If shouldExpandAtomicLoadInIR returns true on that load, it will undergo
2548 /// another round of expansion.
2549 virtual LoadInst *
2551 return nullptr;
2552 }
2553
2554 /// Returns how the platform's atomic operations are extended (ZERO_EXTEND,
2555 /// SIGN_EXTEND, or ANY_EXTEND).
2557 return ISD::ZERO_EXTEND;
2558 }
2559
2560 /// Returns how the platform's atomic compare and swap expects its comparison
2561 /// value to be extended (ZERO_EXTEND, SIGN_EXTEND, or ANY_EXTEND). This is
2562 /// separate from getExtendForAtomicOps, which is concerned with the
2563 /// sign-extension of the instruction's output, whereas here we are concerned
2564 /// with the sign-extension of the input. For targets with compare-and-swap
2565 /// instructions (or sub-word comparisons in their LL/SC loop expansions),
2566 /// the input can be ANY_EXTEND, but the output will still have a specific
2567 /// extension.
2569 return ISD::ANY_EXTEND;
2570 }
2571
2572 /// Returns how the platform's atomic rmw operations expect their input
2573 /// argument to be extended (ZERO_EXTEND, SIGN_EXTEND, or ANY_EXTEND).
2575 return ISD::ANY_EXTEND;
2576 }
2577
2578 /// @}
2579
2580 /// Returns true if we should normalize
2581 /// select(N0&N1, X, Y) => select(N0, select(N1, X, Y), Y) and
2582 /// select(N0|N1, X, Y) => select(N0, select(N1, X, Y, Y)) if it is likely
2583 /// that it saves us from materializing N0 and N1 in an integer register.
2584 /// Targets that are able to perform and/or on flags should return false here.
2585 /// \p VT is the type of the select (and X and Y). \p CCVT is the type of its
2586 /// condition (N0 and N1).
2588 EVT CCVT) const {
2589 // If a target has multiple condition registers, then it likely has logical
2590 // operations on those registers.
2592 return false;
2593 // Only do the transform if the value won't be split into multiple
2594 // registers.
2595 LegalizeTypeAction Action = getTypeAction(Context, VT);
2596 return Action != TypeExpandInteger && Action != TypeExpandFloat &&
2597 Action != TypeSplitVector;
2598 }
2599
2600 virtual bool isProfitableToCombineMinNumMaxNum(EVT VT) const { return true; }
2601
2602 /// Return true if a select of constants (select Cond, C1, C2) should be
2603 /// transformed into simple math ops with the condition value. For example:
2604 /// select Cond, C1, C1-1 --> add (zext Cond), C1-1
2605 virtual bool convertSelectOfConstantsToMath(EVT VT) const {
2606 return false;
2607 }
2608
2609 /// Return true if it is profitable to transform an integer
2610 /// multiplication-by-constant into simpler operations like shifts and adds.
2611 /// This may be true if the target does not directly support the
2612 /// multiplication operation for the specified type or the sequence of simpler
2613 /// ops is faster than the multiply.
2615 EVT VT, SDValue C) const {
2616 return false;
2617 }
2618
2619 /// Return true if it may be profitable to transform
2620 /// (mul (add x, c1), c2) -> (add (mul x, c2), c1*c2).
2621 /// This may not be true if c1 and c2 can be represented as immediates but
2622 /// c1*c2 cannot, for example.
2623 /// The target should check if c1, c2 and c1*c2 can be represented as
2624 /// immediates, or have to be materialized into registers. If it is not sure
2625 /// about some cases, a default true can be returned to let the DAGCombiner
2626 /// decide.
2627 /// AddNode is (add x, c1), and ConstNode is c2.
2629 SDValue ConstNode) const {
2630 return true;
2631 }
2632
2633 /// Return true if it is more correct/profitable to use strict FP_TO_INT
2634 /// conversion operations - canonicalizing the FP source value instead of
2635 /// converting all cases and then selecting based on value.
2636 /// This may be true if the target throws exceptions for out of bounds
2637 /// conversions or has fast FP CMOV.
2638 virtual bool shouldUseStrictFP_TO_INT(EVT FpVT, EVT IntVT,
2639 bool IsSigned) const {
2640 return false;
2641 }
2642
2643 /// Return true if it is beneficial to expand an @llvm.powi.* intrinsic.
2644 /// If not optimizing for size, expanding @llvm.powi.* intrinsics is always
2645 /// considered beneficial.
2646 /// If optimizing for size, expansion is only considered beneficial for upto
2647 /// 5 multiplies and a divide (if the exponent is negative).
2648 bool isBeneficialToExpandPowI(int64_t Exponent, bool OptForSize) const {
2649 if (Exponent < 0)
2650 Exponent = -Exponent;
2651 uint64_t E = static_cast<uint64_t>(Exponent);
2652 return !OptForSize || (llvm::popcount(E) + Log2_64(E) < 7);
2653 }
2654
2655 //===--------------------------------------------------------------------===//
2656 // TargetLowering Configuration Methods - These methods should be invoked by
2657 // the derived class constructor to configure this object for the target.
2658 //
2659protected:
2660 /// Specify how the target extends the result of integer and floating point
2661 /// boolean values from i1 to a wider type. See getBooleanContents.
2663 BooleanContents = Ty;
2664 BooleanFloatContents = Ty;
2665 }
2666
2667 /// Specify how the target extends the result of integer and floating point
2668 /// boolean values from i1 to a wider type. See getBooleanContents.
2670 BooleanContents = IntTy;
2671 BooleanFloatContents = FloatTy;
2672 }
2673
2674 /// Specify how the target extends the result of a vector boolean value from a
2675 /// vector of i1 to a wider type. See getBooleanContents.
2677 BooleanVectorContents = Ty;
2678 }
2679
2680 /// Specify the target scheduling preference.
2682 SchedPreferenceInfo = Pref;
2683 }
2684
2685 /// Indicate the minimum number of blocks to generate jump tables.
2686 void setMinimumJumpTableEntries(unsigned Val);
2687
2688 /// Indicate the maximum number of entries in jump tables.
2689 /// Set to zero to generate unlimited jump tables.
2690 void setMaximumJumpTableSize(unsigned);
2691
2692 /// Set the minimum of largest of number of comparisons to generate BitTest.
2693 void setMinimumBitTestCmps(unsigned Val);
2694
2695 /// If set to a physical register, this specifies the register that
2696 /// llvm.savestack/llvm.restorestack should save and restore.
2698 StackPointerRegisterToSaveRestore = R;
2699 }
2700
2701 /// Tells the code generator that the target has BitExtract instructions.
2702 /// The code generator will aggressively sink "shift"s into the blocks of
2703 /// their users if the users will generate "and" instructions which can be
2704 /// combined with "shift" to BitExtract instructions.
2705 void setHasExtractBitsInsn(bool hasExtractInsn = true) {
2706 HasExtractBitsInsn = hasExtractInsn;
2707 }
2708
2709 /// Tells the code generator not to expand logic operations on comparison
2710 /// predicates into separate sequences that increase the amount of flow
2711 /// control.
2712 void setJumpIsExpensive(bool isExpensive = true);
2713
2714 /// Tells the code generator which bitwidths to bypass.
2715 void addBypassSlowDiv(unsigned int SlowBitWidth, unsigned int FastBitWidth) {
2716 BypassSlowDivWidths[SlowBitWidth] = FastBitWidth;
2717 }
2718
2719 /// Add the specified register class as an available regclass for the
2720 /// specified value type. This indicates the selector can handle values of
2721 /// that class natively.
2723 assert((unsigned)VT.SimpleTy < std::size(RegClassForVT));
2724 RegClassForVT[VT.SimpleTy] = RC;
2725 }
2726
2727 /// Return the largest legal super-reg register class of the register class
2728 /// for the specified type and its associated "cost".
2729 virtual std::pair<const TargetRegisterClass *, uint8_t>
2730 findRepresentativeClass(const TargetRegisterInfo *TRI, MVT VT) const;
2731
2732 /// Once all of the register classes are added, this allows us to compute
2733 /// derived properties we expose.
2734 void computeRegisterProperties(const TargetRegisterInfo *TRI);
2735
2736 /// Indicate that the specified operation does not work with the specified
2737 /// type and indicate what to do about it. Note that VT may refer to either
2738 /// the type of a result or that of an operand of Op.
2739 void setOperationAction(unsigned Op, MVT VT, LegalizeAction Action) {
2740 assert(Op < std::size(OpActions[0]) && "Table isn't big enough!");
2741 OpActions[(unsigned)VT.SimpleTy][Op] = Action;
2742 }
2744 LegalizeAction Action) {
2745 for (auto Op : Ops)
2746 setOperationAction(Op, VT, Action);
2747 }
2749 LegalizeAction Action) {
2750 for (auto VT : VTs)
2751 setOperationAction(Ops, VT, Action);
2752 }
2753
2754 /// Indicate that the specified load with extension does not work with the
2755 /// specified type and indicate what to do about it.
2756 void setLoadExtAction(unsigned ExtType, MVT ValVT, MVT MemVT,
2757 LegalizeAction Action) {
2758 assert(ExtType < ISD::LAST_LOADEXT_TYPE && ValVT.isValid() &&
2759 MemVT.isValid() && "Table isn't big enough!");
2760 assert((unsigned)Action < 0x10 && "too many bits for bitfield array");
2761 unsigned Shift = 4 * ExtType;
2762 LoadExtActions[ValVT.SimpleTy][MemVT.SimpleTy] &= ~((uint16_t)0xF << Shift);
2763 LoadExtActions[ValVT.SimpleTy][MemVT.SimpleTy] |= (uint16_t)Action << Shift;
2764 }
2765 void setLoadExtAction(ArrayRef<unsigned> ExtTypes, MVT ValVT, MVT MemVT,
2766 LegalizeAction Action) {
2767 for (auto ExtType : ExtTypes)
2768 setLoadExtAction(ExtType, ValVT, MemVT, Action);
2769 }
2771 ArrayRef<MVT> MemVTs, LegalizeAction Action) {
2772 for (auto MemVT : MemVTs)
2773 setLoadExtAction(ExtTypes, ValVT, MemVT, Action);
2774 }
2775
2776 /// Let target indicate that an extending atomic load of the specified type
2777 /// is legal.
2778 void setAtomicLoadExtAction(unsigned ExtType, MVT ValVT, MVT MemVT,
2779 LegalizeAction Action) {
2780 assert(ExtType < ISD::LAST_LOADEXT_TYPE && ValVT.isValid() &&
2781 MemVT.isValid() && "Table isn't big enough!");
2782 assert((unsigned)Action < 0x10 && "too many bits for bitfield array");
2783 unsigned Shift = 4 * ExtType;
2784 AtomicLoadExtActions[ValVT.SimpleTy][MemVT.SimpleTy] &=
2785 ~((uint16_t)0xF << Shift);
2786 AtomicLoadExtActions[ValVT.SimpleTy][MemVT.SimpleTy] |=
2787 ((uint16_t)Action << Shift);
2788 }
2790 LegalizeAction Action) {
2791 for (auto ExtType : ExtTypes)
2792 setAtomicLoadExtAction(ExtType, ValVT, MemVT, Action);
2793 }
2795 ArrayRef<MVT> MemVTs, LegalizeAction Action) {
2796 for (auto MemVT : MemVTs)
2797 setAtomicLoadExtAction(ExtTypes, ValVT, MemVT, Action);
2798 }
2799
2800 /// Indicate that the specified truncating store does not work with the
2801 /// specified type and indicate what to do about it.
2802 void setTruncStoreAction(MVT ValVT, MVT MemVT, LegalizeAction Action) {
2803 assert(ValVT.isValid() && MemVT.isValid() && "Table isn't big enough!");
2804 TruncStoreActions[(unsigned)ValVT.SimpleTy][MemVT.SimpleTy] = Action;
2805 }
2806
2807 /// Indicate that the specified indexed load does or does not work with the
2808 /// specified type and indicate what to do abort it.
2809 ///
2810 /// NOTE: All indexed mode loads are initialized to Expand in
2811 /// TargetLowering.cpp
2813 LegalizeAction Action) {
2814 for (auto IdxMode : IdxModes)
2815 setIndexedModeAction(IdxMode, VT, IMAB_Load, Action);
2816 }
2817
2819 LegalizeAction Action) {
2820 for (auto VT : VTs)
2821 setIndexedLoadAction(IdxModes, VT, Action);
2822 }
2823
2824 /// Indicate that the specified indexed store does or does not work with the
2825 /// specified type and indicate what to do about it.
2826 ///
2827 /// NOTE: All indexed mode stores are initialized to Expand in
2828 /// TargetLowering.cpp
2830 LegalizeAction Action) {
2831 for (auto IdxMode : IdxModes)
2832 setIndexedModeAction(IdxMode, VT, IMAB_Store, Action);
2833 }
2834
2836 LegalizeAction Action) {
2837 for (auto VT : VTs)
2838 setIndexedStoreAction(IdxModes, VT, Action);
2839 }
2840
2841 /// Indicate that the specified indexed masked load does or does not work with
2842 /// the specified type and indicate what to do about it.
2843 ///
2844 /// NOTE: All indexed mode masked loads are initialized to Expand in
2845 /// TargetLowering.cpp
2846 void setIndexedMaskedLoadAction(unsigned IdxMode, MVT VT,
2847 LegalizeAction Action) {
2848 setIndexedModeAction(IdxMode, VT, IMAB_MaskedLoad, Action);
2849 }
2850
2851 /// Indicate that the specified indexed masked store does or does not work
2852 /// with the specified type and indicate what to do about it.
2853 ///
2854 /// NOTE: All indexed mode masked stores are initialized to Expand in
2855 /// TargetLowering.cpp
2856 void setIndexedMaskedStoreAction(unsigned IdxMode, MVT VT,
2857 LegalizeAction Action) {
2858 setIndexedModeAction(IdxMode, VT, IMAB_MaskedStore, Action);
2859 }
2860
2861 /// Indicate that the specified condition code is or isn't supported on the
2862 /// target and indicate what to do about it.
2864 LegalizeAction Action) {
2865 for (auto CC : CCs) {
2866 assert(VT.isValid() && (unsigned)CC < std::size(CondCodeActions) &&
2867 "Table isn't big enough!");
2868 assert((unsigned)Action < 0x10 && "too many bits for bitfield array");
2869 /// The lower 3 bits of the SimpleTy index into Nth 4bit set from the
2870 /// 32-bit value and the upper 29 bits index into the second dimension of
2871 /// the array to select what 32-bit value to use.
2872 uint32_t Shift = 4 * (VT.SimpleTy & 0x7);
2873 CondCodeActions[CC][VT.SimpleTy >> 3] &= ~((uint32_t)0xF << Shift);
2874 CondCodeActions[CC][VT.SimpleTy >> 3] |= (uint32_t)Action << Shift;
2875 }
2876 }
2878 LegalizeAction Action) {
2879 for (auto VT : VTs)
2880 setCondCodeAction(CCs, VT, Action);
2881 }
2882
2883 /// Indicate how a PARTIAL_REDUCE_U/SMLA node with Acc type AccVT and Input
2884 /// type InputVT should be treated by the target. Either it's legal, needs to
2885 /// be promoted to a larger size, needs to be expanded to some other code
2886 /// sequence, or the target has a custom expander for it.
2887 void setPartialReduceMLAAction(unsigned Opc, MVT AccVT, MVT InputVT,
2888 LegalizeAction Action) {
2891 assert(AccVT.isValid() && InputVT.isValid() &&
2892 "setPartialReduceMLAAction types aren't valid");
2893 PartialReduceActionTypes Key = {Opc, AccVT.SimpleTy, InputVT.SimpleTy};
2894 PartialReduceMLAActions[Key] = Action;
2895 }
2897 MVT InputVT, LegalizeAction Action) {
2898 for (unsigned Opc : Opcodes)
2899 setPartialReduceMLAAction(Opc, AccVT, InputVT, Action);
2900 }
2901
2902 /// Indicate how a VECTOR_INTERLEAVE or VECTOR_DEINTERLEAVE node with the
2903 /// given interleave factor Factor and type VT should be treated.
2904 void setVectorInterleaveAction(unsigned Opc, unsigned Factor, MVT VT,
2905 LegalizeAction Action) {
2907 VectorInterleaveActionKey Key = {Opc, Factor, VT.SimpleTy};
2908 VectorInterleaveActions[Key] = Action;
2909 }
2910
2912 ArrayRef<unsigned> Factors, MVT VT,
2913 LegalizeAction Action) {
2914 for (unsigned Opc : Opcodes)
2915 for (unsigned Factor : Factors)
2916 setVectorInterleaveAction(Opc, Factor, VT, Action);
2917 }
2918
2919 /// If Opc/OrigVT is specified as being promoted, the promotion code defaults
2920 /// to trying a larger integer/fp until it can find one that works. If that
2921 /// default is insufficient, this method can be used by the target to override
2922 /// the default.
2923 void AddPromotedToType(unsigned Opc, MVT OrigVT, MVT DestVT) {
2924 PromoteToType[std::make_pair(Opc, OrigVT.SimpleTy)] = DestVT.SimpleTy;
2925 }
2926
2927 /// Convenience method to set an operation to Promote and specify the type
2928 /// in a single call.
2929 void setOperationPromotedToType(unsigned Opc, MVT OrigVT, MVT DestVT) {
2930 setOperationAction(Opc, OrigVT, Promote);
2931 AddPromotedToType(Opc, OrigVT, DestVT);
2932 }
2934 MVT DestVT) {
2935 for (auto Op : Ops) {
2936 setOperationAction(Op, OrigVT, Promote);
2937 AddPromotedToType(Op, OrigVT, DestVT);
2938 }
2939 }
2940
2941 /// Targets should invoke this method for each target independent node that
2942 /// they want to provide a custom DAG combiner for by implementing the
2943 /// PerformDAGCombine virtual method.
2945 for (auto NT : NTs) {
2946 assert(unsigned(NT >> 3) < std::size(TargetDAGCombineArray));
2947 TargetDAGCombineArray[NT >> 3] |= 1 << (NT & 7);
2948 }
2949 }
2950
2951 /// Set the target's minimum function alignment.
2953 MinFunctionAlignment = Alignment;
2954 }
2955
2956 /// Set the target's preferred function alignment. This should be set if
2957 /// there is a performance benefit to higher-than-minimum alignment
2959 PrefFunctionAlignment = Alignment;
2960 }
2961
2962 /// Set the target's preferred loop alignment. Default alignment is one, it
2963 /// means the target does not care about loop alignment. The target may also
2964 /// override getPrefLoopAlignment to provide per-loop values.
2965 void setPrefLoopAlignment(Align Alignment) { PrefLoopAlignment = Alignment; }
2966 void setMaxBytesForAlignment(unsigned MaxBytes) {
2967 MaxBytesForAlignment = MaxBytes;
2968 }
2969
2970 /// Set the minimum stack alignment of an argument.
2972 MinStackArgumentAlignment = Alignment;
2973 }
2974
2975 /// Set the maximum atomic operation size supported by the
2976 /// backend. Atomic operations greater than this size (as well as
2977 /// ones that are not naturally aligned), will be expanded by
2978 /// AtomicExpandPass into an __atomic_* library call.
2979 void setMaxAtomicSizeInBitsSupported(unsigned SizeInBits) {
2980 MaxAtomicSizeInBitsSupported = SizeInBits;
2981 }
2982
2983 /// Set the size in bits of the maximum div/rem the backend supports.
2984 /// Larger operations will be expanded by ExpandIRInsts.
2985 void setMaxDivRemBitWidthSupported(unsigned SizeInBits) {
2986 MaxDivRemBitWidthSupported = SizeInBits;
2987 }
2988
2989 /// Set the size in bits of the maximum fp to/from int conversion the backend
2990 /// supports. Larger operations will be expanded by ExpandIRInsts.
2991 void setMaxLargeFPConvertBitWidthSupported(unsigned SizeInBits) {
2992 MaxLargeFPConvertBitWidthSupported = SizeInBits;
2993 }
2994
2995 /// Sets the minimum cmpxchg or ll/sc size supported by the backend.
2996 void setMinCmpXchgSizeInBits(unsigned SizeInBits) {
2997 MinCmpXchgSizeInBits = SizeInBits;
2998 }
2999
3000 /// Sets whether unaligned atomic operations are supported.
3001 void setSupportsUnalignedAtomics(bool UnalignedSupported) {
3002 SupportsUnalignedAtomics = UnalignedSupported;
3003 }
3004
3005public:
3006 //===--------------------------------------------------------------------===//
3007 // Addressing mode description hooks (used by LSR etc).
3008 //
3009
3010 /// CodeGenPrepare sinks address calculations into the same BB as Load/Store
3011 /// instructions reading the address. This allows as much computation as
3012 /// possible to be done in the address mode for that operand. This hook lets
3013 /// targets also pass back when this should be done on intrinsics which
3014 /// load/store.
3015 virtual bool getAddrModeArguments(const IntrinsicInst * /*I*/,
3016 SmallVectorImpl<Value *> & /*Ops*/,
3017 Type *& /*AccessTy*/) const {
3018 return false;
3019 }
3020
3021 /// This represents an addressing mode of:
3022 /// BaseGV + BaseOffs + BaseReg + Scale*ScaleReg + ScalableOffset*vscale
3023 /// If BaseGV is null, there is no BaseGV.
3024 /// If BaseOffs is zero, there is no base offset.
3025 /// If HasBaseReg is false, there is no base register.
3026 /// If Scale is zero, there is no ScaleReg. Scale of 1 indicates a reg with
3027 /// no scale.
3028 /// If ScalableOffset is zero, there is no scalable offset.
3029 struct AddrMode {
3031 int64_t BaseOffs = 0;
3032 bool HasBaseReg = false;
3033 int64_t Scale = 0;
3034 int64_t ScalableOffset = 0;
3035 AddrMode() = default;
3036 };
3037
3038 /// Return true if the addressing mode represented by AM is legal for this
3039 /// target, for a load/store of the specified type.
3040 ///
3041 /// The type may be VoidTy, in which case only return true if the addressing
3042 /// mode is legal for a load/store of any legal type. TODO: Handle
3043 /// pre/postinc as well.
3044 ///
3045 /// If the address space cannot be determined, it will be -1.
3046 ///
3047 /// TODO: Remove default argument
3048 virtual bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM,
3049 Type *Ty, unsigned AddrSpace,
3050 Instruction *I = nullptr) const;
3051
3052 /// Returns true if the targets addressing mode can target thread local
3053 /// storage (TLS).
3054 virtual bool addressingModeSupportsTLS(const GlobalValue &) const {
3055 return false;
3056 }
3057
3058 /// Return the prefered common base offset.
3059 virtual int64_t getPreferredLargeGEPBaseOffset(int64_t MinOffset,
3060 int64_t MaxOffset) const {
3061 return 0;
3062 }
3063
3064 /// Return true if the specified immediate is legal icmp immediate, that is
3065 /// the target has icmp instructions which can compare a register against the
3066 /// immediate without having to materialize the immediate into a register.
3067 virtual bool isLegalICmpImmediate(int64_t) const {
3068 return true;
3069 }
3070
3071 /// Return true if the specified immediate is legal add immediate, that is the
3072 /// target has add instructions which can add a register with the immediate
3073 /// without having to materialize the immediate into a register.
3074 virtual bool isLegalAddImmediate(int64_t) const {
3075 return true;
3076 }
3077
3078 /// Return true if adding the specified scalable immediate is legal, that is
3079 /// the target has add instructions which can add a register with the
3080 /// immediate (multiplied by vscale) without having to materialize the
3081 /// immediate into a register.
3082 virtual bool isLegalAddScalableImmediate(int64_t) const { return false; }
3083
3084 /// Return true if the specified immediate is legal for the value input of a
3085 /// store instruction.
3086 virtual bool isLegalStoreImmediate(int64_t Value) const {
3087 // Default implementation assumes that at least 0 works since it is likely
3088 // that a zero register exists or a zero immediate is allowed.
3089 return Value == 0;
3090 }
3091
3092 /// Given a shuffle vector SVI representing a vector splat, return a new
3093 /// scalar type of size equal to SVI's scalar type if the new type is more
3094 /// profitable. Returns nullptr otherwise. For example under MVE float splats
3095 /// are converted to integer to prevent the need to move from SPR to GPR
3096 /// registers.
3098 return nullptr;
3099 }
3100
3101 /// Given a set in interconnected phis of type 'From' that are loaded/stored
3102 /// or bitcast to type 'To', return true if the set should be converted to
3103 /// 'To'.
3104 virtual bool shouldConvertPhiType(Type *From, Type *To) const {
3105 return (From->isIntegerTy() || From->isFloatingPointTy()) &&
3106 (To->isIntegerTy() || To->isFloatingPointTy());
3107 }
3108
3109 /// Returns true if the opcode is a commutative binary operation.
3110 virtual bool isCommutativeBinOp(unsigned Opcode) const {
3111 // FIXME: This should get its info from the td file.
3112 switch (Opcode) {
3113 case ISD::ADD:
3114 case ISD::SMIN:
3115 case ISD::SMAX:
3116 case ISD::UMIN:
3117 case ISD::UMAX:
3118 case ISD::MUL:
3119 case ISD::CLMUL:
3120 case ISD::CLMULH:
3121 case ISD::CLMULR:
3122 case ISD::MULHU:
3123 case ISD::MULHS:
3124 case ISD::SMUL_LOHI:
3125 case ISD::UMUL_LOHI:
3126 case ISD::FADD:
3127 case ISD::FMUL:
3128 case ISD::AND:
3129 case ISD::OR:
3130 case ISD::XOR:
3131 case ISD::SADDO:
3132 case ISD::UADDO:
3133 case ISD::ADDC:
3134 case ISD::ADDE:
3135 case ISD::SADDSAT:
3136 case ISD::UADDSAT:
3137 case ISD::FMINNUM:
3138 case ISD::FMAXNUM:
3139 case ISD::FMINNUM_IEEE:
3140 case ISD::FMAXNUM_IEEE:
3141 case ISD::FMINIMUM:
3142 case ISD::FMAXIMUM:
3143 case ISD::FMINIMUMNUM:
3144 case ISD::FMAXIMUMNUM:
3145 case ISD::AVGFLOORS:
3146 case ISD::AVGFLOORU:
3147 case ISD::AVGCEILS:
3148 case ISD::AVGCEILU:
3149 case ISD::ABDS:
3150 case ISD::ABDU:
3151 return true;
3152 default: return false;
3153 }
3154 }
3155
3156 /// Return true if the node is a math/logic binary operator.
3157 virtual bool isBinOp(unsigned Opcode) const {
3158 // A commutative binop must be a binop.
3159 if (isCommutativeBinOp(Opcode))
3160 return true;
3161 // These are non-commutative binops.
3162 switch (Opcode) {
3163 case ISD::SUB:
3164 case ISD::SHL:
3165 case ISD::SRL:
3166 case ISD::SRA:
3167 case ISD::ROTL:
3168 case ISD::ROTR:
3169 case ISD::SDIV:
3170 case ISD::UDIV:
3171 case ISD::SREM:
3172 case ISD::UREM:
3173 case ISD::SSUBSAT:
3174 case ISD::USUBSAT:
3175 case ISD::FSUB:
3176 case ISD::FDIV:
3177 case ISD::FREM:
3178 case ISD::PSEUDO_FMIN:
3179 case ISD::PSEUDO_FMAX:
3180 return true;
3181 default:
3182 return false;
3183 }
3184 }
3185
3186 /// Return true if it's free to truncate a value of type FromTy to type
3187 /// ToTy. e.g. On x86 it's free to truncate a i32 value in register EAX to i16
3188 /// by referencing its sub-register AX.
3189 /// Targets must return false when FromTy <= ToTy.
3190 virtual bool isTruncateFree(Type *FromTy, Type *ToTy) const {
3191 return false;
3192 }
3193
3194 /// Return true if a truncation from FromTy to ToTy is permitted when deciding
3195 /// whether a call is in tail position. Typically this means that both results
3196 /// would be assigned to the same register or stack slot, but it could mean
3197 /// the target performs adequate checks of its own before proceeding with the
3198 /// tail call. Targets must return false when FromTy <= ToTy.
3199 virtual bool allowTruncateForTailCall(Type *FromTy, Type *ToTy) const {
3200 return false;
3201 }
3202
3203 virtual bool isTruncateFree(EVT FromVT, EVT ToVT) const { return false; }
3204 virtual bool isTruncateFree(LLT FromTy, LLT ToTy, LLVMContext &Ctx) const {
3205 return isTruncateFree(getApproximateEVTForLLT(FromTy, Ctx),
3206 getApproximateEVTForLLT(ToTy, Ctx));
3207 }
3208
3209 /// Return true if truncating the specific node Val to type VT2 is free.
3210 virtual bool isTruncateFree(SDValue Val, EVT VT2) const {
3211 // Fallback to type matching.
3212 return isTruncateFree(Val.getValueType(), VT2);
3213 }
3214
3215 virtual bool isProfitableToHoist(Instruction *I) const { return true; }
3216
3217 /// Return true if the extension represented by \p I is free.
3218 /// Unlikely the is[Z|FP]ExtFree family which is based on types,
3219 /// this method can use the context provided by \p I to decide
3220 /// whether or not \p I is free.
3221 /// This method extends the behavior of the is[Z|FP]ExtFree family.
3222 /// In other words, if is[Z|FP]Free returns true, then this method
3223 /// returns true as well. The converse is not true.
3224 /// The target can perform the adequate checks by overriding isExtFreeImpl.
3225 /// \pre \p I must be a sign, zero, or fp extension.
3226 bool isExtFree(const Instruction *I) const {
3227 switch (I->getOpcode()) {
3228 case Instruction::FPExt:
3229 if (isFPExtFree(EVT::getEVT(I->getType()),
3230 EVT::getEVT(I->getOperand(0)->getType())))
3231 return true;
3232 break;
3233 case Instruction::ZExt:
3234 if (isZExtFree(I->getOperand(0)->getType(), I->getType()))
3235 return true;
3236 break;
3237 case Instruction::SExt:
3238 break;
3239 default:
3240 llvm_unreachable("Instruction is not an extension");
3241 }
3242 return isExtFreeImpl(I);
3243 }
3244
3245 /// Return true if \p Load and \p Ext can form an ExtLoad.
3246 /// For example, in AArch64
3247 /// %L = load i8, i8* %ptr
3248 /// %E = zext i8 %L to i32
3249 /// can be lowered into one load instruction
3250 /// ldrb w0, [x0]
3251 bool isExtLoad(const LoadInst *Load, const Instruction *Ext,
3252 const DataLayout &DL) const {
3253 EVT VT = getValueType(DL, Ext->getType());
3254 EVT LoadVT = getValueType(DL, Load->getType());
3255
3256 // If the load has other users and the truncate is not free, the ext
3257 // probably isn't free.
3258 if (!Load->hasOneUse() && (isTypeLegal(LoadVT) || !isTypeLegal(VT)) &&
3259 !isTruncateFree(Ext->getType(), Load->getType()))
3260 return false;
3261
3262 // Check whether the target supports casts folded into loads.
3263 unsigned LType;
3264 if (isa<ZExtInst>(Ext))
3265 LType = ISD::ZEXTLOAD;
3266 else {
3267 assert(isa<SExtInst>(Ext) && "Unexpected ext type!");
3268 LType = ISD::SEXTLOAD;
3269 }
3270
3271 return isLoadLegal(VT, LoadVT, Load->getAlign(),
3272 Load->getPointerAddressSpace(), LType, false);
3273 }
3274
3275 /// Return true if any actual instruction that defines a value of type FromTy
3276 /// implicitly zero-extends the value to ToTy in the result register.
3277 ///
3278 /// The function should return true when it is likely that the truncate can
3279 /// be freely folded with an instruction defining a value of FromTy. If
3280 /// the defining instruction is unknown (because you're looking at a
3281 /// function argument, PHI, etc.) then the target may require an
3282 /// explicit truncate, which is not necessarily free, but this function
3283 /// does not deal with those cases.
3284 /// Targets must return false when FromTy >= ToTy.
3285 virtual bool isZExtFree(Type *FromTy, Type *ToTy) const {
3286 return false;
3287 }
3288
3289 virtual bool isZExtFree(EVT FromTy, EVT ToTy) const { return false; }
3290 virtual bool isZExtFree(LLT FromTy, LLT ToTy, LLVMContext &Ctx) const {
3291 return isZExtFree(getApproximateEVTForLLT(FromTy, Ctx),
3292 getApproximateEVTForLLT(ToTy, Ctx));
3293 }
3294
3295 /// Return true if zero-extending the specific node Val to type VT2 is free
3296 /// (either because it's implicitly zero-extended such as ARM ldrb / ldrh or
3297 /// because it's folded such as X86 zero-extending loads).
3298 virtual bool isZExtFree(SDValue Val, EVT VT2) const {
3299 return isZExtFree(Val.getValueType(), VT2);
3300 }
3301
3302 /// Return true is an anyext is free from FromTy to ToTy. Usually true for
3303 /// scalar types when not trying to pack elements into vector lanes.
3304 virtual bool isAnyExtFree(EVT FromTy, EVT ToTy) const {
3305 return !FromTy.isVector();
3306 }
3307
3308 /// Return true if sign-extension from FromTy to ToTy is cheaper than
3309 /// zero-extension.
3310 virtual bool isSExtCheaperThanZExt(EVT FromTy, EVT ToTy) const {
3311 return false;
3312 }
3313
3314 /// Return true if this constant should be sign extended when promoting to
3315 /// a larger type.
3316 virtual bool signExtendConstant(const ConstantInt *C) const { return false; }
3317
3318 /// Try to optimize extending or truncating conversion instructions (like
3319 /// zext, trunc, fptoui, uitofp) for the target.
3320 virtual bool
3322 const TargetTransformInfo &TTI) const {
3323 return false;
3324 }
3325
3326 /// Return true if the target supplies and combines to a paired load
3327 /// two loaded values of type LoadedType next to each other in memory.
3328 /// RequiredAlignment gives the minimal alignment constraints that must be met
3329 /// to be able to select this paired load.
3330 ///
3331 /// This information is *not* used to generate actual paired loads, but it is
3332 /// used to generate a sequence of loads that is easier to combine into a
3333 /// paired load.
3334 /// For instance, something like this:
3335 /// a = load i64* addr
3336 /// b = trunc i64 a to i32
3337 /// c = lshr i64 a, 32
3338 /// d = trunc i64 c to i32
3339 /// will be optimized into:
3340 /// b = load i32* addr1
3341 /// d = load i32* addr2
3342 /// Where addr1 = addr2 +/- sizeof(i32).
3343 ///
3344 /// In other words, unless the target performs a post-isel load combining,
3345 /// this information should not be provided because it will generate more
3346 /// loads.
3347 virtual bool hasPairedLoad(EVT /*LoadedType*/,
3348 Align & /*RequiredAlignment*/) const {
3349 return false;
3350 }
3351
3352 /// Return true if the target has a vector blend instruction.
3353 virtual bool hasVectorBlend() const { return false; }
3354
3355 /// Get the maximum supported factor for interleaved memory accesses.
3356 /// Default to be the minimum interleave factor: 2.
3357 virtual unsigned getMaxSupportedInterleaveFactor() const { return 2; }
3358
3359 /// Lower an interleaved load to target specific intrinsics. Return
3360 /// true on success.
3361 ///
3362 /// \p Load is the vector load instruction. Can be either a plain load
3363 /// instruction or a vp.load intrinsic.
3364 /// \p Mask is a per-segment (i.e. number of lanes equal to that of one
3365 /// component being interwoven) mask. Can be nullptr, in which case the
3366 /// result is uncondiitional.
3367 /// \p Shuffles is the shufflevector list to DE-interleave the loaded vector.
3368 /// \p Indices is the corresponding indices for each shufflevector.
3369 /// \p Factor is the interleave factor.
3370 /// \p GapMask is a mask with zeros for components / fields that may not be
3371 /// accessed.
3374 ArrayRef<unsigned> Indices, unsigned Factor,
3375 const APInt &GapMask) const {
3376 return false;
3377 }
3378
3379 /// Lower an interleaved store to target specific intrinsics. Return
3380 /// true on success.
3381 ///
3382 /// \p SI is the vector store instruction. Can be either a plain store
3383 /// or a vp.store.
3384 /// \p Mask is a per-segment (i.e. number of lanes equal to that of one
3385 /// component being interwoven) mask. Can be nullptr, in which case the
3386 /// result is unconditional.
3387 /// \p SVI is the shufflevector to RE-interleave the stored vector.
3388 /// \p Factor is the interleave factor.
3389 /// \p GapMask is a mask with zeros for components / fields that may not be
3390 /// accessed.
3392 ShuffleVectorInst *SVI, unsigned Factor,
3393 const APInt &GapMask) const {
3394 return false;
3395 }
3396
3397 /// Lower a deinterleave intrinsic to a target specific load intrinsic.
3398 /// Return true on success. Currently only supports
3399 /// llvm.vector.deinterleave{2,3,5,7}
3400 ///
3401 /// \p Load is the accompanying load instruction. Can be either a plain load
3402 /// instruction or a vp.load intrinsic.
3403 /// \p DI represents the deinterleaveN intrinsic.
3404 /// \p GapMask is a mask with zeros for components / fields that may not be
3405 /// accessed.
3407 IntrinsicInst *DI,
3408 const APInt &GapMask) const {
3409 return false;
3410 }
3411
3412 /// Lower an interleave intrinsic to a target specific store intrinsic.
3413 /// Return true on success. Currently only supports
3414 /// llvm.vector.interleave{2,3,5,7}
3415 ///
3416 /// \p Store is the accompanying store instruction. Can be either a plain
3417 /// store or a vp.store intrinsic.
3418 /// \p Mask is a per-segment (i.e. number of lanes equal to that of one
3419 /// component being interwoven) mask. Can be nullptr, in which case the
3420 /// result is uncondiitional.
3421 /// \p InterleaveValues contains the interleaved values.
3422 virtual bool
3424 ArrayRef<Value *> InterleaveValues) const {
3425 return false;
3426 }
3427
3428 /// Return true if an fpext operation is free (for instance, because
3429 /// single-precision floating-point numbers are implicitly extended to
3430 /// double-precision).
3431 virtual bool isFPExtFree(EVT DestVT, EVT SrcVT) const {
3432 assert(SrcVT.isFloatingPoint() && DestVT.isFloatingPoint() &&
3433 "invalid fpext types");
3434 return false;
3435 }
3436
3437 /// Return true if an fpext operation input to an \p Opcode operation is free
3438 /// (for instance, because half-precision floating-point numbers are
3439 /// implicitly extended to float-precision) for an FMA instruction.
3440 virtual bool isFPExtFoldable(const MachineInstr &MI, unsigned Opcode,
3441 LLT DestTy, LLT SrcTy) const {
3442 return false;
3443 }
3444
3445 /// Return true if an fpext operation input to an \p Opcode operation is free
3446 /// (for instance, because half-precision floating-point numbers are
3447 /// implicitly extended to float-precision) for an FMA instruction.
3448 virtual bool isFPExtFoldable(const SelectionDAG &DAG, unsigned Opcode,
3449 EVT DestVT, EVT SrcVT) const {
3450 assert(DestVT.isFloatingPoint() && SrcVT.isFloatingPoint() &&
3451 "invalid fpext types");
3452 return isFPExtFree(DestVT, SrcVT);
3453 }
3454
3455 /// Return true if folding a vector load into ExtVal (a sign, zero, or any
3456 /// extend node) is profitable.
3457 virtual bool isVectorLoadExtDesirable(SDValue ExtVal) const { return false; }
3458
3459 /// Return true if an fneg operation is free to the point where it is never
3460 /// worthwhile to replace it with a bitwise operation.
3461 virtual bool isFNegFree(EVT VT) const {
3462 assert(VT.isFloatingPoint());
3463 return false;
3464 }
3465
3466 /// Return true if an fabs operation is free to the point where it is never
3467 /// worthwhile to replace it with a bitwise operation.
3468 virtual bool isFAbsFree(EVT VT) const {
3469 assert(VT.isFloatingPoint());
3470 return false;
3471 }
3472
3473 /// Return true if an FMA operation is faster than a pair of fmul and fadd
3474 /// instructions. fmuladd intrinsics will be expanded to FMAs when this method
3475 /// returns true, otherwise fmuladd is expanded to fmul + fadd.
3476 ///
3477 /// NOTE: This may be called before legalization on types for which FMAs are
3478 /// not legal, but should return true if those types will eventually legalize
3479 /// to types that support FMAs. After legalization, it will only be called on
3480 /// types that support FMAs (via Legal or Custom actions)
3481 ///
3482 /// Targets that care about soft float support should return false when soft
3483 /// float code is being generated (i.e. use-soft-float).
3485 EVT) const {
3486 return false;
3487 }
3488
3489 /// Return true if an FMA operation is faster than a pair of fmul and fadd
3490 /// instructions. fmuladd intrinsics will be expanded to FMAs when this method
3491 /// returns true, otherwise fmuladd is expanded to fmul + fadd.
3492 ///
3493 /// NOTE: This may be called before legalization on types for which FMAs are
3494 /// not legal, but should return true if those types will eventually legalize
3495 /// to types that support FMAs. After legalization, it will only be called on
3496 /// types that support FMAs (via Legal or Custom actions)
3498 LLT) const {
3499 return false;
3500 }
3501
3502 /// IR version
3503 virtual bool isFMAFasterThanFMulAndFAdd(const Function &F, Type *) const {
3504 return false;
3505 }
3506
3507 /// Returns true if \p MI can be combined with another instruction to
3508 /// form TargetOpcode::G_FMAD. \p N may be an TargetOpcode::G_FADD,
3509 /// TargetOpcode::G_FSUB, or an TargetOpcode::G_FMUL which will be
3510 /// distributed into an fadd/fsub.
3511 virtual bool isFMADLegal(const MachineInstr &MI, LLT Ty) const {
3512 assert((MI.getOpcode() == TargetOpcode::G_FADD ||
3513 MI.getOpcode() == TargetOpcode::G_FSUB ||
3514 MI.getOpcode() == TargetOpcode::G_FMUL) &&
3515 "unexpected node in FMAD forming combine");
3516 switch (Ty.getScalarSizeInBits()) {
3517 case 16:
3518 return isOperationLegal(TargetOpcode::G_FMAD, MVT::f16);
3519 case 32:
3520 return isOperationLegal(TargetOpcode::G_FMAD, MVT::f32);
3521 case 64:
3522 return isOperationLegal(TargetOpcode::G_FMAD, MVT::f64);
3523 default:
3524 break;
3525 }
3526
3527 return false;
3528 }
3529
3530 /// Returns true if be combined with to form an ISD::FMAD. \p N may be an
3531 /// ISD::FADD, ISD::FSUB, or an ISD::FMUL which will be distributed into an
3532 /// fadd/fsub.
3533 virtual bool isFMADLegal(const SelectionDAG &DAG, const SDNode *N) const {
3534 assert((N->getOpcode() == ISD::FADD || N->getOpcode() == ISD::FSUB ||
3535 N->getOpcode() == ISD::FMUL) &&
3536 "unexpected node in FMAD forming combine");
3537 return isOperationLegal(ISD::FMAD, N->getValueType(0));
3538 }
3539
3540 // Return true when the decision to generate FMA's (or FMS, FMLA etc) rather
3541 // than FMUL and ADD is delegated to the machine combiner.
3543 CodeGenOptLevel OptLevel) const {
3544 return false;
3545 }
3546
3547 /// Return true if it's profitable to narrow operations of type SrcVT to
3548 /// DestVT. e.g. on x86, it's profitable to narrow from i32 to i8 but not from
3549 /// i32 to i16.
3550 virtual bool isNarrowingProfitable(SDNode *N, EVT SrcVT, EVT DestVT) const {
3551 return false;
3552 }
3553
3554 /// Return true if pulling a binary operation into a select with an identity
3555 /// constant is profitable. This is the inverse of an IR transform.
3556 /// Example: X + (Cond ? Y : 0) --> Cond ? (X + Y) : X
3557 virtual bool shouldFoldSelectWithIdentityConstant(unsigned BinOpcode, EVT VT,
3558 unsigned SelectOpcode,
3559 SDValue X,
3560 SDValue Y) const {
3561 return false;
3562 }
3563
3564 /// Return true if it is beneficial to convert a load of a constant to
3565 /// just the constant itself.
3566 /// On some targets it might be more efficient to use a combination of
3567 /// arithmetic instructions to materialize the constant instead of loading it
3568 /// from a constant pool.
3570 Type *Ty) const {
3571 return false;
3572 }
3573
3574 /// Return the cost of extracting a subvector of type \p ResVT from a vector
3575 /// of type \p SrcVT, starting at element \p Index.
3576 ///
3577 /// Most callers only create a new EXTRACT_SUBVECTOR when the cost is at most
3578 /// ExtractSubvectorCost::Cheap. This hook exists because EXTRACT_SUBVECTOR
3579 /// usually has custom lowering that depends on the index of the first
3580 /// element, so only the target knows which lowering is cheap.
3582 unsigned Index) const {
3584 }
3585
3586 /// Try to convert an extract element of a vector binary operation into an
3587 /// extract element followed by a scalar operation.
3588 virtual bool shouldScalarizeBinop(SDValue VecOp) const {
3589 return false;
3590 }
3591
3592 /// Return true if extraction of a scalar element from the given vector type
3593 /// at the given index is cheap. For example, if scalar operations occur on
3594 /// the same register file as vector operations, then an extract element may
3595 /// be a sub-register rename rather than an actual instruction.
3596 virtual bool isExtractVecEltCheap(EVT VT, unsigned Index) const {
3597 return false;
3598 }
3599
3600 /// Try to convert math with an overflow comparison into the corresponding DAG
3601 /// node operation. Targets may want to override this independently of whether
3602 /// the operation is legal/custom for the given type because it may obscure
3603 /// matching of other patterns.
3604 virtual bool shouldFormOverflowOp(unsigned Opcode, EVT VT,
3605 bool MathUsed) const {
3606 // Form it if it is legal.
3607 if (isOperationLegal(Opcode, VT))
3608 return true;
3609
3610 // TODO: The default logic is inherited from code in CodeGenPrepare.
3611 // The opcode should not make a difference by default?
3612 if (Opcode != ISD::UADDO)
3613 return false;
3614
3615 // Allow the transform as long as we have an integer type that is not
3616 // obviously illegal and unsupported and if the math result is used
3617 // besides the overflow check. On some targets (e.g. SPARC), it is
3618 // not profitable to form on overflow op if the math result has no
3619 // concrete users.
3620 if (VT.isVector())
3621 return false;
3622 return MathUsed && (VT.isSimple() || !isOperationExpand(Opcode, VT));
3623 }
3624
3625 // Return true if the target wants to optimize the mul overflow intrinsic
3626 // for the given \p VT.
3628 EVT VT) const {
3629 return false;
3630 }
3631
3632 // Return true if it is profitable to use a scalar input to a BUILD_VECTOR
3633 // even if the vector itself has multiple uses.
3634 virtual bool aggressivelyPreferBuildVectorSources(EVT VecVT) const {
3635 return false;
3636 }
3637
3638 // Return true if CodeGenPrepare should consider splitting large offset of a
3639 // GEP to make the GEP fit into the addressing mode and can be sunk into the
3640 // same blocks of its users.
3641 virtual bool shouldConsiderGEPOffsetSplit() const { return false; }
3642
3643 /// Return true if creating a shift of the type by the given
3644 /// amount is not profitable.
3645 virtual bool shouldAvoidTransformToShift(EVT VT, unsigned Amount) const {
3646 return false;
3647 }
3648
3649 // Should we fold (select_cc seteq (and x, y), 0, 0, A) -> (and (sra (shl x))
3650 // A) where y has a single bit set?
3652 const APInt &AndMask) const {
3653 unsigned ShCt = AndMask.getBitWidth() - 1;
3654 return !shouldAvoidTransformToShift(VT, ShCt);
3655 }
3656
3657 /// Does this target require the clearing of high-order bits in a register
3658 /// passed to the fp16 to fp conversion library function.
3659 virtual bool shouldKeepZExtForFP16Conv() const { return false; }
3660
3661 /// Should we generate fp_to_si_sat and fp_to_ui_sat from type FPVT to type
3662 /// VT. Used when folding idioms into a saturating fp-to-int conversion, such
3663 /// as min(max(fptoi)) clamps or NaN-guarded selects.
3664 virtual bool shouldConvertFpToSat(unsigned Op, EVT FPVT, EVT VT) const {
3665 return isOperationLegalOrCustom(Op, VT);
3666 }
3667
3668 /// Should we prefer selects to doing arithmetic on boolean types
3670 return false;
3671 }
3672
3673 /// True if target has some particular form of dealing with pointer arithmetic
3674 /// semantics for pointers with the given value type. False if pointer
3675 /// arithmetic should not be preserved for passes such as instruction
3676 /// selection, and can fallback to regular arithmetic.
3677 /// This should be removed when PTRADD nodes are widely supported by backends.
3678 virtual bool shouldPreservePtrArith(const Function &F, EVT PtrVT) const {
3679 return false;
3680 }
3681
3682 /// True if the target allows transformations of in-bounds pointer
3683 /// arithmetic that cause out-of-bounds intermediate results.
3685 EVT PtrVT) const {
3686 return false;
3687 }
3688
3689 /// Does this target support complex deinterleaving
3690 virtual bool isComplexDeinterleavingSupported() const { return false; }
3691
3692 /// Does this target support complex deinterleaving with the given operation
3693 /// and type
3696 return false;
3697 }
3698
3699 // Get the preferred opcode for FP_TO_XINT nodes.
3700 // By default, this checks if the provded operation is an illegal FP_TO_UINT
3701 // and if so, checks if FP_TO_SINT is legal or custom for use as a
3702 // replacement. If both UINT and SINT conversions are Custom, we choose SINT
3703 // by default because that's the right thing on PPC.
3704 virtual unsigned getPreferredFPToIntOpcode(unsigned Op, EVT FromVT,
3705 EVT ToVT) const {
3706 if (isOperationLegal(Op, ToVT))
3707 return Op;
3708 switch (Op) {
3709 case ISD::FP_TO_UINT:
3711 return ISD::FP_TO_SINT;
3712 break;
3716 break;
3717 default:
3718 break;
3719 }
3720 return Op;
3721 }
3722
3723 /// Create the IR node for the given complex deinterleaving operation.
3724 /// If one cannot be created using all the given inputs, nullptr should be
3725 /// returned.
3728 ComplexDeinterleavingRotation Rotation, Value *InputA, Value *InputB,
3729 Value *Accumulator = nullptr) const {
3730 return nullptr;
3731 }
3732
3734 return RuntimeLibcallInfo;
3735 }
3736
3737 const LibcallLoweringInfo &getLibcallLoweringInfo() const { return Libcalls; }
3738
3739 void setLibcallImpl(RTLIB::Libcall Call, RTLIB::LibcallImpl Impl) {
3740 Libcalls.setLibcallImpl(Call, Impl);
3741 }
3742
3743 /// Get the libcall impl routine name for the specified libcall.
3744 RTLIB::LibcallImpl getLibcallImpl(RTLIB::Libcall Call) const {
3745 return Libcalls.getLibcallImpl(Call);
3746 }
3747
3748 /// Get the libcall routine name for the specified libcall.
3749 // FIXME: This should be removed. Only LibcallImpl should have a name.
3750 const char *getLibcallName(RTLIB::Libcall Call) const {
3751 return Libcalls.getLibcallName(Call);
3752 }
3753
3754 /// Get the libcall routine name for the specified libcall implementation
3758
3759 RTLIB::LibcallImpl getMemcpyImpl() const { return Libcalls.getMemcpyImpl(); }
3760
3761 /// Check if this is valid libcall for the current module, otherwise
3762 /// RTLIB::Unsupported.
3763 RTLIB::LibcallImpl getSupportedLibcallImpl(StringRef FuncName) const {
3764 return RuntimeLibcallInfo.getSupportedLibcallImpl(FuncName);
3765 }
3766
3767 /// Get the CallingConv that should be used for the specified libcall
3768 /// implementation.
3770 return Libcalls.getLibcallImplCallingConv(Call);
3771 }
3772
3773 /// Get the CallingConv that should be used for the specified libcall.
3774 // FIXME: Remove this wrapper and directly use the used LibcallImpl
3776 return Libcalls.getLibcallCallingConv(Call);
3777 }
3778
3779 /// Execute target specific actions to finalize target lowering.
3780 /// This is used to set extra flags in MachineFrameInformation and freezing
3781 /// the set of reserved registers.
3782 /// The default implementation just freezes the set of reserved registers.
3783 virtual void finalizeLowering(MachineFunction &MF) const;
3784
3785 /// Returns true if it's profitable to allow merging store of loads when there
3786 /// are functions calls between the load and the store.
3787 virtual bool shouldMergeStoreOfLoadsOverCall(EVT, EVT) const { return true; }
3788
3789 //===----------------------------------------------------------------------===//
3790 // GlobalISel Hooks
3791 //===----------------------------------------------------------------------===//
3792 /// Check whether or not \p MI needs to be moved close to its uses.
3793 virtual bool shouldLocalize(const MachineInstr &MI, const TargetTransformInfo *TTI) const;
3794
3795
3796private:
3797 const TargetMachine &TM;
3798
3799 /// Tells the code generator that the target has BitExtract instructions.
3800 /// The code generator will aggressively sink "shift"s into the blocks of
3801 /// their users if the users will generate "and" instructions which can be
3802 /// combined with "shift" to BitExtract instructions.
3803 bool HasExtractBitsInsn;
3804
3805 /// Tells the code generator to bypass slow divide or remainder
3806 /// instructions. For example, BypassSlowDivWidths[32,8] tells the code
3807 /// generator to bypass 32-bit integer div/rem with an 8-bit unsigned integer
3808 /// div/rem when the operands are positive and less than 256.
3809 DenseMap <unsigned int, unsigned int> BypassSlowDivWidths;
3810
3811 /// Tells the code generator that it shouldn't generate extra flow control
3812 /// instructions and should attempt to combine flow control instructions via
3813 /// predication.
3814 bool JumpIsExpensive;
3815
3816 /// Information about the contents of the high-bits in boolean values held in
3817 /// a type wider than i1. See getBooleanContents.
3818 BooleanContent BooleanContents;
3819
3820 /// Information about the contents of the high-bits in boolean values held in
3821 /// a type wider than i1. See getBooleanContents.
3822 BooleanContent BooleanFloatContents;
3823
3824 /// Information about the contents of the high-bits in boolean vector values
3825 /// when the element type is wider than i1. See getBooleanContents.
3826 BooleanContent BooleanVectorContents;
3827
3828 /// The target scheduling preference: shortest possible total cycles or lowest
3829 /// register usage.
3830 Sched::Preference SchedPreferenceInfo;
3831
3832 /// The minimum alignment that any argument on the stack needs to have.
3833 Align MinStackArgumentAlignment;
3834
3835 /// The minimum function alignment (used when optimizing for size, and to
3836 /// prevent explicitly provided alignment from leading to incorrect code).
3837 Align MinFunctionAlignment;
3838
3839 /// The preferred function alignment (used when alignment unspecified and
3840 /// optimizing for speed).
3841 Align PrefFunctionAlignment;
3842
3843 /// The preferred loop alignment (in log2 bot in bytes).
3844 Align PrefLoopAlignment;
3845 /// The maximum amount of bytes permitted to be emitted for alignment.
3846 unsigned MaxBytesForAlignment;
3847
3848 /// Size in bits of the maximum atomics size the backend supports.
3849 /// Accesses larger than this will be expanded by AtomicExpandPass.
3850 unsigned MaxAtomicSizeInBitsSupported;
3851
3852 /// Size in bits of the maximum div/rem size the backend supports.
3853 /// Larger operations will be expanded by ExpandIRInsts.
3854 unsigned MaxDivRemBitWidthSupported;
3855
3856 /// Size in bits of the maximum fp to/from int conversion size the
3857 /// backend supports. Larger operations will be expanded by
3858 /// ExpandIRInsts.
3859 unsigned MaxLargeFPConvertBitWidthSupported;
3860
3861 /// Size in bits of the minimum cmpxchg or ll/sc operation the
3862 /// backend supports.
3863 unsigned MinCmpXchgSizeInBits;
3864
3865 /// The minimum of largest number of comparisons to use bit test for switch.
3866 unsigned MinimumBitTestCmps;
3867
3868 /// Maximum known-legal store size, which can be guaranteed for scalable
3869 /// vectors.
3870 unsigned MaximumLegalStoreInBits;
3871
3872 /// This indicates if the target supports unaligned atomic operations.
3873 bool SupportsUnalignedAtomics;
3874
3875 /// If set to a physical register, this specifies the register that
3876 /// llvm.savestack/llvm.restorestack should save and restore.
3877 Register StackPointerRegisterToSaveRestore;
3878
3879 /// This indicates the default register class to use for each ValueType the
3880 /// target supports natively.
3881 const TargetRegisterClass *RegClassForVT[MVT::VALUETYPE_SIZE];
3882 uint16_t NumRegistersForVT[MVT::VALUETYPE_SIZE];
3883 MVT RegisterTypeForVT[MVT::VALUETYPE_SIZE];
3884
3885 /// This indicates the "representative" register class to use for each
3886 /// ValueType the target supports natively. This information is used by the
3887 /// scheduler to track register pressure. By default, the representative
3888 /// register class is the largest legal super-reg register class of the
3889 /// register class of the specified type. e.g. On x86, i8, i16, and i32's
3890 /// representative class would be GR32.
3891 const TargetRegisterClass *RepRegClassForVT[MVT::VALUETYPE_SIZE] = {nullptr};
3892
3893 /// This indicates the "cost" of the "representative" register class for each
3894 /// ValueType. The cost is used by the scheduler to approximate register
3895 /// pressure.
3896 uint8_t RepRegClassCostForVT[MVT::VALUETYPE_SIZE];
3897
3898 /// For any value types we are promoting or expanding, this contains the value
3899 /// type that we are changing to. For Expanded types, this contains one step
3900 /// of the expand (e.g. i64 -> i32), even if there are multiple steps required
3901 /// (e.g. i64 -> i16). For types natively supported by the system, this holds
3902 /// the same type (e.g. i32 -> i32).
3903 MVT TransformToType[MVT::VALUETYPE_SIZE];
3904
3905 /// For each operation and each value type, keep a LegalizeAction that
3906 /// indicates how instruction selection should deal with the operation. Most
3907 /// operations are Legal (aka, supported natively by the target), but
3908 /// operations that are not should be described. Note that operations on
3909 /// non-legal value types are not described here.
3910 LegalizeAction OpActions[MVT::VALUETYPE_SIZE][ISD::BUILTIN_OP_END];
3911
3912 /// For each load extension type and each value type, keep a LegalizeAction
3913 /// that indicates how instruction selection should deal with a load of a
3914 /// specific value type and extension type. Uses 4-bits to store the action
3915 /// for each of the 4 load ext types.
3916 uint16_t LoadExtActions[MVT::VALUETYPE_SIZE][MVT::VALUETYPE_SIZE];
3917
3918 /// Similar to LoadExtActions, but for atomic loads. Only Legal or Expand
3919 /// (default) values are supported.
3920 uint16_t AtomicLoadExtActions[MVT::VALUETYPE_SIZE][MVT::VALUETYPE_SIZE];
3921
3922 /// For each value type pair keep a LegalizeAction that indicates whether a
3923 /// truncating store of a specific value type and truncating type is legal.
3924 LegalizeAction TruncStoreActions[MVT::VALUETYPE_SIZE][MVT::VALUETYPE_SIZE];
3925
3926 /// For each indexed mode and each value type, keep a quad of LegalizeAction
3927 /// that indicates how instruction selection should deal with the load /
3928 /// store / maskedload / maskedstore.
3929 ///
3930 /// The first dimension is the value_type for the reference. The second
3931 /// dimension represents the various modes for load store.
3932 uint16_t IndexedModeActions[MVT::VALUETYPE_SIZE][ISD::LAST_INDEXED_MODE];
3933
3934 /// For each condition code (ISD::CondCode) keep a LegalizeAction that
3935 /// indicates how instruction selection should deal with the condition code.
3936 ///
3937 /// Because each CC action takes up 4 bits, we need to have the array size be
3938 /// large enough to fit all of the value types. This can be done by rounding
3939 /// up the MVT::VALUETYPE_SIZE value to the next multiple of 8.
3940 uint32_t CondCodeActions[ISD::SETCC_INVALID][(MVT::VALUETYPE_SIZE + 7) / 8];
3941
3942 using PartialReduceActionTypes =
3943 std::tuple<unsigned, MVT::SimpleValueType, MVT::SimpleValueType>;
3944 /// For each partial reduce opcode, result type and input type combination,
3945 /// keep a LegalizeAction which indicates how instruction selection should
3946 /// deal with this operation.
3947 DenseMap<PartialReduceActionTypes, LegalizeAction> PartialReduceMLAActions;
3948
3949 using VectorInterleaveActionKey =
3950 std::tuple<unsigned, unsigned, MVT::SimpleValueType>;
3951 /// For each vector (de)interleave opcode, interleave factor and fragment
3952 /// type combination, keep the corresponding LegalizeAction.
3953 DenseMap<VectorInterleaveActionKey, LegalizeAction> VectorInterleaveActions;
3954
3955 ValueTypeActionImpl ValueTypeActions;
3956
3957private:
3958 /// Targets can specify ISD nodes that they would like PerformDAGCombine
3959 /// callbacks for by calling setTargetDAGCombine(), which sets a bit in this
3960 /// array.
3961 unsigned char
3962 TargetDAGCombineArray[(ISD::BUILTIN_OP_END+CHAR_BIT-1)/CHAR_BIT];
3963
3964 /// For operations that must be promoted to a specific type, this holds the
3965 /// destination type. This map should be sparse, so don't hold it as an
3966 /// array.
3967 ///
3968 /// Targets add entries to this map with AddPromotedToType(..), clients access
3969 /// this with getTypeToPromoteTo(..).
3970 std::map<std::pair<unsigned, MVT::SimpleValueType>, MVT::SimpleValueType>
3971 PromoteToType;
3972
3973 /// FIXME: This should not live here; it should come from an analysis.
3974 const RTLIB::RuntimeLibcallsInfo RuntimeLibcallInfo;
3975
3976 /// The list of libcalls that the target will use.
3977 /// FIXME: This should not live here; it should come from an analysis.
3978 LibcallLoweringInfo Libcalls;
3979
3980 /// The bits of IndexedModeActions used to store the legalisation actions
3981 /// We store the data as | ML | MS | L | S | each taking 4 bits.
3982 enum IndexedModeActionsBits {
3983 IMAB_Store = 0,
3984 IMAB_Load = 4,
3985 IMAB_MaskedStore = 8,
3986 IMAB_MaskedLoad = 12
3987 };
3988
3989 void setIndexedModeAction(unsigned IdxMode, MVT VT, unsigned Shift,
3990 LegalizeAction Action) {
3991 assert(VT.isValid() && IdxMode < ISD::LAST_INDEXED_MODE &&
3992 (unsigned)Action < 0xf && "Table isn't big enough!");
3993 unsigned Ty = (unsigned)VT.SimpleTy;
3994 IndexedModeActions[Ty][IdxMode] &= ~(0xf << Shift);
3995 IndexedModeActions[Ty][IdxMode] |= ((uint16_t)Action) << Shift;
3996 }
3997
3998 LegalizeAction getIndexedModeAction(unsigned IdxMode, MVT VT,
3999 unsigned Shift) const {
4000 assert(IdxMode < ISD::LAST_INDEXED_MODE && VT.isValid() &&
4001 "Table isn't big enough!");
4002 unsigned Ty = (unsigned)VT.SimpleTy;
4003 return (LegalizeAction)((IndexedModeActions[Ty][IdxMode] >> Shift) & 0xf);
4004 }
4005
4006 unsigned getVectorTypeBreakdownImpl(LLVMContext &Context, EVT VT,
4007 EVT &IntermediateVT,
4008 unsigned &NumIntermediates,
4009 MVT &RegisterVT,
4010 bool ForCallingConv) const;
4011
4012 unsigned getVectorTypeBreakdownMVT(MVT VT, MVT &IntermediateVT,
4013 unsigned &NumIntermediates,
4014 MVT &RegisterVT);
4015
4016 /// Return the type of registers that this ValueType will eventually require.
4017 MVT getCachedRegisterType(MVT VT) const {
4018 assert((unsigned)VT.SimpleTy < std::size(RegisterTypeForVT));
4019 return RegisterTypeForVT[VT.SimpleTy];
4020 }
4021
4022 MVT getRegisterTypeImpl(LLVMContext &Context, EVT VT,
4023 bool ForCallingConv) const {
4024 if (VT.isSimple() &&
4025 !shouldUseDynamicVectorTypeBreakdown(VT, ForCallingConv))
4026 return getCachedRegisterType(VT.getSimpleVT());
4027 if (VT.isVector()) {
4028 EVT VT1;
4029 MVT RegisterVT;
4030 unsigned NumIntermediates;
4031 (void)getVectorTypeBreakdownImpl(Context, VT, VT1, NumIntermediates,
4032 RegisterVT, ForCallingConv);
4033 return RegisterVT;
4034 }
4035 if (VT.isInteger()) {
4036 return getRegisterTypeImpl(Context, getTypeToTransformTo(Context, VT),
4037 ForCallingConv);
4038 }
4039 llvm_unreachable("Unsupported extended type!");
4040 }
4041
4042 unsigned getNumRegistersImpl(LLVMContext &Context, EVT VT,
4043 bool ForCallingConv) const {
4044 if (VT.isSimple() &&
4045 !shouldUseDynamicVectorTypeBreakdown(VT, ForCallingConv)) {
4046 assert((unsigned)VT.getSimpleVT().SimpleTy <
4047 std::size(NumRegistersForVT));
4048 return NumRegistersForVT[VT.getSimpleVT().SimpleTy];
4049 }
4050 if (VT.isVector()) {
4051 EVT VT1;
4052 MVT VT2;
4053 unsigned NumIntermediates;
4054 return getVectorTypeBreakdownImpl(Context, VT, VT1, NumIntermediates, VT2,
4055 ForCallingConv);
4056 }
4057 if (VT.isInteger()) {
4058 unsigned BitWidth = VT.getSizeInBits();
4059 unsigned RegWidth =
4060 getRegisterTypeImpl(Context, VT, ForCallingConv).getSizeInBits();
4061 return (BitWidth + RegWidth - 1) / RegWidth;
4062 }
4063 llvm_unreachable("Unsupported extended type!");
4064 }
4065
4066protected:
4067 /// Return true if the extension represented by \p I is free.
4068 /// \pre \p I is a sign, zero, or fp extension and
4069 /// is[Z|FP]ExtFree of the related types is not true.
4070 virtual bool isExtFreeImpl(const Instruction *I) const { return false; }
4071
4072 /// Depth that GatherAllAliases should continue looking for chain
4073 /// dependencies when trying to find a more preferable chain. As an
4074 /// approximation, this should be more than the number of consecutive stores
4075 /// expected to be merged.
4077
4078 /// \brief Specify maximum number of store instructions per memset call.
4079 ///
4080 /// When lowering \@llvm.memset this field specifies the maximum number of
4081 /// store operations that may be substituted for the call to memset. Targets
4082 /// must set this value based on the cost threshold for that target. Targets
4083 /// should assume that the memset will be done using as many of the largest
4084 /// store operations first, followed by smaller ones, if necessary, per
4085 /// alignment restrictions. For example, storing 9 bytes on a 32-bit machine
4086 /// with 16-bit alignment would result in four 2-byte stores and one 1-byte
4087 /// store. This only applies to setting a constant array of a constant size.
4089 /// Likewise for functions with the OptSize attribute.
4091
4092 /// \brief Specify maximum number of store instructions per memcpy call.
4093 ///
4094 /// When lowering \@llvm.memcpy this field specifies the maximum number of
4095 /// store operations that may be substituted for a call to memcpy. Targets
4096 /// must set this value based on the cost threshold for that target. Targets
4097 /// should assume that the memcpy will be done using as many of the largest
4098 /// store operations first, followed by smaller ones, if necessary, per
4099 /// alignment restrictions. For example, storing 7 bytes on a 32-bit machine
4100 /// with 32-bit alignment would result in one 4-byte store, a one 2-byte store
4101 /// and one 1-byte store. This only applies to copying a constant array of
4102 /// constant size.
4104 /// Likewise for functions with the OptSize attribute.
4106 /// \brief Specify max number of store instructions to glue in inlined memcpy.
4107 ///
4108 /// When memcpy is inlined based on MaxStoresPerMemcpy, specify maximum number
4109 /// of store instructions to keep together. This helps in pairing and
4110 // vectorization later on.
4112
4113 /// \brief Specify maximum number of load instructions per memcmp call.
4114 ///
4115 /// When lowering \@llvm.memcmp this field specifies the maximum number of
4116 /// pairs of load operations that may be substituted for a call to memcmp.
4117 /// Targets must set this value based on the cost threshold for that target.
4118 /// Targets should assume that the memcmp will be done using as many of the
4119 /// largest load operations first, followed by smaller ones, if necessary, per
4120 /// alignment restrictions. For example, loading 7 bytes on a 32-bit machine
4121 /// with 32-bit alignment would result in one 4-byte load, a one 2-byte load
4122 /// and one 1-byte load. This only applies to copying a constant array of
4123 /// constant size.
4125 /// Likewise for functions with the OptSize attribute.
4127
4128 /// \brief Specify maximum number of store instructions per memmove call.
4129 ///
4130 /// When lowering \@llvm.memmove this field specifies the maximum number of
4131 /// store instructions that may be substituted for a call to memmove. Targets
4132 /// must set this value based on the cost threshold for that target. Targets
4133 /// should assume that the memmove will be done using as many of the largest
4134 /// store operations first, followed by smaller ones, if necessary, per
4135 /// alignment restrictions. For example, moving 9 bytes on a 32-bit machine
4136 /// with 8-bit alignment would result in nine 1-byte stores. This only
4137 /// applies to copying a constant array of constant size.
4139 /// Likewise for functions with the OptSize attribute.
4141
4142 /// Tells the code generator that select is more expensive than a branch if
4143 /// the branch is usually predicted right.
4145
4146 /// \see enableExtLdPromotion.
4148
4149 /// Return true if the value types that can be represented by the specified
4150 /// register class are all legal.
4151 bool isLegalRC(const TargetRegisterInfo &TRI,
4152 const TargetRegisterClass &RC) const;
4153
4154 /// Replace/modify any TargetFrameIndex operands with a targte-dependent
4155 /// sequence of memory operands that is recognized by PrologEpilogInserter.
4157 MachineBasicBlock *MBB) const;
4158
4160};
4161
4162/// This class defines information used to lower LLVM code to legal SelectionDAG
4163/// operators that the target instruction selector can accept natively.
4164///
4165/// This class also defines callbacks that targets must implement to lower
4166/// target-specific constructs to SelectionDAG operators.
4168public:
4169 struct DAGCombinerInfo;
4170 struct MakeLibCallOptions;
4171
4174
4175 explicit TargetLowering(const TargetMachine &TM,
4176 const TargetSubtargetInfo &STI);
4178
4179 bool isPositionIndependent() const;
4180
4181 // If set to true, SelectionDAG nodes will be consistently processed in
4182 // topological order. This is a temporary hook until sorting can be
4183 // enabled globally.
4184 virtual bool useTopologicalSorting() const { return false; }
4185
4188 UniformityInfo *UA) const {
4189 return false;
4190 }
4191
4192 // Lets target to control the following reassociation of operands: (op (op x,
4193 // c1), y) -> (op (op x, y), c1) where N0 is (op x, c1) and N1 is y. By
4194 // default consider profitable any case where N0 has single use. This
4195 // behavior reflects the condition replaced by this target hook call in the
4196 // DAGCombiner. Any particular target can implement its own heuristic to
4197 // restrict common combiner.
4199 SDValue N1) const {
4200 return N0.hasOneUse();
4201 }
4202
4203 // Lets target to control the following reassociation of operands: (op (op x,
4204 // c1), y) -> (op (op x, y), c1) where N0 is (op x, c1) and N1 is y. By
4205 // default consider profitable any case where N0 has single use. This
4206 // behavior reflects the condition replaced by this target hook call in the
4207 // combiner. Any particular target can implement its own heuristic to
4208 // restrict common combiner.
4210 Register N1) const {
4211 return MRI.hasOneNonDBGUse(N0);
4212 }
4213
4214 virtual bool isSDNodeAlwaysUniform(const SDNode * N) const {
4215 return false;
4216 }
4217
4218 /// Returns true by value, base pointer and offset pointer and addressing mode
4219 /// by reference if the node's address can be legally represented as
4220 /// pre-indexed load / store address.
4221 virtual bool getPreIndexedAddressParts(SDNode * /*N*/, SDValue &/*Base*/,
4222 SDValue &/*Offset*/,
4223 ISD::MemIndexedMode &/*AM*/,
4224 SelectionDAG &/*DAG*/) const {
4225 return false;
4226 }
4227
4228 /// Returns true by value, base pointer and offset pointer and addressing mode
4229 /// by reference if this node can be combined with a load / store to form a
4230 /// post-indexed load / store.
4231 virtual bool getPostIndexedAddressParts(SDNode * /*N*/, SDNode * /*Op*/,
4232 SDValue &/*Base*/,
4233 SDValue &/*Offset*/,
4234 ISD::MemIndexedMode &/*AM*/,
4235 SelectionDAG &/*DAG*/) const {
4236 return false;
4237 }
4238
4239 /// Returns true if the specified base+offset is a legal indexed addressing
4240 /// mode for this target. \p MI is the load or store instruction that is being
4241 /// considered for transformation.
4243 bool IsPre, MachineRegisterInfo &MRI) const {
4244 return false;
4245 }
4246
4247 /// Return the entry encoding for a jump table in the current function. The
4248 /// returned value is a member of the MachineJumpTableInfo::JTEntryKind enum.
4249 virtual unsigned getJumpTableEncoding() const;
4250
4251 virtual MVT getJumpTableRegTy(const DataLayout &DL) const {
4252 return getPointerTy(DL);
4253 }
4254
4255 virtual const MCExpr *
4257 const MachineBasicBlock * /*MBB*/, unsigned /*uid*/,
4258 MCContext &/*Ctx*/) const {
4259 llvm_unreachable("Need to implement this hook if target has custom JTIs");
4260 }
4261
4262 /// Returns relocation base for the given PIC jumptable.
4263 virtual SDValue getPICJumpTableRelocBase(SDValue Table,
4264 SelectionDAG &DAG) const;
4265
4266 /// This returns the relocation base for the given PIC jumptable, the same as
4267 /// getPICJumpTableRelocBase, but as an MCExpr.
4268 virtual const MCExpr *
4269 getPICJumpTableRelocBaseExpr(const MachineFunction *MF,
4270 unsigned JTI, MCContext &Ctx) const;
4271
4272 /// Return true if folding a constant offset with the given GlobalAddress is
4273 /// legal. It is frequently not legal in PIC relocation models.
4274 virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
4275
4276 /// On x86, return true if the operand with index OpNo is a CALL or JUMP
4277 /// instruction, which can use either a memory constraint or an address
4278 /// constraint. -fasm-blocks "__asm call foo" lowers to
4279 /// call void asm sideeffect inteldialect "call ${0:P}", "*m..."
4280 ///
4281 /// This function is used by a hack to choose the address constraint,
4282 /// lowering to a direct call.
4283 virtual bool
4285 unsigned OpNo) const {
4286 return false;
4287 }
4288
4290 SDValue &Chain) const;
4291
4292 void softenSetCCOperands(SelectionDAG &DAG, EVT VT, SDValue &NewLHS,
4293 SDValue &NewRHS, ISD::CondCode &CCCode,
4294 const SDLoc &DL, const SDValue OldLHS,
4295 const SDValue OldRHS) const;
4296
4297 void softenSetCCOperands(SelectionDAG &DAG, EVT VT, SDValue &NewLHS,
4298 SDValue &NewRHS, ISD::CondCode &CCCode,
4299 const SDLoc &DL, const SDValue OldLHS,
4300 const SDValue OldRHS, SDValue &Chain,
4301 bool IsSignaling = false) const;
4302
4304 SDValue Chain, MachineMemOperand *MMO,
4305 SDValue &NewLoad, SDValue Ptr,
4306 SDValue PassThru, SDValue Mask) const {
4307 llvm_unreachable("Not Implemented");
4308 }
4309
4311 SDValue Chain, MachineMemOperand *MMO,
4312 SDValue Ptr, SDValue Val,
4313 SDValue Mask) const {
4314 llvm_unreachable("Not Implemented");
4315 }
4316
4317 /// Returns a pair of (return value, chain).
4318 /// It is an error to pass RTLIB::Unsupported as \p LibcallImpl
4319 std::pair<SDValue, SDValue>
4320 makeLibCall(SelectionDAG &DAG, RTLIB::LibcallImpl LibcallImpl, EVT RetVT,
4321 ArrayRef<SDValue> Ops, MakeLibCallOptions CallOptions,
4322 const SDLoc &dl, SDValue Chain = SDValue()) const;
4323
4324 /// It is an error to pass RTLIB::UNKNOWN_LIBCALL as \p LC.
4325 std::pair<SDValue, SDValue> makeLibCall(SelectionDAG &DAG, RTLIB::Libcall LC,
4326 EVT RetVT, ArrayRef<SDValue> Ops,
4327 MakeLibCallOptions CallOptions,
4328 const SDLoc &dl,
4329 SDValue Chain = SDValue()) const {
4330 return makeLibCall(DAG, getLibcallImpl(LC), RetVT, Ops, CallOptions, dl,
4331 Chain);
4332 }
4333
4334 /// Check whether parameters to a call that are passed in callee saved
4335 /// registers are the same as from the calling function. This needs to be
4336 /// checked for tail call eligibility.
4337 bool parametersInCSRMatch(const MachineRegisterInfo &MRI,
4338 const uint32_t *CallerPreservedMask,
4339 const SmallVectorImpl<CCValAssign> &ArgLocs,
4340 const SmallVectorImpl<SDValue> &OutVals) const;
4341
4342 //===--------------------------------------------------------------------===//
4343 // TargetLowering Optimization Methods
4344 //
4345
4346 /// A convenience struct that encapsulates a DAG, and two SDValues for
4347 /// returning information from TargetLowering to its clients that want to
4348 /// combine.
4355
4357 bool LT, bool LO) :
4358 DAG(InDAG), LegalTys(LT), LegalOps(LO) {}
4359
4360 bool LegalTypes() const { return LegalTys; }
4361 bool LegalOperations() const { return LegalOps; }
4362
4364 Old = O;
4365 New = N;
4366 return true;
4367 }
4368 };
4369
4370 /// Determines the optimal series of memory ops to replace the memset /
4371 /// memcpy. Return true if the number of memory ops is below the threshold
4372 /// (Limit). Note that this is always the case when Limit is ~0. It returns
4373 /// the types of the sequence of memory ops to perform memset / memcpy by
4374 /// reference. If LargestVT is non-null, the target may set it to the largest
4375 /// EVT that should be used for generating the memset value (e.g., for vector
4376 /// splats). If LargestVT is null or left unchanged, the caller will compute
4377 /// it from MemOps.
4378 virtual bool findOptimalMemOpLowering(LLVMContext &Context,
4379 std::vector<EVT> &MemOps,
4380 unsigned Limit, const MemOp &Op,
4381 unsigned DstAS, unsigned SrcAS,
4382 const AttributeList &FuncAttributes,
4383 EVT *LargestVT = nullptr) const;
4384
4385 /// Check to see if the specified operand of the specified instruction is a
4386 /// constant integer. If so, check to see if there are any bits set in the
4387 /// constant that are not demanded. If so, shrink the constant and return
4388 /// true.
4390 const APInt &DemandedElts,
4391 TargetLoweringOpt &TLO) const;
4392
4393 /// Helper wrapper around ShrinkDemandedConstant, demanding all elements.
4395 TargetLoweringOpt &TLO) const;
4396
4397 // Target hook to do target-specific const optimization, which is called by
4398 // ShrinkDemandedConstant. This function should return true if the target
4399 // doesn't want ShrinkDemandedConstant to further optimize the constant.
4401 const APInt &DemandedBits,
4402 const APInt &DemandedElts,
4403 TargetLoweringOpt &TLO) const {
4404 return false;
4405 }
4406
4407 /// Convert x+y to (VT)((SmallVT)x+(SmallVT)y) if the casts are free.
4408 /// This uses isTruncateFree/isZExtFree and ANY_EXTEND for the widening cast,
4409 /// but it could be generalized for targets with other types of implicit
4410 /// widening casts.
4411 bool ShrinkDemandedOp(SDValue Op, unsigned BitWidth,
4412 const APInt &DemandedBits,
4413 TargetLoweringOpt &TLO) const;
4414
4415 /// Look at Op. At this point, we know that only the DemandedBits bits of the
4416 /// result of Op are ever used downstream. If we can use this information to
4417 /// simplify Op, create a new simplified DAG node and return true, returning
4418 /// the original and new nodes in Old and New. Otherwise, analyze the
4419 /// expression and return a mask of KnownOne and KnownZero bits for the
4420 /// expression (used to simplify the caller). The KnownZero/One bits may only
4421 /// be accurate for those bits in the Demanded masks.
4422 /// \p AssumeSingleUse When this parameter is true, this function will
4423 /// attempt to simplify \p Op even if there are multiple uses.
4424 /// Callers are responsible for correctly updating the DAG based on the
4425 /// results of this function, because simply replacing TLO.Old
4426 /// with TLO.New will be incorrect when this parameter is true and TLO.Old
4427 /// has multiple uses.
4428 bool SimplifyDemandedBits(SDValue Op, const APInt &DemandedBits,
4429 const APInt &DemandedElts, KnownBits &Known,
4430 TargetLoweringOpt &TLO, unsigned Depth = 0,
4431 bool AssumeSingleUse = false) const;
4432
4433 /// Helper wrapper around SimplifyDemandedBits, demanding all elements.
4434 /// Adds Op back to the worklist upon success.
4435 bool SimplifyDemandedBits(SDValue Op, const APInt &DemandedBits,
4436 KnownBits &Known, TargetLoweringOpt &TLO,
4437 unsigned Depth = 0,
4438 bool AssumeSingleUse = false) const;
4439
4440 /// Helper wrapper around SimplifyDemandedBits.
4441 /// Adds Op back to the worklist upon success.
4442 bool SimplifyDemandedBits(SDValue Op, const APInt &DemandedBits,
4443 DAGCombinerInfo &DCI) const;
4444
4445 /// Helper wrapper around SimplifyDemandedBits.
4446 /// Adds Op back to the worklist upon success.
4447 bool SimplifyDemandedBits(SDValue Op, const APInt &DemandedBits,
4448 const APInt &DemandedElts,
4449 DAGCombinerInfo &DCI) const;
4450
4451 /// More limited version of SimplifyDemandedBits that can be used to "look
4452 /// through" ops that don't contribute to the DemandedBits/DemandedElts -
4453 /// bitwise ops etc.
4454 SDValue SimplifyMultipleUseDemandedBits(SDValue Op, const APInt &DemandedBits,
4455 const APInt &DemandedElts,
4456 SelectionDAG &DAG,
4457 unsigned Depth = 0) const;
4458
4459 /// Helper wrapper around SimplifyMultipleUseDemandedBits, demanding all
4460 /// elements.
4461 SDValue SimplifyMultipleUseDemandedBits(SDValue Op, const APInt &DemandedBits,
4462 SelectionDAG &DAG,
4463 unsigned Depth = 0) const;
4464
4465 /// Helper wrapper around SimplifyMultipleUseDemandedBits, demanding all
4466 /// bits from only some vector elements.
4467 SDValue SimplifyMultipleUseDemandedVectorElts(SDValue Op,
4468 const APInt &DemandedElts,
4469 SelectionDAG &DAG,
4470 unsigned Depth = 0) const;
4471
4472 /// Look at Vector Op. At this point, we know that only the DemandedElts
4473 /// elements of the result of Op are ever used downstream. If we can use
4474 /// this information to simplify Op, create a new simplified DAG node and
4475 /// return true, storing the original and new nodes in TLO.
4476 /// Otherwise, analyze the expression and return a mask of KnownUndef and
4477 /// KnownZero elements for the expression (used to simplify the caller).
4478 /// The KnownUndef/Zero elements may only be accurate for those bits
4479 /// in the DemandedMask.
4480 /// \p AssumeSingleUse When this parameter is true, this function will
4481 /// attempt to simplify \p Op even if there are multiple uses.
4482 /// Callers are responsible for correctly updating the DAG based on the
4483 /// results of this function, because simply replacing TLO.Old
4484 /// with TLO.New will be incorrect when this parameter is true and TLO.Old
4485 /// has multiple uses.
4486 bool SimplifyDemandedVectorElts(SDValue Op, const APInt &DemandedEltMask,
4487 APInt &KnownUndef, APInt &KnownZero,
4488 TargetLoweringOpt &TLO, unsigned Depth = 0,
4489 bool AssumeSingleUse = false) const;
4490
4491 /// Helper wrapper around SimplifyDemandedVectorElts.
4492 /// Adds Op back to the worklist upon success.
4493 bool SimplifyDemandedVectorElts(SDValue Op, const APInt &DemandedElts,
4494 DAGCombinerInfo &DCI) const;
4495
4496 /// Return true if the target supports simplifying demanded vector elements by
4497 /// converting them to undefs.
4498 virtual bool
4500 const TargetLoweringOpt &TLO) const {
4501 return true;
4502 }
4503
4504 /// If only low elements of a vector are demanded, shrink the operation to the
4505 /// returned size in bits by converting
4506 /// (op x) to insert_subvector (op (extract_subvector x)).
4507 ///
4508 /// The returned size must be a multiple of the element size, greater than or
4509 /// equal to the demanded part of the vector and less than the original
4510 /// vector size. Return 0 to disable shrinking.
4511 virtual unsigned
4513 const APInt &DemandedElts) const {
4514 return 0;
4515 }
4516
4517 /// Determine which of the bits specified in Mask are known to be either zero
4518 /// or one and return them in the KnownZero/KnownOne bitsets. The DemandedElts
4519 /// argument allows us to only collect the known bits that are shared by the
4520 /// requested vector elements.
4521 virtual void computeKnownBitsForTargetNode(const SDValue Op,
4523 const APInt &DemandedElts,
4524 const SelectionDAG &DAG,
4525 unsigned Depth = 0) const;
4526
4527 /// Determine which of the bits specified in Mask are known to be either zero
4528 /// or one and return them in the KnownZero/KnownOne bitsets. The DemandedElts
4529 /// argument allows us to only collect the known bits that are shared by the
4530 /// requested vector elements. This is for GISel.
4531 virtual void computeKnownBitsForTargetInstr(GISelValueTracking &Analysis,
4533 const APInt &DemandedElts,
4534 const MachineRegisterInfo &MRI,
4535 unsigned Depth = 0) const;
4536
4537 virtual void computeKnownFPClassForTargetInstr(GISelValueTracking &Analysis,
4538 Register R,
4540 const APInt &DemandedElts,
4541 const MachineRegisterInfo &MRI,
4542 unsigned Depth = 0) const;
4543
4544 /// Determine the known alignment for the pointer value \p R. This is can
4545 /// typically be inferred from the number of low known 0 bits. However, for a
4546 /// pointer with a non-integral address space, the alignment value may be
4547 /// independent from the known low bits.
4548 virtual Align computeKnownAlignForTargetInstr(GISelValueTracking &Analysis,
4549 Register R,
4550 const MachineRegisterInfo &MRI,
4551 unsigned Depth = 0) const;
4552
4553 /// Determine known bits of a pointer to a known valid stack object.
4554 /// The default implementation computes low bits based on alignment.
4555 virtual void computeKnownBitsForStackObjectPointer(KnownBits &Known,
4556 const MachineFunction &MF,
4557 Align Alignment) const;
4558
4559 /// This method can be implemented by targets that want to expose additional
4560 /// information about sign bits to the DAG Combiner. The DemandedElts
4561 /// argument allows us to only collect the minimum sign bits that are shared
4562 /// by the requested vector elements.
4563 virtual unsigned ComputeNumSignBitsForTargetNode(SDValue Op,
4564 const APInt &DemandedElts,
4565 const SelectionDAG &DAG,
4566 unsigned Depth = 0) const;
4567
4568 /// This method can be implemented by targets that want to expose additional
4569 /// information about sign bits to GlobalISel combiners. The DemandedElts
4570 /// argument allows us to only collect the minimum sign bits that are shared
4571 /// by the requested vector elements.
4572 virtual unsigned computeNumSignBitsForTargetInstr(
4573 GISelValueTracking &Analysis, Register R, const APInt &DemandedElts,
4574 const MachineRegisterInfo &MRI, unsigned Depth = 0) const;
4575
4576 /// Attempt to simplify any target nodes based on the demanded vector
4577 /// elements, returning true on success. Otherwise, analyze the expression and
4578 /// return a mask of KnownUndef and KnownZero elements for the expression
4579 /// (used to simplify the caller). The KnownUndef/Zero elements may only be
4580 /// accurate for those bits in the DemandedMask.
4581 virtual bool SimplifyDemandedVectorEltsForTargetNode(
4582 SDValue Op, const APInt &DemandedElts, APInt &KnownUndef,
4583 APInt &KnownZero, TargetLoweringOpt &TLO, unsigned Depth = 0) const;
4584
4585 /// Attempt to simplify any target nodes based on the demanded bits/elts,
4586 /// returning true on success. Otherwise, analyze the
4587 /// expression and return a mask of KnownOne and KnownZero bits for the
4588 /// expression (used to simplify the caller). The KnownZero/One bits may only
4589 /// be accurate for those bits in the Demanded masks.
4590 virtual bool SimplifyDemandedBitsForTargetNode(SDValue Op,
4591 const APInt &DemandedBits,
4592 const APInt &DemandedElts,
4594 TargetLoweringOpt &TLO,
4595 unsigned Depth = 0) const;
4596
4597 /// More limited version of SimplifyDemandedBits that can be used to "look
4598 /// through" ops that don't contribute to the DemandedBits/DemandedElts -
4599 /// bitwise ops etc.
4600 virtual SDValue SimplifyMultipleUseDemandedBitsForTargetNode(
4601 SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts,
4602 SelectionDAG &DAG, unsigned Depth) const;
4603
4604 /// Return true if this function can prove that \p Op is never poison
4605 /// and, \p Kind can be used to track poison and/or undef bits. The
4606 /// DemandedElts argument limits the check to the requested vector elements.
4607 virtual bool isGuaranteedNotToBeUndefOrPoisonForTargetNode(
4608 SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG,
4609 UndefPoisonKind Kind, unsigned Depth) const;
4610
4611 /// Return true if Op can create undef or poison from non-undef & non-poison
4612 /// operands. The DemandedElts argument limits the check to the requested
4613 /// vector elements.
4614 virtual bool canCreateUndefOrPoisonForTargetNode(
4615 SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG,
4616 UndefPoisonKind Kind, bool ConsiderFlags, unsigned Depth) const;
4617
4618 /// Tries to build a legal vector shuffle using the provided parameters
4619 /// or equivalent variations. The Mask argument maybe be modified as the
4620 /// function tries different variations.
4621 /// Returns an empty SDValue if the operation fails.
4622 SDValue buildLegalVectorShuffle(EVT VT, const SDLoc &DL, SDValue N0,
4624 SelectionDAG &DAG) const;
4625
4626 /// This method returns the constant pool value that will be loaded by LD.
4627 /// NOTE: You must check for implicit extensions of the constant by LD.
4628 virtual const Constant *getTargetConstantFromLoad(LoadSDNode *LD) const;
4629
4630 /// Determine floating-point class information for a target node. The
4631 /// DemandedElts argument allows us to only collect the known FP classes
4632 /// that are shared by the requested vector elements.
4633 virtual void computeKnownFPClassForTargetNode(const SDValue Op,
4635 const APInt &DemandedElts,
4636 const SelectionDAG &DAG,
4637 unsigned Depth = 0) const;
4638
4639 /// If \p SNaN is false, \returns true if \p Op is known to never be any
4640 /// NaN. If \p sNaN is true, returns if \p Op is known to never be a signaling
4641 /// NaN.
4642 virtual bool isKnownNeverNaNForTargetNode(SDValue Op,
4643 const APInt &DemandedElts,
4644 const SelectionDAG &DAG,
4645 bool SNaN = false,
4646 unsigned Depth = 0) const;
4647
4648 /// Return true if vector \p Op has the same value across all \p DemandedElts,
4649 /// indicating any elements which may be undef in the output \p UndefElts.
4650 virtual bool isSplatValueForTargetNode(SDValue Op, const APInt &DemandedElts,
4651 APInt &UndefElts,
4652 const SelectionDAG &DAG,
4653 unsigned Depth = 0) const;
4654
4655 /// Returns true if the given Opc is considered a canonical constant for the
4656 /// target, which should not be transformed back into a BUILD_VECTOR.
4658 return Op.getOpcode() == ISD::SPLAT_VECTOR ||
4659 Op.getOpcode() == ISD::SPLAT_VECTOR_PARTS;
4660 }
4661
4662 /// Return true if the given select/vselect should be considered canonical and
4663 /// not be transformed. Currently only used for "vselect (not Cond), N1, N2 ->
4664 /// vselect Cond, N2, N1".
4665 virtual bool isTargetCanonicalSelect(SDNode *N) const { return false; }
4666
4668 void *DC; // The DAG Combiner object.
4671
4672 public:
4674
4675 DAGCombinerInfo(SelectionDAG &dag, CombineLevel level, bool cl, void *dc)
4676 : DC(dc), Level(level), CalledByLegalizer(cl), DAG(dag) {}
4677
4678 bool isBeforeLegalize() const { return Level == BeforeLegalizeTypes; }
4680 bool isAfterLegalizeDAG() const { return Level >= AfterLegalizeDAG; }
4683
4684 LLVM_ABI void AddToWorklist(SDNode *N);
4685 LLVM_ABI SDValue CombineTo(SDNode *N, ArrayRef<SDValue> To,
4686 bool AddTo = true);
4687 LLVM_ABI SDValue CombineTo(SDNode *N, SDValue Res, bool AddTo = true);
4688 LLVM_ABI SDValue CombineTo(SDNode *N, SDValue Res0, SDValue Res1,
4689 bool AddTo = true);
4690
4691 LLVM_ABI bool recursivelyDeleteUnusedNodes(SDNode *N);
4692
4693 LLVM_ABI void CommitTargetLoweringOpt(const TargetLoweringOpt &TLO);
4694 };
4695
4696 /// Return if the N is a constant or constant vector equal to the true value
4697 /// from getBooleanContents().
4698 bool isConstTrueVal(SDValue N) const;
4699
4700 /// Return if the N is a constant or constant vector equal to the false value
4701 /// from getBooleanContents().
4702 bool isConstFalseVal(SDValue N) const;
4703
4704 /// Return if \p N is a True value when extended to \p VT.
4705 bool isExtendedTrueVal(const ConstantSDNode *N, EVT VT, bool SExt) const;
4706
4707 /// Try to simplify a setcc built with the specified operands and cc. If it is
4708 /// unable to simplify it, return a null SDValue.
4709 SDValue SimplifySetCC(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond,
4710 bool foldBooleans, DAGCombinerInfo &DCI,
4711 const SDLoc &dl) const;
4712
4713 // For targets which wrap address, unwrap for analysis.
4714 virtual SDValue unwrapAddress(SDValue N) const { return N; }
4715
4716 /// Returns true (and the GlobalValue and the offset) if the node is a
4717 /// GlobalAddress + offset.
4718 virtual bool
4719 isGAPlusOffset(SDNode *N, const GlobalValue* &GA, int64_t &Offset) const;
4720
4721 /// This method will be invoked for all target nodes and for any
4722 /// target-independent nodes that the target has registered with invoke it
4723 /// for.
4724 ///
4725 /// The semantics are as follows:
4726 /// Return Value:
4727 /// SDValue.Val == 0 - No change was made
4728 /// SDValue.Val == N - N was replaced, is dead, and is already handled.
4729 /// otherwise - N should be replaced by the returned Operand.
4730 ///
4731 /// In addition, methods provided by DAGCombinerInfo may be used to perform
4732 /// more complex transformations.
4733 ///
4734 virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
4735
4736 /// Return true if it is profitable to move this shift by a constant amount
4737 /// through its operand, adjusting any immediate operands as necessary to
4738 /// preserve semantics. This transformation may not be desirable if it
4739 /// disrupts a particularly auspicious target-specific tree (e.g. bitfield
4740 /// extraction in AArch64). By default, it returns true.
4741 ///
4742 /// @param N the shift node
4743 /// @param Level the current DAGCombine legalization level.
4745 CombineLevel Level) const {
4746 SDValue ShiftLHS = N->getOperand(0);
4747 if (!ShiftLHS->hasOneUse())
4748 return false;
4749 if (ShiftLHS.getOpcode() == ISD::SIGN_EXTEND &&
4750 !ShiftLHS.getOperand(0)->hasOneUse())
4751 return false;
4752 return true;
4753 }
4754
4755 /// GlobalISel - return true if it is profitable to move this shift by a
4756 /// constant amount through its operand, adjusting any immediate operands as
4757 /// necessary to preserve semantics. This transformation may not be desirable
4758 /// if it disrupts a particularly auspicious target-specific tree (e.g.
4759 /// bitfield extraction in AArch64). By default, it returns true.
4760 ///
4761 /// @param MI the shift instruction
4762 /// @param IsAfterLegal true if running after legalization.
4764 bool IsAfterLegal) const {
4765 return true;
4766 }
4767
4768 /// GlobalISel - return true if it's profitable to perform the combine:
4769 /// shl ([sza]ext x), y => zext (shl x, y)
4770 virtual bool isDesirableToPullExtFromShl(const MachineInstr &MI) const {
4771 return true;
4772 }
4773
4774 // Return AndOrSETCCFoldKind::{AddAnd, ABS} if its desirable to try and
4775 // optimize LogicOp(SETCC0, SETCC1). An example (what is implemented as of
4776 // writing this) is:
4777 // With C as a power of 2 and C != 0 and C != INT_MIN:
4778 // AddAnd:
4779 // (icmp eq A, C) | (icmp eq A, -C)
4780 // -> (icmp eq and(add(A, C), ~(C + C)), 0)
4781 // (icmp ne A, C) & (icmp ne A, -C)w
4782 // -> (icmp ne and(add(A, C), ~(C + C)), 0)
4783 // ABS:
4784 // (icmp eq A, C) | (icmp eq A, -C)
4785 // -> (icmp eq Abs(A), C)
4786 // (icmp ne A, C) & (icmp ne A, -C)w
4787 // -> (icmp ne Abs(A), C)
4788 //
4789 // @param LogicOp the logic op
4790 // @param SETCC0 the first of the SETCC nodes
4791 // @param SETCC0 the second of the SETCC nodes
4793 const SDNode *LogicOp, const SDNode *SETCC0, const SDNode *SETCC1) const {
4795 }
4796
4797 /// Return true if it is profitable to combine an XOR of a logical shift
4798 /// to create a logical shift of NOT. This transformation may not be desirable
4799 /// if it disrupts a particularly auspicious target-specific tree (e.g.
4800 /// BIC on ARM/AArch64). By default, it returns true.
4801 virtual bool isDesirableToCommuteXorWithShift(const SDNode *N) const {
4802 return true;
4803 }
4804
4805 /// Return true if the target has native support for the specified value type
4806 /// and it is 'desirable' to use the type for the given node type. e.g. On x86
4807 /// i16 is legal, but undesirable since i16 instruction encodings are longer
4808 /// and some i16 instructions are slow.
4809 virtual bool isTypeDesirableForOp(unsigned /*Opc*/, EVT VT) const {
4810 // By default, assume all legal types are desirable.
4811 return isTypeLegal(VT);
4812 }
4813
4814 /// Return true if it is profitable for dag combiner to transform a floating
4815 /// point op of specified opcode to a equivalent op of an integer
4816 /// type. e.g. f32 load -> i32 load can be profitable on ARM.
4817 virtual bool isDesirableToTransformToIntegerOp(unsigned /*Opc*/,
4818 EVT /*VT*/) const {
4819 return false;
4820 }
4821
4822 /// This method query the target whether it is beneficial for dag combiner to
4823 /// promote the specified node. If true, it should return the desired
4824 /// promotion type by reference.
4825 virtual bool IsDesirableToPromoteOp(SDValue /*Op*/, EVT &/*PVT*/) const {
4826 return false;
4827 }
4828
4829 /// Return true if the target supports swifterror attribute. It optimizes
4830 /// loads and stores to reading and writing a specific register.
4831 virtual bool supportSwiftError() const {
4832 return false;
4833 }
4834
4835 /// Return true if the target supports that a subset of CSRs for the given
4836 /// machine function is handled explicitly via copies.
4837 virtual bool supportSplitCSR(MachineFunction *MF) const {
4838 return false;
4839 }
4840
4841 /// Return true if the target supports kcfi operand bundles.
4842 virtual bool supportKCFIBundles() const { return false; }
4843
4844 /// Return true if the target supports ptrauth operand bundles.
4845 virtual bool supportPtrAuthBundles() const { return false; }
4846
4847 /// Perform necessary initialization to handle a subset of CSRs explicitly
4848 /// via copies. This function is called at the beginning of instruction
4849 /// selection.
4850 virtual void initializeSplitCSR(MachineBasicBlock *Entry) const {
4851 llvm_unreachable("Not Implemented");
4852 }
4853
4854 /// Insert explicit copies in entry and exit blocks. We copy a subset of
4855 /// CSRs to virtual registers in the entry block, and copy them back to
4856 /// physical registers in the exit blocks. This function is called at the end
4857 /// of instruction selection.
4859 MachineBasicBlock *Entry,
4860 const SmallVectorImpl<MachineBasicBlock *> &Exits) const {
4861 llvm_unreachable("Not Implemented");
4862 }
4863
4864 /// Return the newly negated expression if the cost is not expensive and
4865 /// set the cost in \p Cost to indicate that if it is cheaper or neutral to
4866 /// do the negation.
4867 virtual SDValue getNegatedExpression(SDValue Op, SelectionDAG &DAG,
4868 bool LegalOps, bool OptForSize,
4869 NegatibleCost &Cost,
4870 unsigned Depth = 0) const;
4871
4873 SDValue Op, SelectionDAG &DAG, bool LegalOps, bool OptForSize,
4875 unsigned Depth = 0) const {
4877 SDValue Neg =
4878 getNegatedExpression(Op, DAG, LegalOps, OptForSize, Cost, Depth);
4879 if (!Neg)
4880 return SDValue();
4881
4882 if (Cost <= CostThreshold)
4883 return Neg;
4884
4885 // Remove the new created node to avoid the side effect to the DAG.
4886 if (Neg->use_empty())
4887 DAG.RemoveDeadNode(Neg.getNode());
4888 return SDValue();
4889 }
4890
4891 /// This is the helper function to return the newly negated expression only
4892 /// when the cost is cheaper.
4894 bool LegalOps, bool OptForSize,
4895 unsigned Depth = 0) const {
4896 return getCheaperOrNeutralNegatedExpression(Op, DAG, LegalOps, OptForSize,
4898 }
4899
4900 /// This is the helper function to return the newly negated expression if
4901 /// the cost is not expensive.
4903 bool OptForSize, unsigned Depth = 0) const {
4905 return getNegatedExpression(Op, DAG, LegalOps, OptForSize, Cost, Depth);
4906 }
4907
4908 //===--------------------------------------------------------------------===//
4909 // Lowering methods - These methods must be implemented by targets so that
4910 // the SelectionDAGBuilder code knows how to lower these.
4911 //
4912
4913 /// Target-specific splitting of values into parts that fit a register
4914 /// storing a legal type
4916 SelectionDAG & DAG, const SDLoc &DL, SDValue Val, SDValue *Parts,
4917 unsigned NumParts, MVT PartVT, std::optional<CallingConv::ID> CC) const {
4918 return false;
4919 }
4920
4921 /// Target-specific combining of register parts into its original value
4922 virtual SDValue
4924 const SDValue *Parts, unsigned NumParts,
4925 MVT PartVT, EVT ValueVT,
4926 std::optional<CallingConv::ID> CC) const {
4927 return SDValue();
4928 }
4929
4930 /// This hook must be implemented to lower the incoming (formal) arguments,
4931 /// described by the Ins array, into the specified DAG. The implementation
4932 /// should fill in the InVals array with legal-type argument values, and
4933 /// return the resulting token chain value.
4935 SDValue /*Chain*/, CallingConv::ID /*CallConv*/, bool /*isVarArg*/,
4936 const SmallVectorImpl<ISD::InputArg> & /*Ins*/, const SDLoc & /*dl*/,
4937 SelectionDAG & /*DAG*/, SmallVectorImpl<SDValue> & /*InVals*/) const {
4938 llvm_unreachable("Not Implemented");
4939 }
4940
4941 /// Optional target hook to add target-specific actions when entering EH pad
4942 /// blocks. The implementation should return the resulting token chain value.
4943 virtual SDValue lowerEHPadEntry(SDValue Chain, const SDLoc &DL,
4944 SelectionDAG &DAG) const {
4945 return SDValue();
4946 }
4947
4948 virtual void markLibCallAttributes(MachineFunction *MF, unsigned CC,
4949 ArgListTy &Args) const {}
4950
4951 /// This structure contains the information necessary for lowering
4952 /// pointer-authenticating indirect calls. It is equivalent to the "ptrauth"
4953 /// operand bundle found on the call instruction, if any.
4958
4959 /// This structure contains all information that is necessary for lowering
4960 /// calls. It is passed to TLI::LowerCallTo when the SelectionDAG builder
4961 /// needs to lower a call, and targets will see this struct in their LowerCall
4962 /// implementation.
4965 /// Original unlegalized return type.
4966 Type *OrigRetTy = nullptr;
4967 /// Same as OrigRetTy, or partially legalized for soft float libcalls.
4968 Type *RetTy = nullptr;
4969 bool RetSExt : 1;
4970 bool RetZExt : 1;
4971 bool IsVarArg : 1;
4972 bool IsInReg : 1;
4978 bool NoMerge : 1;
4979
4980 // IsTailCall should be modified by implementations of
4981 // TargetLowering::LowerCall that perform tail call conversions.
4982 bool IsTailCall = false;
4983
4984 // Is Call lowering done post SelectionDAG type legalization.
4986
4987 unsigned NumFixedArgs = -1;
4993 const CallBase *CB = nullptr;
4998 const ConstantInt *CFIType = nullptr;
5001
5002 std::optional<PtrAuthInfo> PAI;
5003
5009
5011 DL = dl;
5012 return *this;
5013 }
5014
5016 Chain = InChain;
5017 return *this;
5018 }
5019
5020 // setCallee with target/module-specific attributes
5022 SDValue Target, ArgListTy &&ArgsList) {
5023 return setLibCallee(CC, ResultType, ResultType, Target,
5024 std::move(ArgsList));
5025 }
5026
5028 Type *OrigResultType, SDValue Target,
5029 ArgListTy &&ArgsList) {
5030 OrigRetTy = OrigResultType;
5031 RetTy = ResultType;
5032 Callee = Target;
5033 CallConv = CC;
5034 NumFixedArgs = ArgsList.size();
5035 Args = std::move(ArgsList);
5036
5037 DAG.getTargetLoweringInfo().markLibCallAttributes(
5038 &(DAG.getMachineFunction()), CC, Args);
5039 return *this;
5040 }
5041
5043 SDValue Target, ArgListTy &&ArgsList,
5044 AttributeSet ResultAttrs = {}) {
5045 RetTy = OrigRetTy = ResultType;
5046 IsInReg = ResultAttrs.hasAttribute(Attribute::InReg);
5047 RetSExt = ResultAttrs.hasAttribute(Attribute::SExt);
5048 RetZExt = ResultAttrs.hasAttribute(Attribute::ZExt);
5049 NoMerge = ResultAttrs.hasAttribute(Attribute::NoMerge);
5050
5051 Callee = Target;
5052 CallConv = CC;
5053 NumFixedArgs = ArgsList.size();
5054 Args = std::move(ArgsList);
5055 return *this;
5056 }
5057
5059 SDValue Target, ArgListTy &&ArgsList,
5060 const CallBase &Call) {
5061 RetTy = OrigRetTy = ResultType;
5062
5063 IsInReg = Call.hasRetAttr(Attribute::InReg);
5065 Call.doesNotReturn() ||
5066 (!isa<InvokeInst>(Call) && isa<UnreachableInst>(Call.getNextNode()));
5067 IsVarArg = FTy->isVarArg();
5068 IsReturnValueUsed = !Call.use_empty();
5069 RetSExt = Call.hasRetAttr(Attribute::SExt);
5070 RetZExt = Call.hasRetAttr(Attribute::ZExt);
5071 NoMerge = Call.hasFnAttr(Attribute::NoMerge);
5072
5073 Callee = Target;
5074
5075 CallConv = Call.getCallingConv();
5076 NumFixedArgs = FTy->getNumParams();
5077 Args = std::move(ArgsList);
5078
5079 CB = &Call;
5080
5081 return *this;
5082 }
5083
5085 IsInReg = Value;
5086 return *this;
5087 }
5088
5091 return *this;
5092 }
5093
5095 IsVarArg = Value;
5096 return *this;
5097 }
5098
5100 IsTailCall = Value;
5101 return *this;
5102 }
5103
5106 return *this;
5107 }
5108
5111 return *this;
5112 }
5113
5115 RetSExt = Value;
5116 return *this;
5117 }
5118
5120 RetZExt = Value;
5121 return *this;
5122 }
5123
5126 return *this;
5127 }
5128
5131 return *this;
5132 }
5133
5135 PAI = Value;
5136 return *this;
5137 }
5138
5141 return *this;
5142 }
5143
5145 CFIType = Type;
5146 return *this;
5147 }
5148
5151 return *this;
5152 }
5153
5155 DeactivationSymbol = Sym;
5156 return *this;
5157 }
5158
5160 return Args;
5161 }
5162 };
5163
5164 /// This structure is used to pass arguments to makeLibCall function.
5166 // By passing type list before soften to makeLibCall, the target hook
5167 // shouldExtendTypeInLibCall can get the original type before soften.
5171
5172 bool IsSigned : 1;
5176 bool IsSoften : 1;
5177
5181
5183 IsSigned = Value;
5184 return *this;
5185 }
5186
5189 return *this;
5190 }
5191
5194 return *this;
5195 }
5196
5199 return *this;
5200 }
5201
5203 OpsVTBeforeSoften = OpsVT;
5204 RetVTBeforeSoften = RetVT;
5205 IsSoften = true;
5206 return *this;
5207 }
5208
5209 /// Override the argument type for an operand. Leave the type as null to use
5210 /// the type from the operand's node.
5212 OpsTypeOverrides = OpsTypes;
5213 return *this;
5214 }
5215 };
5216
5217 /// This function lowers an abstract call to a function into an actual call.
5218 /// This returns a pair of operands. The first element is the return value
5219 /// for the function (if RetTy is not VoidTy). The second element is the
5220 /// outgoing token chain. It calls LowerCall to do the actual lowering.
5221 std::pair<SDValue, SDValue> LowerCallTo(CallLoweringInfo &CLI) const;
5222
5223 /// This hook must be implemented to lower calls into the specified
5224 /// DAG. The outgoing arguments to the call are described by the Outs array,
5225 /// and the values to be returned by the call are described by the Ins
5226 /// array. The implementation should fill in the InVals array with legal-type
5227 /// return values from the call, and return the resulting token chain value.
5228 virtual SDValue
5230 SmallVectorImpl<SDValue> &/*InVals*/) const {
5231 llvm_unreachable("Not Implemented");
5232 }
5233
5234 /// Target-specific cleanup for formal ByVal parameters.
5235 virtual void HandleByVal(CCState *, unsigned &, Align) const {}
5236
5237 /// This hook should be implemented to check whether the return values
5238 /// described by the Outs array can fit into the return registers. If false
5239 /// is returned, an sret-demotion is performed.
5240 virtual bool CanLowerReturn(CallingConv::ID /*CallConv*/,
5241 MachineFunction &/*MF*/, bool /*isVarArg*/,
5242 const SmallVectorImpl<ISD::OutputArg> &/*Outs*/,
5243 LLVMContext &/*Context*/, const Type *RetTy) const
5244 {
5245 // Return true by default to get preexisting behavior.
5246 return true;
5247 }
5248
5249 /// Annotate a stack object pointer with known-bits assertions.
5250 SDValue annotateStackObjectPointer(SDValue Ptr, SelectionDAG &DAG,
5251 const SDLoc &DL, Align Alignment) const;
5252
5253 /// This hook must be implemented to lower outgoing return values, described
5254 /// by the Outs array, into the specified DAG. The implementation should
5255 /// return the resulting token chain value.
5256 virtual SDValue LowerReturn(SDValue /*Chain*/, CallingConv::ID /*CallConv*/,
5257 bool /*isVarArg*/,
5258 const SmallVectorImpl<ISD::OutputArg> & /*Outs*/,
5259 const SmallVectorImpl<SDValue> & /*OutVals*/,
5260 const SDLoc & /*dl*/,
5261 SelectionDAG & /*DAG*/) const {
5262 llvm_unreachable("Not Implemented");
5263 }
5264
5265 /// Return true if result of the specified node is used by a return node
5266 /// only. It also compute and return the input chain for the tail call.
5267 ///
5268 /// This is used to determine whether it is possible to codegen a libcall as
5269 /// tail call at legalization time.
5270 virtual bool isUsedByReturnOnly(SDNode *, SDValue &/*Chain*/) const {
5271 return false;
5272 }
5273
5274 /// Return true if the target may be able emit the call instruction as a tail
5275 /// call. This is used by optimization passes to determine if it's profitable
5276 /// to duplicate return instructions to enable tailcall optimization.
5277 virtual bool mayBeEmittedAsTailCall(const CallInst *) const {
5278 return false;
5279 }
5280
5281 /// Return the register ID of the name passed in. Used by named register
5282 /// global variables extension. There is no target-independent behaviour
5283 /// so the default action is to bail.
5284 virtual Register getRegisterByName(const char* RegName, LLT Ty,
5285 const MachineFunction &MF) const {
5286 reportFatalUsageError("Named registers not implemented for this target");
5287 }
5288
5289 /// Return the type that should be used to zero or sign extend a
5290 /// zeroext/signext integer return value. FIXME: Some C calling conventions
5291 /// require the return type to be promoted, but this is not true all the time,
5292 /// e.g. i1/i8/i16 on x86/x86_64. It is also not necessary for non-C calling
5293 /// conventions. The frontend should handle this and include all of the
5294 /// necessary information.
5296 ISD::NodeType /*ExtendKind*/) const {
5297 EVT MinVT = getRegisterType(Context, MVT::i32);
5298 return VT.bitsLT(MinVT) ? MinVT : VT;
5299 }
5300
5301 /// For some targets, an LLVM struct type must be broken down into multiple
5302 /// simple types, but the calling convention specifies that the entire struct
5303 /// must be passed in a block of consecutive registers.
5304 virtual bool
5306 bool isVarArg,
5307 const DataLayout &DL) const {
5308 return false;
5309 }
5310
5311 /// For most targets, an LLVM type must be broken down into multiple
5312 /// smaller types. Usually the halves are ordered according to the endianness
5313 /// but for some platform that would break. So this method will default to
5314 /// matching the endianness but can be overridden.
5315 virtual bool
5317 return DL.isLittleEndian();
5318 }
5319
5320 /// Returns a 0 terminated array of registers that can be safely used as
5321 /// scratch registers.
5323 return nullptr;
5324 }
5325
5326 /// Returns a 0 terminated array of rounding control registers that can be
5327 /// attached into strict FP call.
5331
5332 /// This callback is used to prepare for a volatile or atomic load.
5333 /// It takes a chain node as input and returns the chain for the load itself.
5334 ///
5335 /// Having a callback like this is necessary for targets like SystemZ,
5336 /// which allows a CPU to reuse the result of a previous load indefinitely,
5337 /// even if a cache-coherent store is performed by another CPU. The default
5338 /// implementation does nothing.
5340 SelectionDAG &DAG) const {
5341 return Chain;
5342 }
5343
5344 /// This callback is invoked by the type legalizer to legalize nodes with an
5345 /// illegal operand type but legal result types. It replaces the
5346 /// LowerOperation callback in the type Legalizer. The reason we can not do
5347 /// away with LowerOperation entirely is that LegalizeDAG isn't yet ready to
5348 /// use this callback.
5349 ///
5350 /// TODO: Consider merging with ReplaceNodeResults.
5351 ///
5352 /// The target places new result values for the node in Results (their number
5353 /// and types must exactly match those of the original return values of
5354 /// the node), or leaves Results empty, which indicates that the node is not
5355 /// to be custom lowered after all.
5356 /// The default implementation calls LowerOperation.
5357 virtual void LowerOperationWrapper(SDNode *N,
5359 SelectionDAG &DAG) const;
5360
5361 /// This callback is invoked for operations that are unsupported by the
5362 /// target, which are registered to use 'custom' lowering, and whose defined
5363 /// values are all legal. If the target has no operations that require custom
5364 /// lowering, it need not implement this. The default implementation of this
5365 /// aborts.
5366 virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
5367
5368 /// This callback is invoked when a node result type is illegal for the
5369 /// target, and the operation was registered to use 'custom' lowering for that
5370 /// result type. The target places new result values for the node in Results
5371 /// (their number and types must exactly match those of the original return
5372 /// values of the node), or leaves Results empty, which indicates that the
5373 /// node is not to be custom lowered after all.
5374 ///
5375 /// If the target has no operations that require custom lowering, it need not
5376 /// implement this. The default implementation aborts.
5377 virtual void ReplaceNodeResults(SDNode * /*N*/,
5378 SmallVectorImpl<SDValue> &/*Results*/,
5379 SelectionDAG &/*DAG*/) const {
5380 llvm_unreachable("ReplaceNodeResults not implemented for this target!");
5381 }
5382
5383 /// This method returns the name of a target specific DAG node.
5384 virtual const char *getTargetNodeName(unsigned Opcode) const;
5385
5386 /// This method returns a target specific FastISel object, or null if the
5387 /// target does not support "fast" ISel.
5389 const TargetLibraryInfo *,
5390 const LibcallLoweringInfo *) const {
5391 return nullptr;
5392 }
5393
5394 //===--------------------------------------------------------------------===//
5395 // Inline Asm Support hooks
5396 //
5397
5399 C_Register, // Constraint represents specific register(s).
5400 C_RegisterClass, // Constraint represents any of register(s) in class.
5401 C_Memory, // Memory constraint.
5402 C_Address, // Address constraint.
5403 C_Immediate, // Requires an immediate.
5404 C_Other, // Something else.
5405 C_Unknown // Unsupported constraint.
5406 };
5407
5409 // Generic weights.
5410 CW_Invalid = -1, // No match.
5411 CW_Okay = 0, // Acceptable.
5412 CW_Good = 1, // Good weight.
5413 CW_Better = 2, // Better weight.
5414 CW_Best = 3, // Best weight.
5415
5416 // Well-known weights.
5417 CW_SpecificReg = CW_Okay, // Specific register operands.
5418 CW_Register = CW_Good, // Register operands.
5419 CW_Memory = CW_Better, // Memory operands.
5420 CW_Constant = CW_Best, // Constant operand.
5421 CW_Default = CW_Okay // Default or don't know type.
5422 };
5423
5424 /// This contains information for each constraint that we are lowering.
5426 /// This contains the actual string for the code, like "m". TargetLowering
5427 /// picks the 'best' code from ConstraintInfo::Codes that most closely
5428 /// matches the operand.
5429 std::string ConstraintCode;
5430
5431 /// Information about the constraint code, e.g. Register, RegisterClass,
5432 /// Memory, Other, Unknown.
5434
5435 /// If this is the result output operand or a clobber, this is null,
5436 /// otherwise it is the incoming operand to the CallInst. This gets
5437 /// modified as the asm is processed.
5439
5440 /// The ValueType for the operand value.
5441 MVT ConstraintVT = MVT::Other;
5442
5443 /// Copy constructor for copying from a ConstraintInfo.
5446
5447 /// Return true of this is an input operand that is a matching constraint
5448 /// like "4".
5449 LLVM_ABI bool isMatchingInputConstraint() const;
5450
5451 /// If this is an input matching constraint, this method returns the output
5452 /// operand it matches.
5453 LLVM_ABI unsigned getMatchedOperand() const;
5454 };
5455
5456 using AsmOperandInfoVector = std::vector<AsmOperandInfo>;
5457
5458 /// Split up the constraint string from the inline assembly value into the
5459 /// specific constraints and their prefixes, and also tie in the associated
5460 /// operand values. If this returns an empty vector, and if the constraint
5461 /// string itself isn't empty, there was an error parsing.
5463 const TargetRegisterInfo *TRI,
5464 const CallBase &Call) const;
5465
5466 /// Examine constraint type and operand type and determine a weight value.
5467 /// The operand object must already have been set up with the operand type.
5469 AsmOperandInfo &info, int maIndex) const;
5470
5471 /// Examine constraint string and operand type and determine a weight value.
5472 /// The operand object must already have been set up with the operand type.
5474 AsmOperandInfo &info, const char *constraint) const;
5475
5476 /// Determines the constraint code and constraint type to use for the specific
5477 /// AsmOperandInfo, setting OpInfo.ConstraintCode and OpInfo.ConstraintType.
5478 /// If the actual operand being passed in is available, it can be passed in as
5479 /// Op, otherwise an empty SDValue can be passed.
5480 virtual void ComputeConstraintToUse(AsmOperandInfo &OpInfo,
5481 SDValue Op,
5482 SelectionDAG *DAG = nullptr) const;
5483
5484 /// Given a constraint, return the type of constraint it is for this target.
5485 virtual ConstraintType getConstraintType(StringRef Constraint) const;
5486
5487 using ConstraintPair = std::pair<StringRef, TargetLowering::ConstraintType>;
5489 /// Given an OpInfo with list of constraints codes as strings, return a
5490 /// sorted Vector of pairs of constraint codes and their types in priority of
5491 /// what we'd prefer to lower them as. This may contain immediates that
5492 /// cannot be lowered, but it is meant to be a machine agnostic order of
5493 /// preferences.
5495
5496 /// Given a physical register constraint (e.g. {edx}), return the register
5497 /// number and the register class for the register.
5498 ///
5499 /// Given a register class constraint, like 'r', if this corresponds directly
5500 /// to an LLVM register class, return a register of 0 and the register class
5501 /// pointer.
5502 ///
5503 /// This should only be used for C_Register constraints. On error, this
5504 /// returns a register number of 0 and a null register class pointer.
5505 virtual std::pair<unsigned, const TargetRegisterClass *>
5507 StringRef Constraint, MVT VT) const;
5508
5510 getInlineAsmMemConstraint(StringRef ConstraintCode) const {
5511 if (ConstraintCode == "m")
5513 if (ConstraintCode == "o")
5515 if (ConstraintCode == "X")
5517 if (ConstraintCode == "p")
5520 }
5521
5522 /// Try to replace an X constraint, which matches anything, with another that
5523 /// has more specific requirements based on the type of the corresponding
5524 /// operand. This returns null if there is no replacement to make.
5525 virtual const char *LowerXConstraint(EVT ConstraintVT) const;
5526
5527 /// Lower the specified operand into the Ops vector. If it is invalid, don't
5528 /// add anything to Ops.
5529 virtual void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint,
5530 std::vector<SDValue> &Ops,
5531 SelectionDAG &DAG) const;
5532
5533 // Lower custom output constraints. If invalid, return SDValue().
5534 virtual SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Glue,
5535 const SDLoc &DL,
5536 const AsmOperandInfo &OpInfo,
5537 SelectionDAG &DAG) const;
5538
5539 // Targets may override this function to collect operands from the CallInst
5540 // and for example, lower them into the SelectionDAG operands.
5541 virtual void CollectTargetIntrinsicOperands(const CallInst &I,
5543 SelectionDAG &DAG) const;
5544
5545 //===--------------------------------------------------------------------===//
5546 // Div utility functions
5547 //
5548
5549 SDValue BuildSDIV(SDNode *N, SelectionDAG &DAG, bool IsAfterLegalization,
5550 bool IsAfterLegalTypes,
5551 SmallVectorImpl<SDNode *> &Created) const;
5552 SDValue BuildUDIV(SDNode *N, SelectionDAG &DAG, bool IsAfterLegalization,
5553 bool IsAfterLegalTypes,
5554 SmallVectorImpl<SDNode *> &Created) const;
5555 // Build sdiv by power-of-2 with conditional move instructions
5556 SDValue buildSDIVPow2WithCMov(SDNode *N, const APInt &Divisor,
5557 SelectionDAG &DAG,
5558 SmallVectorImpl<SDNode *> &Created) const;
5559
5560 /// Targets may override this function to provide custom SDIV lowering for
5561 /// power-of-2 denominators. If the target returns an empty SDValue, LLVM
5562 /// assumes SDIV is expensive and replaces it with a series of other integer
5563 /// operations.
5564 virtual SDValue BuildSDIVPow2(SDNode *N, const APInt &Divisor,
5565 SelectionDAG &DAG,
5566 SmallVectorImpl<SDNode *> &Created) const;
5567
5568 /// Targets may override this function to provide custom SREM lowering for
5569 /// power-of-2 denominators. If the target returns an empty SDValue, LLVM
5570 /// assumes SREM is expensive and replaces it with a series of other integer
5571 /// operations.
5572 virtual SDValue BuildSREMPow2(SDNode *N, const APInt &Divisor,
5573 SelectionDAG &DAG,
5574 SmallVectorImpl<SDNode *> &Created) const;
5575
5576 /// Indicate whether this target prefers to combine FDIVs with the same
5577 /// divisor. If the transform should never be done, return zero. If the
5578 /// transform should be done, return the minimum number of divisor uses
5579 /// that must exist.
5580 virtual unsigned combineRepeatedFPDivisors() const {
5581 return 0;
5582 }
5583
5584 /// Hooks for building estimates in place of slower divisions and square
5585 /// roots.
5586
5587 /// Return either a square root or its reciprocal estimate value for the input
5588 /// operand.
5589 /// \p Enabled is a ReciprocalEstimate enum with value either 'Unspecified' or
5590 /// 'Enabled' as set by a potential default override attribute.
5591 /// If \p RefinementSteps is 'Unspecified', the number of Newton-Raphson
5592 /// refinement iterations required to generate a sufficient (though not
5593 /// necessarily IEEE-754 compliant) estimate is returned in that parameter.
5594 /// The boolean UseOneConstNR output is used to select a Newton-Raphson
5595 /// algorithm implementation that uses either one or two constants.
5596 /// The boolean Reciprocal is used to select whether the estimate is for the
5597 /// square root of the input operand or the reciprocal of its square root.
5598 /// A target may choose to implement its own refinement within this function.
5599 /// If that's true, then return '0' as the number of RefinementSteps to avoid
5600 /// any further refinement of the estimate.
5601 /// An empty SDValue return means no estimate sequence can be created.
5603 int Enabled, int &RefinementSteps,
5604 bool &UseOneConstNR, bool Reciprocal) const {
5605 return SDValue();
5606 }
5607
5608 /// Try to convert the fminnum/fmaxnum to a compare/select sequence. This is
5609 /// required for correctness since InstCombine might have canonicalized a
5610 /// fcmp+select sequence to a FMINNUM/FMAXNUM intrinsic. If we were to fall
5611 /// through to the default expansion/soften to libcall, we might introduce a
5612 /// link-time dependency on libm into a file that originally did not have one.
5613 SDValue createSelectForFMINNUM_FMAXNUM(SDNode *Node, SelectionDAG &DAG) const;
5614
5615 /// Return a reciprocal estimate value for the input operand.
5616 /// \p Enabled is a ReciprocalEstimate enum with value either 'Unspecified' or
5617 /// 'Enabled' as set by a potential default override attribute.
5618 /// If \p RefinementSteps is 'Unspecified', the number of Newton-Raphson
5619 /// refinement iterations required to generate a sufficient (though not
5620 /// necessarily IEEE-754 compliant) estimate is returned in that parameter.
5621 /// A target may choose to implement its own refinement within this function.
5622 /// If that's true, then return '0' as the number of RefinementSteps to avoid
5623 /// any further refinement of the estimate.
5624 /// An empty SDValue return means no estimate sequence can be created.
5626 int Enabled, int &RefinementSteps) const {
5627 return SDValue();
5628 }
5629
5630 /// Return a target-dependent comparison result if the input operand is
5631 /// suitable for use with a square root estimate calculation. For example, the
5632 /// comparison may check if the operand is NAN, INF, zero, normal, etc. The
5633 /// result should be used as the condition operand for a select or branch.
5634 virtual SDValue getSqrtInputTest(SDValue Operand, SelectionDAG &DAG,
5635 const DenormalMode &Mode,
5636 SDNodeFlags Flags = {}) const;
5637
5638 /// Return a target-dependent result if the input operand is not suitable for
5639 /// use with a square root estimate calculation.
5641 SelectionDAG &DAG) const {
5642 return DAG.getConstantFP(0.0, SDLoc(Operand), Operand.getValueType());
5643 }
5644
5645 //===--------------------------------------------------------------------===//
5646 // Legalization utility functions
5647 //
5648
5649 /// Expand a MUL or [US]MUL_LOHI of n-bit values into two or four nodes,
5650 /// respectively, each computing an n/2-bit part of the result.
5651 /// \param Result A vector that will be filled with the parts of the result
5652 /// in little-endian order.
5653 /// \param LL Low bits of the LHS of the MUL. You can use this parameter
5654 /// if you want to control how low bits are extracted from the LHS.
5655 /// \param LH High bits of the LHS of the MUL. See LL for meaning.
5656 /// \param RL Low bits of the RHS of the MUL. See LL for meaning
5657 /// \param RH High bits of the RHS of the MUL. See LL for meaning.
5658 /// \returns true if the node has been expanded, false if it has not
5659 bool expandMUL_LOHI(unsigned Opcode, EVT VT, const SDLoc &dl, SDValue LHS,
5660 SDValue RHS, SmallVectorImpl<SDValue> &Result, EVT HiLoVT,
5661 SelectionDAG &DAG, MulExpansionKind Kind,
5662 SDValue LL = SDValue(), SDValue LH = SDValue(),
5663 SDValue RL = SDValue(), SDValue RH = SDValue()) const;
5664
5665 /// Expand a MUL into two nodes. One that computes the high bits of
5666 /// the result and one that computes the low bits.
5667 /// \param HiLoVT The value type to use for the Lo and Hi nodes.
5668 /// \param LL Low bits of the LHS of the MUL. You can use this parameter
5669 /// if you want to control how low bits are extracted from the LHS.
5670 /// \param LH High bits of the LHS of the MUL. See LL for meaning.
5671 /// \param RL Low bits of the RHS of the MUL. See LL for meaning
5672 /// \param RH High bits of the RHS of the MUL. See LL for meaning.
5673 /// \returns true if the node has been expanded. false if it has not
5674 bool expandMUL(SDNode *N, SDValue &Lo, SDValue &Hi, EVT HiLoVT,
5675 SelectionDAG &DAG, MulExpansionKind Kind,
5676 SDValue LL = SDValue(), SDValue LH = SDValue(),
5677 SDValue RL = SDValue(), SDValue RH = SDValue()) const;
5678
5679 /// Attempt to expand an n-bit div/rem/divrem by constant using an n/2-bit
5680 /// algorithm. First, attempt to expand the division using a n/2-bit urem by
5681 /// constant and other arithmetic ops. The n/2-bit urem by constant will be
5682 /// expanded by DAGCombiner. As this is not possible for all constant
5683 /// divisors, this method falls back to an implementation of the magic
5684 /// algorithm using n/2-bit operations.
5685 /// \param N Node to expand
5686 /// \param Result A vector that will be filled with the lo and high parts of
5687 /// the results. For *DIVREM, this will be the quotient parts followed
5688 /// by the remainder parts.
5689 /// \param HiLoVT The value type to use for the Lo and Hi parts. Should be
5690 /// half of VT.
5691 /// \param LL Low bits of the LHS of the operation. You can use this
5692 /// parameter if you want to control how low bits are extracted from
5693 /// the LHS.
5694 /// \param LH High bits of the LHS of the operation. See LL for meaning.
5695 /// \returns true if the node has been expanded, false if it has not.
5696 bool expandDIVREMByConstant(SDNode *N, SmallVectorImpl<SDValue> &Result,
5697 EVT HiLoVT, SelectionDAG &DAG,
5698 SDValue LL = SDValue(),
5699 SDValue LH = SDValue()) const;
5700
5701 /// Expand funnel shift.
5702 /// \param N Node to expand
5703 /// \returns The expansion if successful, SDValue() otherwise
5704 SDValue expandFunnelShift(SDNode *N, SelectionDAG &DAG) const;
5705
5706 /// Expand carryless multiply.
5707 /// \param N Node to expand
5708 /// \returns The expansion if successful, SDValue() otherwise
5709 SDValue expandCLMUL(SDNode *N, SelectionDAG &DAG) const;
5710
5711 /// Expand parallel bit extract (compress).
5712 /// \param N Node to expand
5713 /// \returns The expansion if successful, SDValue() otherwise
5714 SDValue expandPEXT(SDNode *N, SelectionDAG &DAG) const;
5715
5716 /// Expand parallel bit deposit (expand).
5717 /// \param N Node to expand
5718 /// \returns The expansion if successful, SDValue() otherwise
5719 SDValue expandPDEP(SDNode *N, SelectionDAG &DAG) const;
5720
5721 /// Expand rotations.
5722 /// \param N Node to expand
5723 /// \param AllowVectorOps expand vector rotate, this should only be performed
5724 /// if the legalization is happening outside of LegalizeVectorOps
5725 /// \returns The expansion if successful, SDValue() otherwise
5726 SDValue expandROT(SDNode *N, bool AllowVectorOps, SelectionDAG &DAG) const;
5727
5728 /// Expand shift-by-parts.
5729 /// \param N Node to expand
5730 /// \param Lo lower-output-part after conversion
5731 /// \param Hi upper-output-part after conversion
5732 void expandShiftParts(SDNode *N, SDValue &Lo, SDValue &Hi,
5733 SelectionDAG &DAG) const;
5734
5735 /// Expand float(f32) to SINT(i64) conversion
5736 /// \param N Node to expand
5737 /// \param Result output after conversion
5738 /// \returns True, if the expansion was successful, false otherwise
5739 bool expandFP_TO_SINT(SDNode *N, SDValue &Result, SelectionDAG &DAG) const;
5740
5741 /// Expand float to UINT conversion
5742 /// \param N Node to expand
5743 /// \param Result output after conversion
5744 /// \param Chain output chain after conversion
5745 /// \returns True, if the expansion was successful, false otherwise
5746 bool expandFP_TO_UINT(SDNode *N, SDValue &Result, SDValue &Chain,
5747 SelectionDAG &DAG) const;
5748
5749 /// Expand UINT(i64) to double(f64) conversion
5750 /// \param N Node to expand
5751 /// \param Result output after conversion
5752 /// \param Chain output chain after conversion
5753 /// \returns True, if the expansion was successful, false otherwise
5754 bool expandUINT_TO_FP(SDNode *N, SDValue &Result, SDValue &Chain,
5755 SelectionDAG &DAG) const;
5756
5757 /// Expand fminnum/fmaxnum into fminnum_ieee/fmaxnum_ieee with quieted inputs.
5758 SDValue expandFMINNUM_FMAXNUM(SDNode *N, SelectionDAG &DAG) const;
5759
5760 /// Expand fminimum/fmaximum into multiple comparison with selects.
5761 SDValue expandFMINIMUM_FMAXIMUM(SDNode *N, SelectionDAG &DAG) const;
5762
5763 /// Expand fminimumnum/fmaximumnum into multiple comparison with selects.
5764 SDValue expandFMINIMUMNUM_FMAXIMUMNUM(SDNode *N, SelectionDAG &DAG) const;
5765
5766 /// Expand FP_TO_[US]INT_SAT into FP_TO_[US]INT and selects or min/max.
5767 /// \param N Node to expand
5768 /// \returns The expansion result
5769 SDValue expandFP_TO_INT_SAT(SDNode *N, SelectionDAG &DAG) const;
5770
5771 /// Truncate Op to ResultVT. If the result is exact, leave it alone. If it is
5772 /// not exact, force the result to be odd.
5773 /// \param ResultVT The type of result.
5774 /// \param Op The value to round.
5775 /// \returns The expansion result
5776 SDValue expandRoundInexactToOdd(EVT ResultVT, SDValue Op, const SDLoc &DL,
5777 SelectionDAG &DAG) const;
5778
5779 /// Expand round(fp) to fp conversion
5780 /// \param N Node to expand
5781 /// \returns The expansion result
5782 SDValue expandFP_ROUND(SDNode *Node, SelectionDAG &DAG) const;
5783
5784 /// Expand check for floating point class.
5785 /// \param ResultVT The type of intrinsic call result.
5786 /// \param Op The tested value.
5787 /// \param Test The test to perform.
5788 /// \param Flags The optimization flags.
5789 /// \returns The expansion result or SDValue() if it fails.
5790 SDValue expandIS_FPCLASS(EVT ResultVT, SDValue Op, FPClassTest Test,
5791 SDNodeFlags Flags, const SDLoc &DL,
5792 SelectionDAG &DAG) const;
5793
5794 /// Expand FCANONICALIZE to FMUL with 1.
5795 /// \param NodeNode to expand
5796 /// \returns The expansion result
5797 SDValue expandFCANONICALIZE(SDNode *Node, SelectionDAG &DAG) const;
5798
5799 /// Expand CONVERT_TO_ARBITRARY_FP using bit manipulation.
5800 /// \param Node Node to expand.
5801 /// \returns The expansion result, or SDValue() if fails.
5802 SDValue expandCONVERT_TO_ARBITRARY_FP(SDNode *Node, SelectionDAG &DAG) const;
5803
5804 /// Expand CONVERT_FROM_ARBITRARY_FP using bit manipulation.
5805 /// \param Node Node to expand.
5806 /// \returns The expansion result, or SDValue() if fails.
5807 SDValue expandCONVERT_FROM_ARBITRARY_FP(SDNode *Node,
5808 SelectionDAG &DAG) const;
5809
5810 /// Expand CTPOP nodes. Expands vector/scalar CTPOP nodes,
5811 /// vector nodes can only succeed if all operations are legal/custom.
5812 /// \param N Node to expand
5813 /// \returns The expansion result or SDValue() if it fails.
5814 SDValue expandCTPOP(SDNode *N, SelectionDAG &DAG) const;
5815
5816 /// Expand CTLZ/CTLZ_ZERO_POISON nodes. Expands vector/scalar CTLZ nodes,
5817 /// vector nodes can only succeed if all operations are legal/custom.
5818 /// \param N Node to expand
5819 /// \returns The expansion result or SDValue() if it fails.
5820 SDValue expandCTLZ(SDNode *N, SelectionDAG &DAG) const;
5821
5822 /// Expand CTLS (count leading sign bits) nodes.
5823 /// CTLS(x) = CTLZ(OR(SHL(XOR(x, SRA(x, BW-1)), 1), 1))
5824 /// \param N Node to expand
5825 /// \returns The expansion result or SDValue() if it fails.
5826 SDValue expandCTLS(SDNode *N, SelectionDAG &DAG) const;
5827
5828 /// Expand CTTZ via Table Lookup.
5829 /// \param N Node to expand
5830 /// \returns The expansion result or SDValue() if it fails.
5831 SDValue CTTZTableLookup(SDNode *N, SelectionDAG &DAG, const SDLoc &DL, EVT VT,
5832 SDValue Op, unsigned NumBitsPerElt) const;
5833
5834 /// Expand CTTZ/CTTZ_ZERO_POISON nodes. Expands vector/scalar CTTZ nodes,
5835 /// vector nodes can only succeed if all operations are legal/custom.
5836 /// \param N Node to expand
5837 /// \returns The expansion result or SDValue() if it fails.
5838 SDValue expandCTTZ(SDNode *N, SelectionDAG &DAG) const;
5839
5840 /// Expand VP_CTTZ_ELTS/VP_CTTZ_ELTS_ZERO_POISON nodes.
5841 /// \param N Node to expand
5842 /// \returns The expansion result or SDValue() if it fails.
5843 SDValue expandVPCTTZElements(SDNode *N, SelectionDAG &DAG) const;
5844
5845 /// Expand VECTOR_MATCH nodes.
5846 /// \param N Node to expand
5847 /// \returns The expansion result or SDValue() if it fails.
5848 SDValue expandVectorMatch(SDNode *N, SelectionDAG &DAG) const;
5849
5850 /// Expand VECTOR_FIND_LAST_ACTIVE nodes
5851 /// \param N Node to expand
5852 /// \returns The expansion result or SDValue() if it fails.
5853 SDValue expandVectorFindLastActive(SDNode *N, SelectionDAG &DAG) const;
5854
5855 /// Expand LOOP_DEPENDENCE_MASK nodes
5856 /// \param N Node to expand
5857 /// \returns The expansion result or SDValue() if it fails.
5858 SDValue expandLoopDependenceMask(SDNode *N, SelectionDAG &DAG) const;
5859
5860 /// Expand ABS nodes. Expands vector/scalar ABS nodes,
5861 /// vector nodes can only succeed if all operations are legal/custom.
5862 /// (ABS x) -> (XOR (ADD x, (SRA x, type_size)), (SRA x, type_size))
5863 /// \param N Node to expand
5864 /// \param IsNegative indicate negated abs
5865 /// \returns The expansion result or SDValue() if it fails.
5866 SDValue expandABS(SDNode *N, SelectionDAG &DAG,
5867 bool IsNegative = false) const;
5868
5869 /// Expand ABDS/ABDU nodes. Expands vector/scalar ABDS/ABDU nodes.
5870 /// \param N Node to expand
5871 /// \returns The expansion result or SDValue() if it fails.
5872 SDValue expandABD(SDNode *N, SelectionDAG &DAG) const;
5873
5874 /// Expand vector/scalar AVGCEILS/AVGCEILU/AVGFLOORS/AVGFLOORU nodes.
5875 /// \param N Node to expand
5876 /// \returns The expansion result or SDValue() if it fails.
5877 SDValue expandAVG(SDNode *N, SelectionDAG &DAG) const;
5878
5879 /// Expand BSWAP nodes. Expands scalar/vector BSWAP nodes with i16/i32/i64
5880 /// scalar types. Returns SDValue() if expand fails.
5881 /// \param N Node to expand
5882 /// \returns The expansion result or SDValue() if it fails.
5883 SDValue expandBSWAP(SDNode *N, SelectionDAG &DAG) const;
5884
5885 /// Expand BITREVERSE nodes. Expands scalar/vector BITREVERSE nodes.
5886 /// Returns SDValue() if expand fails.
5887 /// \param N Node to expand
5888 /// \returns The expansion result or SDValue() if it fails.
5889 SDValue expandBITREVERSE(SDNode *N, SelectionDAG &DAG) const;
5890
5891 /// Turn load of vector type into a load of the individual elements.
5892 /// \param LD load to expand
5893 /// \returns BUILD_VECTOR and TokenFactor nodes.
5894 std::pair<SDValue, SDValue> scalarizeVectorLoad(LoadSDNode *LD,
5895 SelectionDAG &DAG) const;
5896
5897 // Turn a store of a vector type into stores of the individual elements.
5898 /// \param ST Store with a vector value type
5899 /// \returns TokenFactor of the individual store chains.
5901
5902 /// Expands an unaligned load to 2 half-size loads for an integer, and
5903 /// possibly more for vectors.
5904 std::pair<SDValue, SDValue> expandUnalignedLoad(LoadSDNode *LD,
5905 SelectionDAG &DAG) const;
5906
5907 /// Expands an unaligned store to 2 half-size stores for integer values, and
5908 /// possibly more for vectors.
5909 SDValue expandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG) const;
5910
5911 /// Increments memory address \p Addr according to the type of the value
5912 /// \p DataVT that should be stored. If the data is stored in compressed
5913 /// form, the memory address should be incremented according to the number of
5914 /// the stored elements. This number is equal to the number of '1's bits
5915 /// in the \p Mask.
5916 /// \p DataVT is a vector type. \p Mask is a vector value.
5917 /// \p DataVT and \p Mask have the same number of vector elements.
5918 SDValue IncrementMemoryAddress(SDValue Addr, SDValue Mask, const SDLoc &DL,
5919 EVT DataVT, SelectionDAG &DAG,
5920 bool IsCompressedMemory) const;
5921
5922 /// Get a pointer to vector element \p Idx located in memory for a vector of
5923 /// type \p VecVT starting at a base address of \p VecPtr. If \p Idx is out of
5924 /// bounds the returned pointer is unspecified, but will be within the vector
5925 /// bounds. \p PtrArithFlags can be used to mark that arithmetic within the
5926 /// vector in memory is known to not wrap or to be inbounds.
5927 SDValue getVectorElementPointer(
5928 SelectionDAG &DAG, SDValue VecPtr, EVT VecVT, SDValue Index,
5929 const SDNodeFlags PtrArithFlags = SDNodeFlags()) const;
5930
5931 /// Get a pointer to vector element \p Idx located in memory for a vector of
5932 /// type \p VecVT starting at a base address of \p VecPtr. If \p Idx is out of
5933 /// bounds the returned pointer is unspecified, but will be within the vector
5934 /// bounds. \p VecPtr is guaranteed to point to the beginning of a memory
5935 /// location large enough for the vector.
5937 EVT VecVT, SDValue Index) const {
5938 return getVectorElementPointer(DAG, VecPtr, VecVT, Index,
5941 }
5942
5943 /// Get a pointer to a sub-vector of type \p SubVecVT at index \p Idx located
5944 /// in memory for a vector of type \p VecVT starting at a base address of
5945 /// \p VecPtr. If \p Idx plus the size of \p SubVecVT is out of bounds the
5946 /// returned pointer is unspecified, but the value returned will be such that
5947 /// the entire subvector would be within the vector bounds. \p PtrArithFlags
5948 /// can be used to mark that arithmetic within the vector in memory is known
5949 /// to not wrap or to be inbounds.
5950 SDValue
5951 getVectorSubVecPointer(SelectionDAG &DAG, SDValue VecPtr, EVT VecVT,
5952 EVT SubVecVT, SDValue Index,
5953 const SDNodeFlags PtrArithFlags = SDNodeFlags()) const;
5954
5955 /// Method for building the DAG expansion of ISD::[US][MIN|MAX]. This
5956 /// method accepts integers as its arguments.
5957 SDValue expandIntMINMAX(SDNode *Node, SelectionDAG &DAG) const;
5958
5959 /// Method for building the DAG expansion of ISD::[US][ADD|SUB]SAT. This
5960 /// method accepts integers as its arguments.
5961 SDValue expandAddSubSat(SDNode *Node, SelectionDAG &DAG) const;
5962
5963 /// Method for building the DAG expansion of ISD::[US]CMP. This
5964 /// method accepts integers as its arguments
5965 SDValue expandCMP(SDNode *Node, SelectionDAG &DAG) const;
5966
5967 /// Method for building the DAG expansion of ISD::[US]SHLSAT. This
5968 /// method accepts integers as its arguments.
5969 SDValue expandShlSat(SDNode *Node, SelectionDAG &DAG) const;
5970
5971 /// Method for building the DAG expansion of ISD::[U|S]MULFIX[SAT]. This
5972 /// method accepts integers as its arguments.
5973 SDValue expandFixedPointMul(SDNode *Node, SelectionDAG &DAG) const;
5974
5975 /// Method for building the DAG expansion of ISD::[US]DIVFIX[SAT]. This
5976 /// method accepts integers as its arguments.
5977 /// Note: This method may fail if the division could not be performed
5978 /// within the type. Clients must retry with a wider type if this happens.
5979 SDValue expandFixedPointDiv(unsigned Opcode, const SDLoc &dl,
5981 unsigned Scale, SelectionDAG &DAG) const;
5982
5983 /// Method for building the DAG expansion of ISD::U(ADD|SUB)O. Expansion
5984 /// always suceeds and populates the Result and Overflow arguments.
5985 void expandUADDSUBO(SDNode *Node, SDValue &Result, SDValue &Overflow,
5986 SelectionDAG &DAG) const;
5987
5988 /// Method for building the DAG expansion of ISD::S(ADD|SUB)O. Expansion
5989 /// always suceeds and populates the Result and Overflow arguments.
5990 void expandSADDSUBO(SDNode *Node, SDValue &Result, SDValue &Overflow,
5991 SelectionDAG &DAG) const;
5992
5993 /// Method for building the DAG expansion of ISD::[US]MULO. Returns whether
5994 /// expansion was successful and populates the Result and Overflow arguments.
5995 bool expandMULO(SDNode *Node, SDValue &Result, SDValue &Overflow,
5996 SelectionDAG &DAG) const;
5997
5998 /// Calculate the product twice the width of LHS and RHS. If HiLHS/HiRHS are
5999 /// non-null they will be included in the multiplication. The expansion works
6000 /// by splitting the 2 inputs into 4 pieces that we can multiply and add
6001 /// together without neding MULH or MUL_LOHI.
6002 void forceExpandMultiply(SelectionDAG &DAG, const SDLoc &dl, bool Signed,
6004 SDValue HiLHS = SDValue(),
6005 SDValue HiRHS = SDValue()) const;
6006
6007 /// Calculate full product of LHS and RHS either via a libcall or through
6008 /// brute force expansion of the multiplication. The expansion works by
6009 /// splitting the 2 inputs into 4 pieces that we can multiply and add together
6010 /// without needing MULH or MUL_LOHI.
6011 void forceExpandWideMUL(SelectionDAG &DAG, const SDLoc &dl, bool Signed,
6012 const SDValue LHS, const SDValue RHS, SDValue &Lo,
6013 SDValue &Hi) const;
6014
6015 /// Expand a VECREDUCE_* into an explicit calculation. If Count is specified,
6016 /// only the first Count elements of the vector are used.
6017 SDValue expandVecReduce(SDNode *Node, SelectionDAG &DAG) const;
6018
6019 /// Expand a VECREDUCE_SEQ_* into an explicit ordered calculation.
6020 SDValue expandVecReduceSeq(SDNode *Node, SelectionDAG &DAG) const;
6021
6022 /// Expand an SREM or UREM using SDIV/UDIV or SDIVREM/UDIVREM, if legal.
6023 /// Returns true if the expansion was successful.
6024 bool expandREM(SDNode *Node, SDValue &Result, SelectionDAG &DAG) const;
6025
6026 /// Method for building the DAG expansion of ISD::VECTOR_SPLICE. This
6027 /// method accepts vectors as its arguments.
6028 SDValue expandVectorSplice(SDNode *Node, SelectionDAG &DAG) const;
6029
6030 /// Expand a vector VECTOR_COMPRESS into a sequence of extract element, store
6031 /// temporarily, advance store position, before re-loading the final vector.
6032 SDValue expandVECTOR_COMPRESS(SDNode *Node, SelectionDAG &DAG) const;
6033
6034 /// Expand a CTTZ_ELTS or CTTZ_ELTS_ZERO_POISON by calculating (VL - i) for
6035 /// each active lane (i), getting the maximum and subtracting it from VL.
6036 SDValue expandCttzElts(SDNode *Node, SelectionDAG &DAG) const;
6037
6038 /// Expands PARTIAL_REDUCE_S/UMLA nodes to a series of simpler operations,
6039 /// consisting of zext/sext, extract_subvector, mul and add operations.
6040 SDValue expandPartialReduceMLA(SDNode *Node, SelectionDAG &DAG) const;
6041
6042 /// Expands a node with multiple results to an FP or vector libcall. The
6043 /// libcall is expected to take all the operands of the \p Node followed by
6044 /// output pointers for each of the results. \p CallRetResNo can be optionally
6045 /// set to indicate that one of the results comes from the libcall's return
6046 /// value.
6047 bool expandMultipleResultFPLibCall(
6048 SelectionDAG &DAG, RTLIB::Libcall LC, SDNode *Node,
6050 std::optional<unsigned> CallRetResNo = {}) const;
6051
6052 /// Legalize a SETCC with given LHS and RHS and condition code CC on the
6053 /// current target.
6054 ///
6055 /// If the SETCC has been legalized using AND / OR, then the legalized node
6056 /// will be stored in LHS. RHS and CC will be set to SDValue(). NeedInvert
6057 /// will be set to false.
6058 ///
6059 /// If the SETCC has been legalized by using getSetCCSwappedOperands(), then
6060 /// the values of LHS and RHS will be swapped, CC will be set to the new
6061 /// condition, and NeedInvert will be set to false.
6062 ///
6063 /// If the SETCC has been legalized using the inverse condcode, then LHS and
6064 /// RHS will be unchanged, CC will set to the inverted condcode, and
6065 /// NeedInvert will be set to true. The caller must invert the result of the
6066 /// SETCC with SelectionDAG::getLogicalNOT() or take equivalent action to swap
6067 /// the effect of a true/false result.
6068 ///
6069 /// \returns true if the SETCC has been legalized, false if it hasn't.
6070 bool LegalizeSetCCCondCode(SelectionDAG &DAG, EVT VT, SDValue &LHS,
6071 SDValue &RHS, SDValue &CC, bool &NeedInvert,
6072 const SDLoc &dl, SDValue &Chain,
6073 bool IsSignaling = false) const;
6074
6075 //===--------------------------------------------------------------------===//
6076 // Instruction Emitting Hooks
6077 //
6078
6079 /// This method should be implemented by targets that mark instructions with
6080 /// the 'usesCustomInserter' flag. These instructions are special in various
6081 /// ways, which require special support to insert. The specified MachineInstr
6082 /// is created but not inserted into any basic blocks, and this method is
6083 /// called to expand it into a sequence of instructions, potentially also
6084 /// creating new basic blocks and control flow.
6085 /// As long as the returned basic block is different (i.e., we created a new
6086 /// one), the custom inserter is free to modify the rest of \p MBB.
6087 virtual MachineBasicBlock *
6088 EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *MBB) const;
6089
6090 /// This method should be implemented by targets that mark instructions with
6091 /// the 'hasPostISelHook' flag. These instructions must be adjusted after
6092 /// instruction selection by target hooks. e.g. To fill in optional defs for
6093 /// ARM 's' setting instructions.
6094 virtual void AdjustInstrPostInstrSelection(MachineInstr &MI,
6095 SDNode *Node) const;
6096
6097 /// If this function returns true, SelectionDAGBuilder emits a
6098 /// LOAD_STACK_GUARD node when it is lowering Intrinsic::stackprotector.
6099 virtual bool useLoadStackGuardNode(const Module &M) const { return false; }
6100
6102 const SDLoc &DL) const {
6103 llvm_unreachable("not implemented for this target");
6104 }
6105
6106 /// Lower TLS global address SDNode for target independent emulated TLS model.
6107 virtual SDValue LowerToTLSEmulatedModel(const GlobalAddressSDNode *GA,
6108 SelectionDAG &DAG) const;
6109
6110 /// Expands target specific indirect branch for the case of JumpTable
6111 /// expansion.
6112 virtual SDValue expandIndirectJTBranch(const SDLoc &dl, SDValue Value,
6113 SDValue Addr, int JTI,
6114 SelectionDAG &DAG) const;
6115
6116 // seteq(x, 0) -> truncate(srl(ctlz(zext(x)), log2(#bits)))
6117 // If we're comparing for equality to zero and isCtlzFast is true, expose the
6118 // fact that this can be implemented as a ctlz/srl pair, so that the dag
6119 // combiner can fold the new nodes.
6120 SDValue lowerCmpEqZeroToCtlzSrl(SDValue Op, SelectionDAG &DAG) const;
6121
6122 // Return true if `X & Y eq/ne 0` is preferable to `X & Y ne/eq Y`
6124 return true;
6125 }
6126
6127 // Expand vector operation by dividing it into smaller length operations and
6128 // joining their results. SDValue() is returned when expansion did not happen.
6129 SDValue expandVectorNaryOpBySplitting(SDNode *Node, SelectionDAG &DAG) const;
6130
6131 /// Replace an extraction of a load with a narrowed load.
6132 ///
6133 /// \param ResultVT type of the result extraction.
6134 /// \param InVecVT type of the input vector to with bitcasts resolved.
6135 /// \param EltNo index of the vector element to load.
6136 /// \param OriginalLoad vector load that to be replaced.
6137 /// \returns \p ResultVT Load on success SDValue() on failure.
6138 SDValue scalarizeExtractedVectorLoad(EVT ResultVT, const SDLoc &DL,
6139 EVT InVecVT, SDValue EltNo,
6140 LoadSDNode *OriginalLoad,
6141 SelectionDAG &DAG) const;
6142
6143protected:
6144 void setTypeIdForCallsiteInfo(const CallBase *CB, MachineFunction &MF,
6145 MachineFunction::CallSiteInfo &CSInfo) const;
6146
6147private:
6148 SDValue foldSetCCWithAnd(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond,
6149 const SDLoc &DL, DAGCombinerInfo &DCI) const;
6150 SDValue foldSetCCWithOr(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond,
6151 const SDLoc &DL, DAGCombinerInfo &DCI) const;
6152 SDValue foldSetCCWithBinOp(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond,
6153 const SDLoc &DL, DAGCombinerInfo &DCI) const;
6154
6155 SDValue optimizeSetCCOfSignedTruncationCheck(EVT SCCVT, SDValue N0,
6157 DAGCombinerInfo &DCI,
6158 const SDLoc &DL) const;
6159
6160 // (X & (C l>>/<< Y)) ==/!= 0 --> ((X <</l>> Y) & C) ==/!= 0
6161 SDValue optimizeSetCCByHoistingAndByConstFromLogicalShift(
6162 EVT SCCVT, SDValue N0, SDValue N1C, ISD::CondCode Cond,
6163 DAGCombinerInfo &DCI, const SDLoc &DL) const;
6164
6165 SDValue prepareUREMEqFold(EVT SETCCVT, SDValue REMNode,
6166 SDValue CompTargetNode, ISD::CondCode Cond,
6167 DAGCombinerInfo &DCI, const SDLoc &DL,
6168 SmallVectorImpl<SDNode *> &Created) const;
6169 SDValue buildUREMEqFold(EVT SETCCVT, SDValue REMNode, SDValue CompTargetNode,
6170 ISD::CondCode Cond, DAGCombinerInfo &DCI,
6171 const SDLoc &DL) const;
6172
6173 SDValue prepareSREMEqFold(EVT SETCCVT, SDValue REMNode,
6174 SDValue CompTargetNode, ISD::CondCode Cond,
6175 DAGCombinerInfo &DCI, const SDLoc &DL,
6176 SmallVectorImpl<SDNode *> &Created) const;
6177 SDValue buildSREMEqFold(EVT SETCCVT, SDValue REMNode, SDValue CompTargetNode,
6178 ISD::CondCode Cond, DAGCombinerInfo &DCI,
6179 const SDLoc &DL) const;
6180
6181 bool expandUDIVREMByConstantViaUREMDecomposition(
6182 SDNode *N, APInt Divisor, SmallVectorImpl<SDValue> &Result, EVT HiLoVT,
6183 SelectionDAG &DAG, SDValue LL, SDValue LH) const;
6184
6185 bool expandUDIVREMByConstantViaUMulHiMagic(SDNode *N, const APInt &Divisor,
6187 EVT HiLoVT, SelectionDAG &DAG,
6188 SDValue LL, SDValue LH) const;
6189};
6190
6191/// Given an LLVM IR type and return type attributes, compute the return value
6192/// EVTs and flags, and optionally also the offsets, if the return value is
6193/// being lowered to memory.
6194LLVM_ABI void GetReturnInfo(CallingConv::ID CC, Type *ReturnType,
6195 AttributeList attr,
6196 SmallVectorImpl<ISD::OutputArg> &Outs,
6197 const TargetLowering &TLI, const DataLayout &DL);
6198
6199} // end namespace llvm
6200
6201#endif // LLVM_CODEGEN_TARGETLOWERING_H
return SDValue()
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned Imm
unsigned uint64_t
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
Function Alias Analysis Results
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
#define X(NUM, ENUM, NAME)
Definition ELF.h:857
block Block Frequency Analysis
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_ABI
Definition Compiler.h:215
#define LLVM_READONLY
Definition Compiler.h:330
This file defines the DenseMap class.
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
static bool ShrinkDemandedConstant(Instruction *I, unsigned OpNo, const APInt &Demanded)
Check to see if the specified operand of the specified instruction is a constant integer.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define RegName(no)
lazy value info
Implement a low-level type suitable for MachineInstr level instruction selection.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
const uint64_t BitWidth
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t High
PowerPC Reduce CR logical Operation
const SmallVectorImpl< MachineOperand > & Cond
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
This file defines the SmallVector class.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
static SDValue scalarizeVectorStore(StoreSDNode *Store, MVT StoreVT, SelectionDAG &DAG)
Scalarize a vector store, bitcasting to TargetVT to determine the scalar type.
Value * RHS
Value * LHS
Class for arbitrary precision integers.
Definition APInt.h:78
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1509
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
A cache of @llvm.assume calls within a function.
An instruction that atomically checks whether a specified value is in a memory location,...
an instruction that atomically reads a memory location, combines it with another value,...
bool isFloatingPointOperation() const
BinOp getOperation() const
This class holds the attributes for a particular argument, parameter, function, or return value.
Definition Attributes.h:407
LLVM_ABI bool getValueAsBool() const
Return the attribute's value as a boolean.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
CCState - This class holds information needed while lowering arguments and return values.
CCValAssign - Represent assignment of one arg/retval to a location.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
This class represents a function call, abstracting a target machine's calling convention.
This is the shared class of boolean and integer constants.
Definition Constants.h:87
This class represents a range of values.
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
unsigned size() const
Definition DenseMap.h:172
constexpr bool isScalar() const
Exactly one element.
Definition TypeSize.h:320
This is a fast-path instruction selection class that generates poor code and doesn't support illegal ...
Definition FastISel.h:67
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
Class to represent function types.
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
bool isVarArg() const
Attribute getFnAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind.
Definition Function.cpp:765
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
A wrapper class for inspecting calls to intrinsic functions.
static LLT integer(unsigned SizeInBits)
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Tracks which library functions to use for a particular subtarget or function.
An instruction for reading from memory.
This class is used to represent ISD::LOAD nodes.
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
Context object for machine code objects.
Definition MCContext.h:83
Base class for the full range of assembler expressions which are needed for parsing.
Definition MCExpr.h:34
MCRegisterClass - Base class of TargetRegisterClass.
Machine Value Type.
@ INVALID_SIMPLE_VALUE_TYPE
SimpleValueType SimpleTy
uint64_t getScalarSizeInBits() const
bool isInteger() const
Return true if this is an integer or a vector integer type.
bool isPow2VectorType() const
Returns true if the given vector is a power of 2.
ElementCount getVectorElementCount() const
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
bool isValid() const
Return true if this is a valid simple valuetype.
static MVT getIntegerVT(unsigned BitWidth)
Instructions::iterator instr_iterator
Representation of each machine instruction.
A description of a memory reference used in the backend.
Flags
Flags values. These may be or'd together.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI bool hasOneNonDBGUse(Register RegNo) const
hasOneNonDBGUse - Return true if there is exactly one non-Debug use of the specified register.
This is an abstract virtual class for memory operations.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
A discriminated union of two or more pointer types, with the discriminator in the low bits of the poi...
Analysis providing profile information.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
bool hasOneUse() const
Return true if there is exactly one use of this node.
bool use_empty() const
Return true if there are no uses of this node.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDNode * getNode() const
get the SDNode which holds the desired result
bool hasOneUse() const
Return true if there is exactly one node using value ResNo of Node, in exactly one operand.
EVT getValueType() const
Return the ValueType of the referenced return value.
const SDValue & getOperand(unsigned i) const
unsigned getOpcode() const
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
LLVM_ABI SDValue getConstantFP(double Val, const SDLoc &DL, EVT VT, bool isTarget=false)
Create a ConstantFPSDNode wrapping a constant value.
const DataLayout & getDataLayout() const
LLVM_ABI void RemoveDeadNode(SDNode *N)
Remove the specified node from the system.
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVMContext * getContext() const
This instruction constructs a fixed permutation of two input vectors.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
This class is used to represent ISD::STORE nodes.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Multiway switch.
TargetInstrInfo - Interface to description of machine instruction set.
Provides information about what library functions are available for the current target.
ArgListEntry(Value *Val, SDValue Node=SDValue())
ArgListEntry(Value *Val, SDValue Node, Type *Ty)
Type * Ty
Same as OrigTy, or partially legalized for soft float libcalls.
Type * OrigTy
Original unlegalized argument type.
LegalizeTypeAction getTypeAction(MVT VT) const
void setTypeAction(MVT VT, LegalizeTypeAction Action)
This base class for TargetLowering contains the SelectionDAG-independent parts that can be used from ...
virtual Value * emitStoreConditional(IRBuilderBase &Builder, Value *Val, Value *Addr, AtomicOrdering Ord) const
Perform a store-conditional operation to Addr.
virtual bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF, EVT) const
Return true if an FMA operation is faster than a pair of fmul and fadd instructions.
bool isOperationExpand(unsigned Op, EVT VT) const
Return true if the specified operation is illegal on this target or unlikely to be made legal with cu...
EVT getMemValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
virtual bool enableAggressiveFMAFusion(LLT Ty) const
Return true if target always benefits from combining into FMA for a given value type.
virtual void emitBitTestAtomicRMWIntrinsic(AtomicRMWInst *AI) const
Perform a bit test atomicrmw using a target-specific intrinsic.
void setOperationAction(ArrayRef< unsigned > Ops, ArrayRef< MVT > VTs, LegalizeAction Action)
virtual bool requiresUniformRegister(MachineFunction &MF, const Value *) const
Allows target to decide about the register class of the specific value that is live outside the defin...
void setBooleanVectorContents(BooleanContent Ty)
Specify how the target extends the result of a vector boolean value from a vector of i1 to a wider ty...
virtual unsigned getVaListSizeInBits(const DataLayout &DL) const
Returns the size of the platform's va_list object.
virtual bool lowerDeinterleaveIntrinsicToLoad(Instruction *Load, Value *Mask, IntrinsicInst *DI, const APInt &GapMask) const
Lower a deinterleave intrinsic to a target specific load intrinsic.
void setOperationAction(unsigned Op, MVT VT, LegalizeAction Action)
Indicate that the specified operation does not work with the specified type and indicate what to do a...
virtual bool preferSextInRegOfTruncate(EVT TruncVT, EVT VT, EVT ExtVT) const
virtual bool decomposeMulByConstant(LLVMContext &Context, EVT VT, SDValue C) const
Return true if it is profitable to transform an integer multiplication-by-constant into simpler opera...
void setMaxDivRemBitWidthSupported(unsigned SizeInBits)
Set the size in bits of the maximum div/rem the backend supports.
virtual bool hasAndNot(SDValue X) const
Return true if the target has a bitwise and-not operation: X = ~A & B This can be used to simplify se...
ReciprocalEstimate
Reciprocal estimate status values used by the functions below.
bool PredictableSelectIsExpensive
Tells the code generator that select is more expensive than a branch if the branch is usually predict...
virtual bool isShuffleMaskLegal(ArrayRef< int >, EVT) const
Targets can use this to indicate that they only support some VECTOR_SHUFFLE operations,...
virtual bool isAtomicAlignmentSupported(Align Alignment, uint64_t SizeInBytes) const
Return true if the target supports an atomic access of SizeInBytes bytes at the given Alignment.
virtual bool enableAggressiveFMAFusion(EVT VT) const
Return true if target always benefits from combining into FMA for a given value type.
virtual bool isComplexDeinterleavingOperationSupported(ComplexDeinterleavingOperation Operation, Type *Ty) const
Does this target support complex deinterleaving with the given operation and type.
virtual bool shouldRemoveRedundantExtend(SDValue Op) const
Return true (the default) if it is profitable to remove a sext_inreg(x) where the sext is redundant,...
bool isIndexedStoreLegal(unsigned IdxMode, EVT VT) const
Return true if the specified indexed load is legal on this target.
SDValue promoteTargetBoolean(SelectionDAG &DAG, SDValue Bool, EVT ValVT) const
Promote the given target boolean to a target boolean of the given type.
virtual bool isFMADLegal(const SelectionDAG &DAG, const SDNode *N) const
Returns true if be combined with to form an ISD::FMAD.
virtual bool shouldReduceLoadWidth(SDNode *Load, ISD::LoadExtType ExtTy, EVT NewVT, std::optional< unsigned > ByteOffset=std::nullopt) const
Return true if it is profitable to reduce a load to a smaller type.
virtual bool hasStandaloneRem(EVT VT) const
Return true if the target can handle a standalone remainder operation.
virtual bool isExtFreeImpl(const Instruction *I) const
Return true if the extension represented by I is free.
EVT getValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the EVT corresponding to this LLVM type.
LegalizeAction
This enum indicates whether operations are valid for a target, and if not, what action should be used...
virtual bool shouldExpandBuildVectorWithShuffles(EVT, unsigned DefinedValues) const
LegalizeAction getIndexedMaskedStoreAction(unsigned IdxMode, MVT VT) const
Return how the indexed store should be treated: either it is legal, needs to be promoted to a larger ...
virtual bool isSelectSupported(SelectSupportKind) const
CallingConv::ID getLibcallCallingConv(RTLIB::Libcall Call) const
Get the CallingConv that should be used for the specified libcall.
unsigned MaxStoresPerMemcpyOptSize
Likewise for functions with the OptSize attribute.
MachineBasicBlock * emitPatchPoint(MachineInstr &MI, MachineBasicBlock *MBB) const
Replace/modify any TargetFrameIndex operands with a targte-dependent sequence of memory operands that...
virtual bool isEqualityCmpFoldedWithSignedCmp() const
Return true if instruction generated for equality comparison is folded with instruction generated for...
virtual bool preferSelectsOverBooleanArithmetic(EVT VT) const
Should we prefer selects to doing arithmetic on boolean types.
virtual bool isLegalICmpImmediate(int64_t) const
Return true if the specified immediate is legal icmp immediate, that is the target has icmp instructi...
virtual bool convertSetCCLogicToBitwiseLogic(EVT VT) const
Use bitwise logic to make pairs of compares more efficient.
void setAtomicLoadExtAction(ArrayRef< unsigned > ExtTypes, MVT ValVT, ArrayRef< MVT > MemVTs, LegalizeAction Action)
virtual const TargetRegisterClass * getRegClassFor(MVT VT, bool isDivergent=false) const
Return the register class that should be used for the specified value type.
virtual bool shouldFormOverflowOp(unsigned Opcode, EVT VT, bool MathUsed) const
Try to convert math with an overflow comparison into the corresponding DAG node operation.
ShiftLegalizationStrategy
Return the preferred strategy to legalize tihs SHIFT instruction, with ExpansionFactor being the recu...
virtual bool isVectorLoadExtDesirable(SDValue ExtVal) const
Return true if folding a vector load into ExtVal (a sign, zero, or any extend node) is profitable.
virtual bool isMaskAndCmp0FoldingBeneficial(const Instruction &AndI) const
Return if the target supports combining a chain like:
virtual Value * createComplexDeinterleavingIR(IRBuilderBase &B, ComplexDeinterleavingOperation OperationType, ComplexDeinterleavingRotation Rotation, Value *InputA, Value *InputB, Value *Accumulator=nullptr) const
Create the IR node for the given complex deinterleaving operation.
virtual bool shouldConvertConstantLoadToIntImm(const APInt &Imm, Type *Ty) const
Return true if it is beneficial to convert a load of a constant to just the constant itself.
virtual MVT::SimpleValueType getCmpLibcallReturnType() const
Return the ValueType for comparison libcalls.
virtual bool isSupportedFixedPointOperation(unsigned Op, EVT VT, unsigned Scale) const
Custom method defined by each target to indicate if an operation which may require a scale is support...
void setLoadExtAction(ArrayRef< unsigned > ExtTypes, MVT ValVT, MVT MemVT, LegalizeAction Action)
unsigned getMaximumLegalStoreInBits() const
Return maximum known-legal store size, which can be guaranteed for scalable vectors.
virtual bool shouldOptimizeMulOverflowWithZeroHighBits(LLVMContext &Context, EVT VT) const
virtual AtomicExpansionKind shouldExpandAtomicRMWInIR(const AtomicRMWInst *RMW) const
Returns how the IR-level AtomicExpand pass should expand the given AtomicRMW, if at all.
virtual Sched::Preference getSchedulingPreference(SDNode *) const
Some scheduler, e.g.
virtual MachineInstr * EmitKCFICheck(MachineBasicBlock &MBB, MachineBasicBlock::instr_iterator &MBBI, const TargetInstrInfo *TII) const
void setMinStackArgumentAlignment(Align Alignment)
Set the minimum stack alignment of an argument.
bool isExtLoad(const LoadInst *Load, const Instruction *Ext, const DataLayout &DL) const
Return true if Load and Ext can form an ExtLoad.
LegalizeTypeAction getTypeAction(MVT VT) const
virtual bool isLegalScaleForGatherScatter(uint64_t Scale, uint64_t ElemSize) const
EVT getTypeToExpandTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
virtual bool isSExtCheaperThanZExt(EVT FromTy, EVT ToTy) const
Return true if sign-extension from FromTy to ToTy is cheaper than zero-extension.
virtual bool shouldInsertFencesForAtomic(const Instruction *I) const
Whether AtomicExpandPass should automatically insert fences and reduce ordering for this atomic.
virtual AtomicOrdering atomicOperationOrderAfterFenceSplit(const Instruction *I) const
MVT getVectorIdxTy(const DataLayout &DL) const
Returns the type to be used for the index operand of: ISD::INSERT_VECTOR_ELT, ISD::EXTRACT_VECTOR_ELT...
bool isOperationExpandOrLibCall(unsigned Op, EVT VT) const
virtual bool allowsMisalignedMemoryAccesses(LLT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *=nullptr) const
LLT handling variant.
virtual bool isSafeMemOpType(MVT) const
Returns true if it's safe to use load / store of the specified type to expand memcpy / memset inline.
virtual void emitExpandAtomicCmpXchg(AtomicCmpXchgInst *CI) const
Perform a cmpxchg expansion using a target-specific method.
virtual ISD::NodeType getExtendForAtomicRMWArg(unsigned Op) const
Returns how the platform's atomic rmw operations expect their input argument to be extended (ZERO_EXT...
const TargetMachine & getTargetMachine() const
unsigned MaxLoadsPerMemcmp
Specify maximum number of load instructions per memcmp call.
virtual unsigned getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain targets require unusual breakdowns of certain types.
bool rangeFitsInWord(const APInt &Low, const APInt &High, const DataLayout &DL) const
Check whether the range [Low,High] fits in a machine word.
virtual bool isCtpopFast(EVT VT) const
Return true if ctpop instruction is fast.
virtual MachineMemOperand::Flags getTargetMMOFlags(const Instruction &I) const
This callback is used to inspect load/store instructions and add target-specific MachineMemOperand fl...
virtual Register getExceptionSelectorRegister(ExceptionHandling EH, const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception typeid on entry to a la...
unsigned MaxGluedStoresPerMemcpy
Specify max number of store instructions to glue in inlined memcpy.
virtual bool isZExtFree(Type *FromTy, Type *ToTy) const
Return true if any actual instruction that defines a value of type FromTy implicitly zero-extends the...
bool isPaddedAtMostSignificantBitsWhenStored(EVT VT) const
Indicates if any padding is guaranteed to go at the most significant bits when storing the type to me...
virtual MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain combinations of ABIs, Targets and features require that types are legal for some operations a...
void setOperationPromotedToType(unsigned Opc, MVT OrigVT, MVT DestVT)
Convenience method to set an operation to Promote and specify the type in a single call.
LegalizeTypeAction
This enum indicates whether a types are legal for a target, and if not, what action should be used to...
virtual bool useStackGuardMixFP() const
If this function returns true, stack protection checks should mix the frame pointer (or whichever poi...
unsigned getMinCmpXchgSizeInBits() const
Returns the size of the smallest cmpxchg or ll/sc instruction the backend supports.
virtual Value * emitMaskedAtomicRMWIntrinsic(IRBuilderBase &Builder, AtomicRMWInst *AI, Value *AlignedAddr, Value *Incr, Value *Mask, Value *ShiftAmt, AtomicOrdering Ord) const
Perform a masked atomicrmw using a target-specific intrinsic.
virtual bool areJTsAllowed(const Function *Fn) const
Return true if lowering to a jump table is allowed.
virtual LegalizeAction getCustomTruncStoreAction(EVT ValVT, EVT MemVT, Align Alignment, unsigned AddrSpace) const
Returns an alternative action to use when the coarser lookups (configured through setTruncStoreAction...
bool enableExtLdPromotion() const
Return true if the target wants to use the optimization that turns ext(promotableInst1(....
virtual bool isFPExtFoldable(const MachineInstr &MI, unsigned Opcode, LLT DestTy, LLT SrcTy) const
Return true if an fpext operation input to an Opcode operation is free (for instance,...
void setIndexedMaskedLoadAction(unsigned IdxMode, MVT VT, LegalizeAction Action)
Indicate that the specified indexed masked load does or does not work with the specified type and ind...
void setMaxBytesForAlignment(unsigned MaxBytes)
bool isOperationLegalOrPromote(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal using promotion.
void setHasExtractBitsInsn(bool hasExtractInsn=true)
Tells the code generator that the target has BitExtract instructions.
void addBypassSlowDiv(unsigned int SlowBitWidth, unsigned int FastBitWidth)
Tells the code generator which bitwidths to bypass.
virtual bool hasBitTest(SDValue X, SDValue Y) const
Return true if the target has a bit-test instruction: (X & (1 << Y)) ==/!= 0 This knowledge can be us...
MVT getRegisterType(LLVMContext &Context, EVT VT) const
Return the type of registers that this ValueType will eventually require.
virtual AtomicExpansionKind shouldExpandAtomicCmpXchgInIR(const AtomicCmpXchgInst *AI) const
Returns how the given atomic cmpxchg should be expanded by the IR-level AtomicExpand pass.
virtual bool needsFixedCatchObjects() const
virtual bool isAnyExtFree(EVT FromTy, EVT ToTy) const
Return true is an anyext is free from FromTy to ToTy.
EVT getLegalTypeToTransformTo(LLVMContext &Context, EVT VT) const
Perform getTypeToTransformTo repeatedly until a legal type is obtained.
virtual Value * emitLoadLinked(IRBuilderBase &Builder, Type *ValueTy, Value *Addr, AtomicOrdering Ord) const
Perform a load-linked operation on Addr, returning a "Value *" with the corresponding pointee type.
void setMaxLargeFPConvertBitWidthSupported(unsigned SizeInBits)
Set the size in bits of the maximum fp to/from int conversion the backend supports.
const LibcallLoweringInfo & getLibcallLoweringInfo() const
virtual unsigned getNumRegisters(LLVMContext &Context, EVT VT, std::optional< MVT > RegisterVT=std::nullopt) const
Return the number of registers that this ValueType will eventually require.
virtual bool isCheapToSpeculateCttz(Type *Ty) const
Return true if it is cheap to speculate a call to intrinsic cttz.
unsigned getMinimumBitTestCmps() const
Retuen the minimum of largest number of comparisons in BitTest.
bool isJumpExpensive() const
Return true if Flow Control is an expensive operation that should be avoided.
virtual bool useFPRegsForHalfType() const
LegalizeAction getCondCodeAction(ISD::CondCode CC, MVT VT) const
Return how the condition code should be treated: either it is legal, needs to be expanded to some oth...
bool hasExtractBitsInsn() const
Return true if the target has BitExtract instructions.
virtual bool isLoadBitCastBeneficial(EVT LoadVT, EVT BitcastVT, const SelectionDAG &DAG, const MachineMemOperand &MMO) const
Return true if the following transform is beneficial: fold (conv (load x)) -> (load (conv*)x) On arch...
LegalizeAction getIndexedStoreAction(unsigned IdxMode, MVT VT) const
Return how the indexed store should be treated: either it is legal, needs to be promoted to a larger ...
void setIndexedLoadAction(ArrayRef< unsigned > IdxModes, MVT VT, LegalizeAction Action)
Indicate that the specified indexed load does or does not work with the specified type and indicate w...
CallingConv::ID getLibcallImplCallingConv(RTLIB::LibcallImpl Call) const
Get the CallingConv that should be used for the specified libcall implementation.
void setPrefLoopAlignment(Align Alignment)
Set the target's preferred loop alignment.
virtual bool areTwoSDNodeTargetMMOFlagsMergeable(const MemSDNode &NodeX, const MemSDNode &NodeY) const
Return true if it is valid to merge the TargetMMOFlags in two SDNodes.
virtual bool isCommutativeBinOp(unsigned Opcode) const
Returns true if the opcode is a commutative binary operation.
void setMaxAtomicSizeInBitsSupported(unsigned SizeInBits)
Set the maximum atomic operation size supported by the backend.
virtual bool isFPImmLegal(const APFloat &, EVT, bool ForCodeSize=false) const
Returns true if the target can instruction select the specified FP immediate natively.
LegalizeAction getTruncStoreAction(EVT ValVT, EVT MemVT, Align Alignment, unsigned AddrSpace) const
Return how this store with truncation should be treated: either it is legal, needs to be promoted to ...
virtual unsigned getPreferredFPToIntOpcode(unsigned Op, EVT FromVT, EVT ToVT) const
virtual bool isExtractVecEltCheap(EVT VT, unsigned Index) const
Return true if extraction of a scalar element from the given vector type at the given index is cheap.
void setOperationAction(ArrayRef< unsigned > Ops, MVT VT, LegalizeAction Action)
virtual bool optimizeFMulOrFDivAsShiftAddBitcast(SDNode *N, SDValue FPConst, SDValue IntPow2) const
SelectSupportKind
Enum that describes what type of support for selects the target has.
RTLIB::LibcallImpl getMemcpyImpl() const
LegalizeAction getIndexedLoadAction(unsigned IdxMode, MVT VT) const
Return how the indexed load should be treated: either it is legal, needs to be promoted to a larger s...
virtual bool shouldTransformSignedTruncationCheck(EVT XVT, unsigned KeptBits) const
Should we tranform the IR-optimal check for whether given truncation down into KeptBits would be trun...
virtual bool isFPExtFoldable(const SelectionDAG &DAG, unsigned Opcode, EVT DestVT, EVT SrcVT) const
Return true if an fpext operation input to an Opcode operation is free (for instance,...
bool isLegalRC(const TargetRegisterInfo &TRI, const TargetRegisterClass &RC) const
Return true if the value types that can be represented by the specified register class are all legal.
virtual TargetLoweringBase::LegalizeTypeAction getPreferredVectorAction(MVT VT) const
Return the preferred vector type legalization action.
virtual bool allowTruncateForTailCall(Type *FromTy, Type *ToTy) const
Return true if a truncation from FromTy to ToTy is permitted when deciding whether a call is in tail ...
void setAtomicLoadExtAction(unsigned ExtType, MVT ValVT, MVT MemVT, LegalizeAction Action)
Let target indicate that an extending atomic load of the specified type is legal.
virtual bool shouldExtendGSIndex(EVT VT, EVT &EltTy) const
Returns true if the index type for a masked gather/scatter requires extending.
virtual unsigned getVectorTypeBreakdownForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const
Certain targets such as MIPS require that some types such as vectors are always broken down into scal...
Register getStackPointerRegisterToSaveRestore() const
If a physical register, this specifies the register that llvm.savestack/llvm.restorestack should save...
virtual StringRef getStackProbeSymbolName(const MachineFunction &MF) const
LegalizeAction getFixedPointOperationAction(unsigned Op, EVT VT, unsigned Scale) const
Some fixed point operations may be natively supported by the target but only for specific scales.
virtual bool preferScalarizeSplat(SDNode *N) const
void setVectorInterleaveAction(unsigned Opc, unsigned Factor, MVT VT, LegalizeAction Action)
Indicate how a VECTOR_INTERLEAVE or VECTOR_DEINTERLEAVE node with the given interleave factor Factor ...
bool isIndexedMaskedLoadLegal(unsigned IdxMode, EVT VT) const
Return true if the specified indexed load is legal on this target.
virtual ISD::NodeType getExtendForAtomicOps() const
Returns how the platform's atomic operations are extended (ZERO_EXTEND, SIGN_EXTEND,...
Sched::Preference getSchedulingPreference() const
Return target scheduling preference.
virtual bool allowsMisalignedMemoryAccesses(EVT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *=nullptr) const
Determine if the target supports unaligned memory accesses.
virtual LLT getOptimalMemOpLLT(const MemOp &Op, const AttributeList &) const
LLT returning variant.
void setMinFunctionAlignment(Align Alignment)
Set the target's minimum function alignment.
bool isOperationCustom(unsigned Op, EVT VT) const
Return true if the operation uses custom lowering, regardless of whether the type is legal or not.
virtual ExtractSubvectorCost getExtractSubvectorCost(EVT ResVT, EVT SrcVT, unsigned Index) const
Return the cost of extracting a subvector of type ResVT from a vector of type SrcVT,...
virtual void emitExpandAtomicRMW(AtomicRMWInst *AI) const
Perform a atomicrmw expansion using a target-specific way.
unsigned MaxStoresPerMemsetOptSize
Likewise for functions with the OptSize attribute.
virtual bool reduceSelectOfFPConstantLoads(EVT CmpOpVT) const
Return true if it is profitable to convert a select of FP constants into a constant pool load whose a...
bool hasBigEndianPartOrdering(EVT VT, const DataLayout &DL) const
When splitting a value of the specified type into parts, does the Lo or Hi part come first?
virtual bool hasStackProbeSymbol(const MachineFunction &MF) const
Returns the name of the symbol used to emit stack probes or the empty string if not applicable.
bool isSlowDivBypassed() const
Returns true if target has indicated at least one type should be bypassed.
virtual Align getABIAlignmentForCallingConv(Type *ArgTy, const DataLayout &DL) const
Certain targets have context sensitive alignment requirements, where one type has the alignment requi...
virtual bool isMulAddWithConstProfitable(SDValue AddNode, SDValue ConstNode) const
Return true if it may be profitable to transform (mul (add x, c1), c2) -> (add (mul x,...
virtual bool shouldExtendTypeInLibCall(EVT Type) const
Returns true if arguments should be extended in lib calls.
void setBooleanContents(BooleanContent Ty)
Specify how the target extends the result of integer and floating point boolean values from i1 to a w...
void setVectorInterleaveAction(ArrayRef< unsigned > Opcodes, ArrayRef< unsigned > Factors, MVT VT, LegalizeAction Action)
bool isPartialReduceMLALegalOrCustom(unsigned Opc, EVT AccVT, EVT InputVT) const
Return true if a PARTIAL_REDUCE_U/SMLA node with the specified types is legal or custom for this targ...
virtual bool isFsqrtCheap(SDValue X, SelectionDAG &DAG) const
Return true if SQRT(X) shouldn't be replaced with X*RSQRT(X).
unsigned MaxStoresPerMemmove
Specify maximum number of store instructions per memmove call.
virtual bool shouldNormalizeToSelectSequence(LLVMContext &Context, EVT VT, EVT CCVT) const
Returns true if we should normalize select(N0&N1, X, Y) => select(N0, select(N1, X,...
bool isSuitableForBitTests(const DenseMap< const BasicBlock *, unsigned int > &DestCmps, const APInt &Low, const APInt &High, const DataLayout &DL) const
Return true if lowering to a bit test is suitable for a set of case clusters which contains NumDests ...
virtual bool shouldExpandGetActiveLaneMask(EVT VT, EVT OpVT) const
Return true if the @llvm.get.active.lane.mask intrinsic should be expanded using generic code in Sele...
virtual bool shallExtractConstSplatVectorElementToStore(Type *VectorTy, unsigned ElemSizeInBits, unsigned &Index) const
Return true if the target shall perform extract vector element and store given that the vector is kno...
virtual bool isTruncateFree(Type *FromTy, Type *ToTy) const
Return true if it's free to truncate a value of type FromTy to type ToTy.
virtual bool hasMultipleConditionRegisters(EVT VT) const
Does the target have multiple (allocatable) condition registers that can be used to store the results...
unsigned getMaxExpandSizeMemcmp(bool OptSize) const
Get maximum # of load operations permitted for memcmp.
bool isStrictFPEnabled() const
Return true if the target support strict float operation.
virtual bool shouldAvoidTransformToShift(EVT VT, unsigned Amount) const
Return true if creating a shift of the type by the given amount is not profitable.
virtual bool shouldPreservePtrArith(const Function &F, EVT PtrVT) const
True if target has some particular form of dealing with pointer arithmetic semantics for pointers wit...
virtual bool isFPExtFree(EVT DestVT, EVT SrcVT) const
Return true if an fpext operation is free (for instance, because single-precision floating-point numb...
virtual EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const
Return the ValueType of the result of SETCC operations.
virtual bool lowerInterleavedStore(Instruction *Store, Value *Mask, ShuffleVectorInst *SVI, unsigned Factor, const APInt &GapMask) const
Lower an interleaved store to target specific intrinsics.
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
unsigned MaxStoresPerMemmoveOptSize
Likewise for functions with the OptSize attribute.
virtual bool shouldFoldSelectWithSingleBitTest(EVT VT, const APInt &AndMask) const
MVT getSimpleValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the MVT corresponding to this LLVM type. See getValueType.
BooleanContent getBooleanContents(bool isVec, bool isFloat) const
For targets without i1 registers, this gives the nature of the high-bits of boolean values held in ty...
bool isVectorInterleaveLegalOrCustom(unsigned Opc, unsigned Factor, EVT VT) const
Return true if a VECTOR_INTERLEAVE or VECTOR_DEINTERLEAVE node with the given interleave factor and f...
LegalizeAction getVectorInterleaveAction(unsigned Opc, unsigned Factor, EVT VT) const
Return how a VECTOR_INTERLEAVE or VECTOR_DEINTERLEAVE node with the given interleave factor and VT sh...
virtual bool shouldReassociateReduction(unsigned RedOpc, EVT VT) const
void addRegisterClass(MVT VT, const TargetRegisterClass *RC)
Add the specified register class as an available regclass for the specified value type.
virtual CondMergingParams getJumpConditionMergingParams(Instruction::BinaryOps, const Value *, const Value *, const Function *) const
bool isCondCodeLegal(ISD::CondCode CC, MVT VT) const
Return true if the specified condition code is legal for a comparison of the specified types on this ...
virtual bool canCombineStoreAndExtract(Type *VectorTy, Value *Idx, unsigned &Cost) const
Return true if the target can combine store(extractelement VectorTy,Idx).
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
virtual bool shouldFoldConstantShiftPairToMask(const SDNode *N) const
Return true if it is profitable to fold a pair of shifts into a mask.
MVT getProgramPointerTy(const DataLayout &DL) const
Return the type for code pointers, which is determined by the program address space specified through...
void setIndexedStoreAction(ArrayRef< unsigned > IdxModes, MVT VT, LegalizeAction Action)
Indicate that the specified indexed store does or does not work with the specified type and indicate ...
ExtractSubvectorCost
Enum that specifies how expensive lowering an EXTRACT_SUBVECTOR is.
virtual void emitAtomicCmpXchgNoStoreLLBalance(IRBuilderBase &Builder) const
void setSupportsUnalignedAtomics(bool UnalignedSupported)
Sets whether unaligned atomic operations are supported.
void setLoadExtAction(ArrayRef< unsigned > ExtTypes, MVT ValVT, ArrayRef< MVT > MemVTs, LegalizeAction Action)
virtual void emitExpandAtomicStore(StoreInst *SI) const
Perform a atomic store using a target-specific way.
virtual bool preferIncOfAddToSubOfNot(EVT VT) const
These two forms are equivalent: sub y, (xor x, -1) add (add x, 1), y The variant with two add's is IR...
virtual bool ShouldShrinkFPConstant(EVT) const
If true, then instruction selection should seek to shrink the FP constant of the specified type to a ...
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
void setPrefFunctionAlignment(Align Alignment)
Set the target's preferred function alignment.
unsigned getMaxDivRemBitWidthSupported() const
Returns the size in bits of the maximum div/rem the backend supports.
virtual bool isLegalAddImmediate(int64_t) const
Return true if the specified immediate is legal add immediate, that is the target has add instruction...
virtual unsigned getMaxSupportedInterleaveFactor() const
Get the maximum supported factor for interleaved memory accesses.
bool isOperationLegal(unsigned Op, EVT VT) const
Return true if the specified operation is legal on this target.
virtual bool shouldKeepZExtForFP16Conv() const
Does this target require the clearing of high-order bits in a register passed to the fp16 to fp conve...
virtual AtomicExpansionKind shouldCastAtomicRMWIInIR(AtomicRMWInst *RMWI) const
Returns how the given atomic atomicrmw should be cast by the IR-level AtomicExpand pass.
void setIndexedMaskedStoreAction(unsigned IdxMode, MVT VT, LegalizeAction Action)
Indicate that the specified indexed masked store does or does not work with the specified type and in...
virtual bool canTransformPtrArithOutOfBounds(const Function &F, EVT PtrVT) const
True if the target allows transformations of in-bounds pointer arithmetic that cause out-of-bounds in...
virtual bool shouldConsiderGEPOffsetSplit() const
const ValueTypeActionImpl & getValueTypeActions() const
virtual bool canCombineTruncStore(EVT ValVT, EVT MemVT, Align Alignment, unsigned AddrSpace, bool LegalOnly) const
TargetLoweringBase(const TargetMachine &TM, const TargetSubtargetInfo &STI)
NOTE: The TargetMachine owns TLOF.
unsigned MaxStoresPerMemset
Specify maximum number of store instructions per memset call.
virtual bool isTruncateFree(SDValue Val, EVT VT2) const
Return true if truncating the specific node Val to type VT2 is free.
virtual bool isProfitableToCombineMinNumMaxNum(EVT VT) const
virtual unsigned getCustomCtpopCost(EVT VT, ISD::CondCode Cond) const
Return the maximum number of "x & (x - 1)" operations that can be done instead of deferring to a cust...
virtual bool shouldProduceAndByConstByHoistingConstFromShiftsLHSOfAnd(SDValue X, ConstantSDNode *XC, ConstantSDNode *CC, SDValue Y, unsigned OldShiftOpcode, unsigned NewShiftOpcode, SelectionDAG &DAG) const
Given the pattern (X & (C l>>/<< Y)) ==/!= 0 return true if it should be transformed into: ((X <</l>>...
virtual bool shouldInsertTrailingSeqCstFenceForAtomicStore(const Instruction *I) const
Whether AtomicExpandPass should automatically insert a seq_cst trailing fence without reducing the or...
virtual bool isFNegFree(EVT VT) const
Return true if an fneg operation is free to the point where it is never worthwhile to replace it with...
void setPartialReduceMLAAction(unsigned Opc, MVT AccVT, MVT InputVT, LegalizeAction Action)
Indicate how a PARTIAL_REDUCE_U/SMLA node with Acc type AccVT and Input type InputVT should be treate...
virtual AtomicExpansionKind shouldExpandAtomicLoadInIR(LoadInst *LI) const
Returns how the given (atomic) load should be expanded by the IR-level AtomicExpand pass.
void setTruncStoreAction(MVT ValVT, MVT MemVT, LegalizeAction Action)
Indicate that the specified truncating store does not work with the specified type and indicate what ...
bool isExtFree(const Instruction *I) const
Return true if the extension represented by I is free.
virtual MVT getFenceOperandTy(const DataLayout &DL) const
Return the type for operands of fence.
virtual Value * emitMaskedAtomicCmpXchgIntrinsic(IRBuilderBase &Builder, AtomicCmpXchgInst *CI, Value *AlignedAddr, Value *CmpVal, Value *NewVal, Value *Mask, AtomicOrdering Ord) const
Perform a masked cmpxchg using a target-specific intrinsic.
virtual bool isZExtFree(EVT FromTy, EVT ToTy) const
virtual ISD::NodeType getExtendForAtomicCmpSwapArg() const
Returns how the platform's atomic compare and swap expects its comparison value to be extended (ZERO_...
virtual bool shouldFoldSelectWithIdentityConstant(unsigned BinOpcode, EVT VT, unsigned SelectOpcode, SDValue X, SDValue Y) const
Return true if pulling a binary operation into a select with an identity constant is profitable.
BooleanContent
Enum that describes how the target represents true/false values.
virtual bool shouldExpandGetVectorLength(EVT CountVT, unsigned VF, bool IsScalable) const
virtual bool isIntDivCheap(EVT VT, AttributeList Attr) const
Return true if integer divide is usually cheaper than a sequence of several shifts,...
virtual ShiftLegalizationStrategy preferredShiftLegalizationStrategy(SelectionDAG &DAG, SDNode *N, unsigned ExpansionFactor) const
virtual uint8_t getRepRegClassCostFor(MVT VT) const
Return the cost of the 'representative' register class for the specified value type.
virtual bool isZExtFree(LLT FromTy, LLT ToTy, LLVMContext &Ctx) const
bool isOperationLegalOrCustom(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
LegalizeAction getPartialReduceMLAAction(unsigned Opc, EVT AccVT, EVT InputVT) const
Return how a PARTIAL_REDUCE_U/SMLA node with Acc type AccVT and Input type InputVT should be treated.
bool isPredictableSelectExpensive() const
Return true if selects are only cheaper than branches if the branch is unlikely to be predicted right...
virtual bool mergeStoresAfterLegalization(EVT MemVT) const
Allow store merging for the specified type after legalization in addition to before legalization.
unsigned getVectorTypeBreakdown(LLVMContext &Context, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const
Vector types are broken down into some number of legal first class types.
virtual bool shouldIssueAtomicLoadForAtomicEmulationLoop(void) const
virtual bool shouldMergeStoreOfLoadsOverCall(EVT, EVT) const
Returns true if it's profitable to allow merging store of loads when there are functions calls betwee...
RTLIB::LibcallImpl getSupportedLibcallImpl(StringRef FuncName) const
Check if this is valid libcall for the current module, otherwise RTLIB::Unsupported.
virtual bool isProfitableToHoist(Instruction *I) const
unsigned getGatherAllAliasesMaxDepth() const
virtual LegalizeAction getCustomOperationAction(SDNode &Op) const
How to legalize this custom operation?
virtual bool isFMAFasterThanFMulAndFAdd(const Function &F, Type *) const
IR version.
virtual bool hasAndNotCompare(SDValue Y) const
Return true if the target should transform: (X & Y) == Y ---> (~X & Y) == 0 (X & Y) !...
virtual bool storeOfVectorConstantIsCheap(bool IsZero, EVT MemVT, unsigned NumElem, unsigned AddrSpace) const
Return true if it is expected to be cheaper to do a store of vector constant with the given size and ...
unsigned MaxLoadsPerMemcmpOptSize
Likewise for functions with the OptSize attribute.
virtual MVT hasFastEqualityCompare(unsigned NumBits) const
Return the preferred operand type if the target has a quick way to compare integer values of the give...
virtual const TargetRegisterClass * getRepRegClassFor(MVT VT) const
Return the 'representative' register class for the specified value type.
virtual bool isNarrowingProfitable(SDNode *N, EVT SrcVT, EVT DestVT) const
Return true if it's profitable to narrow operations of type SrcVT to DestVT.
LegalizeAction getLoadAction(EVT ValVT, EVT MemVT, Align Alignment, unsigned AddrSpace, unsigned ExtType, bool Atomic) const
Return how this load with extension should be treated: either it is legal, needs to be promoted to a ...
virtual bool isMultiStoresCheaperThanBitsMerge(EVT LTy, EVT HTy) const
Return true if it is cheaper to split the store of a merged int val from a pair of smaller values int...
bool shouldUseDynamicVectorTypeBreakdown(EVT VT, bool ForCallingConv) const
TargetLoweringBase(const TargetLoweringBase &)=delete
virtual unsigned getMaxGluedStoresPerMemcpy() const
Get maximum # of store operations to be glued together.
virtual bool isBinOp(unsigned Opcode) const
Return true if the node is a math/logic binary operator.
virtual bool shouldFoldMaskToVariableShiftPair(SDValue X) const
There are two ways to clear extreme bits (either low or high): Mask: x & (-1 << y) (the instcombine c...
virtual bool alignLoopsWithOptSize() const
Should loops be aligned even when the function is marked OptSize (but not MinSize).
unsigned getMaxAtomicSizeInBitsSupported() const
Returns the maximum atomic operation size (in bits) supported by the backend.
bool isIndexedLoadLegal(unsigned IdxMode, EVT VT) const
Return true if the specified indexed load is legal on this target.
void setMinCmpXchgSizeInBits(unsigned SizeInBits)
Sets the minimum cmpxchg or ll/sc size supported by the backend.
virtual bool canMergeStoresTo(unsigned AS, EVT MemVT, const MachineFunction &MF) const
Returns if it's reasonable to merge stores to MemVT size.
void setPartialReduceMLAAction(ArrayRef< unsigned > Opcodes, MVT AccVT, MVT InputVT, LegalizeAction Action)
LegalizeAction getStrictFPOperationAction(unsigned Op, EVT VT) const
void setStackPointerRegisterToSaveRestore(Register R)
If set to a physical register, this specifies the register that llvm.savestack/llvm....
virtual bool preferABDSToABSWithNSW(EVT VT) const
void AddPromotedToType(unsigned Opc, MVT OrigVT, MVT DestVT)
If Opc/OrigVT is specified as being promoted, the promotion code defaults to trying a larger integer/...
virtual bool getAddrModeArguments(const IntrinsicInst *, SmallVectorImpl< Value * > &, Type *&) const
CodeGenPrepare sinks address calculations into the same BB as Load/Store instructions reading the add...
virtual bool hasInlineStackProbe(const MachineFunction &MF) const
AtomicExpansionKind
Enum that specifies what an atomic load/AtomicRMWInst is expanded to, if at all.
void setCondCodeAction(ArrayRef< ISD::CondCode > CCs, MVT VT, LegalizeAction Action)
Indicate that the specified condition code is or isn't supported on the target and indicate what to d...
void setBooleanContents(BooleanContent IntTy, BooleanContent FloatTy)
Specify how the target extends the result of integer and floating point boolean values from i1 to a w...
const DenseMap< unsigned int, unsigned int > & getBypassSlowDivWidths() const
Returns map of slow types for division or remainder with corresponding fast types.
void setOperationPromotedToType(ArrayRef< unsigned > Ops, MVT OrigVT, MVT DestVT)
unsigned getMaxLargeFPConvertBitWidthSupported() const
Returns the size in bits of the maximum fp to/from int conversion the backend supports.
virtual bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF, LLT) const
Return true if an FMA operation is faster than a pair of fmul and fadd instructions.
virtual bool isTruncateFree(EVT FromVT, EVT ToVT) const
bool isTruncStoreLegal(EVT ValVT, EVT MemVT, Align Alignment, unsigned AddrSpace) const
Return true if the specified store with truncation is legal on this target.
virtual bool isCheapToSpeculateCtlz(Type *Ty) const
Return true if it is cheap to speculate a call to intrinsic ctlz.
virtual void getTgtMemIntrinsic(SmallVectorImpl< IntrinsicInfo > &Infos, const CallBase &I, MachineFunction &MF, unsigned Intrinsic) const
Given an intrinsic, checks if on the target the intrinsic will need to map to a MemIntrinsicNode (tou...
virtual bool signExtendConstant(const ConstantInt *C) const
Return true if this constant should be sign extended when promoting to a larger type.
virtual bool lowerInterleaveIntrinsicToStore(Instruction *Store, Value *Mask, ArrayRef< Value * > InterleaveValues) const
Lower an interleave intrinsic to a target specific store intrinsic.
virtual bool isTruncateFree(LLT FromTy, LLT ToTy, LLVMContext &Ctx) const
AndOrSETCCFoldKind
Enum of different potentially desirable ways to fold (and/or (setcc ...), (setcc ....
virtual bool shouldScalarizeBinop(SDValue VecOp) const
Try to convert an extract element of a vector binary operation into an extract element followed by a ...
Align getPrefFunctionAlignment() const
Return the preferred function alignment.
RTLIB::LibcallImpl getLibcallImpl(RTLIB::Libcall Call) const
Get the libcall impl routine name for the specified libcall.
virtual void emitExpandAtomicLoad(LoadInst *LI) const
Perform a atomic load using a target-specific way.
Align getMinFunctionAlignment() const
Return the minimum function alignment.
virtual AtomicExpansionKind shouldExpandAtomicStoreInIR(StoreInst *SI) const
Returns how the given (atomic) store should be expanded by the IR-level AtomicExpand pass into.
virtual bool preferVectorizedNonPowerOfTwoTypeBreakdown() const
Return true if fixed-length, non-power-of-two vectors should be broken down into legal vector parts i...
static StringRef getLibcallImplName(RTLIB::LibcallImpl Call)
Get the libcall routine name for the specified libcall implementation.
void setTargetDAGCombine(ArrayRef< ISD::NodeType > NTs)
Targets should invoke this method for each target independent node that they want to provide a custom...
virtual bool isCtlzFast() const
Return true if ctlz instruction is fast.
virtual bool useSoftFloat() const
virtual bool isStoreBitCastBeneficial(EVT StoreVT, EVT BitcastVT, const SelectionDAG &DAG, const MachineMemOperand &MMO) const
Return true if the following transform is beneficial: (store (y (conv x)), y*)) -> (store x,...
BooleanContent getBooleanContents(EVT Type) const
virtual LegalizeAction getCustomLoadAction(EVT ValVT, EVT MemVT, Align Alignment, unsigned AddrSpace, unsigned ExtType, bool Atomic) const
Returns an alternative action to use when the coarser lookups (configured through setLoadExtAction an...
bool isIndexedMaskedStoreLegal(unsigned IdxMode, EVT VT) const
Return true if the specified indexed load is legal on this target.
virtual int64_t getPreferredLargeGEPBaseOffset(int64_t MinOffset, int64_t MaxOffset) const
Return the prefered common base offset.
virtual bool isVectorClearMaskLegal(ArrayRef< int >, EVT) const
Similar to isShuffleMaskLegal.
LegalizeKind getTypeConversion(LLVMContext &Context, EVT VT) const
Return pair that represents the legalization kind (first) that needs to happen to EVT (second) in ord...
Align getMinStackArgumentAlignment() const
Return the minimum stack alignment of an argument.
virtual bool shouldUseStrictFP_TO_INT(EVT FpVT, EVT IntVT, bool IsSigned) const
Return true if it is more correct/profitable to use strict FP_TO_INT conversion operations - canonica...
void setLoadExtAction(unsigned ExtType, MVT ValVT, MVT MemVT, LegalizeAction Action)
Indicate that the specified load with extension does not work with the specified type and indicate wh...
bool hasTargetDAGCombine(ISD::NodeType NT) const
If true, the target has custom DAG combine transformations that it can perform for the specified node...
void setLibcallImpl(RTLIB::Libcall Call, RTLIB::LibcallImpl Impl)
virtual bool fallBackToDAGISel(const Instruction &Inst) const
unsigned GatherAllAliasesMaxDepth
Depth that GatherAllAliases should continue looking for chain dependencies when trying to find a more...
virtual bool shouldSplatInsEltVarIndex(EVT) const
Return true if inserting a scalar into a variable element of an undef vector is more efficiently hand...
LegalizeAction getIndexedMaskedLoadAction(unsigned IdxMode, MVT VT) const
Return how the indexed load should be treated: either it is legal, needs to be promoted to a larger s...
NegatibleCost
Enum that specifies when a float negation is beneficial.
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
virtual unsigned preferedOpcodeForCmpEqPiecesOfOperand(EVT VT, unsigned ShiftOpc, bool MayTransformRotate, const APInt &ShiftOrRotateAmt, const std::optional< APInt > &AndMask) const
virtual void emitCmpArithAtomicRMWIntrinsic(AtomicRMWInst *AI) const
Perform a atomicrmw which the result is only used by comparison, using a target-specific intrinsic.
virtual bool shouldSignExtendTypeInLibCall(Type *Ty, bool IsSigned) const
Returns true if arguments should be sign-extended in lib calls.
virtual bool isFMADLegal(const MachineInstr &MI, LLT Ty) const
Returns true if MI can be combined with another instruction to form TargetOpcode::G_FMAD.
void setCondCodeAction(ArrayRef< ISD::CondCode > CCs, ArrayRef< MVT > VTs, LegalizeAction Action)
const char * getLibcallName(RTLIB::Libcall Call) const
Get the libcall routine name for the specified libcall.
virtual bool isLegalAddScalableImmediate(int64_t) const
Return true if adding the specified scalable immediate is legal, that is the target has add instructi...
std::vector< ArgListEntry > ArgListTy
virtual bool shouldAlignPointerArgs(CallInst *, unsigned &, Align &) const
Return true if the pointer arguments to CI should be aligned by aligning the object whose address is ...
virtual bool hasVectorBlend() const
Return true if the target has a vector blend instruction.
virtual AtomicExpansionKind shouldCastAtomicStoreInIR(StoreInst *SI) const
Returns how the given (atomic) store should be cast by the IR-level AtomicExpand pass into.
bool isTruncStoreLegalOrCustom(EVT ValVT, EVT MemVT, Align Alignment, unsigned AddrSpace) const
Return true if the specified store with truncation has solution on this target.
void setIndexedStoreAction(ArrayRef< unsigned > IdxModes, ArrayRef< MVT > VTs, LegalizeAction Action)
virtual bool aggressivelyPreferBuildVectorSources(EVT VecVT) const
virtual Register getExceptionPointerRegister(ExceptionHandling EH, const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception address on entry to an ...
virtual MachineMemOperand::Flags getTargetMMOFlags(const MemSDNode &Node) const
This callback is used to inspect load/store SDNode.
virtual EVT getOptimalMemOpType(LLVMContext &Context, const MemOp &Op, const AttributeList &) const
Returns the target specific optimal type for load and store operations as a result of memset,...
virtual Type * shouldConvertSplatType(ShuffleVectorInst *SVI) const
Given a shuffle vector SVI representing a vector splat, return a new scalar type of size equal to SVI...
virtual bool isZExtFree(SDValue Val, EVT VT2) const
Return true if zero-extending the specific node Val to type VT2 is free (either because it's implicit...
void setAtomicLoadExtAction(ArrayRef< unsigned > ExtTypes, MVT ValVT, MVT MemVT, LegalizeAction Action)
virtual bool shouldRemoveExtendFromGSIndex(SDValue Extend, EVT DataVT) const
virtual LLVM_READONLY LLT getPreferredShiftAmountTy(LLT ShiftValueTy) const
Return the preferred type to use for a shift opcode, given the shifted amount type is ShiftValueTy.
bool isBeneficialToExpandPowI(int64_t Exponent, bool OptForSize) const
Return true if it is beneficial to expand an @llvm.powi.
LLT getVectorIdxLLT(const DataLayout &DL) const
Returns the type to be used for the index operand of: G_INSERT_VECTOR_ELT, G_EXTRACT_VECTOR_ELT,...
virtual EVT getAsmOperandValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
void setIndexedLoadAction(ArrayRef< unsigned > IdxModes, ArrayRef< MVT > VTs, LegalizeAction Action)
virtual AtomicExpansionKind shouldCastAtomicLoadInIR(LoadInst *LI) const
Returns how the given (atomic) load should be cast by the IR-level AtomicExpand pass.
bool isCondCodeLegalOrCustom(ISD::CondCode CC, MVT VT) const
Return true if the specified condition code is legal or custom for a comparison of the specified type...
virtual bool isComplexDeinterleavingSupported() const
Does this target support complex deinterleaving.
unsigned MaxStoresPerMemcpy
Specify maximum number of store instructions per memcpy call.
MVT getFrameIndexTy(const DataLayout &DL) const
Return the type for frame index, which is determined by the alloca address space specified through th...
virtual MVT getPointerMemTy(const DataLayout &DL, uint32_t AS=0) const
Return the in-memory pointer type for the given address space, defaults to the pointer type from the ...
bool isLoadLegal(EVT ValVT, EVT MemVT, Align Alignment, unsigned AddrSpace, unsigned ExtType, bool Atomic) const
Return true if the specified load with extension is legal on this target.
void setSchedulingPreference(Sched::Preference Pref)
Specify the target scheduling preference.
virtual bool addressingModeSupportsTLS(const GlobalValue &) const
Returns true if the targets addressing mode can target thread local storage (TLS).
bool isLoadLegalOrCustom(EVT ValVT, EVT MemVT, Align Alignment, unsigned AddrSpace, unsigned ExtType, bool Atomic) const
Return true if the specified load with extension is legal or custom on this target.
virtual bool shouldConvertPhiType(Type *From, Type *To) const
Given a set in interconnected phis of type 'From' that are loaded/stored or bitcast to type 'To',...
virtual bool isFAbsFree(EVT VT) const
Return true if an fabs operation is free to the point where it is never worthwhile to replace it with...
virtual bool isLegalStoreImmediate(int64_t Value) const
Return true if the specified immediate is legal for the value input of a store instruction.
virtual bool preferZeroCompareBranch() const
Return true if the heuristic to prefer icmp eq zero should be used in code gen prepare.
LegalizeAction getOperationAction(unsigned Op, EVT VT) const
Return how this operation should be treated: either it is legal, needs to be promoted to a larger siz...
virtual bool lowerInterleavedLoad(Instruction *Load, Value *Mask, ArrayRef< ShuffleVectorInst * > Shuffles, ArrayRef< unsigned > Indices, unsigned Factor, const APInt &GapMask) const
Lower an interleaved load to target specific intrinsics.
virtual unsigned getVectorIdxWidth(const DataLayout &DL) const
Returns the type to be used for the index operand vector operations.
MVT getTypeToPromoteTo(unsigned Op, MVT VT) const
If the action for this operation is to promote, this method returns the ValueType to promote to.
virtual bool generateFMAsInMachineCombiner(EVT VT, CodeGenOptLevel OptLevel) const
virtual LoadInst * lowerIdempotentRMWIntoFencedLoad(AtomicRMWInst *RMWI) const
On some platforms, an AtomicRMW that never actually modifies the value (such as fetch_add of 0) can b...
virtual bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty, unsigned AddrSpace, Instruction *I=nullptr) const
Return true if the addressing mode represented by AM is legal for this target, for a load/store of th...
virtual bool hasPairedLoad(EVT, Align &) const
Return true if the target supplies and combines to a paired load two loaded values of type LoadedType...
virtual bool convertSelectOfConstantsToMath(EVT VT) const
Return true if a select of constants (select Cond, C1, C2) should be transformed into simple math ops...
bool isOperationLegalOrCustomOrPromote(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
virtual bool optimizeExtendOrTruncateConversion(Instruction *I, Loop *L, const TargetTransformInfo &TTI) const
Try to optimize extending or truncating conversion instructions (like zext, trunc,...
virtual MVT getVPExplicitVectorLengthTy() const
Returns the type to be used for the EVL/AVL operand of VP nodes: ISD::VP_UDIV, ISD::VP_SDIV,...
std::pair< LegalizeTypeAction, EVT > LegalizeKind
LegalizeKind holds the legalization kind that needs to happen to EVT in order to type-legalize it.
TargetLoweringBase & operator=(const TargetLoweringBase &)=delete
MulExpansionKind
Enum that specifies when a multiplication should be expanded.
static ISD::NodeType getExtendForContent(BooleanContent Content)
const RTLIB::RuntimeLibcallsInfo & getRuntimeLibcallsInfo() const
virtual bool shouldConvertFpToSat(unsigned Op, EVT FPVT, EVT VT) const
Should we generate fp_to_si_sat and fp_to_ui_sat from type FPVT to type VT.
virtual bool supportKCFIBundles() const
Return true if the target supports kcfi operand bundles.
virtual ConstraintWeight getMultipleConstraintMatchWeight(AsmOperandInfo &info, int maIndex) const
Examine constraint type and operand type and determine a weight value.
SmallVector< ConstraintPair > ConstraintGroup
virtual SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled, int &RefinementSteps, bool &UseOneConstNR, bool Reciprocal) const
Hooks for building estimates in place of slower divisions and square roots.
virtual bool isDesirableToCommuteWithShift(const MachineInstr &MI, bool IsAfterLegal) const
GlobalISel - return true if it is profitable to move this shift by a constant amount through its oper...
virtual bool supportPtrAuthBundles() const
Return true if the target supports ptrauth operand bundles.
virtual void ReplaceNodeResults(SDNode *, SmallVectorImpl< SDValue > &, SelectionDAG &) const
This callback is invoked when a node result type is illegal for the target, and the operation was reg...
virtual bool isUsedByReturnOnly(SDNode *, SDValue &) const
Return true if result of the specified node is used by a return node only.
virtual bool supportSwiftError() const
Return true if the target supports swifterror attribute.
virtual SDValue visitMaskedLoad(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, MachineMemOperand *MMO, SDValue &NewLoad, SDValue Ptr, SDValue PassThru, SDValue Mask) const
virtual unsigned getPreferredShrunkVectorSizeInBits(SDValue Op, const APInt &DemandedElts) const
If only low elements of a vector are demanded, shrink the operation to the returned size in bits by c...
SDValue getNegatedExpression(SDValue Op, SelectionDAG &DAG, bool LegalOps, bool OptForSize, unsigned Depth=0) const
This is the helper function to return the newly negated expression if the cost is not expensive.
virtual bool isReassocProfitable(SelectionDAG &DAG, SDValue N0, SDValue N1) const
virtual EVT getTypeForExtReturn(LLVMContext &Context, EVT VT, ISD::NodeType) const
Return the type that should be used to zero or sign extend a zeroext/signext integer return value.
SDValue getCheaperOrNeutralNegatedExpression(SDValue Op, SelectionDAG &DAG, bool LegalOps, bool OptForSize, const NegatibleCost CostThreshold=NegatibleCost::Neutral, unsigned Depth=0) const
virtual Register getRegisterByName(const char *RegName, LLT Ty, const MachineFunction &MF) const
Return the register ID of the name passed in.
virtual InlineAsm::ConstraintCode getInlineAsmMemConstraint(StringRef ConstraintCode) const
virtual bool targetShrinkDemandedConstant(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, TargetLoweringOpt &TLO) const
std::vector< AsmOperandInfo > AsmOperandInfoVector
virtual bool isTargetCanonicalConstantNode(SDValue Op) const
Returns true if the given Opc is considered a canonical constant for the target, which should not be ...
virtual bool isTargetCanonicalSelect(SDNode *N) const
Return true if the given select/vselect should be considered canonical and not be transformed.
SDValue getCheaperNegatedExpression(SDValue Op, SelectionDAG &DAG, bool LegalOps, bool OptForSize, unsigned Depth=0) const
This is the helper function to return the newly negated expression only when the cost is cheaper.
virtual SDValue prepareVolatileOrAtomicLoad(SDValue Chain, const SDLoc &DL, SelectionDAG &DAG) const
This callback is used to prepare for a volatile or atomic load.
virtual SDValue emitStackGuardMixFP(SelectionDAG &DAG, SDValue Val, const SDLoc &DL) const
virtual SDValue lowerEHPadEntry(SDValue Chain, const SDLoc &DL, SelectionDAG &DAG) const
Optional target hook to add target-specific actions when entering EH pad blocks.
virtual ConstraintType getConstraintType(StringRef Constraint) const
Given a constraint, return the type of constraint it is for this target.
virtual SDValue unwrapAddress(SDValue N) const
virtual bool splitValueIntoRegisterParts(SelectionDAG &DAG, const SDLoc &DL, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, std::optional< CallingConv::ID > CC) const
Target-specific splitting of values into parts that fit a register storing a legal type.
virtual bool IsDesirableToPromoteOp(SDValue, EVT &) const
This method query the target whether it is beneficial for dag combiner to promote the specified node.
virtual SDValue joinRegisterPartsIntoValue(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, std::optional< CallingConv::ID > CC) const
Target-specific combining of register parts into its original value.
virtual void insertCopiesSplitCSR(MachineBasicBlock *Entry, const SmallVectorImpl< MachineBasicBlock * > &Exits) const
Insert explicit copies in entry and exit blocks.
virtual SDValue LowerCall(CallLoweringInfo &, SmallVectorImpl< SDValue > &) const
This hook must be implemented to lower calls into the specified DAG.
virtual bool isTypeDesirableForOp(unsigned, EVT VT) const
Return true if the target has native support for the specified value type and it is 'desirable' to us...
~TargetLowering() override
TargetLowering & operator=(const TargetLowering &)=delete
virtual bool isDesirableToPullExtFromShl(const MachineInstr &MI) const
GlobalISel - return true if it's profitable to perform the combine: shl ([sza]ext x),...
bool isPositionIndependent() const
std::pair< StringRef, TargetLowering::ConstraintType > ConstraintPair
virtual SDValue getNegatedExpression(SDValue Op, SelectionDAG &DAG, bool LegalOps, bool OptForSize, NegatibleCost &Cost, unsigned Depth=0) const
Return the newly negated expression if the cost is not expensive and set the cost in Cost to indicate...
virtual ConstraintWeight getSingleConstraintMatchWeight(AsmOperandInfo &info, const char *constraint) const
Examine constraint string and operand type and determine a weight value.
virtual bool isIndexingLegal(MachineInstr &MI, Register Base, Register Offset, bool IsPre, MachineRegisterInfo &MRI) const
Returns true if the specified base+offset is a legal indexed addressing mode for this target.
ConstraintGroup getConstraintPreferences(AsmOperandInfo &OpInfo) const
Given an OpInfo with list of constraints codes as strings, return a sorted Vector of pairs of constra...
virtual void initializeSplitCSR(MachineBasicBlock *Entry) const
Perform necessary initialization to handle a subset of CSRs explicitly via copies.
virtual bool isSDNodeSourceOfDivergence(const SDNode *N, FunctionLoweringInfo *FLI, UniformityInfo *UA) const
virtual SDValue getRecipEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled, int &RefinementSteps) const
Return a reciprocal estimate value for the input operand.
virtual std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const
Given a physical register constraint (e.g.
virtual bool isSDNodeAlwaysUniform(const SDNode *N) const
virtual bool isDesirableToCommuteXorWithShift(const SDNode *N) const
Return true if it is profitable to combine an XOR of a logical shift to create a logical shift of NOT...
TargetLowering(const TargetLowering &)=delete
virtual bool shouldSimplifyDemandedVectorElts(SDValue Op, const TargetLoweringOpt &TLO) const
Return true if the target supports simplifying demanded vector elements by converting them to undefs.
virtual SDValue LowerFormalArguments(SDValue, CallingConv::ID, bool, const SmallVectorImpl< ISD::InputArg > &, const SDLoc &, SelectionDAG &, SmallVectorImpl< SDValue > &) const
This hook must be implemented to lower the incoming (formal) arguments, described by the Ins array,...
virtual AsmOperandInfoVector ParseConstraints(const DataLayout &DL, const TargetRegisterInfo *TRI, const CallBase &Call) const
Split up the constraint string from the inline assembly value into the specific constraints and their...
virtual SDValue getSqrtResultForDenormInput(SDValue Operand, SelectionDAG &DAG) const
Return a target-dependent result if the input operand is not suitable for use with a square root esti...
virtual bool getPostIndexedAddressParts(SDNode *, SDNode *, SDValue &, SDValue &, ISD::MemIndexedMode &, SelectionDAG &) const
Returns true by value, base pointer and offset pointer and addressing mode by reference if this node ...
virtual bool shouldSplitFunctionArgumentsAsLittleEndian(const DataLayout &DL) const
For most targets, an LLVM type must be broken down into multiple smaller types.
virtual ArrayRef< MCPhysReg > getRoundingControlRegisters() const
Returns a 0 terminated array of rounding control registers that can be attached into strict FP call.
virtual SDValue LowerReturn(SDValue, CallingConv::ID, bool, const SmallVectorImpl< ISD::OutputArg > &, const SmallVectorImpl< SDValue > &, const SDLoc &, SelectionDAG &) const
This hook must be implemented to lower outgoing return values, described by the Outs array,...
virtual bool functionArgumentNeedsConsecutiveRegisters(Type *Ty, CallingConv::ID CallConv, bool isVarArg, const DataLayout &DL) const
For some targets, an LLVM struct type must be broken down into multiple simple types,...
virtual bool isDesirableToCommuteWithShift(const SDNode *N, CombineLevel Level) const
Return true if it is profitable to move this shift by a constant amount through its operand,...
virtual void ComputeConstraintToUse(AsmOperandInfo &OpInfo, SDValue Op, SelectionDAG *DAG=nullptr) const
Determines the constraint code and constraint type to use for the specific AsmOperandInfo,...
virtual SDValue visitMaskedStore(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, MachineMemOperand *MMO, SDValue Ptr, SDValue Val, SDValue Mask) const
virtual const MCExpr * LowerCustomJumpTableEntry(const MachineJumpTableInfo *, const MachineBasicBlock *, unsigned, MCContext &) const
virtual bool useTopologicalSorting() const
virtual bool useLoadStackGuardNode(const Module &M) const
If this function returns true, SelectionDAGBuilder emits a LOAD_STACK_GUARD node when it is lowering ...
std::pair< SDValue, SDValue > makeLibCall(SelectionDAG &DAG, RTLIB::Libcall LC, EVT RetVT, ArrayRef< SDValue > Ops, MakeLibCallOptions CallOptions, const SDLoc &dl, SDValue Chain=SDValue()) const
It is an error to pass RTLIB::UNKNOWN_LIBCALL as LC.
virtual FastISel * createFastISel(FunctionLoweringInfo &, const TargetLibraryInfo *, const LibcallLoweringInfo *) const
This method returns a target specific FastISel object, or null if the target does not support "fast" ...
virtual unsigned combineRepeatedFPDivisors() const
Indicate whether this target prefers to combine FDIVs with the same divisor.
virtual AndOrSETCCFoldKind isDesirableToCombineLogicOpOfSETCC(const SDNode *LogicOp, const SDNode *SETCC0, const SDNode *SETCC1) const
virtual void HandleByVal(CCState *, unsigned &, Align) const
Target-specific cleanup for formal ByVal parameters.
virtual const MCPhysReg * getScratchRegisters(CallingConv::ID CC) const
Returns a 0 terminated array of registers that can be safely used as scratch registers.
virtual bool getPreIndexedAddressParts(SDNode *, SDValue &, SDValue &, ISD::MemIndexedMode &, SelectionDAG &) const
Returns true by value, base pointer and offset pointer and addressing mode by reference if the node's...
SDValue getVectorElementPointer(SelectionDAG &DAG, SDValue VecPtr, EVT VecVT, SDValue Index, const SDNodeFlags PtrArithFlags=SDNodeFlags()) const
Get a pointer to vector element Idx located in memory for a vector of type VecVT starting at a base a...
std::pair< SDValue, SDValue > makeLibCall(SelectionDAG &DAG, RTLIB::LibcallImpl LibcallImpl, EVT RetVT, ArrayRef< SDValue > Ops, MakeLibCallOptions CallOptions, const SDLoc &dl, SDValue Chain=SDValue()) const
Returns a pair of (return value, chain).
virtual bool supportSplitCSR(MachineFunction *MF) const
Return true if the target supports that a subset of CSRs for the given machine function is handled ex...
virtual bool isReassocProfitable(MachineRegisterInfo &MRI, Register N0, Register N1) const
virtual bool mayBeEmittedAsTailCall(const CallInst *) const
Return true if the target may be able emit the call instruction as a tail call.
virtual bool isInlineAsmTargetBranch(const SmallVectorImpl< StringRef > &AsmStrs, unsigned OpNo) const
On x86, return true if the operand with index OpNo is a CALL or JUMP instruction, which can use eithe...
SDValue getInboundsVectorElementPointer(SelectionDAG &DAG, SDValue VecPtr, EVT VecVT, SDValue Index) const
Get a pointer to vector element Idx located in memory for a vector of type VecVT starting at a base a...
virtual MVT getJumpTableRegTy(const DataLayout &DL) const
virtual void markLibCallAttributes(MachineFunction *MF, unsigned CC, ArgListTy &Args) const
virtual bool CanLowerReturn(CallingConv::ID, MachineFunction &, bool, const SmallVectorImpl< ISD::OutputArg > &, LLVMContext &, const Type *RetTy) const
This hook should be implemented to check whether the return values described by the Outs array can fi...
virtual bool isXAndYEqZeroPreferableToXAndYEqY(ISD::CondCode, EVT) const
virtual bool isDesirableToTransformToIntegerOp(unsigned, EVT) const
Return true if it is profitable for dag combiner to transform a floating point op of specified opcode...
Primary interface to the complete machine description for the target machine.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
TargetSubtargetInfo - Generic base class for all target subtargets.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
Target - Wrapper for Target specific information.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:288
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:282
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
Definition Type.h:186
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:257
This is the common base class for vector predication intrinsics.
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
CallInst * Call
#define UINT64_MAX
Definition DataTypes.h:77
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:41
@ PARTIAL_REDUCE_SMLA
PARTIAL_REDUCE_[U|S]MLA(Accumulator, Input1, Input2) The partial reduction nodes sign or zero extend ...
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
Definition ISDOpcodes.h:275
@ SMULFIX
RESULT = [US]MULFIX(LHS, RHS, SCALE) - Perform fixed point multiplication on 2 integers with the same...
Definition ISDOpcodes.h:394
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:294
@ FMAD
FMAD - Perform a * b + c, while getting the same result as the separately rounded operations.
Definition ISDOpcodes.h:524
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:264
@ SMULFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition ISDOpcodes.h:400
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:863
@ PSEUDO_FMIN
PSEUDO_FMIN is strictly equivalent to op0 olt op1 ?
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:417
@ CLMUL
Carry-less multiplication operations.
Definition ISDOpcodes.h:780
@ SDIVFIX
RESULT = [US]DIVFIX(LHS, RHS, SCALE) - Perform fixed point division on 2 integers with the same width...
Definition ISDOpcodes.h:407
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:854
@ AVGCEILS
AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an integer of type i[N+2],...
Definition ISDOpcodes.h:717
@ PARTIAL_REDUCE_FMLA
@ BRIND
BRIND - Indirect branch.
@ BR_JT
BR_JT - Jumptable branch.
@ VECTOR_INTERLEAVE
VECTOR_INTERLEAVE(VEC1, VEC2, ...) - Returns N vectors from N input vectors, where N is the factor to...
Definition ISDOpcodes.h:637
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:374
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition ISDOpcodes.h:674
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition ISDOpcodes.h:348
@ MULHU
MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing an unsigned/signed value of...
Definition ISDOpcodes.h:706
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:771
@ FMINNUM_IEEE
FMINNUM_IEEE/FMAXNUM_IEEE - Perform floating-point minimumNumber or maximumNumber on two values,...
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:860
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum maximum on two values, following IEEE-754 definition...
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:729
@ SDIVFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition ISDOpcodes.h:413
@ STRICT_FP_TO_UINT
Definition ISDOpcodes.h:480
@ STRICT_FP_TO_SINT
STRICT_FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:479
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:936
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:741
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
Definition ISDOpcodes.h:712
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:304
@ SPLAT_VECTOR_PARTS
SPLAT_VECTOR_PARTS(SCALAR1, SCALAR2, ...) - Returns a vector with the scalar values joined together a...
Definition ISDOpcodes.h:683
@ PARTIAL_REDUCE_SUMLA
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:365
@ VECTOR_DEINTERLEAVE
VECTOR_DEINTERLEAVE(VEC1, VEC2, ...) - Returns N vectors from N input vectors, where N is the factor ...
Definition ISDOpcodes.h:626
@ FMINIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM - minimumnum/maximumnum that is same with FMINNUM_IEEE and FMAXNUM_IEEE besid...
@ ABDS
ABDS/ABDU - Absolute difference - Return the absolute difference between two numbers interpreted as s...
Definition ISDOpcodes.h:724
static const int LAST_LOADEXT_TYPE
MemIndexedMode
MemIndexedMode enum - This enum defines the load / store indexed addressing modes.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
@ System
Synchronized with respect to all concurrently executing threads.
Definition LLVMContext.h:58
This namespace contains all of the command line option processing machinery.
Definition MCSchedule.h:35
This is an optimization pass for GlobalISel generic memory operations.
GenericUniformityInfo< SSAContext > UniformityInfo
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
Definition Threading.h:280
@ Offset
Definition DWP.cpp:577
void fill(R &&Range, T &&Value)
Provide wrappers to std::fill which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1759
LLVM_ABI void GetReturnInfo(CallingConv::ID CC, Type *ReturnType, AttributeList attr, SmallVectorImpl< ISD::OutputArg > &Outs, const TargetLowering &TLI, const DataLayout &DL)
Given an LLVM IR type and return type attributes, compute the return value EVTs and flags,...
InstructionCost Cost
@ Known
Known to have no common set bits.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
bool isAligned(Align Lhs, uint64_t SizeInBytes)
Checks that SizeInBytes is a multiple of the alignment.
Definition Alignment.h:134
@ Load
The value being inserted comes from a load (InsertElement only).
@ Store
The extracted value is stored (ExtractElement only).
constexpr int popcount(T Value) noexcept
Count the number of set bits in a value.
Definition bit.h:156
unsigned Log2_64(uint64_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition MathExtras.h:332
LLVM_ABI bool isConstTrueVal(const TargetLowering &TLI, int64_t Val, bool IsVector, bool IsFP)
Returns true if given the TargetLowering's boolean contents information, the value Val contains a tru...
Definition Utils.cpp:1604
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:280
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:149
@ Default
-O2, -Os, -Oz
Definition CodeGen.h:152
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
AtomicOrdering
Atomic ordering for LLVM's memory model.
LLVM_ABI EVT getApproximateEVTForLLT(LLT Ty, LLVMContext &Ctx)
TargetTransformInfo TTI
CombineLevel
Definition DAGCombine.h:15
@ AfterLegalizeDAG
Definition DAGCombine.h:19
@ AfterLegalizeVectorOps
Definition DAGCombine.h:18
@ BeforeLegalizeTypes
Definition DAGCombine.h:16
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
@ Fast
Assign the register banks as fast as possible (default).
LLVM_ABI bool isInTailCallPosition(const CallBase &Call, const TargetMachine &TM, bool ReturnsFirstArg=false)
Test if the given instruction is in a position to be optimized with a tail-call.
Definition Analysis.cpp:539
DWARFExpression::Operation Op
LLVM_ABI bool isConstFalseVal(const TargetLowering &TLI, int64_t Val, bool IsVector, bool IsFP)
Definition Utils.cpp:1617
constexpr unsigned BitWidth
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1917
ExceptionHandling
Definition CodeGen.h:54
UndefPoisonKind
Enumeration to track whether we are interested in Undef, Poison, or both.
Definition UndefPoison.h:20
static cl::opt< unsigned > CostThreshold("dfa-cost-threshold", cl::desc("Maximum cost accepted for the transformation"), cl::Hidden, cl::init(50))
MCRegisterClass TargetRegisterClass
Definition FastISel.h:58
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:878
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77
Represent subnormal handling kind for floating point instruction inputs and outputs.
Extended Value Type.
Definition ValueTypes.h:35
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition ValueTypes.h:145
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition ValueTypes.h:70
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:323
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:155
bool isByteSized() const
Return true if the bit size is a multiple of 8.
Definition ValueTypes.h:266
static LLVM_ABI EVT getEVT(Type *Ty, bool HandleUnknown=false)
Return the value type corresponding to the specified type.
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:339
bool isFixedLengthVector() const
Definition ValueTypes.h:199
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:176
bool isExtended() const
Test if the given EVT is extended (as opposed to being simple).
Definition ValueTypes.h:150
bool isScalarInteger() const
Return true if this is an integer, but not a vector.
Definition ValueTypes.h:165
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:359
ConstraintInfo()=default
Default constructor.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:106
bool isDstAligned(Align AlignCheck) const
bool isFixedDstAlign() const
uint64_t size() const
static MemOp Set(uint64_t Size, bool DstAlignCanChange, Align DstAlign, bool IsZeroMemset, bool IsVolatile)
Align getDstAlign() const
bool isMemcpyStrSrc() const
bool isAligned(Align AlignCheck) const
static MemOp Copy(uint64_t Size, bool DstAlignCanChange, Align DstAlign, Align SrcAlign, bool IsVolatile, bool MemcpyStrSrc=false)
bool isSrcAligned(Align AlignCheck) const
bool isMemcpyOrMemmoveWithFixedDstAlign() const
bool isMemcpyOrMemmove() const
bool isMemmove() const
bool isMemset() const
bool isMemcpy() const
static MemOp Move(uint64_t Size, bool DstAlignCanChange, Align DstAlign, Align SrcAlign, bool IsVolatile)
bool isZeroMemset() const
bool isVolatile() const
Align getSrcAlign() const
A simple container for information about the supported runtime calls.
static StringRef getLibcallImplName(RTLIB::LibcallImpl CallImpl)
Get the libcall routine name for the specified libcall implementation.
These are IR-level optimization flags that may be propagated to SDNodes.
This represents an addressing mode of: BaseGV + BaseOffs + BaseReg + Scale*ScaleReg + ScalableOffset*...
std::optional< unsigned > fallbackAddressSpace
PointerUnion< const Value *, const PseudoSourceValue * > ptrVal
This contains information for each constraint that we are lowering.
AsmOperandInfo(InlineAsm::ConstraintInfo Info)
Copy constructor for copying from a ConstraintInfo.
MVT ConstraintVT
The ValueType for the operand value.
TargetLowering::ConstraintType ConstraintType
Information about the constraint code, e.g.
std::string ConstraintCode
This contains the actual string for the code, like "m".
Value * CallOperandVal
If this is the result output operand or a clobber, this is null, otherwise it is the incoming operand...
This structure contains all information that is necessary for lowering calls.
CallLoweringInfo & setConvergent(bool Value=true)
CallLoweringInfo & setIsPostTypeLegalization(bool Value=true)
CallLoweringInfo & setDeactivationSymbol(GlobalValue *Sym)
CallLoweringInfo & setCallee(Type *ResultType, FunctionType *FTy, SDValue Target, ArgListTy &&ArgsList, const CallBase &Call)
CallLoweringInfo & setCFIType(const ConstantInt *Type)
CallLoweringInfo & setInRegister(bool Value=true)
CallLoweringInfo & setLibCallee(CallingConv::ID CC, Type *ResultType, SDValue Target, ArgListTy &&ArgsList)
SmallVector< ISD::InputArg, 32 > Ins
CallLoweringInfo & setVarArg(bool Value=true)
Type * OrigRetTy
Original unlegalized return type.
std::optional< PtrAuthInfo > PAI
CallLoweringInfo & setDiscardResult(bool Value=true)
CallLoweringInfo & setZExtResult(bool Value=true)
CallLoweringInfo & setIsPatchPoint(bool Value=true)
CallLoweringInfo & setDebugLoc(const SDLoc &dl)
CallLoweringInfo & setLibCallee(CallingConv::ID CC, Type *ResultType, Type *OrigResultType, SDValue Target, ArgListTy &&ArgsList)
CallLoweringInfo & setTailCall(bool Value=true)
CallLoweringInfo & setIsPreallocated(bool Value=true)
CallLoweringInfo & setSExtResult(bool Value=true)
CallLoweringInfo & setNoReturn(bool Value=true)
CallLoweringInfo & setConvergenceControlToken(SDValue Token)
SmallVector< ISD::OutputArg, 32 > Outs
Type * RetTy
Same as OrigRetTy, or partially legalized for soft float libcalls.
CallLoweringInfo & setChain(SDValue InChain)
CallLoweringInfo & setPtrAuth(PtrAuthInfo Value)
CallLoweringInfo & setCallee(CallingConv::ID CC, Type *ResultType, SDValue Target, ArgListTy &&ArgsList, AttributeSet ResultAttrs={})
DAGCombinerInfo(SelectionDAG &dag, CombineLevel level, bool cl, void *dc)
This structure is used to pass arguments to makeLibCall function.
MakeLibCallOptions & setIsPostTypeLegalization(bool Value=true)
MakeLibCallOptions & setDiscardResult(bool Value=true)
MakeLibCallOptions & setTypeListBeforeSoften(ArrayRef< EVT > OpsVT, EVT RetVT)
MakeLibCallOptions & setIsSigned(bool Value=true)
MakeLibCallOptions & setNoReturn(bool Value=true)
MakeLibCallOptions & setOpsTypeOverrides(ArrayRef< Type * > OpsTypes)
Override the argument type for an operand.
This structure contains the information necessary for lowering pointer-authenticating indirect calls.
A convenience struct that encapsulates a DAG, and two SDValues for returning information from TargetL...
TargetLoweringOpt(SelectionDAG &InDAG, bool LT, bool LO)