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