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