LLVM 24.0.0git
TargetTransformInfo.h
Go to the documentation of this file.
1//===- TargetTransformInfo.h ------------------------------------*- 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/// \file
9/// This pass exposes codegen information to IR-level passes. Every
10/// transformation that uses codegen information is broken into three parts:
11/// 1. The IR-level analysis pass.
12/// 2. The IR-level transformation interface which provides the needed
13/// information.
14/// 3. Codegen-level implementation which uses target-specific hooks.
15///
16/// This file defines #2, which is the interface that IR-level transformations
17/// use for querying the codegen.
18///
19//===----------------------------------------------------------------------===//
20
21#ifndef LLVM_ANALYSIS_TARGETTRANSFORMINFO_H
22#define LLVM_ANALYSIS_TARGETTRANSFORMINFO_H
23
24#include "llvm/ADT/APInt.h"
25#include "llvm/ADT/ArrayRef.h"
28#include "llvm/ADT/Uniformity.h"
31#include "llvm/IR/FMF.h"
32#include "llvm/IR/InstrTypes.h"
33#include "llvm/IR/PassManager.h"
34#include "llvm/Pass.h"
39#include <functional>
40#include <optional>
41#include <utility>
42
43namespace llvm {
44
45namespace Intrinsic {
46typedef unsigned ID;
47}
48
49class AllocaInst;
50class AssumptionCache;
52class DominatorTree;
53class CondBrInst;
54class Function;
55class GlobalValue;
56class InstCombiner;
59class ICmpInst;
60class IntrinsicInst;
61class LoadInst;
62class Loop;
63class LoopInfo;
67class SCEV;
68class ScalarEvolution;
69class SmallBitVector;
70class StoreInst;
71class SwitchInst;
73class Type;
74class VPIntrinsic;
75struct KnownBits;
76
77/// Information about a load/store intrinsic defined by the target.
79 /// This is the pointer that the intrinsic is loading from or storing to.
80 /// If this is non-null, then analysis/optimization passes can assume that
81 /// this intrinsic is functionally equivalent to a load/store from this
82 /// pointer.
83 Value *PtrVal = nullptr;
84
85 // Ordering for atomic operations.
87
88 // Same Id is set by the target for corresponding load/store intrinsics.
89 unsigned short MatchingId = 0;
90
91 bool ReadMem = false;
92 bool WriteMem = false;
93 bool IsVolatile = false;
94
96
97 bool isUnordered() const {
100 !IsVolatile;
101 }
102};
103
104/// Attributes of a target dependent hardware loop.
108 Loop *L = nullptr;
111 const SCEV *ExitCount = nullptr;
113 Value *LoopDecrement = nullptr; // Decrement the loop counter by this
114 // value in every iteration.
115 bool IsNestingLegal = false; // Can a hardware loop be a parent to
116 // another hardware loop?
117 bool CounterInReg = false; // Should loop counter be updated in
118 // the loop via a phi?
119 bool PerformEntryTest = false; // Generate the intrinsic which also performs
120 // icmp ne zero on the loop counter value and
121 // produces an i1 to guard the loop entry.
123 DominatorTree &DT,
124 bool ForceNestedLoop = false,
125 bool ForceHardwareLoopPHI = false);
126 LLVM_ABI bool canAnalyze(LoopInfo &LI);
127};
128
129/// Information for memory intrinsic cost model.
131 /// Optional context instruction, if one exists, e.g. the
132 /// load/store to transform to the intrinsic.
133 const Instruction *I = nullptr;
134
135 /// Address in memory.
136 const Value *Ptr = nullptr;
137
138 /// Vector type of the data to be loaded or stored.
139 Type *DataTy = nullptr;
140
141 /// ID of the memory intrinsic.
142 Intrinsic::ID IID;
143
144 /// True when the memory access is predicated with a mask
145 /// that is not a compile-time constant.
146 bool VariableMask = true;
147
148 /// Address space of the pointer.
149 unsigned AddressSpace = 0;
150
151 /// Alignment of single element.
152 Align Alignment;
153
154 const Value *StrideVal;
155
156public:
158 bool VariableMask, Align Alignment,
159 const Instruction *I = nullptr,
160 const Value *StrideVal = nullptr)
161
162 : I(I), Ptr(Ptr), DataTy(DataTy), IID(Id), VariableMask(VariableMask),
163 Alignment(Alignment), StrideVal(StrideVal) {}
164
166 unsigned AddressSpace = 0,
167 const Value *StrideVal = nullptr)
168 : DataTy(DataTy), IID(Id), AddressSpace(AddressSpace),
169 Alignment(Alignment), StrideVal(StrideVal) {}
170
171 MemIntrinsicCostAttributes(Intrinsic::ID Id, Type *DataTy, bool VariableMask,
172 Align Alignment, const Instruction *I = nullptr,
173 const Value *StrideVal = nullptr)
174
175 : I(I), DataTy(DataTy), IID(Id), VariableMask(VariableMask),
176 Alignment(Alignment), StrideVal(StrideVal) {}
177
178 Intrinsic::ID getID() const { return IID; }
179 const Instruction *getInst() const { return I; }
180 const Value *getPointer() const { return Ptr; }
181 Type *getDataType() const { return DataTy; }
182 bool getVariableMask() const { return VariableMask; }
183 unsigned getAddressSpace() const { return AddressSpace; }
184 Align getAlignment() const { return Alignment; }
185 const Value *getStrideVal() const { return StrideVal; }
186};
187
188/// Represents a hint about the context in which a vector instruction or
189/// intrinsic is used.
190///
191/// On some targets, inserts/extracts can cheaply be folded into loads/stores.
192/// Similarly, vp.merge can also be folded into binary ops on some targets.
193///
194/// This enum allows the vectorizer to give getVectorInstrCost and
195/// getIntrinsicInstrCost an idea of how the values are used.
196///
197/// See \c getVectorInstrContextHint to compute a VectorInstrContext from an
198/// insert/extract Instruction*.
200 None, ///< The instruction is not folded.
201 Load, ///< The value being inserted comes from a load (InsertElement only).
202 Store, ///< The extracted value is stored (ExtractElement only).
203 BinaryOp, ///< One of the operands is a binary op.
204 SplatOpFolded, ///< All of the value's users support splatting the value.
205};
206
208 const IntrinsicInst *II = nullptr;
209 Type *RetTy = nullptr;
210 Intrinsic::ID IID;
211 SmallVector<Type *, 4> ParamTys;
213 FastMathFlags FMF;
214 // If ScalarizationCost is UINT_MAX, the cost of scalarizing the
215 // arguments and the return value will be computed based on types.
216 InstructionCost ScalarizationCost = InstructionCost::getInvalid();
218
219public:
221 Intrinsic::ID Id, const CallBase &CI,
223 bool TypeBasedOnly = false);
224
226 Intrinsic::ID Id, Type *RTy, ArrayRef<Type *> Tys,
227 FastMathFlags Flags = FastMathFlags(), const IntrinsicInst *I = nullptr,
229
232
236 const IntrinsicInst *I = nullptr,
239
240 Intrinsic::ID getID() const { return IID; }
241 const IntrinsicInst *getInst() const { return II; }
242 Type *getReturnType() const { return RetTy; }
243 FastMathFlags getFlags() const { return FMF; }
244 InstructionCost getScalarizationCost() const { return ScalarizationCost; }
246 const SmallVectorImpl<const Value *> &getArgs() const { return Arguments; }
247 const SmallVectorImpl<Type *> &getArgTypes() const { return ParamTys; }
248
249 bool isTypeBasedOnly() const {
250 return Arguments.empty();
251 }
252
253 bool skipScalarizationCost() const { return ScalarizationCost.isValid(); }
254};
255
257 /// Don't use tail folding
259 /// Use predicate only to mask operations on data in the loop.
260 /// When the VL is not known to be a power-of-2, this method requires a
261 /// runtime overflow check for the i + VL in the loop because it compares the
262 /// scalar induction variable against the tripcount rounded up by VL which may
263 /// overflow. When the VL is a power-of-2, both the increment and uprounded
264 /// tripcount will overflow to 0, which does not require a runtime check
265 /// since the loop is exited when the loop induction variable equals the
266 /// uprounded trip-count, which are both 0.
268 /// Same as Data, but avoids using the get.active.lane.mask intrinsic to
269 /// calculate the mask and instead implements this with a
270 /// splat/stepvector/cmp.
271 /// FIXME: Can this kind be removed now that SelectionDAGBuilder expands the
272 /// active.lane.mask intrinsic when it is not natively supported?
274 /// Use predicate to control both data and control flow.
275 /// This method always requires a runtime overflow check for the i + VL
276 /// increment inside the loop, because it uses the result direclty in the
277 /// active.lane.mask to calculate the mask for the next iteration. If the
278 /// increment overflows, the mask is no longer correct.
280 /// Use predicated EVL instructions for tail-folding.
281 /// Indicates that VP intrinsics should be used.
283};
284
293
294class TargetTransformInfo;
297
298/// This pass provides access to the codegen interfaces that are needed
299/// for IR-level transformations.
301public:
308
309 /// Get the kind of extension that an instruction represents.
312 /// Get the kind of extension that a cast opcode represents.
315 /// Get the cast opcode for an extension kind.
318
319 /// Construct a TTI object using a type implementing the \c Concept
320 /// API below.
321 ///
322 /// This is used by targets to construct a TTI wrapping their target-specific
323 /// implementation that encodes appropriate costs for their target.
325 std::unique_ptr<const TargetTransformInfoImplBase> Impl);
326
327 /// Construct a baseline TTI object using a minimal implementation of
328 /// the \c Concept API below.
329 ///
330 /// The TTI implementation will reflect the information in the DataLayout
331 /// provided if non-null.
332 LLVM_ABI explicit TargetTransformInfo(const DataLayout &DL);
333
334 // Provide move semantics.
337
338 // We need to define the destructor out-of-line to define our sub-classes
339 // out-of-line.
341
342 /// Handle the invalidation of this information.
343 ///
344 /// When used as a result of \c TargetIRAnalysis this method will be called
345 /// when the function this was computed for changes. When it returns false,
346 /// the information is preserved across those changes.
348 FunctionAnalysisManager::Invalidator &) {
349 // FIXME: We should probably in some way ensure that the subtarget
350 // information for a function hasn't changed.
351 return false;
352 }
353
354 /// \name Generic Target Information
355 /// @{
356
357 /// The kind of cost model.
358 ///
359 /// There are several different cost models that can be customized by the
360 /// target. The normalization of each cost model may be target specific.
361 /// e.g. TCK_SizeAndLatency should be comparable to target thresholds such as
362 /// those derived from MCSchedModel::LoopMicroOpBufferSize etc.
364 TCK_RecipThroughput, ///< Reciprocal throughput.
365 TCK_Latency, ///< The latency of instruction.
366 TCK_CodeSize, ///< Instruction code size.
367 TCK_SizeAndLatency ///< The weighted sum of size and latency.
368 };
369
370 /// Underlying constants for 'cost' values in this interface.
371 ///
372 /// Many APIs in this interface return a cost. This enum defines the
373 /// fundamental values that should be used to interpret (and produce) those
374 /// costs. The costs are returned as an int rather than a member of this
375 /// enumeration because it is expected that the cost of one IR instruction
376 /// may have a multiplicative factor to it or otherwise won't fit directly
377 /// into the enum. Moreover, it is common to sum or average costs which works
378 /// better as simple integral values. Thus this enum only provides constants.
379 /// Also note that the returned costs are signed integers to make it natural
380 /// to add, subtract, and test with zero (a common boundary condition). It is
381 /// not expected that 2^32 is a realistic cost to be modeling at any point.
382 ///
383 /// Note that these costs should usually reflect the intersection of code-size
384 /// cost and execution cost. A free instruction is typically one that folds
385 /// into another instruction. For example, reg-to-reg moves can often be
386 /// skipped by renaming the registers in the CPU, but they still are encoded
387 /// and thus wouldn't be considered 'free' here.
389 TCC_Free = 0, ///< Expected to fold away in lowering.
390 TCC_Basic = 1, ///< The cost of a typical 'add' instruction.
391 TCC_Expensive = 4 ///< The cost of a 'div' instruction on x86.
392 };
393
394 /// Estimate the cost of a GEP operation when lowered.
395 ///
396 /// \p PointeeType is the source element type of the GEP.
397 /// \p Ptr is the base pointer operand.
398 /// \p Operands is the list of indices following the base pointer.
399 ///
400 /// \p AccessType is a hint as to what type of memory might be accessed by
401 /// users of the GEP. getGEPCost will use it to determine if the GEP can be
402 /// folded into the addressing mode of a load/store. If AccessType is null,
403 /// then the resulting target type based off of PointeeType will be used as an
404 /// approximation.
405 LLVM_ABI InstructionCost getGEPCost(Type *PointeeType, const Value *Ptr,
407 TargetCostKind CostKind,
408 Type *AccessType = nullptr) const;
409
410 /// Describe known properties for a set of pointers.
412 /// All the GEPs in a set have same base address.
413 unsigned IsSameBaseAddress : 1;
414 /// These properties only valid if SameBaseAddress is set.
415 /// True if all pointers are separated by a unit stride.
416 unsigned IsUnitStride : 1;
417 /// True if distance between any two neigbouring pointers is a known value.
418 unsigned IsKnownStride : 1;
419 unsigned Reserved : 29;
420
421 bool isSameBase() const { return IsSameBaseAddress; }
422 bool isUnitStride() const { return IsSameBaseAddress && IsUnitStride; }
424
426 return {/*IsSameBaseAddress=*/1, /*IsUnitStride=*/1,
427 /*IsKnownStride=*/1, 0};
428 }
430 return {/*IsSameBaseAddress=*/1, /*IsUnitStride=*/0,
431 /*IsKnownStride=*/1, 0};
432 }
434 return {/*IsSameBaseAddress=*/1, /*IsUnitStride=*/0,
435 /*IsKnownStride=*/0, 0};
436 }
437 };
438 static_assert(sizeof(PointersChainInfo) == 4, "Was size increase justified?");
439
440 /// Estimate the cost of a chain of pointers (typically pointer operands of a
441 /// chain of loads or stores within same block) operations set when lowered.
442 /// \p AccessTy is the type of the loads/stores that will ultimately use the
443 /// \p Ptrs.
446 const PointersChainInfo &Info, Type *AccessTy,
447 const TargetCostKind CostKind) const;
448
449 /// \returns A value by which our inlining threshold should be multiplied.
450 /// This is primarily used to bump up the inlining threshold wholesale on
451 /// targets where calls are unusually expensive.
452 ///
453 /// TODO: This is a rather blunt instrument. Perhaps altering the costs of
454 /// individual classes of instructions would be better.
456
459
460 /// \returns The bonus of inlining the last call to a static function.
462
463 /// \returns A value to be added to the inlining threshold.
464 LLVM_ABI unsigned adjustInliningThreshold(const CallBase *CB) const;
465
466 /// \returns The cost of having an Alloca in the caller if not inlined, to be
467 /// added to the threshold
468 LLVM_ABI unsigned getCallerAllocaCost(const CallBase *CB,
469 const AllocaInst *AI) const;
470
471 /// \returns Vector bonus in percent.
472 ///
473 /// Vector bonuses: We want to more aggressively inline vector-dense kernels
474 /// and apply this bonus based on the percentage of vector instructions. A
475 /// bonus is applied if the vector instructions exceed 50% and half that
476 /// amount is applied if it exceeds 10%. Note that these bonuses are some what
477 /// arbitrary and evolved over time by accident as much as because they are
478 /// principled bonuses.
479 /// FIXME: It would be nice to base the bonus values on something more
480 /// scientific. A target may has no bonus on vector instructions.
482
483 /// \return the expected cost of a memcpy, which could e.g. depend on the
484 /// source/destination type and alignment and the number of bytes copied.
486
487 /// Returns the maximum memset / memcpy size in bytes that still makes it
488 /// profitable to inline the call.
490
491 /// Returns the maximum length in bytes for which a memset with a
492 /// non-constant length, known to be bounded by that value, is preferably
493 /// expanded inline instead of calling the library. Zero disables the
494 /// expansion.
496
497 /// \return The estimated number of case clusters when lowering \p 'SI'.
498 /// \p JTSize Set a jump table size only when \p SI is suitable for a jump
499 /// table.
500 LLVM_ABI unsigned
501 getEstimatedNumberOfCaseClusters(const SwitchInst &SI, unsigned &JTSize,
503 BlockFrequencyInfo *BFI) const;
504
505 /// Estimate the cost of a given IR user when lowered.
506 ///
507 /// This can estimate the cost of either a ConstantExpr or Instruction when
508 /// lowered.
509 ///
510 /// \p Operands is a list of operands which can be a result of transformations
511 /// of the current operands. The number of the operands on the list must equal
512 /// to the number of the current operands the IR user has. Their order on the
513 /// list must be the same as the order of the current operands the IR user
514 /// has.
515 ///
516 /// The returned cost is defined in terms of \c TargetCostConstants, see its
517 /// comments for a detailed explanation of the cost values.
520 TargetCostKind CostKind) const;
521
522 /// This is a helper function which calls the three-argument
523 /// getInstructionCost with \p Operands which are the current operands U has.
525 TargetCostKind CostKind) const {
526 SmallVector<const Value *, 4> Operands(U->operand_values());
527 return getInstructionCost(U, Operands, CostKind);
528 }
529
530 /// If a branch or a select condition is skewed in one direction by more than
531 /// this factor, it is very likely to be predicted correctly.
533
534 /// Returns estimated penalty of a branch misprediction in latency. Indicates
535 /// how aggressive the target wants for eliminating unpredictable branches. A
536 /// zero return value means extra optimization applied to them should be
537 /// minimal.
539
540 /// Return true if branch divergence exists.
541 ///
542 /// Branch divergence has a significantly negative impact on GPU performance
543 /// when threads in the same wavefront take different paths due to conditional
544 /// branches.
545 ///
546 /// If \p F is passed, provides a context function. If \p F is known to only
547 /// execute in a single threaded environment, the target may choose to skip
548 /// uniformity analysis and assume all values are uniform.
549 LLVM_ABI bool hasBranchDivergence(const Function *F = nullptr) const;
550
551 /// Get target-specific uniformity information for a value.
552 /// This allows targets to provide more fine-grained control over
553 /// uniformity analysis by specifying whether specific values
554 /// should always or never be considered uniform, or require custom
555 /// operand-based analysis.
556 /// \param V The value to query for uniformity information.
557 /// \return ValueUniformity.
559
560 /// Query the target whether the specified address space cast from FromAS to
561 /// ToAS is valid.
562 LLVM_ABI bool isValidAddrSpaceCast(unsigned FromAS, unsigned ToAS) const;
563
564 /// Return false if a \p AS0 address cannot possibly alias a \p AS1 address.
565 LLVM_ABI bool addrspacesMayAlias(unsigned AS0, unsigned AS1) const;
566
567 /// Returns the address space ID for a target's 'flat' address space. Note
568 /// this is not necessarily the same as addrspace(0), which LLVM sometimes
569 /// refers to as the generic address space. The flat address space is a
570 /// generic address space that can be used access multiple segments of memory
571 /// with different address spaces. Access of a memory location through a
572 /// pointer with this address space is expected to be legal but slower
573 /// compared to the same memory location accessed through a pointer with a
574 /// different address space.
575 //
576 /// This is for targets with different pointer representations which can
577 /// be converted with the addrspacecast instruction. If a pointer is converted
578 /// to this address space, optimizations should attempt to replace the access
579 /// with the source address space.
580 ///
581 /// \returns ~0u if the target does not have such a flat address space to
582 /// optimize away.
583 LLVM_ABI unsigned getFlatAddressSpace() const;
584
585 /// Return the most specific common address space containing AS1 and AS2.
586 /// AS1 and AS2 must be distinct, and pointers from both spaces must be
587 /// convertible to the target's flat address space with addrspacecast.
588 /// Pointers from either input space must be convertible to the result with
589 /// addrspacecast. Return getFlatAddressSpace() if no more specific common
590 /// address space is available.
591 LLVM_ABI unsigned getAddressSpaceJoin(unsigned AS1, unsigned AS2) const;
592
593 /// Return any intrinsic address operand indexes which may be rewritten if
594 /// they use a flat address space pointer.
595 ///
596 /// \returns true if the intrinsic was handled.
598 Intrinsic::ID IID) const;
599
600 LLVM_ABI bool isNoopAddrSpaceCast(unsigned FromAS, unsigned ToAS) const;
601
602 // Given an address space cast of the given pointer value, calculate the known
603 // bits of the source pointer in the source addrspace and the destination
604 // pointer in the destination addrspace.
605 LLVM_ABI std::pair<KnownBits, KnownBits>
606 computeKnownBitsAddrSpaceCast(unsigned ToAS, const Value &PtrOp) const;
607
608 // Given an address space cast, calculate the known bits of the resulting ptr
609 // in the destination addrspace using the known bits of the source pointer in
610 // the source addrspace.
612 unsigned FromAS, unsigned ToAS, const KnownBits &FromPtrBits) const;
613
614 /// Returns a mask indicating which bits of a pointer remain unchanged when
615 /// casting between address spaces. The returned APInt has the same bit width
616 /// as the source address space pointer size.
617 ///
618 /// Some targets allow certain bits of a pointer to change (e.g., the low
619 /// bits within a page) while still preserving the address space. This mask
620 /// identifies those bits that are guaranteed to be preserved. If the mask is
621 /// all zeros, no bits are preserved and address space inference cannot be
622 /// performed safely.
623 ///
624 /// For example, given:
625 /// %gp = addrspacecast ptr addrspace(2) %sp to ptr
626 /// %a = ptrtoint ptr %gp to i64
627 /// %b = xor i64 7, %a
628 /// %gp2 = inttoptr i64 %b to ptr
629 /// store i16 0, ptr %gp2, align 2
630 /// if the target preserves the upper bits, `%gp2` can be safely replaced
631 /// with `inttoptr i64 %b to ptr addrspace(2)`.
633 unsigned DstAS) const;
634
635 /// Return true if globals in this address space can have initializers other
636 /// than `undef`.
637 LLVM_ABI bool
639
640 LLVM_ABI unsigned getAssumedAddrSpace(const Value *V) const;
641
642 LLVM_ABI std::pair<const Value *, unsigned>
643 getPredicatedAddrSpace(const Value *V) const;
644
645 /// Rewrite intrinsic call \p II such that \p OldV will be replaced with \p
646 /// NewV, which has a different address space. This should happen for every
647 /// operand index that collectFlatAddressOperands returned for the intrinsic.
648 /// \returns nullptr if the intrinsic was not handled. Otherwise, returns the
649 /// new value (which may be the original \p II with modified operands).
650 /// If a different value is returned, the caller replaces all uses of \p II
651 /// and erases it, including any side effects of the original call.
653 Value *OldV,
654 Value *NewV) const;
655
656 /// Test whether calls to a function lower to actual program function
657 /// calls.
658 ///
659 /// The idea is to test whether the program is likely to require a 'call'
660 /// instruction or equivalent in order to call the given function.
661 ///
662 /// FIXME: It's not clear that this is a good or useful query API. Client's
663 /// should probably move to simpler cost metrics using the above.
664 /// Alternatively, we could split the cost interface into distinct code-size
665 /// and execution-speed costs. This would allow modelling the core of this
666 /// query more accurately as a call is a single small instruction, but
667 /// incurs significant execution cost.
668 LLVM_ABI bool isLoweredToCall(const Function *F) const;
669
670 struct LSRCost {
671 /// TODO: Some of these could be merged. Also, a lexical ordering
672 /// isn't always optimal.
673 unsigned Insns;
674 unsigned NumRegs;
675 unsigned AddRecCost;
676 unsigned NumIVMuls;
677 unsigned NumBaseAdds;
678 unsigned ImmCost;
679 unsigned SetupCost;
680 unsigned ScaleCost;
682 };
683
684 /// Parameters that control the generic loop unrolling transformation.
686 /// The cost threshold for the unrolled loop. Should be relative to the
687 /// getInstructionCost values returned by this API, and the expectation is
688 /// that the unrolled loop's instructions when run through that interface
689 /// should not exceed this cost. However, this is only an estimate. Also,
690 /// specific loops may be unrolled even with a cost above this threshold if
691 /// deemed profitable. Set this to UINT_MAX to disable the loop body cost
692 /// restriction.
693 unsigned Threshold;
694 /// If complete unrolling will reduce the cost of the loop, we will boost
695 /// the Threshold by a certain percent to allow more aggressive complete
696 /// unrolling. This value provides the maximum boost percentage that we
697 /// can apply to Threshold (The value should be no less than 100).
698 /// BoostedThreshold = Threshold * min(RolledCost / UnrolledCost,
699 /// MaxPercentThresholdBoost / 100)
700 /// E.g. if complete unrolling reduces the loop execution time by 50%
701 /// then we boost the threshold by the factor of 2x. If unrolling is not
702 /// expected to reduce the running time, then we do not increase the
703 /// threshold.
705 /// The cost threshold for the unrolled loop when optimizing for size (set
706 /// to UINT_MAX to disable).
708 /// The cost threshold for the unrolled loop, like Threshold, but used
709 /// for partial/runtime unrolling (set to UINT_MAX to disable).
711 /// The cost threshold for the unrolled loop when optimizing for size, like
712 /// OptSizeThreshold, but used for partial/runtime unrolling (set to
713 /// UINT_MAX to disable).
715 /// Default unroll count for loops with run-time trip count.
717 // Set the maximum unrolling factor. The unrolling factor may be selected
718 // using the appropriate cost threshold, but may not exceed this number
719 // (set to UINT_MAX to disable). This does not apply in cases where the
720 // loop is being fully unrolled.
721 unsigned MaxCount;
722 /// Set the maximum upper bound of trip count. Allowing the MaxUpperBound
723 /// to be overrided by a target gives more flexiblity on certain cases.
724 /// By default, MaxUpperBound uses UnrollMaxUpperBound which value is 8.
726 /// Set the maximum unrolling factor for full unrolling. Like MaxCount, but
727 /// applies even if full unrolling is selected. This allows a target to fall
728 /// back to Partial unrolling if full unrolling is above FullUnrollMaxCount.
730 // Represents number of instructions optimized when "back edge"
731 // becomes "fall through" in unrolled loop.
732 // For now we count a conditional branch on a backedge and a comparison
733 // feeding it.
734 unsigned BEInsns;
735 /// Allow partial unrolling (unrolling of loops to expand the size of the
736 /// loop body, not only to eliminate small constant-trip-count loops).
738 /// Allow runtime unrolling (unrolling of loops to expand the size of the
739 /// loop body even when the number of loop iterations is not known at
740 /// compile time).
742 /// Allow generation of a loop remainder (extra iterations after unroll).
744 /// Allow emitting expensive instructions (such as divisions) when computing
745 /// the trip count of a loop for runtime unrolling.
747 /// Apply loop unroll on any kind of loop
748 /// (mainly to loops that fail runtime unrolling).
749 bool Force;
750 /// Allow using trip count upper bound to unroll loops.
752 /// Allow unrolling of all the iterations of the runtime loop remainder.
754 /// Allow unroll and jam. Used to enable unroll and jam for the target.
756 /// Threshold for unroll and jam, for inner loop size. The 'Threshold'
757 /// value above is used during unroll and jam for the outer loop size.
758 /// This value is used in the same manner to limit the size of the inner
759 /// loop.
761 /// Don't allow loop unrolling to simulate more than this number of
762 /// iterations when checking full unroll profitability
764 /// Disable runtime unrolling by default for vectorized loops.
766 /// Don't allow runtime unrolling if expanding the trip count takes more
767 /// than SCEVExpansionBudget.
769 /// Allow runtime unrolling multi-exit loops. Should only be set if the
770 /// target determined that multi-exit unrolling is profitable for the loop.
771 /// Fall back to the generic logic to determine whether multi-exit unrolling
772 /// is profitable if set to false.
774 /// Allow unrolling to add parallel reduction phis.
776 };
777
778 /// Get target-customized preferences for the generic loop unrolling
779 /// transformation. The caller will initialize UP with the current
780 /// target-independent defaults.
783 OptimizationRemarkEmitter *ORE) const;
784
785 /// Query the target whether it would be profitable to convert the given loop
786 /// into a hardware loop.
788 AssumptionCache &AC,
789 TargetLibraryInfo *LibInfo,
790 HardwareLoopInfo &HWLoopInfo) const;
791
792 // Query the target for which minimum vectorization factor epilogue
793 // vectorization should be considered.
795
796 /// Query the target whether it would be preferred to create a tail-folded
797 /// vector loop, which can avoid the need to emit a scalar epilogue loop.
799
800 /// Query the target what the preferred style of tail folding is.
802
803 // Parameters that control the loop peeling transformation
805 /// A forced peeling factor (the number of bodied of the original loop
806 /// that should be peeled off before the loop body). When set to 0, the
807 /// a peeling factor based on profile information and other factors.
808 unsigned PeelCount;
809 /// Allow peeling off loop iterations.
811 /// Allow peeling off loop iterations for loop nests.
813 /// Allow peeling basing on profile. Uses to enable peeling off all
814 /// iterations basing on provided profile.
815 /// If the value is true the peeling cost model can decide to peel only
816 /// some iterations and in this case it will set this to false.
818
819 /// Peel off the last PeelCount loop iterations.
821 };
822
823 /// Get target-customized preferences for the generic loop peeling
824 /// transformation. The caller will initialize \p PP with the current
825 /// target-independent defaults with information from \p L and \p SE.
827 PeelingPreferences &PP) const;
828
829 /// Targets can implement their own combinations for target-specific
830 /// intrinsics. This function will be called from the InstCombine pass every
831 /// time a target-specific intrinsic is encountered.
832 ///
833 /// \returns std::nullopt to not do anything target specific or a value that
834 /// will be returned from the InstCombiner. It is possible to return null and
835 /// stop further processing of the intrinsic by returning nullptr.
836 LLVM_ABI std::optional<Instruction *>
838 /// Can be used to implement target-specific instruction combining.
839 /// \see instCombineIntrinsic
840 LLVM_ABI std::optional<Value *>
842 APInt DemandedMask, KnownBits &Known,
843 bool &KnownBitsComputed) const;
844 /// Can be used to implement target-specific instruction combining.
845 /// \see instCombineIntrinsic
846 LLVM_ABI std::optional<Value *> simplifyDemandedVectorEltsIntrinsic(
847 InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
848 APInt &UndefElts2, APInt &UndefElts3,
849 std::function<void(Instruction *, unsigned, APInt, APInt &)>
850 SimplifyAndSetOp) const;
851 /// @}
852
853 /// \name Scalar Target Information
854 /// @{
855
856 /// Flags indicating the kind of support for population count.
857 ///
858 /// Compared to the SW implementation, HW support is supposed to
859 /// significantly boost the performance when the population is dense, and it
860 /// may or may not degrade performance if the population is sparse. A HW
861 /// support is considered as "Fast" if it can outperform, or is on a par
862 /// with, SW implementation when the population is sparse; otherwise, it is
863 /// considered as "Slow".
865
866 /// Return true if the specified immediate is legal add immediate, that
867 /// is the target has add instructions which can add a register with the
868 /// immediate without having to materialize the immediate into a register.
869 LLVM_ABI bool isLegalAddImmediate(int64_t Imm) const;
870
871 /// Return true if adding the specified scalable immediate is legal, that is
872 /// the target has add instructions which can add a register with the
873 /// immediate (multiplied by vscale) without having to materialize the
874 /// immediate into a register.
875 LLVM_ABI bool isLegalAddScalableImmediate(int64_t Imm) const;
876
877 /// Return true if the specified immediate is legal icmp immediate,
878 /// that is the target has icmp instructions which can compare a register
879 /// against the immediate without having to materialize the immediate into a
880 /// register.
881 LLVM_ABI bool isLegalICmpImmediate(int64_t Imm) const;
882
883 /// Return true if replacing the relational loop exit comparison \p Cond
884 /// with an equality comparison against \p PostIncExitValue is profitable.
885 LLVM_ABI bool
887 const APInt &PostIncExitValue) const;
888
889 /// Return true if the addressing mode represented by AM is legal for
890 /// this target, for a load/store of the specified type.
891 /// The type may be VoidTy, in which case only return true if the addressing
892 /// mode is legal for a load/store of any legal type.
893 /// If target returns true in LSRWithInstrQueries(), I may be valid.
894 /// \param ScalableOffset represents a quantity of bytes multiplied by vscale,
895 /// an invariant value known only at runtime. Most targets should not accept
896 /// a scalable offset.
897 ///
898 /// TODO: Handle pre/postinc as well.
900 int64_t BaseOffset, bool HasBaseReg,
901 int64_t Scale, unsigned AddrSpace = 0,
902 Instruction *I = nullptr,
903 int64_t ScalableOffset = 0) const;
904
905 /// Return true if LSR cost of C1 is lower than C2.
907 const TargetTransformInfo::LSRCost &C2) const;
908
909 /// Return true if LSR major cost is number of registers. Targets which
910 /// implement their own isLSRCostLess and unset number of registers as major
911 /// cost should return false, otherwise return true.
913
914 /// Return true if LSR should drop a found solution if it's calculated to be
915 /// less profitable than the baseline.
917
918 /// \returns true if LSR should not optimize a chain that includes \p I.
920
921 /// Return true if the target can fuse a compare and branch.
922 /// Loop-strength-reduction (LSR) uses that knowledge to adjust its cost
923 /// calculation for the instructions in a loop.
924 LLVM_ABI bool canMacroFuseCmp() const;
925
926 /// Return true if the target can save a compare for loop count, for example
927 /// hardware loop saves a compare.
930 TargetLibraryInfo *LibInfo) const;
931
932 /// Which addressing mode Loop Strength Reduction will try to generate.
934 AMK_None = 0x0, ///< Don't prefer any addressing mode
935 AMK_PreIndexed = 0x1, ///< Prefer pre-indexed addressing mode
936 AMK_PostIndexed = 0x2, ///< Prefer post-indexed addressing mode
937 AMK_All = 0x3, ///< Consider all addressing modes
938 LLVM_MARK_AS_BITMASK_ENUM(/*LargestValue=*/AMK_All)
939 };
940
941 /// Return the preferred addressing mode LSR should make efforts to generate.
944
945 /// Some targets only support masked load/store with a constant mask.
950
951 /// Return true if the target supports masked store.
952 LLVM_ABI bool
953 isLegalMaskedStore(Type *DataType, Align Alignment, unsigned AddressSpace,
955 /// Return true if the target supports masked load.
956 LLVM_ABI bool
957 isLegalMaskedLoad(Type *DataType, Align Alignment, unsigned AddressSpace,
959
960 /// Return true if the target supports speculatively loading \p DataType from
961 /// address space \p AddressSpace, i.e. @llvm.can.load.speculatively can
962 /// return true for the store size of \p DataType.
963 LLVM_ABI bool isLegalSpeculativeLoad(Type *DataType,
964 unsigned AddressSpace) const;
965
966 /// Return true if the target supports nontemporal store.
967 LLVM_ABI bool isLegalNTStore(Type *DataType, Align Alignment) const;
968 /// Return true if the target supports nontemporal load.
969 LLVM_ABI bool isLegalNTLoad(Type *DataType, Align Alignment) const;
970
971 /// \Returns true if the target supports broadcasting a load to a vector of
972 /// type <NumElements x ElementTy>.
973 LLVM_ABI bool isLegalBroadcastLoad(Type *ElementTy,
974 ElementCount NumElements) const;
975
976 /// Return true if the target supports masked scatter.
977 LLVM_ABI bool isLegalMaskedScatter(Type *DataType, Align Alignment) const;
978 /// Return true if the target supports masked gather.
979 LLVM_ABI bool isLegalMaskedGather(Type *DataType, Align Alignment) const;
980 /// Return true if the target forces scalarizing of llvm.masked.gather
981 /// intrinsics.
983 Align Alignment) const;
984 /// Return true if the target forces scalarizing of llvm.masked.scatter
985 /// intrinsics.
987 Align Alignment) const;
988
989 /// Return true if the target supports masked compress store.
991 Align Alignment) const;
992 /// Return true if the target supports masked expand load.
993 LLVM_ABI bool isLegalMaskedExpandLoad(Type *DataType, Align Alignment) const;
994
995 /// Return true if the target supports strided load.
996 LLVM_ABI bool isLegalStridedLoadStore(Type *DataType, Align Alignment) const;
997
998 /// Return true is the target supports interleaved access for the given vector
999 /// type \p VTy, interleave factor \p Factor, alignment \p Alignment and
1000 /// address space \p AddrSpace.
1001 LLVM_ABI bool isLegalInterleavedAccessType(VectorType *VTy, unsigned Factor,
1002 Align Alignment,
1003 unsigned AddrSpace) const;
1004
1005 // Return true if the target supports masked vector histograms.
1007 Type *DataType) const;
1008
1009 /// Return true if this is an alternating opcode pattern that can be lowered
1010 /// to a single instruction on the target. In X86 this is for the addsub
1011 /// instruction which corrsponds to a Shuffle + Fadd + FSub pattern in IR.
1012 /// This function expectes two opcodes: \p Opcode1 and \p Opcode2 being
1013 /// selected by \p OpcodeMask. The mask contains one bit per lane and is a `0`
1014 /// when \p Opcode0 is selected and `1` when Opcode1 is selected.
1015 /// \p VecTy is the vector type of the instruction to be generated.
1016 /// \p Scalars are the scalar instructions of the lanes, if known. The target
1017 /// may use them to find the patterns, which depend on the operands, like
1018 /// the alternating fused multiply-add.
1019 LLVM_ABI bool isLegalAltInstr(VectorType *VecTy, unsigned Opcode0,
1020 unsigned Opcode1,
1021 const SmallBitVector &OpcodeMask,
1022 ArrayRef<const Value *> Scalars = {}) const;
1023
1024 /// Enum describing the source/producer of a mask.
1025 enum class MaskSource {
1026 /// The operation is unmasked.
1028 /// The operation is masked with an arbitrary predicate.
1030 /// The operation is masked with a contiguous active lane mask.
1032 };
1033
1034 /// Return true if the target supports loading or storing \p NumVectors
1035 /// contiguous vectors of type \p VectorTy as a single operation. A null
1036 /// \p VectorTy queries whether the target supports this operation in
1037 /// general.
1038 ///
1039 /// \p CastHint is non-null if a stored value is produced by a cast or a
1040 /// loaded value is consumed by one.
1042 unsigned NumVectors, MaskSource Mask, VectorType *VectorTy = nullptr,
1043 bool IsStore = false,
1044 std::optional<Instruction::CastOps> CastHint = std::nullopt) const;
1045
1046 /// Return true if we should be enabling ordered reductions for the target.
1047 LLVM_ABI bool enableOrderedReductions() const;
1048
1049 /// Return true if the target has a unified operation to calculate division
1050 /// and remainder. If so, the additional implicit multiplication and
1051 /// subtraction required to calculate a remainder from division are free. This
1052 /// can enable more aggressive transformations for division and remainder than
1053 /// would typically be allowed using throughput or size cost models.
1054 LLVM_ABI bool hasDivRemOp(Type *DataType, bool IsSigned) const;
1055
1056 /// Return true if the given instruction (assumed to be a memory access
1057 /// instruction) has a volatile variant. If that's the case then we can avoid
1058 /// addrspacecast to generic AS for volatile loads/stores. Default
1059 /// implementation returns false, which prevents address space inference for
1060 /// volatile loads/stores.
1061 LLVM_ABI bool hasVolatileVariant(Instruction *I, unsigned AddrSpace) const;
1062
1063 /// Return true if target doesn't mind addresses in vectors.
1065
1066 /// Return the cost of the scaling factor used in the addressing
1067 /// mode represented by AM for this target, for a load/store
1068 /// of the specified type.
1069 /// If the AM is supported, the return value must be >= 0.
1070 /// If the AM is not supported, it returns a negative value.
1071 /// TODO: Handle pre/postinc as well.
1073 StackOffset BaseOffset,
1074 bool HasBaseReg, int64_t Scale,
1075 unsigned AddrSpace = 0) const;
1076
1077 /// Return true if the loop strength reduce pass should make
1078 /// Instruction* based TTI queries to isLegalAddressingMode(). This is
1079 /// needed on SystemZ, where e.g. a memcpy can only have a 12 bit unsigned
1080 /// immediate offset and no index register.
1081 LLVM_ABI bool LSRWithInstrQueries() const;
1082
1083 /// Return true if it's free to truncate a value of type Ty1 to type
1084 /// Ty2. e.g. On x86 it's free to truncate a i32 value in register EAX to i16
1085 /// by referencing its sub-register AX.
1086 LLVM_ABI bool isTruncateFree(Type *Ty1, Type *Ty2) const;
1087
1088 /// Return true if it is profitable to hoist instruction in the
1089 /// then/else to before if.
1091
1092 LLVM_ABI bool useAA() const;
1093
1094 /// Return true if this type is legal.
1095 LLVM_ABI bool isTypeLegal(Type *Ty) const;
1096
1097 /// Returns the estimated number of registers required to represent \p Ty.
1098 LLVM_ABI unsigned getRegUsageForType(Type *Ty) const;
1099
1100 /// Return true if switches should be turned into lookup tables for the
1101 /// target.
1102 LLVM_ABI bool shouldBuildLookupTables() const;
1103
1104 /// Return true if switches should be turned into lookup tables
1105 /// containing this constant value for the target.
1107
1108 /// Return the minimum bit width to use for integer switch lookup table
1109 /// elements on this target.
1111
1112 /// Return true if lookup tables should be turned into relative lookup tables.
1114
1115 /// Return true if the input function which is cold at all call sites,
1116 /// should use coldcc calling convention.
1118
1119 /// Return true if the input function is internal, should use fastcc calling
1120 /// convention.
1122
1123 /// Identifies if the vector form of the intrinsic has a scalar operand.
1125 unsigned ScalarOpdIdx) const;
1126
1127 /// Identifies if the vector form of the intrinsic is overloaded on the type
1128 /// of the operand at index \p OpdIdx, or on the return type if \p OpdIdx is
1129 /// -1.
1131 int OpdIdx) const;
1132
1133 /// Identifies if the vector form of the intrinsic that returns a struct is
1134 /// overloaded at the struct element index \p RetIdx.
1135 LLVM_ABI bool
1137 int RetIdx) const;
1138
1140
1141 /// Combines 2 context hints into a single value. If both are equal, keep the
1142 /// shared context, otherwise fall back to no specific context.
1146
1147 /// Stores information about the uses of a build vector
1157
1158 /// Calculates a VectorInstrContext from \p I.
1161
1162 /// Calculates a VectorInstrContext from the values in \p VL at indices in
1163 /// \p DemandedElts.
1165 getVectorInstrContextHint(ArrayRef<Value *> VL, const APInt &DemandedElts);
1166
1167 /// Calculates a VectorInstrContext for buildvector-like gather sequences.
1168 ///
1169 /// \p GatherUserOps must collect all users of \p Scalars relevant for
1170 /// determining whether a splat can be folded as a scalar operand. It returns
1171 /// false if those users cannot be gathered in the required form.
1173 ArrayRef<int> Mask, ArrayRef<Value *> Scalars,
1174 function_ref<bool(SmallVectorImpl<BuildVectorUseOp> &)> GatherUseOps)
1175 const;
1176
1177 /// Estimate the overhead of scalarizing an instruction. Insert and Extract
1178 /// are set if the demanded result elements need to be inserted and/or
1179 /// extracted from vectors. The involved values may be passed in VL if
1180 /// Insert is true.
1182 VectorType *Ty, const APInt &DemandedElts, bool Insert, bool Extract,
1183 TTI::TargetCostKind CostKind, bool ForPoisonSrc = true,
1184 ArrayRef<Value *> VL = {},
1186
1187 /// Estimate the overhead of scalarizing operands with the given types. The
1188 /// (potentially vector) types to use for each of argument are passes via Tys.
1192
1193 /// If target has efficient vector element load/store instructions, it can
1194 /// return true here so that insertion/extraction costs are not added to
1195 /// the scalarization cost of a load/store.
1197
1198 /// If the target supports tail calls.
1199 LLVM_ABI bool supportsTailCalls() const;
1200
1201 /// If target supports tail call on \p CB
1202 LLVM_ABI bool supportsTailCallFor(const CallBase *CB) const;
1203
1204 /// Don't restrict interleaved unrolling to small loops.
1205 LLVM_ABI bool enableAggressiveInterleaving(bool LoopHasReductions) const;
1206
1207 /// Returns options for expansion of memcmp. IsZeroCmp is
1208 // true if this is the expansion of memcmp(p1, p2, s) == 0.
1210 // Return true if memcmp expansion is enabled.
1211 operator bool() const { return MaxNumLoads > 0; }
1212
1213 // Maximum number of load operations.
1214 unsigned MaxNumLoads = 0;
1215
1216 // The list of available load sizes (in bytes), sorted in decreasing order.
1218
1219 // For memcmp expansion, allow up to this number of load pairs per block.
1220 // As an example, this may allow 'memcmp(a, b, 3) == 0' in a single block:
1221 // a0 = load2bytes &a[0]
1222 // b0 = load2bytes &b[0]
1223 // a2 = load1byte &a[2]
1224 // b2 = load1byte &b[2]
1225 // r = cmp eq (a0 ^ b0 | a2 ^ b2), 0
1226 // Equality comparisons combine the differences with xor/or. Ordering
1227 // comparisons pack the loads in memory order into a wider integer before
1228 // comparing, without exceeding the target's preferred load width.
1229 unsigned NumLoadsPerBlock = 1;
1230
1231 // Set to true to allow overlapping loads. For example, 7-byte compares can
1232 // be done with two 4-byte compares instead of 4+2+1-byte compares. This
1233 // requires all loads in LoadSizes to be doable in an unaligned way.
1235
1236 // Sometimes, the amount of data that needs to be compared is smaller than
1237 // the standard register size, but it cannot be loaded with just one load
1238 // instruction. For example, if the size of the memory comparison is 6
1239 // bytes, we can handle it more efficiently by loading all 6 bytes in a
1240 // single block and generating an 8-byte number, instead of generating two
1241 // separate blocks with conditional jumps for 4 and 2 byte loads. This
1242 // approach simplifies the process and produces the comparison result as
1243 // normal. This array lists the allowed sizes of memcmp tails that can be
1244 // merged into one block
1246 };
1248 bool IsZeroCmp) const;
1249
1250 /// Should the Select Optimization pass be enabled and ran.
1251 LLVM_ABI bool enableSelectOptimize() const;
1252
1253 /// Should the Select Optimization pass treat the given instruction like a
1254 /// select, potentially converting it to a conditional branch. This can
1255 /// include select-like instructions like or(zext(c), x) that can be converted
1256 /// to selects.
1258
1259 /// Enable matching of interleaved access groups.
1261
1262 /// Enable matching of interleaved access groups that contain predicated
1263 /// accesses or gaps and therefore vectorized using masked
1264 /// vector loads/stores.
1266
1267 /// Indicate that it is potentially unsafe to automatically vectorize
1268 /// floating-point operations because the semantics of vector and scalar
1269 /// floating-point semantics may differ. For example, ARM NEON v7 SIMD math
1270 /// does not support IEEE-754 denormal numbers, while depending on the
1271 /// platform, scalar floating-point math does.
1272 /// This applies to floating-point math operations and calls, not memory
1273 /// operations, shuffles, or casts.
1275
1276 /// Determine if the target supports unaligned memory accesses.
1278 unsigned BitWidth,
1279 unsigned AddressSpace = 0,
1280 Align Alignment = Align(1),
1281 unsigned *Fast = nullptr) const;
1282
1283 /// Return hardware support for population count.
1284 LLVM_ABI PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) const;
1285
1286 /// Return true if the hardware has a fast square-root instruction.
1287 LLVM_ABI bool haveFastSqrt(Type *Ty) const;
1288
1289 /// Return true if the cost of the instruction is too high to speculatively
1290 /// execute and should be kept behind a branch.
1291 /// This normally just wraps around a getInstructionCost() call, but some
1292 /// targets might report a low TCK_SizeAndLatency value that is incompatible
1293 /// with the fixed TCC_Expensive value.
1294 /// NOTE: This assumes the instruction passes isSafeToSpeculativelyExecute().
1296
1297 /// Return true if it is faster to check if a floating-point value is NaN
1298 /// (or not-NaN) versus a comparison against a constant FP zero value.
1299 /// Targets should override this if materializing a 0.0 for comparison is
1300 /// generally as cheap as checking for ordered/unordered.
1302
1303 /// Return the expected cost of supporting the floating point operation
1304 /// of the specified type.
1306
1307 /// Return the expected cost of materializing for the given integer
1308 /// immediate of the specified type.
1310 TargetCostKind CostKind) const;
1311
1312 /// Return the expected cost of materialization for the given integer
1313 /// immediate of the specified type for a given instruction. The cost can be
1314 /// zero if the immediate can be folded into the specified instruction.
1315 LLVM_ABI InstructionCost getIntImmCostInst(unsigned Opc, unsigned Idx,
1316 const APInt &Imm, Type *Ty,
1317 TargetCostKind CostKind,
1318 Instruction *Inst = nullptr) const;
1320 const APInt &Imm, Type *Ty,
1321 TargetCostKind CostKind) const;
1322
1323 /// Return the expected cost for the given integer when optimising
1324 /// for size. This is different than the other integer immediate cost
1325 /// functions in that it is subtarget agnostic. This is useful when you e.g.
1326 /// target one ISA such as Aarch32 but smaller encodings could be possible
1327 /// with another such as Thumb. This return value is used as a penalty when
1328 /// the total costs for a constant is calculated (the bigger the cost, the
1329 /// more beneficial constant hoisting is).
1330 LLVM_ABI InstructionCost getIntImmCodeSizeCost(unsigned Opc, unsigned Idx,
1331 const APInt &Imm,
1332 Type *Ty) const;
1333
1334 /// It can be advantageous to detach complex constants from their uses to make
1335 /// their generation cheaper. This hook allows targets to report when such
1336 /// transformations might negatively effect the code generation of the
1337 /// underlying operation. The motivating example is divides whereby hoisting
1338 /// constants prevents the code generator's ability to transform them into
1339 /// combinations of simpler operations.
1341 const Function &Fn) const;
1342
1343 /// @}
1344
1345 /// \name Vector Target Information
1346 /// @{
1347
1348 /// The various kinds of shuffle patterns for vector queries.
1350 SK_Broadcast, ///< Broadcast element 0 to all other elements.
1351 SK_Reverse, ///< Reverse the order of the vector.
1352 SK_Select, ///< Selects elements from the corresponding lane of
1353 ///< either source operand. This is equivalent to a
1354 ///< vector select with a constant condition operand.
1355 SK_Transpose, ///< Transpose two vectors.
1356 SK_InsertSubvector, ///< InsertSubvector. Index indicates start offset.
1357 SK_ExtractSubvector, ///< ExtractSubvector Index indicates start offset.
1358 SK_PermuteTwoSrc, ///< Merge elements from two source vectors into one
1359 ///< with any shuffle mask.
1360 SK_PermuteSingleSrc, ///< Shuffle elements of single source vector with any
1361 ///< shuffle mask.
1362 SK_Splice ///< Concatenates elements from the first input vector
1363 ///< with elements of the second input vector. Returning
1364 ///< a vector of the same type as the input vectors.
1365 ///< Index indicates start offset in first input vector.
1366 };
1367
1368 /// Additional information about an operand's possible values.
1370 OK_AnyValue, // Operand can have any value.
1371 OK_UniformValue, // Operand is uniform (splat of a value).
1372 OK_UniformConstantValue, // Operand is uniform constant.
1373 OK_NonUniformConstantValue // Operand is a non uniform constant value.
1374 };
1375
1376 /// Additional properties of an operand's values.
1382
1383 // Describe the values an operand can take. We're in the process
1384 // of migrating uses of OperandValueKind and OperandValueProperties
1385 // to use this class, and then will change the internal representation.
1389
1390 bool isConstant() const {
1392 }
1393 bool isUniform() const {
1395 }
1396 bool isPowerOf2() const {
1397 return Properties == OP_PowerOf2;
1398 }
1399 bool isNegatedPowerOf2() const {
1401 }
1402
1404 return {Kind, OP_None};
1405 }
1406
1408 OperandValueKind MergeKind = OK_AnyValue;
1409 if (isConstant() && OpInfoY.isConstant())
1410 MergeKind = OK_NonUniformConstantValue;
1411
1412 OperandValueProperties MergeProp = OP_None;
1413 if (Properties == OpInfoY.Properties)
1414 MergeProp = Properties;
1415 return {MergeKind, MergeProp};
1416 }
1417 };
1418
1419 /// \return the number of registers in the target-provided register class.
1420 LLVM_ABI unsigned getNumberOfRegisters(unsigned ClassID) const;
1421
1422 /// \return true if the target supports load/store that enables fault
1423 /// suppression of memory operands when the source condition is false.
1424 LLVM_ABI bool hasConditionalLoadStoreForType(Type *Ty, bool IsStore) const;
1425
1426 /// \return the target-provided register class ID for the provided type,
1427 /// accounting for type promotion and other type-legalization techniques that
1428 /// the target might apply. However, it specifically does not account for the
1429 /// scalarization or splitting of vector types. Should a vector type require
1430 /// scalarization or splitting into multiple underlying vector registers, that
1431 /// type should be mapped to a register class containing no registers.
1432 /// Specifically, this is designed to provide a simple, high-level view of the
1433 /// register allocation later performed by the backend. These register classes
1434 /// don't necessarily map onto the register classes used by the backend.
1435 /// FIXME: It's not currently possible to determine how many registers
1436 /// are used by the provided type.
1438 Type *Ty = nullptr) const;
1439
1440 /// \return the target-provided register class name
1441 LLVM_ABI const char *getRegisterClassName(unsigned ClassID) const;
1442
1443 /// \return the cost of spilling a register in the target-provided register
1444 /// class to the stack.
1446 getRegisterClassSpillCost(unsigned ClassID, TargetCostKind CostKind) const;
1447
1448 /// \return the cost of reloading a register in the target-provided register
1449 /// class from the stack.
1451 getRegisterClassReloadCost(unsigned ClassID, TargetCostKind CostKind) const;
1452
1454
1455 /// \return The width of the largest scalar or vector register type.
1456 LLVM_ABI TypeSize getRegisterBitWidth(RegisterKind K) const;
1457
1458 /// \return The width of the smallest vector register type.
1459 LLVM_ABI unsigned getMinVectorRegisterBitWidth() const;
1460
1461 /// \return the value of vscale to tune the cost model for.
1462 LLVM_ABI std::optional<unsigned> getVScaleForTuning() const;
1463
1464 /// \return True if the vectorization factor should be chosen to
1465 /// make the vector of the smallest element type match the size of a
1466 /// vector register. For wider element types, this could result in
1467 /// creating vectors that span multiple vector registers.
1468 /// If false, the vectorization factor will be chosen based on the
1469 /// size of the widest element type.
1470 /// \p K Register Kind for vectorization.
1471 LLVM_ABI bool
1473
1474 /// \return The minimum vectorization factor for types of given element
1475 /// bit width, or 0 if there is no minimum VF. The returned value only
1476 /// applies when shouldMaximizeVectorBandwidth returns true.
1477 /// If IsScalable is true, the returned ElementCount must be a scalable VF.
1478 LLVM_ABI ElementCount getMinimumVF(unsigned ElemWidth, bool IsScalable) const;
1479
1480 /// \return The maximum vectorization factor for types of given element
1481 /// bit width and opcode, or 0 if there is no maximum VF.
1482 /// Currently only used by the SLP vectorizer.
1483 LLVM_ABI unsigned getMaximumVF(unsigned ElemWidth, unsigned Opcode) const;
1484
1485 /// \return The minimum vectorization factor for the store instruction. Given
1486 /// the initial estimation of the minimum vector factor and store value type,
1487 /// it tries to find possible lowest VF, which still might be profitable for
1488 /// the vectorization.
1489 /// \param VF Initial estimation of the minimum vector factor.
1490 /// \param ScalarMemTy Scalar memory type of the store operation.
1491 /// \param ScalarValTy Scalar type of the stored value.
1492 /// \param Alignment Alignment of the store
1493 /// \param AddrSpace Address space of the store
1494 /// Currently only used by the SLP vectorizer.
1495 LLVM_ABI unsigned getStoreMinimumVF(unsigned VF, Type *ScalarMemTy,
1496 Type *ScalarValTy, Align Alignment,
1497 unsigned AddrSpace) const;
1498
1499 /// \return True if it should be considered for address type promotion.
1500 /// \p AllowPromotionWithoutCommonHeader Set true if promoting \p I is
1501 /// profitable without finding other extensions fed by the same input.
1503 const Instruction &I, bool &AllowPromotionWithoutCommonHeader) const;
1504
1505 /// \return The size of a cache line in bytes.
1506 LLVM_ABI unsigned getCacheLineSize() const;
1507
1508 /// The possible cache levels
1509 enum class CacheLevel {
1510 L1D, // The L1 data cache
1511 L2D, // The L2 data cache
1512
1513 // We currently do not model L3 caches, as their sizes differ widely between
1514 // microarchitectures. Also, we currently do not have a use for L3 cache
1515 // size modeling yet.
1516 };
1517
1518 /// \return The size of the cache level in bytes, if available.
1519 LLVM_ABI std::optional<unsigned> getCacheSize(CacheLevel Level) const;
1520
1521 /// \return The associativity of the cache level, if available.
1522 LLVM_ABI std::optional<unsigned>
1523 getCacheAssociativity(CacheLevel Level) const;
1524
1525 /// \return The minimum architectural page size for the target.
1526 LLVM_ABI std::optional<unsigned> getMinPageSize() const;
1527
1528 /// \return How much before a load we should place the prefetch
1529 /// instruction. This is currently measured in number of
1530 /// instructions.
1531 LLVM_ABI unsigned getPrefetchDistance() const;
1532
1533 /// Some HW prefetchers can handle accesses up to a certain constant stride.
1534 /// Sometimes prefetching is beneficial even below the HW prefetcher limit,
1535 /// and the arguments provided are meant to serve as a basis for deciding this
1536 /// for a particular loop.
1537 ///
1538 /// \param NumMemAccesses Number of memory accesses in the loop.
1539 /// \param NumStridedMemAccesses Number of the memory accesses that
1540 /// ScalarEvolution could find a known stride
1541 /// for.
1542 /// \param NumPrefetches Number of software prefetches that will be
1543 /// emitted as determined by the addresses
1544 /// involved and the cache line size.
1545 /// \param HasCall True if the loop contains a call.
1546 ///
1547 /// \return This is the minimum stride in bytes where it makes sense to start
1548 /// adding SW prefetches. The default is 1, i.e. prefetch with any
1549 /// stride.
1550 LLVM_ABI unsigned getMinPrefetchStride(unsigned NumMemAccesses,
1551 unsigned NumStridedMemAccesses,
1552 unsigned NumPrefetches,
1553 bool HasCall) const;
1554
1555 /// \return The maximum number of iterations to prefetch ahead. If
1556 /// the required number of iterations is more than this number, no
1557 /// prefetching is performed.
1558 LLVM_ABI unsigned getMaxPrefetchIterationsAhead() const;
1559
1560 /// \return True if prefetching should also be done for writes.
1561 LLVM_ABI bool enableWritePrefetching() const;
1562
1563 /// \return if target want to issue a prefetch in address space \p AS.
1564 LLVM_ABI bool shouldPrefetchAddressSpace(unsigned AS) const;
1565
1566 /// \return The cost of a partial reduction, which is a reduction from a
1567 /// vector to another vector with fewer elements of larger size. They are
1568 /// represented by the llvm.vector.partial.reduce.add and
1569 /// llvm.vector.partial.reduce.fadd intrinsics, which take an accumulator of
1570 /// type \p AccumType and a second vector operand to be accumulated, whose
1571 /// element count is specified by \p VF. The type of reduction is specified by
1572 /// \p Opcode. The second operand passed to the intrinsic could be the result
1573 /// of an extend, such as sext or zext. In this case \p BinOp is nullopt,
1574 /// \p InputTypeA represents the type being extended and \p OpAExtend the
1575 /// operation, i.e. sign- or zero-extend.
1576 /// For floating-point partial reductions, any fast math flags (FMF) should be
1577 /// provided to govern which reductions are valid to perform (depending on
1578 /// reassoc or contract, for example), whereas this must be nullopt for
1579 /// integer partial reductions.
1580 /// Also, \p InputTypeB should be nullptr and OpBExtend should be None.
1581 /// Alternatively, the second operand could be the result of a binary
1582 /// operation performed on two extends, i.e.
1583 /// mul(zext i8 %a -> i32, zext i8 %b -> i32).
1584 /// In this case \p BinOp may specify the opcode of the binary operation,
1585 /// \p InputTypeA and \p InputTypeB the types being extended, and
1586 /// \p OpAExtend, \p OpBExtend the form of extensions. An example of an
1587 /// operation that uses a partial reduction is a dot product, which reduces
1588 /// two vectors in binary mul operation to another of 4 times fewer and 4
1589 /// times larger elements.
1591 unsigned Opcode, Type *InputTypeA, Type *InputTypeB, Type *AccumType,
1593 PartialReductionExtendKind OpBExtend, std::optional<unsigned> BinOp,
1594 TTI::TargetCostKind CostKind, std::optional<FastMathFlags> FMF) const;
1595
1596 /// \return The maximum interleave factor that any transform should try to
1597 /// perform for this target. This number depends on the level of parallelism
1598 /// and the number of execution units in the CPU. HasUnorderedReductions
1599 /// specifies whether (unordered) reductions are present in the loop being
1600 /// vectorized.
1602 bool HasUnorderedReductions) const;
1603
1604 /// Collect properties of V used in cost analysis, e.g. OP_PowerOf2.
1605 LLVM_ABI static OperandValueInfo getOperandInfo(const Value *V);
1606
1607 /// Return information about the vector formed for the specified index
1608 /// of a vector of (the same) instruction.
1609 LLVM_ABI static OperandValueInfo getOperandInfo(ArrayRef<Value *> Ops);
1610
1611 /// Collect common data between two OperandValueInfo inputs
1612 LLVM_ABI static OperandValueInfo commonOperandInfo(const Value *X,
1613 const Value *Y);
1614
1615 /// This is an approximation of reciprocal throughput of a math/logic op.
1616 /// A higher cost indicates less expected throughput.
1617 /// From Agner Fog's guides, reciprocal throughput is "the average number of
1618 /// clock cycles per instruction when the instructions are not part of a
1619 /// limiting dependency chain."
1620 /// Therefore, costs should be scaled to account for multiple execution units
1621 /// on the target that can process this type of instruction. For example, if
1622 /// there are 5 scalar integer units and 2 vector integer units that can
1623 /// calculate an 'add' in a single cycle, this model should indicate that the
1624 /// cost of the vector add instruction is 2.5 times the cost of the scalar
1625 /// add instruction.
1626 /// \p Args is an optional argument which holds the instruction operands
1627 /// values so the TTI can analyze those values searching for special
1628 /// cases or optimizations based on those values.
1629 /// \p CtxI is the optional original context instruction, if one exists, to
1630 /// provide even more information.
1631 /// \p TLibInfo is used to search for platform specific vector library
1632 /// functions for instructions that might be converted to calls (e.g. frem).
1634 unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
1637 ArrayRef<const Value *> Args = {}, const Instruction *CtxI = nullptr,
1638 const TargetLibraryInfo *TLibInfo = nullptr) const;
1639
1640 /// Returns the cost estimation for alternating opcode pattern that can be
1641 /// lowered to a single instruction on the target. In X86 this is for the
1642 /// addsub instruction which corrsponds to a Shuffle + Fadd + FSub pattern in
1643 /// IR. This function expects two opcodes: \p Opcode1 and \p Opcode2 being
1644 /// selected by \p OpcodeMask. The mask contains one bit per lane and is a `0`
1645 /// when \p Opcode0 is selected and `1` when Opcode1 is selected.
1646 /// \p VecTy is the vector type of the instruction to be generated.
1647 /// \p Scalars are the scalar instructions of the lanes, if known. The target
1648 /// may use them to find the patterns, which depend on the operands, like
1649 /// the alternating fused multiply-add.
1651 VectorType *VecTy, unsigned Opcode0, unsigned Opcode1,
1652 const SmallBitVector &OpcodeMask, TTI::TargetCostKind CostKind,
1653 ArrayRef<const Value *> Scalars = {}) const;
1654
1655 /// \return The cost of a shuffle instruction of kind Kind with inputs of type
1656 /// SrcTy, producing a vector of type DstTy. The exact mask may be passed as
1657 /// Mask, or else the array will be empty. The Index and SubTp parameters
1658 /// are used by the subvector insertions shuffle kinds to show the insert
1659 /// point and the type of the subvector being inserted. The operands of the
1660 /// shuffle can be passed through \p Args, which helps improve the cost
1661 /// estimation in some cases, like in broadcast loads.
1663 ShuffleKind Kind, VectorType *DstTy, VectorType *SrcTy,
1664 TTI::TargetCostKind CostKind, ArrayRef<int> Mask = {}, int Index = 0,
1665 VectorType *SubTp = nullptr, ArrayRef<const Value *> Args = {},
1666 const Instruction *CtxI = nullptr,
1668
1669 /// Represents a hint about the context in which a cast is used.
1670 ///
1671 /// For zext/sext, the context of the cast is the operand, which must be a
1672 /// load of some kind. For trunc, the context is of the cast is the single
1673 /// user of the instruction, which must be a store of some kind.
1674 ///
1675 /// This enum allows the vectorizer to give getCastInstrCost an idea of the
1676 /// type of cast it's dealing with, as not every cast is equal. For instance,
1677 /// the zext of a load may be free, but the zext of an interleaving load can
1678 //// be (very) expensive!
1679 ///
1680 /// See \c getCastContextHint to compute a CastContextHint from a cast
1681 /// Instruction*. Callers can use it if they don't need to override the
1682 /// context and just want it to be calculated from the instruction.
1683 ///
1684 /// FIXME: This handles the types of load/store that the vectorizer can
1685 /// produce, which are the cases where the context instruction is most
1686 /// likely to be incorrect. There are other situations where that can happen
1687 /// too, which might be handled here but in the long run a more general
1688 /// solution of costing multiple instructions at the same times may be better.
1690 None, ///< The cast is not used with a load/store of any kind.
1691 Normal, ///< The cast is used with a normal load/store.
1692 Masked, ///< The cast is used with a masked load/store.
1693 GatherScatter, ///< The cast is used with a gather/scatter.
1694 Interleave, ///< The cast is used with an interleaved load/store.
1695 Reversed, ///< The cast is used with a reversed load/store.
1696 };
1697
1698 /// Calculates a CastContextHint from \p I.
1699 /// This should be used by callers of getCastInstrCost if they wish to
1700 /// determine the context from some instruction.
1701 /// \returns the CastContextHint for ZExt/SExt/Trunc, None if \p I is nullptr,
1702 /// or if it's another type of cast.
1704
1705 /// \return The expected cost of cast instructions, such as bitcast, trunc,
1706 /// zext, etc. If there is an existing instruction that holds Opcode, it
1707 /// may be passed in the 'I' parameter.
1709 unsigned Opcode, Type *Dst, Type *Src, TTI::CastContextHint CCH,
1710 TTI::TargetCostKind CostKind, const Instruction *I = nullptr) const;
1711
1712 /// \return The expected cost of a sign- or zero-extended vector extract. Use
1713 /// Index = -1 to indicate that there is no information about the index value.
1715 getExtractWithExtendCost(unsigned Opcode, Type *Dst, VectorType *VecTy,
1716 unsigned Index, TTI::TargetCostKind CostKind) const;
1717
1718 /// \return The expected cost of control-flow related instructions such as
1719 /// Phi, Ret, Br, Switch.
1720 LLVM_ABI InstructionCost getCFInstrCost(unsigned Opcode,
1721 TTI::TargetCostKind CostKind,
1722 const Instruction *I = nullptr) const;
1723
1724 /// \returns The expected cost of compare and select instructions. If there
1725 /// is an existing instruction that holds Opcode, it may be passed in the
1726 /// 'I' parameter. The \p VecPred parameter can be used to indicate the select
1727 /// is using a compare with the specified predicate as condition. When vector
1728 /// types are passed, \p VecPred must be used for all lanes. For a
1729 /// comparison, the two operands are the natural values. For a select, the
1730 /// two operands are the *value* operands, not the condition operand.
1732 getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
1733 CmpInst::Predicate VecPred, TTI::TargetCostKind CostKind,
1734 OperandValueInfo Op1Info = {OK_AnyValue, OP_None},
1735 OperandValueInfo Op2Info = {OK_AnyValue, OP_None},
1736 const Instruction *I = nullptr) const;
1737
1738 /// \return The expected cost of vector Insert and Extract.
1739 /// Use -1 to indicate that there is no information on the index value.
1740 /// This is used when the instruction is not available; a typical use
1741 /// case is to provision the cost of vectorization/scalarization in
1742 /// vectorizer passes.
1744 unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind,
1745 unsigned Index = -1, const Value *Op0 = nullptr,
1746 const Value *Op1 = nullptr,
1748
1749 /// \return The expected cost of vector Insert and Extract.
1750 /// Use -1 to indicate that there is no information on the index value.
1751 /// This is used when the instruction is not available; a typical use
1752 /// case is to provision the cost of vectorization/scalarization in
1753 /// vectorizer passes.
1754 /// \param ScalarUserAndIdx encodes the information about extracts from a
1755 /// vector with 'Scalar' being the value being extracted,'User' being the user
1756 /// of the extract(nullptr if user is not known before vectorization) and
1757 /// 'Idx' being the extract lane.
1759 unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index,
1760 Value *Scalar,
1761 ArrayRef<std::tuple<Value *, User *, int>> ScalarUserAndIdx,
1763
1764 /// \return The expected cost of vector Insert and Extract.
1765 /// This is used when instruction is available, and implementation
1766 /// asserts 'I' is not nullptr.
1767 ///
1768 /// A typical suitable use case is cost estimation when vector instruction
1769 /// exists (e.g., from basic blocks during transformation).
1771 const Instruction &I, Type *Val, TTI::TargetCostKind CostKind,
1772 unsigned Index = -1,
1774
1775 /// \return The expected cost of inserting or extracting a lane that is \p
1776 /// Index elements from the end of a vector, i.e. the mathematical expression
1777 /// for the lane is (VF - 1 - Index). This is required for scalable vectors
1778 /// where the exact lane index is unknown at compile time.
1780 unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind,
1781 unsigned Index) const;
1782
1783 /// \return The expected cost of aggregate inserts and extracts. This is
1784 /// used when the instruction is not available; a typical use case is to
1785 /// provision the cost of vectorization/scalarization in vectorizer passes.
1787 unsigned Opcode, TTI::TargetCostKind CostKind) const;
1788
1789 /// \return The cost of replication shuffle of \p VF elements typed \p EltTy
1790 /// \p ReplicationFactor times.
1791 ///
1792 /// For example, the mask for \p ReplicationFactor=3 and \p VF=4 is:
1793 /// <0,0,0,1,1,1,2,2,2,3,3,3>
1795 Type *EltTy, int ReplicationFactor, int VF, const APInt &DemandedDstElts,
1796 TTI::TargetCostKind CostKind) const;
1797
1798 /// \return The cost of Load and Store instructions. The operand info
1799 /// \p OpdInfo should refer to the stored value for stores and the address
1800 /// for loads.
1802 getMemoryOpCost(unsigned Opcode, Type *Src, Align Alignment,
1803 unsigned AddressSpace, TTI::TargetCostKind CostKind,
1805 const Instruction *I = nullptr) const;
1806
1807 /// \return The cost of the interleaved memory operation.
1808 /// \p Opcode is the memory operation code
1809 /// \p VecTy is the vector type of the interleaved access.
1810 /// \p Factor is the interleave factor
1811 /// \p Indices is the indices for interleaved load members (as interleaved
1812 /// load allows gaps)
1813 /// \p Alignment is the alignment of the memory operation
1814 /// \p AddressSpace is address space of the pointer.
1815 /// \p UseMaskForCond indicates if the memory access is predicated.
1816 /// \p UseMaskForGaps indicates if gaps should be masked.
1818 unsigned Opcode, Type *VecTy, unsigned Factor, ArrayRef<unsigned> Indices,
1819 Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind,
1820 bool UseMaskForCond = false, bool UseMaskForGaps = false) const;
1821
1822 /// A helper function to determine the type of reduction algorithm used
1823 /// for a given \p Opcode and set of FastMathFlags \p FMF.
1824 static bool requiresOrderedReduction(std::optional<FastMathFlags> FMF) {
1825 return FMF && !(*FMF).allowReassoc();
1826 }
1827
1828 /// Calculate the cost of vector reduction intrinsics.
1829 ///
1830 /// This is the cost of reducing the vector value of type \p Ty to a scalar
1831 /// value using the operation denoted by \p Opcode. The FastMathFlags
1832 /// parameter \p FMF indicates what type of reduction we are performing:
1833 /// 1. Tree-wise. This is the typical 'fast' reduction performed that
1834 /// involves successively splitting a vector into half and doing the
1835 /// operation on the pair of halves until you have a scalar value. For
1836 /// example:
1837 /// (v0, v1, v2, v3)
1838 /// ((v0+v2), (v1+v3), undef, undef)
1839 /// ((v0+v2+v1+v3), undef, undef, undef)
1840 /// This is the default behaviour for integer operations, whereas for
1841 /// floating point we only do this if \p FMF indicates that
1842 /// reassociation is allowed.
1843 /// 2. Ordered. For a vector with N elements this involves performing N
1844 /// operations in lane order, starting with an initial scalar value, i.e.
1845 /// result = InitVal + v0
1846 /// result = result + v1
1847 /// result = result + v2
1848 /// result = result + v3
1849 /// This is only the case for FP operations and when reassociation is not
1850 /// allowed.
1851 ///
1853 unsigned Opcode, VectorType *Ty, std::optional<FastMathFlags> FMF,
1854 TTI::TargetCostKind CostKind) const;
1855
1858 TTI::TargetCostKind CostKind) const;
1859
1860 /// Calculate the cost of an extended reduction pattern, similar to
1861 /// getArithmeticReductionCost of an Add/Sub reduction with multiply and
1862 /// optional extensions. This is the cost of as:
1863 /// * ResTy vecreduce.add/sub(mul (A, B)) or,
1864 /// * ResTy vecreduce.add/sub(mul(ext(Ty A), ext(Ty B)).
1866 getMulAccReductionCost(bool IsUnsigned, unsigned RedOpcode, Type *ResTy,
1867 VectorType *Ty, TTI::TargetCostKind CostKind) const;
1868
1869 /// Calculate the cost of an extended reduction pattern, similar to
1870 /// getArithmeticReductionCost of a reduction with an extension.
1871 /// This is the cost of as:
1872 /// ResTy vecreduce.opcode(ext(Ty A)).
1874 unsigned Opcode, bool IsUnsigned, Type *ResTy, VectorType *Ty,
1875 std::optional<FastMathFlags> FMF, TTI::TargetCostKind CostKind) const;
1876
1877 /// \returns The cost of Intrinsic instructions. Analyses the real arguments.
1878 /// Three cases are handled: 1. scalar instruction 2. vector instruction
1879 /// 3. scalar instruction which is to be vectorized.
1881 const IntrinsicCostAttributes &ICA, TTI::TargetCostKind CostKind) const;
1882
1883 /// \returns The cost of memory intrinsic instructions.
1884 /// Used when IntrinsicInst is not materialized.
1887 TTI::TargetCostKind CostKind) const;
1888
1889 /// \returns The cost of Call instructions.
1891 ArrayRef<Type *> Tys,
1892 TTI::TargetCostKind CostKind) const;
1893
1894 /// \returns The number of pieces into which the provided type must be
1895 /// split during legalization. Zero is returned when the answer is unknown.
1896 LLVM_ABI unsigned getNumberOfParts(Type *Tp) const;
1897
1898 /// \returns The cost of the address computation. For most targets this can be
1899 /// merged into the instruction indexing mode. Some targets might want to
1900 /// distinguish between address computation for memory operations with vector
1901 /// pointer types and scalar pointer types. Such targets should override this
1902 /// function. \p SE holds the pointer for the scalar evolution object which
1903 /// was used in order to get the Ptr step value. \p Ptr holds the SCEV of the
1904 /// access pointer.
1906 getAddressComputationCost(Type *PtrTy, ScalarEvolution *SE, const SCEV *Ptr,
1907 TTI::TargetCostKind CostKind) const;
1908
1909 /// \returns The cost, if any, of keeping values of the given types alive
1910 /// over a callsite.
1911 ///
1912 /// Some types may require the use of register classes that do not have
1913 /// any callee-saved registers, so would require a spill and fill.
1916
1917 /// \returns True if the intrinsic is a supported memory intrinsic. Info
1918 /// will contain additional information - whether the intrinsic may write
1919 /// or read to memory, volatility and the pointer. Info is undefined
1920 /// if false is returned.
1922 MemIntrinsicInfo &Info) const;
1923
1924 /// \returns The maximum element size, in bytes, for an element
1925 /// unordered-atomic memory intrinsic.
1927
1928 /// \returns A value which is the result of the given memory intrinsic. If \p
1929 /// CanCreate is true, new instructions may be created to extract the result
1930 /// from the given intrinsic memory operation. Returns nullptr if the target
1931 /// cannot create a result from the given intrinsic.
1932 LLVM_ABI Value *
1934 bool CanCreate = true) const;
1935
1936 /// \returns The type to use in a loop expansion of a memcpy call.
1938 LLVMContext &Context, Value *Length, unsigned SrcAddrSpace,
1939 unsigned DestAddrSpace, Align SrcAlign, Align DestAlign,
1940 std::optional<uint32_t> AtomicElementSize = std::nullopt) const;
1941
1942 /// \param[out] OpsOut The operand types to copy RemainingBytes of memory.
1943 /// \param RemainingBytes The number of bytes to copy.
1944 ///
1945 /// Calculates the operand types to use when copying \p RemainingBytes of
1946 /// memory, where source and destination alignments are \p SrcAlign and
1947 /// \p DestAlign respectively.
1949 SmallVectorImpl<Type *> &OpsOut, LLVMContext &Context,
1950 unsigned RemainingBytes, unsigned SrcAddrSpace, unsigned DestAddrSpace,
1951 Align SrcAlign, Align DestAlign,
1952 std::optional<uint32_t> AtomicCpySize = std::nullopt) const;
1953
1954 /// \returns True if the two functions have compatible attributes for inlining
1955 /// purposes.
1956 LLVM_ABI bool areInlineCompatible(const Function *Caller,
1957 const Function *Callee) const;
1958
1959 /// Returns a penalty for invoking call \p Call in \p F.
1960 /// For example, if a function F calls a function G, which in turn calls
1961 /// function H, then getInlineCallPenalty(F, H()) would return the
1962 /// penalty of calling H from F, e.g. after inlining G into F.
1963 /// \p DefaultCallPenalty is passed to give a default penalty that
1964 /// the target can amend or override.
1965 LLVM_ABI unsigned getInlineCallPenalty(const Function *F,
1966 const CallBase &Call,
1967 unsigned DefaultCallPenalty) const;
1968
1969 /// \returns true if `Caller`'s `Attr` should be added to the new function
1970 /// created by outlining part of `Caller`.
1971 LLVM_ABI bool
1973 const Attribute &Attr) const;
1974
1975 /// \returns True if the caller and callee agree on how \p Types will be
1976 /// passed to or returned from the callee.
1977 /// to the callee.
1978 /// \param Types List of types to check.
1979 LLVM_ABI bool areTypesABICompatible(const Function *Caller,
1980 const Function *Callee,
1981 ArrayRef<Type *> Types) const;
1982
1983 /// The type of load/store indexing.
1985 MIM_Unindexed, ///< No indexing.
1986 MIM_PreInc, ///< Pre-incrementing.
1987 MIM_PreDec, ///< Pre-decrementing.
1988 MIM_PostInc, ///< Post-incrementing.
1989 MIM_PostDec ///< Post-decrementing.
1990 };
1991
1992 /// \returns True if the specified indexed load for the given type is legal.
1993 LLVM_ABI bool isIndexedLoadLegal(enum MemIndexedMode Mode, Type *Ty) const;
1994
1995 /// \returns True if the specified indexed store for the given type is legal.
1996 LLVM_ABI bool isIndexedStoreLegal(enum MemIndexedMode Mode, Type *Ty) const;
1997
1998 /// \returns The bitwidth of the largest vector type that should be used to
1999 /// load/store in the given address space.
2000 LLVM_ABI unsigned getLoadStoreVecRegBitWidth(unsigned AddrSpace) const;
2001
2002 /// \returns True if the load instruction is legal to vectorize.
2004
2005 /// \returns True if the store instruction is legal to vectorize.
2007
2008 /// \returns True if it is legal to vectorize the given load chain.
2009 LLVM_ABI bool isLegalToVectorizeLoadChain(unsigned ChainSizeInBytes,
2010 Align Alignment,
2011 unsigned AddrSpace) const;
2012
2013 /// \returns True if it is legal to vectorize the given store chain.
2014 LLVM_ABI bool isLegalToVectorizeStoreChain(unsigned ChainSizeInBytes,
2015 Align Alignment,
2016 unsigned AddrSpace) const;
2017
2018 /// \returns True if it is legal to vectorize the given reduction kind.
2020 ElementCount VF) const;
2021
2022 /// \returns True if the given type is supported for scalable vectors
2024
2025 /// \returns The new vector factor value if the target doesn't support \p
2026 /// SizeInBytes loads or has a better vector factor.
2027 LLVM_ABI unsigned getLoadVectorFactor(unsigned VF, unsigned LoadSize,
2028 unsigned ChainSizeInBytes,
2029 VectorType *VecTy) const;
2030
2031 /// \returns The new vector factor value if the target doesn't support \p
2032 /// SizeInBytes stores or has a better vector factor.
2033 LLVM_ABI unsigned getStoreVectorFactor(unsigned VF, unsigned StoreSize,
2034 unsigned ChainSizeInBytes,
2035 VectorType *VecTy) const;
2036
2037 /// \returns True if the target prefers fixed width vectorization if the
2038 /// loop vectorizer's cost-model assigns an equal cost to the fixed and
2039 /// scalable version of the vectorized loop.
2041
2042 /// \returns True if target prefers SLP vectorizer with altermate opcode
2043 /// vectorization, false - otherwise.
2045
2046 /// \returns True if the SLP vectorizer should apply the instruction-count
2047 /// check that rejects 2-element vector trees when the vector instruction
2048 /// count exceeds the scalar instruction count, false if the target opts out
2049 /// of this heuristic.
2050 LLVM_ABI bool preferSLPInstCountCheck() const;
2051
2052 /// \returns True if the target prefers reductions of \p Kind to be performed
2053 /// in the loop.
2054 LLVM_ABI bool preferInLoopReduction(RecurKind Kind, Type *Ty) const;
2055
2056 /// \returns True if the target prefers reductions select kept in the loop
2057 /// when tail folding. i.e.
2058 /// loop:
2059 /// p = phi (0, s)
2060 /// a = add (p, x)
2061 /// s = select (mask, a, p)
2062 /// vecreduce.add(s)
2063 ///
2064 /// As opposed to the normal scheme of p = phi (0, a) which allows the select
2065 /// to be pulled out of the loop. If the select(.., add, ..) can be predicated
2066 /// by the target, this can lead to cleaner code generation.
2068
2069 /// Return true if the loop vectorizer should consider vectorizing an
2070 /// otherwise scalar epilogue loop if the loop already has been vectorized
2071 /// processing \p Iters scalar iterations per vector iteration.
2073
2074 /// \returns True if the loop vectorizer should discard any VFs where the
2075 /// maximum register pressure exceeds getNumberOfRegisters.
2077
2078 /// \returns True if the target wants to expand the given reduction intrinsic
2079 /// into a shuffle sequence.
2081
2083
2084 /// \returns The shuffle sequence pattern used to expand the given reduction
2085 /// intrinsic.
2088
2089 /// \returns the size cost of rematerializing a GlobalValue address relative
2090 /// to a stack reload.
2091 LLVM_ABI unsigned getGISelRematGlobalCost() const;
2092
2093 /// \returns the lower bound of a trip count to decide on vectorization
2094 /// while tail-folding.
2096
2097 /// \returns True if the target supports scalable vectors.
2098 LLVM_ABI bool supportsScalableVectors() const;
2099
2100 /// \return true when scalable vectorization is preferred.
2102
2103 /// \name Vector Predication Information
2104 /// @{
2105 /// Whether the target supports the %evl parameter of VP intrinsic efficiently
2106 /// in hardware. (see LLVM Language Reference - "Vector Predication
2107 /// Intrinsics"). Use of %evl is discouraged when that is not the case.
2108 LLVM_ABI bool hasActiveVectorLength() const;
2109
2110 /// Return true if sinking I's operands to the same basic block as I is
2111 /// profitable, e.g. because the operands can be folded into a target
2112 /// instruction during instruction selection. After calling the function
2113 /// \p Ops contains the Uses to sink ordered by dominance (dominating users
2114 /// come first). \p LI, when available, lets targets account for loop
2115 /// boundaries when deciding profitability.
2118 const LoopInfo *LI = nullptr) const;
2119
2120 /// Return true if it's significantly cheaper to shift a vector by a uniform
2121 /// scalar than by an amount which will vary across each lane. On x86 before
2122 /// AVX2 for example, there is a "psllw" instruction for the former case, but
2123 /// no simple instruction for a general "a << b" operation on vectors.
2124 /// This should also apply to lowering for vector funnel shifts (rotates).
2126
2129 // keep the predicating parameter
2131 // where legal, discard the predicate parameter
2133 // transform into something else that is also predicating
2135 };
2136
2137 // How to transform the EVL parameter.
2138 // Legal: keep the EVL parameter as it is.
2139 // Discard: Ignore the EVL parameter where it is safe to do so.
2140 // Convert: Fold the EVL into the mask parameter.
2142
2143 // How to transform the operator.
2144 // Legal: The target supports this operator.
2145 // Convert: Convert this to a non-VP operation.
2146 // The 'Discard' strategy is invalid.
2148
2149 bool shouldDoNothing() const {
2150 return (EVLParamStrategy == Legal) && (OpStrategy == Legal);
2151 }
2154 };
2155
2156 /// \returns How the target needs this vector-predicated operation to be
2157 /// transformed.
2159 getVPLegalizationStrategy(const VPIntrinsic &PI) const;
2160 /// @}
2161
2162 /// \returns Whether a 32-bit branch instruction is available in Arm or Thumb
2163 /// state.
2164 ///
2165 /// Used by the LowerTypeTests pass, which constructs an IR inline assembler
2166 /// node containing a jump table in a format suitable for the target, so it
2167 /// needs to know what format of jump table it can legally use.
2168 ///
2169 /// For non-Arm targets, this function isn't used. It defaults to returning
2170 /// false, but it shouldn't matter what it returns anyway.
2171 LLVM_ABI bool hasArmWideBranch(bool Thumb) const;
2172
2173 /// Returns a bitmask constructed from the target-features or fmv-features
2174 /// metadata of a function corresponding to its Arch Extensions.
2175 LLVM_ABI APInt getFeatureMask(const Function &F) const;
2176
2177 /// Returns a bitmask constructed from the target-features or fmv-features
2178 /// metadata of a function corresponding to its FMV priority.
2179 LLVM_ABI APInt getPriorityMask(const Function &F) const;
2180
2181 /// Returns true if this is an instance of a function with multiple versions.
2182 LLVM_ABI bool isMultiversionedFunction(const Function &F) const;
2183
2184 /// \return The maximum number of function arguments the target supports.
2185 LLVM_ABI unsigned getMaxNumArgs() const;
2186
2187 /// @}
2188
2189 /// Collect kernel launch bounds for \p F into \p LB.
2191 const Function &F,
2192 SmallVectorImpl<std::pair<StringRef, int64_t>> &LB) const;
2193
2194 /// Returns true if GEP should not be used to index into vectors for this
2195 /// target.
2197
2198 /// Determine if an instruction with Custom uniformity can be proven uniform
2199 /// based on which operands are uniform.
2200 ///
2201 /// \param I The instruction to check.
2202 /// \param UniformArgs A bitvector indicating which operands are known to be
2203 /// uniform (bit N corresponds to operand N).
2204 /// \returns true if the instruction result can be proven uniform given the
2205 /// uniform operands, false otherwise.
2206 LLVM_ABI bool isUniform(const Instruction *I,
2207 const SmallBitVector &UniformArgs) const;
2208
2209private:
2210 std::unique_ptr<const TargetTransformInfoImplBase> TTIImpl;
2211};
2212
2213/// Costs for each cost kind in a target cost table. Field order matches
2214/// TargetCostKind, since table entries initialize these fields positionally.
2215/// A cost of ~0U means the table provides no cost for that kind.
2217 unsigned RecipThroughputCost = ~0U;
2218 unsigned LatencyCost = ~0U;
2219 unsigned CodeSizeCost = ~0U;
2220 unsigned SizeAndLatencyCost = ~0U;
2221
2222 std::optional<unsigned>
2224 unsigned Cost = ~0U;
2225 switch (Kind) {
2228 break;
2230 Cost = LatencyCost;
2231 break;
2234 break;
2237 break;
2238 }
2239 if (Cost == ~0U)
2240 return std::nullopt;
2241 return Cost;
2242 }
2243};
2244
2245/// Analysis pass providing the \c TargetTransformInfo.
2246///
2247/// The core idea of the TargetIRAnalysis is to expose an interface through
2248/// which LLVM targets can analyze and provide information about the middle
2249/// end's target-independent IR. This supports use cases such as target-aware
2250/// cost modeling of IR constructs.
2251///
2252/// This is a function analysis because much of the cost modeling for targets
2253/// is done in a subtarget specific way and LLVM supports compiling different
2254/// functions targeting different subtargets in order to support runtime
2255/// dispatch according to the observed subtarget.
2256class TargetIRAnalysis : public AnalysisInfoMixin<TargetIRAnalysis> {
2257public:
2259
2260 /// Default construct a target IR analysis.
2261 ///
2262 /// This will use the module's datalayout to construct a baseline
2263 /// conservative TTI result.
2265
2266 /// Construct an IR analysis pass around a target-provide callback.
2267 ///
2268 /// The callback will be called with a particular function for which the TTI
2269 /// is needed and must return a TTI object for that function.
2270 LLVM_ABI
2271 TargetIRAnalysis(std::function<Result(const Function &)> TTICallback);
2272
2273 // Value semantics. We spell out the constructors for MSVC.
2275 : TTICallback(Arg.TTICallback) {}
2277 : TTICallback(std::move(Arg.TTICallback)) {}
2279 TTICallback = RHS.TTICallback;
2280 return *this;
2281 }
2283 TTICallback = std::move(RHS.TTICallback);
2284 return *this;
2285 }
2286
2288
2289private:
2291 LLVM_ABI static AnalysisKey Key;
2292
2293 /// The callback used to produce a result.
2294 ///
2295 /// We use a completely opaque callback so that targets can provide whatever
2296 /// mechanism they desire for constructing the TTI for a given function.
2297 ///
2298 /// FIXME: Should we really use std::function? It's relatively inefficient.
2299 /// It might be possible to arrange for even stateful callbacks to outlive
2300 /// the analysis and thus use a function_ref which would be lighter weight.
2301 /// This may also be less error prone as the callback is likely to reference
2302 /// the external TargetMachine, and that reference needs to never dangle.
2303 std::function<Result(const Function &)> TTICallback;
2304
2305 /// Helper function used as the callback in the default constructor.
2306 static Result getDefaultTTI(const Function &F);
2307};
2308
2309/// Wrapper pass for TargetTransformInfo.
2310///
2311/// This pass can be constructed from a TTI object which it stores internally
2312/// and is queried by passes.
2314 TargetIRAnalysis TIRA;
2315 std::optional<TargetTransformInfo> TTI;
2316
2317 virtual void anchor();
2318
2319public:
2320 static char ID;
2321
2322 /// We must provide a default constructor for the pass but it should
2323 /// never be used.
2324 ///
2325 /// Use the constructor below or call one of the creation routines.
2327
2329
2331};
2332
2333/// Create an analysis pass wrapper around a TTI object.
2334///
2335/// This analysis pass just holds the TTI instance and makes it available to
2336/// clients.
2339
2340} // namespace llvm
2341
2342#endif
bool IsScalable
uint64_t uint64_t
uint64_t Imm
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Atomic ordering constants.
#define X(NUM, ENUM, NAME)
Definition ELF.h:665
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
#define LLVM_ABI
Definition Compiler.h:211
TargetTransformInfo::VPLegalization VPLegalization
static cl::opt< bool > ForceNestedLoop("force-nested-hardware-loop", cl::Hidden, cl::init(false), cl::desc("Force allowance of nested hardware loops"))
static cl::opt< bool > ForceHardwareLoopPHI("force-hardware-loop-phi", cl::Hidden, cl::init(false), cl::desc("Force hardware loop counter to be updated through a phi"))
This header defines various interfaces for pass management in LLVM.
This file defines an InstructionCost class that is used when calculating the cost of an instruction,...
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
uint64_t IntrinsicInst * II
SmallVector< MachineOperand, 4 > Cond
int64_t C1
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")))
SI Fold Operands
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
Value * RHS
Class for arbitrary precision integers.
Definition APInt.h:78
an instruction to allocate memory on the stack
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
A cache of @llvm.assume calls within a function.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:106
LLVM Basic Block Representation.
Definition BasicBlock.h:62
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
Conditional Branch instruction.
This is an important base class in LLVM.
Definition Constant.h:44
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
Convenience struct for specifying and reasoning about fast-math flags.
Definition FMF.h:23
This instruction compares its operands according to the predicate given to the constructor.
ImmutablePass class - This class is used to provide information that does not need to be run.
Definition Pass.h:283
ImmutablePass(char &pid)
Definition Pass.h:285
The core instruction combiner logic.
static InstructionCost getInvalid(CostType Val=0)
Class to represent integer types.
Drive the analysis of interleaved memory accesses in the loop.
const SmallVectorImpl< Type * > & getArgTypes() const
const SmallVectorImpl< const Value * > & getArgs() const
LLVM_ABI IntrinsicCostAttributes(Intrinsic::ID Id, const CallBase &CI, InstructionCost ScalarCost=InstructionCost::getInvalid(), bool TypeBasedOnly=false)
VectorInstrContext getVectorInstrContext() const
InstructionCost getScalarizationCost() const
const IntrinsicInst * getInst() const
A wrapper class for inspecting calls to intrinsic functions.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:76
An instruction for reading from memory.
LoopVectorizationLegality checks if it is legal to vectorize a loop, and to what vectorization factor...
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
Information for memory intrinsic cost model.
MemIntrinsicCostAttributes(Intrinsic::ID Id, Type *DataTy, const Value *Ptr, bool VariableMask, Align Alignment, const Instruction *I=nullptr, const Value *StrideVal=nullptr)
MemIntrinsicCostAttributes(Intrinsic::ID Id, Type *DataTy, bool VariableMask, Align Alignment, const Instruction *I=nullptr, const Value *StrideVal=nullptr)
MemIntrinsicCostAttributes(Intrinsic::ID Id, Type *DataTy, Align Alignment, unsigned AddressSpace=0, const Value *StrideVal=nullptr)
const Instruction * getInst() const
The optimization diagnostic interface.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
Analysis providing profile information.
The RecurrenceDescriptor is used to identify recurrences variables in a loop.
This class represents an analyzed expression in the program.
The main scalar evolution driver.
This is a 'bitvector' (really, a variable-sized bit array), optimized for the case when the array is ...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StackOffset holds a fixed and a scalable offset in bytes.
Definition TypeSize.h:31
An instruction for storing to memory.
Multiway switch.
Analysis pass providing the TargetTransformInfo.
TargetIRAnalysis(const TargetIRAnalysis &Arg)
TargetIRAnalysis & operator=(const TargetIRAnalysis &RHS)
LLVM_ABI Result run(const Function &F, FunctionAnalysisManager &)
LLVM_ABI TargetIRAnalysis()
Default construct a target IR analysis.
TargetIRAnalysis & operator=(TargetIRAnalysis &&RHS)
TargetIRAnalysis(TargetIRAnalysis &&Arg)
Provides information about what library functions are available for the current target.
Base class for use as a mix-in that aids implementing a TargetTransformInfo-compatible class.
TargetTransformInfoWrapperPass()
We must provide a default constructor for the pass but it should never be used.
TargetTransformInfo & getTTI(const Function &F)
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
LLVM_ABI bool getTgtMemIntrinsic(IntrinsicInst *Inst, MemIntrinsicInfo &Info) const
LLVM_ABI Value * getOrCreateResultFromMemIntrinsic(IntrinsicInst *Inst, Type *ExpectedType, bool CanCreate=true) const
LLVM_ABI bool isLegalToVectorizeLoad(LoadInst *LI) const
LLVM_ABI std::optional< unsigned > getVScaleForTuning() const
LLVM_ABI uint64_t getMaxBoundedMemSetInlineSize() const
Returns the maximum length in bytes for which a memset with a non-constant length,...
static LLVM_ABI CastContextHint getCastContextHint(const Instruction *I)
Calculates a CastContextHint from I.
LLVM_ABI unsigned getMaxNumArgs() const
LLVM_ABI bool addrspacesMayAlias(unsigned AS0, unsigned AS1) const
Return false if a AS0 address cannot possibly alias a AS1 address.
LLVM_ABI bool isLegalMaskedScatter(Type *DataType, Align Alignment) const
Return true if the target supports masked scatter.
LLVM_ABI bool shouldBuildLookupTables() const
Return true if switches should be turned into lookup tables for the target.
LLVM_ABI VectorInstrContext getBuildVectorContextHint(ArrayRef< int > Mask, ArrayRef< Value * > Scalars, function_ref< bool(SmallVectorImpl< BuildVectorUseOp > &)> GatherUseOps) const
Calculates a VectorInstrContext for buildvector-like gather sequences.
LLVM_ABI bool isLegalToVectorizeStore(StoreInst *SI) const
LLVM_ABI bool areTypesABICompatible(const Function *Caller, const Function *Callee, ArrayRef< Type * > Types) const
LLVM_ABI bool enableAggressiveInterleaving(bool LoopHasReductions) const
Don't restrict interleaved unrolling to small loops.
LLVM_ABI bool isLegalSpeculativeLoad(Type *DataType, unsigned AddressSpace) const
Return true if the target supports speculatively loading DataType from address space AddressSpace,...
LLVM_ABI bool isMultiversionedFunction(const Function &F) const
Returns true if this is an instance of a function with multiple versions.
LLVM_ABI unsigned getMaxInterleaveFactor(ElementCount VF, bool HasUnorderedReductions) const
LLVM_ABI bool isFCmpOrdCheaperThanFCmpZero(Type *Ty) const
Return true if it is faster to check if a floating-point value is NaN (or not-NaN) versus a compariso...
LLVM_ABI bool isLegalMaskedStore(Type *DataType, Align Alignment, unsigned AddressSpace, MaskKind MaskKind=VariableOrConstantMask) const
Return true if the target supports masked store.
LLVM_ABI unsigned getMinimumLookupTableEntryBitWidth() const
Return the minimum bit width to use for integer switch lookup table elements on this target.
LLVM_ABI bool supportsEfficientVectorElementLoadStore() const
If target has efficient vector element load/store instructions, it can return true here so that inser...
LLVM_ABI unsigned getAssumedAddrSpace(const Value *V) const
LLVM_ABI bool preferAlternateOpcodeVectorization() const
LLVM_ABI bool shouldDropLSRSolutionIfLessProfitable() const
Return true if LSR should drop a found solution if it's calculated to be less profitable than the bas...
LLVM_ABI bool isLSRCostLess(const TargetTransformInfo::LSRCost &C1, const TargetTransformInfo::LSRCost &C2) const
Return true if LSR cost of C1 is lower than C2.
LLVM_ABI unsigned getPrefetchDistance() const
LLVM_ABI Type * getMemcpyLoopLoweringType(LLVMContext &Context, Value *Length, unsigned SrcAddrSpace, unsigned DestAddrSpace, Align SrcAlign, Align DestAlign, std::optional< uint32_t > AtomicElementSize=std::nullopt) const
LLVM_ABI bool isLegalMaskedExpandLoad(Type *DataType, Align Alignment) const
Return true if the target supports masked expand load.
LLVM_ABI bool prefersVectorizedAddressing() const
Return true if target doesn't mind addresses in vectors.
LLVM_ABI InstructionCost getCFInstrCost(unsigned Opcode, TTI::TargetCostKind CostKind, const Instruction *I=nullptr) const
LLVM_ABI bool hasBranchDivergence(const Function *F=nullptr) const
Return true if branch divergence exists.
LLVM_ABI bool preferEpilogueVectorization(ElementCount Iters) const
Return true if the loop vectorizer should consider vectorizing an otherwise scalar epilogue loop if t...
LLVM_ABI MemCmpExpansionOptions enableMemCmpExpansion(bool OptSize, bool IsZeroCmp) const
bool invalidate(Function &, const PreservedAnalyses &, FunctionAnalysisManager::Invalidator &)
Handle the invalidation of this information.
LLVM_ABI void getUnrollingPreferences(Loop *L, ScalarEvolution &, UnrollingPreferences &UP, OptimizationRemarkEmitter *ORE) const
Get target-customized preferences for the generic loop unrolling transformation.
LLVM_ABI bool shouldBuildLookupTablesForConstant(Constant *C) const
Return true if switches should be turned into lookup tables containing this constant value for the ta...
LLVM_ABI InstructionCost getGEPCost(Type *PointeeType, const Value *Ptr, ArrayRef< const Value * > Operands, TargetCostKind CostKind, Type *AccessType=nullptr) const
Estimate the cost of a GEP operation when lowered.
LLVM_ABI TailFoldingStyle getPreferredTailFoldingStyle() const
Query the target what the preferred style of tail folding is.
LLVM_ABI bool supportsTailCallFor(const CallBase *CB) const
If target supports tail call on CB.
LLVM_ABI std::optional< Instruction * > instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const
Targets can implement their own combinations for target-specific intrinsics.
LLVM_ABI bool isProfitableLSRChainElement(Instruction *I) const
LLVM_ABI TypeSize getRegisterBitWidth(RegisterKind K) const
MaskKind
Some targets only support masked load/store with a constant mask.
LLVM_ABI unsigned getInlineCallPenalty(const Function *F, const CallBase &Call, unsigned DefaultCallPenalty) const
Returns a penalty for invoking call Call in F.
LLVM_ABI InstructionCost getOperandsScalarizationOverhead(ArrayRef< Type * > Tys, TTI::TargetCostKind CostKind, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) const
Estimate the overhead of scalarizing operands with the given types.
LLVM_ABI bool hasActiveVectorLength() const
LLVM_ABI bool isExpensiveToSpeculativelyExecute(const Instruction *I) const
Return true if the cost of the instruction is too high to speculatively execute and should be kept be...
LLVM_ABI InstructionCost getMemoryOpCost(unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind, OperandValueInfo OpdInfo={OK_AnyValue, OP_None}, const Instruction *I=nullptr) const
LLVM_ABI bool isLegalMaskedGather(Type *DataType, Align Alignment) const
Return true if the target supports masked gather.
LLVM_ABI ValueUniformity getValueUniformity(const Value *V) const
Get target-specific uniformity information for a value.
static LLVM_ABI OperandValueInfo commonOperandInfo(const Value *X, const Value *Y)
Collect common data between two OperandValueInfo inputs.
LLVM_ABI InstructionCost getReplicationShuffleCost(Type *EltTy, int ReplicationFactor, int VF, const APInt &DemandedDstElts, TTI::TargetCostKind CostKind) const
LLVM_ABI bool allowVectorElementIndexingUsingGEP() const
Returns true if GEP should not be used to index into vectors for this target.
LLVM_ABI bool preferTailFoldingOverEpilogue(TailFoldingInfo *TFI) const
Query the target whether it would be preferred to create a tail-folded vector loop,...
LLVM_ABI std::optional< Value * > simplifyDemandedVectorEltsIntrinsic(InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function< void(Instruction *, unsigned, APInt, APInt &)> SimplifyAndSetOp) const
Can be used to implement target-specific instruction combining.
LLVM_ABI bool enableOrderedReductions() const
Return true if we should be enabling ordered reductions for the target.
InstructionCost getInstructionCost(const User *U, TargetCostKind CostKind) const
This is a helper function which calls the three-argument getInstructionCost with Operands which are t...
LLVM_ABI unsigned getInliningCostBenefitAnalysisProfitableMultiplier() const
LLVM_ABI bool hasMultiVectorLoadStore(unsigned NumVectors, MaskSource Mask, VectorType *VectorTy=nullptr, bool IsStore=false, std::optional< Instruction::CastOps > CastHint=std::nullopt) const
Return true if the target supports loading or storing NumVectors contiguous vectors of type VectorTy ...
LLVM_ABI InstructionCost getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, TTI::TargetCostKind CostKind) const
LLVM_ABI unsigned getAtomicMemIntrinsicMaxElementSize() const
LLVM_ABI InstructionCost getVectorInstrCost(unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index=-1, const Value *Op0=nullptr, const Value *Op1=nullptr, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) const
LLVM_ABI std::pair< KnownBits, KnownBits > computeKnownBitsAddrSpaceCast(unsigned ToAS, const Value &PtrOp) const
LLVM_ABI bool LSRWithInstrQueries() const
Return true if the loop strength reduce pass should make Instruction* based TTI queries to isLegalAdd...
LLVM_ABI unsigned getStoreVectorFactor(unsigned VF, unsigned StoreSize, unsigned ChainSizeInBytes, VectorType *VecTy) const
LLVM_ABI VPLegalization getVPLegalizationStrategy(const VPIntrinsic &PI) const
static LLVM_ABI PartialReductionExtendKind getPartialReductionExtendKind(Instruction *I)
Get the kind of extension that an instruction represents.
LLVM_ABI InstructionCost getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy, CmpInst::Predicate VecPred, TTI::TargetCostKind CostKind, OperandValueInfo Op1Info={OK_AnyValue, OP_None}, OperandValueInfo Op2Info={OK_AnyValue, OP_None}, const Instruction *I=nullptr) const
LLVM_ABI bool shouldConsiderVectorizationRegPressure() const
LLVM_ABI bool enableWritePrefetching() const
LLVM_ABI bool shouldTreatInstructionLikeSelect(const Instruction *I) const
Should the Select Optimization pass treat the given instruction like a select, potentially converting...
LLVM_ABI bool isNoopAddrSpaceCast(unsigned FromAS, unsigned ToAS) const
LLVM_ABI bool shouldMaximizeVectorBandwidth(TargetTransformInfo::RegisterKind K) const
LLVM_ABI InstructionCost getShuffleCost(ShuffleKind Kind, VectorType *DstTy, VectorType *SrcTy, TTI::TargetCostKind CostKind, ArrayRef< int > Mask={}, int Index=0, VectorType *SubTp=nullptr, ArrayRef< const Value * > Args={}, const Instruction *CtxI=nullptr, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) const
LLVM_ABI bool isLegalToVectorizeStoreChain(unsigned ChainSizeInBytes, Align Alignment, unsigned AddrSpace) const
LLVM_ABI bool isLegalInterleavedAccessType(VectorType *VTy, unsigned Factor, Align Alignment, unsigned AddrSpace) const
Return true is the target supports interleaved access for the given vector type VTy,...
LLVM_ABI unsigned getRegUsageForType(Type *Ty) const
Returns the estimated number of registers required to represent Ty.
LLVM_ABI bool isLegalBroadcastLoad(Type *ElementTy, ElementCount NumElements) const
\Returns true if the target supports broadcasting a load to a vector of type <NumElements x ElementTy...
LLVM_ABI bool isIndexedStoreLegal(enum MemIndexedMode Mode, Type *Ty) const
LLVM_ABI std::pair< const Value *, unsigned > getPredicatedAddrSpace(const Value *V) const
static LLVM_ABI TargetTransformInfo::VectorInstrContext combineVectorInstrContexts(TargetTransformInfo::VectorInstrContext Ctx1, TargetTransformInfo::VectorInstrContext Ctx2)
Combines 2 context hints into a single value.
LLVM_ABI unsigned getLoadStoreVecRegBitWidth(unsigned AddrSpace) const
LLVM_ABI InstructionCost getRegisterClassReloadCost(unsigned ClassID, TargetCostKind CostKind) const
LLVM_ABI ReductionShuffle getPreferredExpandedReductionShuffle(const IntrinsicInst *II) const
static LLVM_ABI OperandValueInfo getOperandInfo(const Value *V)
Collect properties of V used in cost analysis, e.g. OP_PowerOf2.
LLVM_ABI InstructionCost getInterleavedMemoryOpCost(unsigned Opcode, Type *VecTy, unsigned Factor, ArrayRef< unsigned > Indices, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind, bool UseMaskForCond=false, bool UseMaskForGaps=false) const
LLVM_ABI InstructionCost getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src, TTI::CastContextHint CCH, TTI::TargetCostKind CostKind, const Instruction *I=nullptr) const
LLVM_ABI unsigned getAddressSpaceJoin(unsigned AS1, unsigned AS2) const
Return the most specific common address space containing AS1 and AS2.
LLVM_ABI unsigned getRegisterClassForType(bool Vector, Type *Ty=nullptr) const
LLVM_ABI bool isLegalAddressingMode(Type *Ty, GlobalValue *BaseGV, int64_t BaseOffset, bool HasBaseReg, int64_t Scale, unsigned AddrSpace=0, Instruction *I=nullptr, int64_t ScalableOffset=0) const
Return true if the addressing mode represented by AM is legal for this target, for a load/store of th...
LLVM_ABI PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) const
Return hardware support for population count.
LLVM_ABI unsigned getEstimatedNumberOfCaseClusters(const SwitchInst &SI, unsigned &JTSize, ProfileSummaryInfo *PSI, BlockFrequencyInfo *BFI) const
LLVM_ABI bool isElementTypeLegalForScalableVector(Type *Ty) const
LLVM_ABI bool forceScalarizeMaskedGather(VectorType *Type, Align Alignment) const
Return true if the target forces scalarizing of llvm.masked.gather intrinsics.
LLVM_ABI InstructionCost getArithmeticReductionCost(unsigned Opcode, VectorType *Ty, std::optional< FastMathFlags > FMF, TTI::TargetCostKind CostKind) const
Calculate the cost of vector reduction intrinsics.
LLVM_ABI unsigned getMaxPrefetchIterationsAhead() const
LLVM_ABI bool canHaveNonUndefGlobalInitializerInAddressSpace(unsigned AS) const
Return true if globals in this address space can have initializers other than undef.
LLVM_ABI ElementCount getMinimumVF(unsigned ElemWidth, bool IsScalable) const
LLVM_ABI InstructionCost getIntImmCostIntrin(Intrinsic::ID IID, unsigned Idx, const APInt &Imm, Type *Ty, TargetCostKind CostKind) const
LLVM_ABI bool enableMaskedInterleavedAccessVectorization() const
Enable matching of interleaved access groups that contain predicated accesses or gaps and therefore v...
LLVM_ABI InstructionCost getIntImmCostInst(unsigned Opc, unsigned Idx, const APInt &Imm, Type *Ty, TargetCostKind CostKind, Instruction *Inst=nullptr) const
Return the expected cost of materialization for the given integer immediate of the specified type for...
LLVM_ABI bool isLegalStridedLoadStore(Type *DataType, Align Alignment) const
Return true if the target supports strided load.
LLVM_ABI TargetTransformInfo & operator=(TargetTransformInfo &&RHS)
LLVM_ABI InstructionCost getExtendedReductionCost(unsigned Opcode, bool IsUnsigned, Type *ResTy, VectorType *Ty, std::optional< FastMathFlags > FMF, TTI::TargetCostKind CostKind) const
Calculate the cost of an extended reduction pattern, similar to getArithmeticReductionCost of a reduc...
TargetCostKind
The kind of cost model.
@ TCK_RecipThroughput
Reciprocal throughput.
@ TCK_CodeSize
Instruction code size.
@ TCK_SizeAndLatency
The weighted sum of size and latency.
@ TCK_Latency
The latency of instruction.
LLVM_ABI bool enableSelectOptimize() const
Should the Select Optimization pass be enabled and ran.
LLVM_ABI bool collectFlatAddressOperands(SmallVectorImpl< int > &OpIndexes, Intrinsic::ID IID) const
Return any intrinsic address operand indexes which may be rewritten if they use a flat address space ...
OperandValueProperties
Additional properties of an operand's values.
LLVM_ABI int getInliningLastCallToStaticBonus() const
LLVM_ABI bool isIndexedLoadLegal(enum MemIndexedMode Mode, Type *Ty) const
LLVM_ABI InstructionCost getCallInstrCost(Function *F, Type *RetTy, ArrayRef< Type * > Tys, TTI::TargetCostKind CostKind) const
LLVM_ABI unsigned getMaximumVF(unsigned ElemWidth, unsigned Opcode) const
LLVM_ABI unsigned getStoreMinimumVF(unsigned VF, Type *ScalarMemTy, Type *ScalarValTy, Align Alignment, unsigned AddrSpace) const
LLVM_ABI bool isLegalICmpImmediate(int64_t Imm) const
Return true if the specified immediate is legal icmp immediate, that is the target has icmp instructi...
LLVM_ABI bool isTypeLegal(Type *Ty) const
Return true if this type is legal.
static bool requiresOrderedReduction(std::optional< FastMathFlags > FMF)
A helper function to determine the type of reduction algorithm used for a given Opcode and set of Fas...
LLVM_ABI bool isLegalToVectorizeReduction(const RecurrenceDescriptor &RdxDesc, ElementCount VF) const
LLVM_ABI std::optional< unsigned > getCacheAssociativity(CacheLevel Level) const
LLVM_ABI bool isLegalNTLoad(Type *DataType, Align Alignment) const
Return true if the target supports nontemporal load.
LLVM_ABI bool isUniform(const Instruction *I, const SmallBitVector &UniformArgs) const
Determine if an instruction with Custom uniformity can be proven uniform based on which operands are ...
LLVM_ABI InstructionCost getMemcpyCost(const Instruction *I) const
LLVM_ABI unsigned adjustInliningThreshold(const CallBase *CB) const
LLVM_ABI bool isLegalAddImmediate(int64_t Imm) const
Return true if the specified immediate is legal add immediate, that is the target has add instruction...
LLVM_ABI bool isTargetIntrinsicWithStructReturnOverloadAtField(Intrinsic::ID ID, int RetIdx) const
Identifies if the vector form of the intrinsic that returns a struct is overloaded at the struct elem...
LLVM_ABI unsigned getLoadVectorFactor(unsigned VF, unsigned LoadSize, unsigned ChainSizeInBytes, VectorType *VecTy) const
LLVM_ABI InstructionCost getMemIntrinsicInstrCost(const MemIntrinsicCostAttributes &MICA, TTI::TargetCostKind CostKind) const
LLVM_ABI InstructionCost getMinMaxReductionCost(Intrinsic::ID IID, VectorType *Ty, FastMathFlags FMF, TTI::TargetCostKind CostKind) const
LLVM_ABI Value * rewriteIntrinsicWithAddressSpace(IntrinsicInst *II, Value *OldV, Value *NewV) const
Rewrite intrinsic call II such that OldV will be replaced with NewV, which has a different address sp...
LLVM_ABI InstructionCost getCostOfKeepingLiveOverCall(ArrayRef< Type * > Tys) const
LLVM_ABI bool canSaveCmp(Loop *L, CondBrInst **BI, ScalarEvolution *SE, LoopInfo *LI, DominatorTree *DT, AssumptionCache *AC, TargetLibraryInfo *LibInfo) const
Return true if the target can save a compare for loop count, for example hardware loop saves a compar...
LLVM_ABI unsigned getMinPrefetchStride(unsigned NumMemAccesses, unsigned NumStridedMemAccesses, unsigned NumPrefetches, bool HasCall) const
Some HW prefetchers can handle accesses up to a certain constant stride.
LLVM_ABI bool shouldPrefetchAddressSpace(unsigned AS) const
LLVM_ABI InstructionCost getIntImmCost(const APInt &Imm, Type *Ty, TargetCostKind CostKind) const
Return the expected cost of materializing for the given integer immediate of the specified type.
LLVM_ABI unsigned getMinVectorRegisterBitWidth() const
LLVM_ABI InstructionCost getAddressComputationCost(Type *PtrTy, ScalarEvolution *SE, const SCEV *Ptr, TTI::TargetCostKind CostKind) const
LLVM_ABI bool isLegalNTStore(Type *DataType, Align Alignment) const
Return true if the target supports nontemporal store.
LLVM_ABI unsigned getFlatAddressSpace() const
Returns the address space ID for a target's 'flat' address space.
LLVM_ABI bool preferToKeepConstantsAttached(const Instruction &Inst, const Function &Fn) const
It can be advantageous to detach complex constants from their uses to make their generation cheaper.
LLVM_ABI bool hasArmWideBranch(bool Thumb) const
LLVM_ABI const char * getRegisterClassName(unsigned ClassID) const
MaskSource
Enum describing the source/producer of a mask.
@ ArbitraryPredicate
The operation is masked with an arbitrary predicate.
@ ActiveLaneMask
The operation is masked with a contiguous active lane mask.
LLVM_ABI bool shouldConsiderAddressTypePromotion(const Instruction &I, bool &AllowPromotionWithoutCommonHeader) const
LLVM_ABI APInt getPriorityMask(const Function &F) const
Returns a bitmask constructed from the target-features or fmv-features metadata of a function corresp...
LLVM_ABI BranchProbability getPredictableBranchThreshold() const
If a branch or a select condition is skewed in one direction by more than this factor,...
LLVM_ABI TargetTransformInfo(std::unique_ptr< const TargetTransformInfoImplBase > Impl)
Construct a TTI object using a type implementing the Concept API below.
LLVM_ABI bool preferInLoopReduction(RecurKind Kind, Type *Ty) const
LLVM_ABI unsigned getCallerAllocaCost(const CallBase *CB, const AllocaInst *AI) const
LLVM_ABI bool hasConditionalLoadStoreForType(Type *Ty, bool IsStore) const
LLVM_ABI InstructionCost getMulAccReductionCost(bool IsUnsigned, unsigned RedOpcode, Type *ResTy, VectorType *Ty, TTI::TargetCostKind CostKind) const
Calculate the cost of an extended reduction pattern, similar to getArithmeticReductionCost of an Add/...
LLVM_ABI unsigned getCacheLineSize() const
LLVM_ABI bool allowsMisalignedMemoryAccesses(LLVMContext &Context, unsigned BitWidth, unsigned AddressSpace=0, Align Alignment=Align(1), unsigned *Fast=nullptr) const
Determine if the target supports unaligned memory accesses.
LLVM_ABI InstructionCost getAltInstrCost(VectorType *VecTy, unsigned Opcode0, unsigned Opcode1, const SmallBitVector &OpcodeMask, TTI::TargetCostKind CostKind, ArrayRef< const Value * > Scalars={}) const
Returns the cost estimation for alternating opcode pattern that can be lowered to a single instructio...
LLVM_ABI bool shouldCopyAttributeWhenOutliningFrom(const Function *Caller, const Attribute &Attr) const
LLVM_ABI APInt getAddrSpaceCastPreservedPtrMask(unsigned SrcAS, unsigned DstAS) const
Returns a mask indicating which bits of a pointer remain unchanged when casting between address space...
LLVM_ABI int getInlinerVectorBonusPercent() const
LLVM_ABI unsigned getEpilogueVectorizationMinVF() const
LLVM_ABI void collectKernelLaunchBounds(const Function &F, SmallVectorImpl< std::pair< StringRef, int64_t > > &LB) const
Collect kernel launch bounds for F into LB.
PopcntSupportKind
Flags indicating the kind of support for population count.
LLVM_ABI bool preferPredicatedReductionSelect() const
LLVM_ABI InstructionCost getIntImmCodeSizeCost(unsigned Opc, unsigned Idx, const APInt &Imm, Type *Ty) const
Return the expected cost for the given integer when optimising for size.
LLVM_ABI AddressingModeKind getPreferredAddressingMode(const Loop *L, ScalarEvolution *SE) const
Return the preferred addressing mode LSR should make efforts to generate.
LLVM_ABI bool isLoweredToCall(const Function *F) const
Test whether calls to a function lower to actual program function calls.
llvm::VectorInstrContext VectorInstrContext
LLVM_ABI bool isLegalToVectorizeLoadChain(unsigned ChainSizeInBytes, Align Alignment, unsigned AddrSpace) const
LLVM_ABI bool isHardwareLoopProfitable(Loop *L, ScalarEvolution &SE, AssumptionCache &AC, TargetLibraryInfo *LibInfo, HardwareLoopInfo &HWLoopInfo) const
Query the target whether it would be profitable to convert the given loop into a hardware loop.
LLVM_ABI unsigned getInliningThresholdMultiplier() const
LLVM_ABI InstructionCost getBranchMispredictPenalty() const
Returns estimated penalty of a branch misprediction in latency.
LLVM_ABI unsigned getNumberOfRegisters(unsigned ClassID) const
LLVM_ABI bool isProfitableToHoist(Instruction *I) const
Return true if it is profitable to hoist instruction in the then/else to before if.
LLVM_ABI bool supportsScalableVectors() const
LLVM_ABI bool hasVolatileVariant(Instruction *I, unsigned AddrSpace) const
Return true if the given instruction (assumed to be a memory access instruction) has a volatile varia...
LLVM_ABI bool isLegalMaskedCompressStore(Type *DataType, Align Alignment) const
Return true if the target supports masked compress store.
LLVM_ABI std::optional< unsigned > getMinPageSize() const
LLVM_ABI bool preferSLPInstCountCheck() const
LLVM_ABI bool isFPVectorizationPotentiallyUnsafe() const
Indicate that it is potentially unsafe to automatically vectorize floating-point operations because t...
LLVM_ABI InstructionCost getInsertExtractValueCost(unsigned Opcode, TTI::TargetCostKind CostKind) const
LLVM_ABI bool shouldBuildRelLookupTables() const
Return true if lookup tables should be turned into relative lookup tables.
LLVM_ABI std::optional< unsigned > getCacheSize(CacheLevel Level) const
LLVM_ABI std::optional< Value * > simplifyDemandedUseBitsIntrinsic(InstCombiner &IC, IntrinsicInst &II, APInt DemandedMask, KnownBits &Known, bool &KnownBitsComputed) const
Can be used to implement target-specific instruction combining.
LLVM_ABI InstructionCost getArithmeticInstrCost(unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind, TTI::OperandValueInfo Opd1Info={TTI::OK_AnyValue, TTI::OP_None}, TTI::OperandValueInfo Opd2Info={TTI::OK_AnyValue, TTI::OP_None}, ArrayRef< const Value * > Args={}, const Instruction *CtxI=nullptr, const TargetLibraryInfo *TLibInfo=nullptr) const
This is an approximation of reciprocal throughput of a math/logic op.
LLVM_ABI bool isLegalAddScalableImmediate(int64_t Imm) const
Return true if adding the specified scalable immediate is legal, that is the target has add instructi...
LLVM_ABI bool isTargetIntrinsicWithScalarOpAtArg(Intrinsic::ID ID, unsigned ScalarOpdIdx) const
Identifies if the vector form of the intrinsic has a scalar operand.
LLVM_ABI bool hasDivRemOp(Type *DataType, bool IsSigned) const
Return true if the target has a unified operation to calculate division and remainder.
TargetCostConstants
Underlying constants for 'cost' values in this interface.
@ TCC_Expensive
The cost of a 'div' instruction on x86.
@ TCC_Free
Expected to fold away in lowering.
@ TCC_Basic
The cost of a typical 'add' instruction.
LLVM_ABI bool enableInterleavedAccessVectorization() const
Enable matching of interleaved access groups.
LLVM_ABI unsigned getMinTripCountTailFoldingThreshold() const
LLVM_ABI InstructionCost getPartialReductionCost(unsigned Opcode, Type *InputTypeA, Type *InputTypeB, Type *AccumType, ElementCount VF, PartialReductionExtendKind OpAExtend, PartialReductionExtendKind OpBExtend, std::optional< unsigned > BinOp, TTI::TargetCostKind CostKind, std::optional< FastMathFlags > FMF) const
LLVM_ABI InstructionCost getInstructionCost(const User *U, ArrayRef< const Value * > Operands, TargetCostKind CostKind) const
Estimate the cost of a given IR user when lowered.
LLVM_ABI bool enableScalableVectorization() const
LLVM_ABI bool useFastCCForInternalCall(Function &F) const
Return true if the input function is internal, should use fastcc calling convention.
LLVM_ABI bool isVectorShiftByScalarCheap(Type *Ty) const
Return true if it's significantly cheaper to shift a vector by a uniform scalar than by an amount whi...
LLVM_ABI bool isNumRegsMajorCostOfLSR() const
Return true if LSR major cost is number of registers.
LLVM_ABI unsigned getInliningCostBenefitAnalysisSavingsMultiplier() const
LLVM_ABI bool isLegalMaskedVectorHistogram(Type *AddrType, Type *DataType) const
LLVM_ABI unsigned getGISelRematGlobalCost() const
static LLVM_ABI Instruction::CastOps getOpcodeForPartialReductionExtendKind(PartialReductionExtendKind Kind)
Get the cast opcode for an extension kind.
MemIndexedMode
The type of load/store indexing.
LLVM_ABI bool isLegalMaskedLoad(Type *DataType, Align Alignment, unsigned AddressSpace, MaskKind MaskKind=VariableOrConstantMask) const
Return true if the target supports masked load.
LLVM_ABI InstructionCost getIndexedVectorInstrCostFromEnd(unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index) const
LLVM_ABI bool isProfitableToSinkOperands(Instruction *I, SmallVectorImpl< Use * > &Ops, const LoopInfo *LI=nullptr) const
Return true if sinking I's operands to the same basic block as I is profitable, e....
LLVM_ABI bool areInlineCompatible(const Function *Caller, const Function *Callee) const
LLVM_ABI bool useColdCCForColdCall(Function &F) const
Return true if the input function which is cold at all call sites, should use coldcc calling conventi...
LLVM_ABI InstructionCost getFPOpCost(Type *Ty) const
Return the expected cost of supporting the floating point operation of the specified type.
LLVM_ABI bool supportsTailCalls() const
If the target supports tail calls.
LLVM_ABI bool canMacroFuseCmp() const
Return true if the target can fuse a compare and branch.
LLVM_ABI bool isValidAddrSpaceCast(unsigned FromAS, unsigned ToAS) const
Query the target whether the specified address space cast from FromAS to ToAS is valid.
LLVM_ABI unsigned getNumberOfParts(Type *Tp) const
AddressingModeKind
Which addressing mode Loop Strength Reduction will try to generate.
@ AMK_PostIndexed
Prefer post-indexed addressing mode.
@ AMK_All
Consider all addressing modes.
@ AMK_PreIndexed
Prefer pre-indexed addressing mode.
@ AMK_None
Don't prefer any addressing mode.
LLVM_ABI bool preferLoopExitWithEqualityComparison(const ICmpInst &Cond, const APInt &PostIncExitValue) const
Return true if replacing the relational loop exit comparison Cond with an equality comparison against...
LLVM_ABI InstructionCost getScalingFactorCost(Type *Ty, GlobalValue *BaseGV, StackOffset BaseOffset, bool HasBaseReg, int64_t Scale, unsigned AddrSpace=0) const
Return the cost of the scaling factor used in the addressing mode represented by AM for this target,...
LLVM_ABI bool isTruncateFree(Type *Ty1, Type *Ty2) const
Return true if it's free to truncate a value of type Ty1 to type Ty2.
LLVM_ABI void getMemcpyLoopResidualLoweringType(SmallVectorImpl< Type * > &OpsOut, LLVMContext &Context, unsigned RemainingBytes, unsigned SrcAddrSpace, unsigned DestAddrSpace, Align SrcAlign, Align DestAlign, std::optional< uint32_t > AtomicCpySize=std::nullopt) const
LLVM_ABI bool forceScalarizeMaskedScatter(VectorType *Type, Align Alignment) const
Return true if the target forces scalarizing of llvm.masked.scatter intrinsics.
LLVM_ABI bool isTargetIntrinsicWithOverloadTypeAtArg(Intrinsic::ID ID, int OpdIdx) const
Identifies if the vector form of the intrinsic is overloaded on the type of the operand at index OpdI...
static LLVM_ABI VectorInstrContext getVectorInstrContextHint(const Instruction *I)
Calculates a VectorInstrContext from I.
LLVM_ABI InstructionCost getPointersChainCost(ArrayRef< const Value * > Ptrs, const Value *Base, const PointersChainInfo &Info, Type *AccessTy, const TargetCostKind CostKind) const
Estimate the cost of a chain of pointers (typically pointer operands of a chain of loads or stores wi...
LLVM_ABI bool haveFastSqrt(Type *Ty) const
Return true if the hardware has a fast square-root instruction.
LLVM_ABI bool shouldExpandReduction(const IntrinsicInst *II) const
LLVM_ABI InstructionCost getScalarizationOverhead(VectorType *Ty, const APInt &DemandedElts, bool Insert, bool Extract, TTI::TargetCostKind CostKind, bool ForPoisonSrc=true, ArrayRef< Value * > VL={}, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) const
Estimate the overhead of scalarizing an instruction.
LLVM_ABI uint64_t getMaxMemIntrinsicInlineSizeThreshold() const
Returns the maximum memset / memcpy size in bytes that still makes it profitable to inline the call.
LLVM_ABI bool isLegalAltInstr(VectorType *VecTy, unsigned Opcode0, unsigned Opcode1, const SmallBitVector &OpcodeMask, ArrayRef< const Value * > Scalars={}) const
Return true if this is an alternating opcode pattern that can be lowered to a single instruction on t...
ShuffleKind
The various kinds of shuffle patterns for vector queries.
@ SK_InsertSubvector
InsertSubvector. Index indicates start offset.
@ SK_Select
Selects elements from the corresponding lane of either source operand.
@ SK_PermuteSingleSrc
Shuffle elements of single source vector with any shuffle mask.
@ SK_Transpose
Transpose two vectors.
@ SK_Splice
Concatenates elements from the first input vector with elements of the second input vector.
@ SK_Broadcast
Broadcast element 0 to all other elements.
@ SK_PermuteTwoSrc
Merge elements from two source vectors into one with any shuffle mask.
@ SK_Reverse
Reverse the order of the vector.
@ SK_ExtractSubvector
ExtractSubvector Index indicates start offset.
LLVM_ABI APInt getFeatureMask(const Function &F) const
Returns a bitmask constructed from the target-features or fmv-features metadata of a function corresp...
LLVM_ABI void getPeelingPreferences(Loop *L, ScalarEvolution &SE, PeelingPreferences &PP) const
Get target-customized preferences for the generic loop peeling transformation.
CastContextHint
Represents a hint about the context in which a cast is used.
@ Reversed
The cast is used with a reversed load/store.
@ Masked
The cast is used with a masked load/store.
@ Normal
The cast is used with a normal load/store.
@ Interleave
The cast is used with an interleaved load/store.
@ GatherScatter
The cast is used with a gather/scatter.
LLVM_ABI InstructionCost getExtractWithExtendCost(unsigned Opcode, Type *Dst, VectorType *VecTy, unsigned Index, TTI::TargetCostKind CostKind) const
LLVM_ABI InstructionCost getRegisterClassSpillCost(unsigned ClassID, TargetCostKind CostKind) const
OperandValueKind
Additional information about an operand's possible values.
CacheLevel
The possible cache levels.
LLVM_ABI bool preferFixedOverScalableIfEqualCost() const
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
This is the common base class for vector predication intrinsics.
LLVM Value Representation.
Definition Value.h:75
Base class of all SIMD vector types.
An efficient, type-erasing, non-owning reference to a callable.
CallInst * Call
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
@ Length
Definition DWP.cpp:577
InstructionCost Cost
@ Known
Known to have no common set bits.
VectorInstrContext
Represents a hint about the context in which a vector instruction or intrinsic is used.
@ None
The instruction is not folded.
@ BinaryOp
One of the operands is a binary op.
@ SplatOpFolded
All of the value's users support splatting the value.
@ Load
The value being inserted comes from a load (InsertElement only).
@ Store
The extracted value is stored (ExtractElement only).
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
AtomicOrdering
Atomic ordering for LLVM's memory model.
TargetTransformInfo TTI
LLVM_ABI ImmutablePass * createTargetTransformInfoWrapperPass(TargetIRAnalysis TIRA)
Create an analysis pass wrapper around a TTI object.
RecurKind
These are the kinds of recurrences that we support.
@ Fast
Assign the register banks as fast as possible (default).
ArrayRef(const T &OneElt) -> ArrayRef< T >
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:1933
@ DataWithEVL
Use predicated EVL instructions for tail-folding.
@ DataAndControlFlow
Use predicate to control both data and control flow.
@ DataWithoutLaneMask
Same as Data, but avoids using the get.active.lane.mask intrinsic to calculate the mask and instead i...
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
ValueUniformity
Enum describing how values behave with respect to uniformity and divergence, to answer the question: ...
Definition Uniformity.h:18
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:878
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
A CRTP mix-in that provides informational APIs needed for analysis passes.
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition Analysis.h:29
Costs for each cost kind in a target cost table.
std::optional< unsigned > operator[](TargetTransformInfo::TargetCostKind Kind) const
Attributes of a target dependent hardware loop.
LLVM_ABI bool canAnalyze(LoopInfo &LI)
LLVM_ABI bool isHardwareLoopCandidate(ScalarEvolution &SE, LoopInfo &LI, DominatorTree &DT, bool ForceNestedLoop=false, bool ForceHardwareLoopPHI=false)
Information about a load/store intrinsic defined by the target.
SmallVector< InterestingMemoryOperand, 1 > InterestingOperands
Value * PtrVal
This is the pointer that the intrinsic is loading from or storing to.
InterleavedAccessInfo * IAI
TailFoldingInfo(TargetLibraryInfo *TLI, LoopVectorizationLegality *LVL, InterleavedAccessInfo *IAI)
TargetLibraryInfo * TLI
LoopVectorizationLegality * LVL
BuildVectorUseOp(unsigned Opcode, Intrinsic::ID IntrinsicID, int OperandIndex)
unsigned Insns
TODO: Some of these could be merged.
Returns options for expansion of memcmp. IsZeroCmp is.
OperandValueInfo mergeWith(const OperandValueInfo OpInfoY)
bool AllowPeeling
Allow peeling off loop iterations.
bool AllowLoopNestsPeeling
Allow peeling off loop iterations for loop nests.
bool PeelLast
Peel off the last PeelCount loop iterations.
bool PeelProfiledIterations
Allow peeling basing on profile.
unsigned PeelCount
A forced peeling factor (the number of bodied of the original loop that should be peeled off before t...
Describe known properties for a set of pointers.
unsigned IsKnownStride
True if distance between any two neigbouring pointers is a known value.
unsigned IsUnitStride
These properties only valid if SameBaseAddress is set.
unsigned IsSameBaseAddress
All the GEPs in a set have same base address.
Parameters that control the generic loop unrolling transformation.
bool UpperBound
Allow using trip count upper bound to unroll loops.
unsigned Threshold
The cost threshold for the unrolled loop.
bool Force
Apply loop unroll on any kind of loop (mainly to loops that fail runtime unrolling).
unsigned PartialOptSizeThreshold
The cost threshold for the unrolled loop when optimizing for size, like OptSizeThreshold,...
bool UnrollVectorizedLoop
Disable runtime unrolling by default for vectorized loops.
unsigned DefaultUnrollRuntimeCount
Default unroll count for loops with run-time trip count.
unsigned MaxPercentThresholdBoost
If complete unrolling will reduce the cost of the loop, we will boost the Threshold by a certain perc...
bool RuntimeUnrollMultiExit
Allow runtime unrolling multi-exit loops.
unsigned SCEVExpansionBudget
Don't allow runtime unrolling if expanding the trip count takes more than SCEVExpansionBudget.
bool AddAdditionalAccumulators
Allow unrolling to add parallel reduction phis.
unsigned UnrollAndJamInnerLoopThreshold
Threshold for unroll and jam, for inner loop size.
unsigned MaxIterationsCountToAnalyze
Don't allow loop unrolling to simulate more than this number of iterations when checking full unroll ...
bool AllowRemainder
Allow generation of a loop remainder (extra iterations after unroll).
bool UnrollAndJam
Allow unroll and jam. Used to enable unroll and jam for the target.
bool UnrollRemainder
Allow unrolling of all the iterations of the runtime loop remainder.
unsigned FullUnrollMaxCount
Set the maximum unrolling factor for full unrolling.
unsigned PartialThreshold
The cost threshold for the unrolled loop, like Threshold, but used for partial/runtime unrolling (set...
bool Runtime
Allow runtime unrolling (unrolling of loops to expand the size of the loop body even when the number ...
bool Partial
Allow partial unrolling (unrolling of loops to expand the size of the loop body, not only to eliminat...
unsigned OptSizeThreshold
The cost threshold for the unrolled loop when optimizing for size (set to UINT_MAX to disable).
bool AllowExpensiveTripCount
Allow emitting expensive instructions (such as divisions) when computing the trip count of a loop for...
unsigned MaxUpperBound
Set the maximum upper bound of trip count.
VPLegalization(VPTransform EVLParamStrategy, VPTransform OpStrategy)