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