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