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