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