LLVM 22.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"
27#include "llvm/IR/FMF.h"
28#include "llvm/IR/InstrTypes.h"
29#include "llvm/IR/PassManager.h"
30#include "llvm/Pass.h"
35#include <functional>
36#include <optional>
37#include <utility>
38
39namespace llvm {
40
41namespace Intrinsic {
42typedef unsigned ID;
43}
44
45class AllocaInst;
46class AssumptionCache;
47class BlockFrequencyInfo;
48class DominatorTree;
49class BranchInst;
50class Function;
51class GlobalValue;
52class InstCombiner;
53class OptimizationRemarkEmitter;
54class InterleavedAccessInfo;
55class IntrinsicInst;
56class LoadInst;
57class Loop;
58class LoopInfo;
59class LoopVectorizationLegality;
60class ProfileSummaryInfo;
61class RecurrenceDescriptor;
62class SCEV;
63class ScalarEvolution;
64class SmallBitVector;
65class StoreInst;
66class SwitchInst;
67class TargetLibraryInfo;
68class Type;
69class VPIntrinsic;
70struct KnownBits;
71
72/// Information about a load/store intrinsic defined by the target.
74 /// This is the pointer that the intrinsic is loading from or storing to.
75 /// If this is non-null, then analysis/optimization passes can assume that
76 /// this intrinsic is functionally equivalent to a load/store from this
77 /// pointer.
78 Value *PtrVal = nullptr;
79
80 // Ordering for atomic operations.
82
83 // Same Id is set by the target for corresponding load/store intrinsics.
84 unsigned short MatchingId = 0;
85
86 bool ReadMem = false;
87 bool WriteMem = false;
88 bool IsVolatile = false;
89
90 bool isUnordered() const {
94 }
95};
96
97/// Attributes of a target dependent hardware loop.
99 HardwareLoopInfo() = delete;
101 Loop *L = nullptr;
104 const SCEV *ExitCount = nullptr;
106 Value *LoopDecrement = nullptr; // Decrement the loop counter by this
107 // value in every iteration.
108 bool IsNestingLegal = false; // Can a hardware loop be a parent to
109 // another hardware loop?
110 bool CounterInReg = false; // Should loop counter be updated in
111 // the loop via a phi?
112 bool PerformEntryTest = false; // Generate the intrinsic which also performs
113 // icmp ne zero on the loop counter value and
114 // produces an i1 to guard the loop entry.
116 DominatorTree &DT,
117 bool ForceNestedLoop = false,
118 bool ForceHardwareLoopPHI = false);
119 LLVM_ABI bool canAnalyze(LoopInfo &LI);
120};
121
123 const IntrinsicInst *II = nullptr;
124 Type *RetTy = nullptr;
125 Intrinsic::ID IID;
126 SmallVector<Type *, 4> ParamTys;
128 FastMathFlags FMF;
129 // If ScalarizationCost is UINT_MAX, the cost of scalarizing the
130 // arguments and the return value will be computed based on types.
131 InstructionCost ScalarizationCost = InstructionCost::getInvalid();
132 TargetLibraryInfo const *LibInfo = nullptr;
133
134public:
136 Intrinsic::ID Id, const CallBase &CI,
138 bool TypeBasedOnly = false, TargetLibraryInfo const *LibInfo = nullptr);
139
141 Intrinsic::ID Id, Type *RTy, ArrayRef<Type *> Tys,
142 FastMathFlags Flags = FastMathFlags(), const IntrinsicInst *I = nullptr,
144
147
151 const IntrinsicInst *I = nullptr,
153 TargetLibraryInfo const *LibInfo = nullptr);
154
155 Intrinsic::ID getID() const { return IID; }
156 const IntrinsicInst *getInst() const { return II; }
157 Type *getReturnType() const { return RetTy; }
158 FastMathFlags getFlags() const { return FMF; }
159 InstructionCost getScalarizationCost() const { return ScalarizationCost; }
161 const SmallVectorImpl<Type *> &getArgTypes() const { return ParamTys; }
162 const TargetLibraryInfo *getLibInfo() const { return LibInfo; }
163
164 bool isTypeBasedOnly() const {
165 return Arguments.empty();
166 }
167
168 bool skipScalarizationCost() const { return ScalarizationCost.isValid(); }
169};
170
172 /// Don't use tail folding
173 None,
174 /// Use predicate only to mask operations on data in the loop.
175 /// When the VL is not known to be a power-of-2, this method requires a
176 /// runtime overflow check for the i + VL in the loop because it compares the
177 /// scalar induction variable against the tripcount rounded up by VL which may
178 /// overflow. When the VL is a power-of-2, both the increment and uprounded
179 /// tripcount will overflow to 0, which does not require a runtime check
180 /// since the loop is exited when the loop induction variable equals the
181 /// uprounded trip-count, which are both 0.
182 Data,
183 /// Same as Data, but avoids using the get.active.lane.mask intrinsic to
184 /// calculate the mask and instead implements this with a
185 /// splat/stepvector/cmp.
186 /// FIXME: Can this kind be removed now that SelectionDAGBuilder expands the
187 /// active.lane.mask intrinsic when it is not natively supported?
189 /// Use predicate to control both data and control flow.
190 /// This method always requires a runtime overflow check for the i + VL
191 /// increment inside the loop, because it uses the result direclty in the
192 /// active.lane.mask to calculate the mask for the next iteration. If the
193 /// increment overflows, the mask is no longer correct.
195 /// Use predicate to control both data and control flow, but modify
196 /// the trip count so that a runtime overflow check can be avoided
197 /// and such that the scalar epilogue loop can always be removed.
199 /// Use predicated EVL instructions for tail-folding.
200 /// Indicates that VP intrinsics should be used.
202};
203
210 : TLI(TLI), LVL(LVL), IAI(IAI) {}
211};
212
213class TargetTransformInfo;
216
217/// This pass provides access to the codegen interfaces that are needed
218/// for IR-level transformations.
220public:
222
223 /// Get the kind of extension that an instruction represents.
226
227 /// Construct a TTI object using a type implementing the \c Concept
228 /// API below.
229 ///
230 /// This is used by targets to construct a TTI wrapping their target-specific
231 /// implementation that encodes appropriate costs for their target.
233 std::unique_ptr<const TargetTransformInfoImplBase> Impl);
234
235 /// Construct a baseline TTI object using a minimal implementation of
236 /// the \c Concept API below.
237 ///
238 /// The TTI implementation will reflect the information in the DataLayout
239 /// provided if non-null.
240 LLVM_ABI explicit TargetTransformInfo(const DataLayout &DL);
241
242 // Provide move semantics.
245
246 // We need to define the destructor out-of-line to define our sub-classes
247 // out-of-line.
249
250 /// Handle the invalidation of this information.
251 ///
252 /// When used as a result of \c TargetIRAnalysis this method will be called
253 /// when the function this was computed for changes. When it returns false,
254 /// the information is preserved across those changes.
257 // FIXME: We should probably in some way ensure that the subtarget
258 // information for a function hasn't changed.
259 return false;
260 }
261
262 /// \name Generic Target Information
263 /// @{
264
265 /// The kind of cost model.
266 ///
267 /// There are several different cost models that can be customized by the
268 /// target. The normalization of each cost model may be target specific.
269 /// e.g. TCK_SizeAndLatency should be comparable to target thresholds such as
270 /// those derived from MCSchedModel::LoopMicroOpBufferSize etc.
272 TCK_RecipThroughput, ///< Reciprocal throughput.
273 TCK_Latency, ///< The latency of instruction.
274 TCK_CodeSize, ///< Instruction code size.
275 TCK_SizeAndLatency ///< The weighted sum of size and latency.
276 };
277
278 /// Underlying constants for 'cost' values in this interface.
279 ///
280 /// Many APIs in this interface return a cost. This enum defines the
281 /// fundamental values that should be used to interpret (and produce) those
282 /// costs. The costs are returned as an int rather than a member of this
283 /// enumeration because it is expected that the cost of one IR instruction
284 /// may have a multiplicative factor to it or otherwise won't fit directly
285 /// into the enum. Moreover, it is common to sum or average costs which works
286 /// better as simple integral values. Thus this enum only provides constants.
287 /// Also note that the returned costs are signed integers to make it natural
288 /// to add, subtract, and test with zero (a common boundary condition). It is
289 /// not expected that 2^32 is a realistic cost to be modeling at any point.
290 ///
291 /// Note that these costs should usually reflect the intersection of code-size
292 /// cost and execution cost. A free instruction is typically one that folds
293 /// into another instruction. For example, reg-to-reg moves can often be
294 /// skipped by renaming the registers in the CPU, but they still are encoded
295 /// and thus wouldn't be considered 'free' here.
297 TCC_Free = 0, ///< Expected to fold away in lowering.
298 TCC_Basic = 1, ///< The cost of a typical 'add' instruction.
299 TCC_Expensive = 4 ///< The cost of a 'div' instruction on x86.
300 };
301
302 /// Estimate the cost of a GEP operation when lowered.
303 ///
304 /// \p PointeeType is the source element type of the GEP.
305 /// \p Ptr is the base pointer operand.
306 /// \p Operands is the list of indices following the base pointer.
307 ///
308 /// \p AccessType is a hint as to what type of memory might be accessed by
309 /// users of the GEP. getGEPCost will use it to determine if the GEP can be
310 /// folded into the addressing mode of a load/store. If AccessType is null,
311 /// then the resulting target type based off of PointeeType will be used as an
312 /// approximation.
314 getGEPCost(Type *PointeeType, const Value *Ptr,
315 ArrayRef<const Value *> Operands, Type *AccessType = nullptr,
317
318 /// Describe known properties for a set of pointers.
320 /// All the GEPs in a set have same base address.
321 unsigned IsSameBaseAddress : 1;
322 /// These properties only valid if SameBaseAddress is set.
323 /// True if all pointers are separated by a unit stride.
324 unsigned IsUnitStride : 1;
325 /// True if distance between any two neigbouring pointers is a known value.
326 unsigned IsKnownStride : 1;
327 unsigned Reserved : 29;
328
329 bool isSameBase() const { return IsSameBaseAddress; }
330 bool isUnitStride() const { return IsSameBaseAddress && IsUnitStride; }
332
334 return {/*IsSameBaseAddress=*/1, /*IsUnitStride=*/1,
335 /*IsKnownStride=*/1, 0};
336 }
338 return {/*IsSameBaseAddress=*/1, /*IsUnitStride=*/0,
339 /*IsKnownStride=*/1, 0};
340 }
342 return {/*IsSameBaseAddress=*/1, /*IsUnitStride=*/0,
343 /*IsKnownStride=*/0, 0};
344 }
345 };
346 static_assert(sizeof(PointersChainInfo) == 4, "Was size increase justified?");
347
348 /// Estimate the cost of a chain of pointers (typically pointer operands of a
349 /// chain of loads or stores within same block) operations set when lowered.
350 /// \p AccessTy is the type of the loads/stores that will ultimately use the
351 /// \p Ptrs.
354 const PointersChainInfo &Info, Type *AccessTy,
356
357 /// \returns A value by which our inlining threshold should be multiplied.
358 /// This is primarily used to bump up the inlining threshold wholesale on
359 /// targets where calls are unusually expensive.
360 ///
361 /// TODO: This is a rather blunt instrument. Perhaps altering the costs of
362 /// individual classes of instructions would be better.
364
367
368 /// \returns The bonus of inlining the last call to a static function.
370
371 /// \returns A value to be added to the inlining threshold.
372 LLVM_ABI unsigned adjustInliningThreshold(const CallBase *CB) const;
373
374 /// \returns The cost of having an Alloca in the caller if not inlined, to be
375 /// added to the threshold
376 LLVM_ABI unsigned getCallerAllocaCost(const CallBase *CB,
377 const AllocaInst *AI) const;
378
379 /// \returns Vector bonus in percent.
380 ///
381 /// Vector bonuses: We want to more aggressively inline vector-dense kernels
382 /// and apply this bonus based on the percentage of vector instructions. A
383 /// bonus is applied if the vector instructions exceed 50% and half that
384 /// amount is applied if it exceeds 10%. Note that these bonuses are some what
385 /// arbitrary and evolved over time by accident as much as because they are
386 /// principled bonuses.
387 /// FIXME: It would be nice to base the bonus values on something more
388 /// scientific. A target may has no bonus on vector instructions.
390
391 /// \return the expected cost of a memcpy, which could e.g. depend on the
392 /// source/destination type and alignment and the number of bytes copied.
394
395 /// Returns the maximum memset / memcpy size in bytes that still makes it
396 /// profitable to inline the call.
398
399 /// \return The estimated number of case clusters when lowering \p 'SI'.
400 /// \p JTSize Set a jump table size only when \p SI is suitable for a jump
401 /// table.
402 LLVM_ABI unsigned
403 getEstimatedNumberOfCaseClusters(const SwitchInst &SI, unsigned &JTSize,
405 BlockFrequencyInfo *BFI) const;
406
407 /// Estimate the cost of a given IR user when lowered.
408 ///
409 /// This can estimate the cost of either a ConstantExpr or Instruction when
410 /// lowered.
411 ///
412 /// \p Operands is a list of operands which can be a result of transformations
413 /// of the current operands. The number of the operands on the list must equal
414 /// to the number of the current operands the IR user has. Their order on the
415 /// list must be the same as the order of the current operands the IR user
416 /// has.
417 ///
418 /// The returned cost is defined in terms of \c TargetCostConstants, see its
419 /// comments for a detailed explanation of the cost values.
423
424 /// This is a helper function which calls the three-argument
425 /// getInstructionCost with \p Operands which are the current operands U has.
427 TargetCostKind CostKind) const {
428 SmallVector<const Value *, 4> Operands(U->operand_values());
430 }
431
432 /// If a branch or a select condition is skewed in one direction by more than
433 /// this factor, it is very likely to be predicted correctly.
435
436 /// Returns estimated penalty of a branch misprediction in latency. Indicates
437 /// how aggressive the target wants for eliminating unpredictable branches. A
438 /// zero return value means extra optimization applied to them should be
439 /// minimal.
441
442 /// Return true if branch divergence exists.
443 ///
444 /// Branch divergence has a significantly negative impact on GPU performance
445 /// when threads in the same wavefront take different paths due to conditional
446 /// branches.
447 ///
448 /// If \p F is passed, provides a context function. If \p F is known to only
449 /// execute in a single threaded environment, the target may choose to skip
450 /// uniformity analysis and assume all values are uniform.
451 LLVM_ABI bool hasBranchDivergence(const Function *F = nullptr) const;
452
453 /// Returns whether V is a source of divergence.
454 ///
455 /// This function provides the target-dependent information for
456 /// the target-independent UniformityAnalysis.
457 LLVM_ABI bool isSourceOfDivergence(const Value *V) const;
458
459 // Returns true for the target specific
460 // set of operations which produce uniform result
461 // even taking non-uniform arguments
462 LLVM_ABI bool isAlwaysUniform(const Value *V) const;
463
464 /// Query the target whether the specified address space cast from FromAS to
465 /// ToAS is valid.
466 LLVM_ABI bool isValidAddrSpaceCast(unsigned FromAS, unsigned ToAS) const;
467
468 /// Return false if a \p AS0 address cannot possibly alias a \p AS1 address.
469 LLVM_ABI bool addrspacesMayAlias(unsigned AS0, unsigned AS1) const;
470
471 /// Returns the address space ID for a target's 'flat' address space. Note
472 /// this is not necessarily the same as addrspace(0), which LLVM sometimes
473 /// refers to as the generic address space. The flat address space is a
474 /// generic address space that can be used access multiple segments of memory
475 /// with different address spaces. Access of a memory location through a
476 /// pointer with this address space is expected to be legal but slower
477 /// compared to the same memory location accessed through a pointer with a
478 /// different address space.
479 //
480 /// This is for targets with different pointer representations which can
481 /// be converted with the addrspacecast instruction. If a pointer is converted
482 /// to this address space, optimizations should attempt to replace the access
483 /// with the source address space.
484 ///
485 /// \returns ~0u if the target does not have such a flat address space to
486 /// optimize away.
487 LLVM_ABI unsigned getFlatAddressSpace() const;
488
489 /// Return any intrinsic address operand indexes which may be rewritten if
490 /// they use a flat address space pointer.
491 ///
492 /// \returns true if the intrinsic was handled.
494 Intrinsic::ID IID) const;
495
496 LLVM_ABI bool isNoopAddrSpaceCast(unsigned FromAS, unsigned ToAS) const;
497
498 /// Return true if globals in this address space can have initializers other
499 /// than `undef`.
500 LLVM_ABI bool
502
503 LLVM_ABI unsigned getAssumedAddrSpace(const Value *V) const;
504
505 LLVM_ABI bool isSingleThreaded() const;
506
507 LLVM_ABI std::pair<const Value *, unsigned>
508 getPredicatedAddrSpace(const Value *V) const;
509
510 /// Rewrite intrinsic call \p II such that \p OldV will be replaced with \p
511 /// NewV, which has a different address space. This should happen for every
512 /// operand index that collectFlatAddressOperands returned for the intrinsic.
513 /// \returns nullptr if the intrinsic was not handled. Otherwise, returns the
514 /// new value (which may be the original \p II with modified operands).
516 Value *OldV,
517 Value *NewV) const;
518
519 /// Test whether calls to a function lower to actual program function
520 /// calls.
521 ///
522 /// The idea is to test whether the program is likely to require a 'call'
523 /// instruction or equivalent in order to call the given function.
524 ///
525 /// FIXME: It's not clear that this is a good or useful query API. Client's
526 /// should probably move to simpler cost metrics using the above.
527 /// Alternatively, we could split the cost interface into distinct code-size
528 /// and execution-speed costs. This would allow modelling the core of this
529 /// query more accurately as a call is a single small instruction, but
530 /// incurs significant execution cost.
531 LLVM_ABI bool isLoweredToCall(const Function *F) const;
532
533 struct LSRCost {
534 /// TODO: Some of these could be merged. Also, a lexical ordering
535 /// isn't always optimal.
536 unsigned Insns;
537 unsigned NumRegs;
538 unsigned AddRecCost;
539 unsigned NumIVMuls;
540 unsigned NumBaseAdds;
541 unsigned ImmCost;
542 unsigned SetupCost;
543 unsigned ScaleCost;
544 };
545
546 /// Parameters that control the generic loop unrolling transformation.
548 /// The cost threshold for the unrolled loop. Should be relative to the
549 /// getInstructionCost values returned by this API, and the expectation is
550 /// that the unrolled loop's instructions when run through that interface
551 /// should not exceed this cost. However, this is only an estimate. Also,
552 /// specific loops may be unrolled even with a cost above this threshold if
553 /// deemed profitable. Set this to UINT_MAX to disable the loop body cost
554 /// restriction.
555 unsigned Threshold;
556 /// If complete unrolling will reduce the cost of the loop, we will boost
557 /// the Threshold by a certain percent to allow more aggressive complete
558 /// unrolling. This value provides the maximum boost percentage that we
559 /// can apply to Threshold (The value should be no less than 100).
560 /// BoostedThreshold = Threshold * min(RolledCost / UnrolledCost,
561 /// MaxPercentThresholdBoost / 100)
562 /// E.g. if complete unrolling reduces the loop execution time by 50%
563 /// then we boost the threshold by the factor of 2x. If unrolling is not
564 /// expected to reduce the running time, then we do not increase the
565 /// threshold.
567 /// The cost threshold for the unrolled loop when optimizing for size (set
568 /// to UINT_MAX to disable).
570 /// The cost threshold for the unrolled loop, like Threshold, but used
571 /// for partial/runtime unrolling (set to UINT_MAX to disable).
573 /// The cost threshold for the unrolled loop when optimizing for size, like
574 /// OptSizeThreshold, but used for partial/runtime unrolling (set to
575 /// UINT_MAX to disable).
577 /// A forced unrolling factor (the number of concatenated bodies of the
578 /// original loop in the unrolled loop body). When set to 0, the unrolling
579 /// transformation will select an unrolling factor based on the current cost
580 /// threshold and other factors.
581 unsigned Count;
582 /// Default unroll count for loops with run-time trip count.
584 // Set the maximum unrolling factor. The unrolling factor may be selected
585 // using the appropriate cost threshold, but may not exceed this number
586 // (set to UINT_MAX to disable). This does not apply in cases where the
587 // loop is being fully unrolled.
588 unsigned MaxCount;
589 /// Set the maximum upper bound of trip count. Allowing the MaxUpperBound
590 /// to be overrided by a target gives more flexiblity on certain cases.
591 /// By default, MaxUpperBound uses UnrollMaxUpperBound which value is 8.
593 /// Set the maximum unrolling factor for full unrolling. Like MaxCount, but
594 /// applies even if full unrolling is selected. This allows a target to fall
595 /// back to Partial unrolling if full unrolling is above FullUnrollMaxCount.
597 // Represents number of instructions optimized when "back edge"
598 // becomes "fall through" in unrolled loop.
599 // For now we count a conditional branch on a backedge and a comparison
600 // feeding it.
601 unsigned BEInsns;
602 /// Allow partial unrolling (unrolling of loops to expand the size of the
603 /// loop body, not only to eliminate small constant-trip-count loops).
605 /// Allow runtime unrolling (unrolling of loops to expand the size of the
606 /// loop body even when the number of loop iterations is not known at
607 /// compile time).
609 /// Allow generation of a loop remainder (extra iterations after unroll).
611 /// Allow emitting expensive instructions (such as divisions) when computing
612 /// the trip count of a loop for runtime unrolling.
614 /// Apply loop unroll on any kind of loop
615 /// (mainly to loops that fail runtime unrolling).
616 bool Force;
617 /// Allow using trip count upper bound to unroll loops.
619 /// Allow unrolling of all the iterations of the runtime loop remainder.
621 /// Allow unroll and jam. Used to enable unroll and jam for the target.
623 /// Threshold for unroll and jam, for inner loop size. The 'Threshold'
624 /// value above is used during unroll and jam for the outer loop size.
625 /// This value is used in the same manner to limit the size of the inner
626 /// loop.
628 /// Don't allow loop unrolling to simulate more than this number of
629 /// iterations when checking full unroll profitability
631 /// Don't disable runtime unroll for the loops which were vectorized.
633 /// Don't allow runtime unrolling if expanding the trip count takes more
634 /// than SCEVExpansionBudget.
636 /// Allow runtime unrolling multi-exit loops. Should only be set if the
637 /// target determined that multi-exit unrolling is profitable for the loop.
638 /// Fall back to the generic logic to determine whether multi-exit unrolling
639 /// is profitable if set to false.
641 };
642
643 /// Get target-customized preferences for the generic loop unrolling
644 /// transformation. The caller will initialize UP with the current
645 /// target-independent defaults.
648 OptimizationRemarkEmitter *ORE) const;
649
650 /// Query the target whether it would be profitable to convert the given loop
651 /// into a hardware loop.
653 AssumptionCache &AC,
654 TargetLibraryInfo *LibInfo,
655 HardwareLoopInfo &HWLoopInfo) const;
656
657 // Query the target for which minimum vectorization factor epilogue
658 // vectorization should be considered.
660
661 /// Query the target whether it would be prefered to create a predicated
662 /// vector loop, which can avoid the need to emit a scalar epilogue loop.
664
665 /// Query the target what the preferred style of tail folding is.
666 /// \param IVUpdateMayOverflow Tells whether it is known if the IV update
667 /// may (or will never) overflow for the suggested VF/UF in the given loop.
668 /// Targets can use this information to select a more optimal tail folding
669 /// style. The value conservatively defaults to true, such that no assumptions
670 /// are made on overflow.
672 getPreferredTailFoldingStyle(bool IVUpdateMayOverflow = true) const;
673
674 // Parameters that control the loop peeling transformation
676 /// A forced peeling factor (the number of bodied of the original loop
677 /// that should be peeled off before the loop body). When set to 0, the
678 /// a peeling factor based on profile information and other factors.
679 unsigned PeelCount;
680 /// Allow peeling off loop iterations.
682 /// Allow peeling off loop iterations for loop nests.
684 /// Allow peeling basing on profile. Uses to enable peeling off all
685 /// iterations basing on provided profile.
686 /// If the value is true the peeling cost model can decide to peel only
687 /// some iterations and in this case it will set this to false.
689
690 /// Peel off the last PeelCount loop iterations.
692 };
693
694 /// Get target-customized preferences for the generic loop peeling
695 /// transformation. The caller will initialize \p PP with the current
696 /// target-independent defaults with information from \p L and \p SE.
698 PeelingPreferences &PP) const;
699
700 /// Targets can implement their own combinations for target-specific
701 /// intrinsics. This function will be called from the InstCombine pass every
702 /// time a target-specific intrinsic is encountered.
703 ///
704 /// \returns std::nullopt to not do anything target specific or a value that
705 /// will be returned from the InstCombiner. It is possible to return null and
706 /// stop further processing of the intrinsic by returning nullptr.
707 LLVM_ABI std::optional<Instruction *>
709 /// Can be used to implement target-specific instruction combining.
710 /// \see instCombineIntrinsic
711 LLVM_ABI std::optional<Value *>
713 APInt DemandedMask, KnownBits &Known,
714 bool &KnownBitsComputed) const;
715 /// Can be used to implement target-specific instruction combining.
716 /// \see instCombineIntrinsic
717 LLVM_ABI std::optional<Value *> simplifyDemandedVectorEltsIntrinsic(
718 InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
719 APInt &UndefElts2, APInt &UndefElts3,
720 std::function<void(Instruction *, unsigned, APInt, APInt &)>
721 SimplifyAndSetOp) const;
722 /// @}
723
724 /// \name Scalar Target Information
725 /// @{
726
727 /// Flags indicating the kind of support for population count.
728 ///
729 /// Compared to the SW implementation, HW support is supposed to
730 /// significantly boost the performance when the population is dense, and it
731 /// may or may not degrade performance if the population is sparse. A HW
732 /// support is considered as "Fast" if it can outperform, or is on a par
733 /// with, SW implementation when the population is sparse; otherwise, it is
734 /// considered as "Slow".
736
737 /// Return true if the specified immediate is legal add immediate, that
738 /// is the target has add instructions which can add a register with the
739 /// immediate without having to materialize the immediate into a register.
740 LLVM_ABI bool isLegalAddImmediate(int64_t Imm) const;
741
742 /// Return true if adding the specified scalable immediate is legal, that is
743 /// the target has add instructions which can add a register with the
744 /// immediate (multiplied by vscale) without having to materialize the
745 /// immediate into a register.
746 LLVM_ABI bool isLegalAddScalableImmediate(int64_t Imm) const;
747
748 /// Return true if the specified immediate is legal icmp immediate,
749 /// that is the target has icmp instructions which can compare a register
750 /// against the immediate without having to materialize the immediate into a
751 /// register.
752 LLVM_ABI bool isLegalICmpImmediate(int64_t Imm) const;
753
754 /// Return true if the addressing mode represented by AM is legal for
755 /// this target, for a load/store of the specified type.
756 /// The type may be VoidTy, in which case only return true if the addressing
757 /// mode is legal for a load/store of any legal type.
758 /// If target returns true in LSRWithInstrQueries(), I may be valid.
759 /// \param ScalableOffset represents a quantity of bytes multiplied by vscale,
760 /// an invariant value known only at runtime. Most targets should not accept
761 /// a scalable offset.
762 ///
763 /// TODO: Handle pre/postinc as well.
765 int64_t BaseOffset, bool HasBaseReg,
766 int64_t Scale, unsigned AddrSpace = 0,
767 Instruction *I = nullptr,
768 int64_t ScalableOffset = 0) const;
769
770 /// Return true if LSR cost of C1 is lower than C2.
772 const TargetTransformInfo::LSRCost &C2) const;
773
774 /// Return true if LSR major cost is number of registers. Targets which
775 /// implement their own isLSRCostLess and unset number of registers as major
776 /// cost should return false, otherwise return true.
778
779 /// Return true if LSR should drop a found solution if it's calculated to be
780 /// less profitable than the baseline.
782
783 /// \returns true if LSR should not optimize a chain that includes \p I.
785
786 /// Return true if the target can fuse a compare and branch.
787 /// Loop-strength-reduction (LSR) uses that knowledge to adjust its cost
788 /// calculation for the instructions in a loop.
789 LLVM_ABI bool canMacroFuseCmp() const;
790
791 /// Return true if the target can save a compare for loop count, for example
792 /// hardware loop saves a compare.
795 TargetLibraryInfo *LibInfo) const;
796
801 };
802
803 /// Return the preferred addressing mode LSR should make efforts to generate.
806
807 /// Return true if the target supports masked store.
808 LLVM_ABI bool isLegalMaskedStore(Type *DataType, Align Alignment,
809 unsigned AddressSpace) const;
810 /// Return true if the target supports masked load.
811 LLVM_ABI bool isLegalMaskedLoad(Type *DataType, Align Alignment,
812 unsigned AddressSpace) const;
813
814 /// Return true if the target supports nontemporal store.
815 LLVM_ABI bool isLegalNTStore(Type *DataType, Align Alignment) const;
816 /// Return true if the target supports nontemporal load.
817 LLVM_ABI bool isLegalNTLoad(Type *DataType, Align Alignment) const;
818
819 /// \Returns true if the target supports broadcasting a load to a vector of
820 /// type <NumElements x ElementTy>.
821 LLVM_ABI bool isLegalBroadcastLoad(Type *ElementTy,
822 ElementCount NumElements) const;
823
824 /// Return true if the target supports masked scatter.
825 LLVM_ABI bool isLegalMaskedScatter(Type *DataType, Align Alignment) const;
826 /// Return true if the target supports masked gather.
827 LLVM_ABI bool isLegalMaskedGather(Type *DataType, Align Alignment) const;
828 /// Return true if the target forces scalarizing of llvm.masked.gather
829 /// intrinsics.
831 Align Alignment) const;
832 /// Return true if the target forces scalarizing of llvm.masked.scatter
833 /// intrinsics.
835 Align Alignment) const;
836
837 /// Return true if the target supports masked compress store.
839 Align Alignment) const;
840 /// Return true if the target supports masked expand load.
841 LLVM_ABI bool isLegalMaskedExpandLoad(Type *DataType, Align Alignment) const;
842
843 /// Return true if the target supports strided load.
844 LLVM_ABI bool isLegalStridedLoadStore(Type *DataType, Align Alignment) const;
845
846 /// Return true is the target supports interleaved access for the given vector
847 /// type \p VTy, interleave factor \p Factor, alignment \p Alignment and
848 /// address space \p AddrSpace.
849 LLVM_ABI bool isLegalInterleavedAccessType(VectorType *VTy, unsigned Factor,
850 Align Alignment,
851 unsigned AddrSpace) const;
852
853 // Return true if the target supports masked vector histograms.
855 Type *DataType) const;
856
857 /// Return true if this is an alternating opcode pattern that can be lowered
858 /// to a single instruction on the target. In X86 this is for the addsub
859 /// instruction which corrsponds to a Shuffle + Fadd + FSub pattern in IR.
860 /// This function expectes two opcodes: \p Opcode1 and \p Opcode2 being
861 /// selected by \p OpcodeMask. The mask contains one bit per lane and is a `0`
862 /// when \p Opcode0 is selected and `1` when Opcode1 is selected.
863 /// \p VecTy is the vector type of the instruction to be generated.
864 LLVM_ABI bool isLegalAltInstr(VectorType *VecTy, unsigned Opcode0,
865 unsigned Opcode1,
866 const SmallBitVector &OpcodeMask) const;
867
868 /// Return true if we should be enabling ordered reductions for the target.
870
871 /// Return true if the target has a unified operation to calculate division
872 /// and remainder. If so, the additional implicit multiplication and
873 /// subtraction required to calculate a remainder from division are free. This
874 /// can enable more aggressive transformations for division and remainder than
875 /// would typically be allowed using throughput or size cost models.
876 LLVM_ABI bool hasDivRemOp(Type *DataType, bool IsSigned) const;
877
878 /// Return true if the given instruction (assumed to be a memory access
879 /// instruction) has a volatile variant. If that's the case then we can avoid
880 /// addrspacecast to generic AS for volatile loads/stores. Default
881 /// implementation returns false, which prevents address space inference for
882 /// volatile loads/stores.
883 LLVM_ABI bool hasVolatileVariant(Instruction *I, unsigned AddrSpace) const;
884
885 /// Return true if target doesn't mind addresses in vectors.
887
888 /// Return the cost of the scaling factor used in the addressing
889 /// mode represented by AM for this target, for a load/store
890 /// of the specified type.
891 /// If the AM is supported, the return value must be >= 0.
892 /// If the AM is not supported, it returns a negative value.
893 /// TODO: Handle pre/postinc as well.
895 StackOffset BaseOffset,
896 bool HasBaseReg, int64_t Scale,
897 unsigned AddrSpace = 0) const;
898
899 /// Return true if the loop strength reduce pass should make
900 /// Instruction* based TTI queries to isLegalAddressingMode(). This is
901 /// needed on SystemZ, where e.g. a memcpy can only have a 12 bit unsigned
902 /// immediate offset and no index register.
903 LLVM_ABI bool LSRWithInstrQueries() const;
904
905 /// Return true if it's free to truncate a value of type Ty1 to type
906 /// Ty2. e.g. On x86 it's free to truncate a i32 value in register EAX to i16
907 /// by referencing its sub-register AX.
908 LLVM_ABI bool isTruncateFree(Type *Ty1, Type *Ty2) const;
909
910 /// Return true if it is profitable to hoist instruction in the
911 /// then/else to before if.
913
914 LLVM_ABI bool useAA() const;
915
916 /// Return true if this type is legal.
917 LLVM_ABI bool isTypeLegal(Type *Ty) const;
918
919 /// Returns the estimated number of registers required to represent \p Ty.
920 LLVM_ABI unsigned getRegUsageForType(Type *Ty) const;
921
922 /// Return true if switches should be turned into lookup tables for the
923 /// target.
925
926 /// Return true if switches should be turned into lookup tables
927 /// containing this constant value for the target.
929
930 /// Return true if lookup tables should be turned into relative lookup tables.
932
933 /// Return true if the input function which is cold at all call sites,
934 /// should use coldcc calling convention.
936
938
939 /// Identifies if the vector form of the intrinsic has a scalar operand.
941 unsigned ScalarOpdIdx) const;
942
943 /// Identifies if the vector form of the intrinsic is overloaded on the type
944 /// of the operand at index \p OpdIdx, or on the return type if \p OpdIdx is
945 /// -1.
947 int OpdIdx) const;
948
949 /// Identifies if the vector form of the intrinsic that returns a struct is
950 /// overloaded at the struct element index \p RetIdx.
951 LLVM_ABI bool
953 int RetIdx) const;
954
955 /// Estimate the overhead of scalarizing an instruction. Insert and Extract
956 /// are set if the demanded result elements need to be inserted and/or
957 /// extracted from vectors. The involved values may be passed in VL if
958 /// Insert is true.
960 VectorType *Ty, const APInt &DemandedElts, bool Insert, bool Extract,
961 TTI::TargetCostKind CostKind, bool ForPoisonSrc = true,
962 ArrayRef<Value *> VL = {}) const;
963
964 /// Estimate the overhead of scalarizing operands with the given types. The
965 /// (potentially vector) types to use for each of argument are passes via Tys.
967 ArrayRef<Type *> Tys, TTI::TargetCostKind CostKind) const;
968
969 /// If target has efficient vector element load/store instructions, it can
970 /// return true here so that insertion/extraction costs are not added to
971 /// the scalarization cost of a load/store.
973
974 /// If the target supports tail calls.
975 LLVM_ABI bool supportsTailCalls() const;
976
977 /// If target supports tail call on \p CB
978 LLVM_ABI bool supportsTailCallFor(const CallBase *CB) const;
979
980 /// Don't restrict interleaved unrolling to small loops.
981 LLVM_ABI bool enableAggressiveInterleaving(bool LoopHasReductions) const;
982
983 /// Returns options for expansion of memcmp. IsZeroCmp is
984 // true if this is the expansion of memcmp(p1, p2, s) == 0.
986 // Return true if memcmp expansion is enabled.
987 operator bool() const { return MaxNumLoads > 0; }
988
989 // Maximum number of load operations.
990 unsigned MaxNumLoads = 0;
991
992 // The list of available load sizes (in bytes), sorted in decreasing order.
994
995 // For memcmp expansion when the memcmp result is only compared equal or
996 // not-equal to 0, allow up to this number of load pairs per block. As an
997 // example, this may allow 'memcmp(a, b, 3) == 0' in a single block:
998 // a0 = load2bytes &a[0]
999 // b0 = load2bytes &b[0]
1000 // a2 = load1byte &a[2]
1001 // b2 = load1byte &b[2]
1002 // r = cmp eq (a0 ^ b0 | a2 ^ b2), 0
1003 unsigned NumLoadsPerBlock = 1;
1004
1005 // Set to true to allow overlapping loads. For example, 7-byte compares can
1006 // be done with two 4-byte compares instead of 4+2+1-byte compares. This
1007 // requires all loads in LoadSizes to be doable in an unaligned way.
1009
1010 // Sometimes, the amount of data that needs to be compared is smaller than
1011 // the standard register size, but it cannot be loaded with just one load
1012 // instruction. For example, if the size of the memory comparison is 6
1013 // bytes, we can handle it more efficiently by loading all 6 bytes in a
1014 // single block and generating an 8-byte number, instead of generating two
1015 // separate blocks with conditional jumps for 4 and 2 byte loads. This
1016 // approach simplifies the process and produces the comparison result as
1017 // normal. This array lists the allowed sizes of memcmp tails that can be
1018 // merged into one block
1020 };
1022 bool IsZeroCmp) const;
1023
1024 /// Should the Select Optimization pass be enabled and ran.
1025 LLVM_ABI bool enableSelectOptimize() const;
1026
1027 /// Should the Select Optimization pass treat the given instruction like a
1028 /// select, potentially converting it to a conditional branch. This can
1029 /// include select-like instructions like or(zext(c), x) that can be converted
1030 /// to selects.
1032
1033 /// Enable matching of interleaved access groups.
1035
1036 /// Enable matching of interleaved access groups that contain predicated
1037 /// accesses or gaps and therefore vectorized using masked
1038 /// vector loads/stores.
1040
1041 /// Indicate that it is potentially unsafe to automatically vectorize
1042 /// floating-point operations because the semantics of vector and scalar
1043 /// floating-point semantics may differ. For example, ARM NEON v7 SIMD math
1044 /// does not support IEEE-754 denormal numbers, while depending on the
1045 /// platform, scalar floating-point math does.
1046 /// This applies to floating-point math operations and calls, not memory
1047 /// operations, shuffles, or casts.
1049
1050 /// Determine if the target supports unaligned memory accesses.
1052 unsigned BitWidth,
1053 unsigned AddressSpace = 0,
1054 Align Alignment = Align(1),
1055 unsigned *Fast = nullptr) const;
1056
1057 /// Return hardware support for population count.
1058 LLVM_ABI PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) const;
1059
1060 /// Return true if the hardware has a fast square-root instruction.
1061 LLVM_ABI bool haveFastSqrt(Type *Ty) const;
1062
1063 /// Return true if the cost of the instruction is too high to speculatively
1064 /// execute and should be kept behind a branch.
1065 /// This normally just wraps around a getInstructionCost() call, but some
1066 /// targets might report a low TCK_SizeAndLatency value that is incompatible
1067 /// with the fixed TCC_Expensive value.
1068 /// NOTE: This assumes the instruction passes isSafeToSpeculativelyExecute().
1070
1071 /// Return true if it is faster to check if a floating-point value is NaN
1072 /// (or not-NaN) versus a comparison against a constant FP zero value.
1073 /// Targets should override this if materializing a 0.0 for comparison is
1074 /// generally as cheap as checking for ordered/unordered.
1076
1077 /// Return the expected cost of supporting the floating point operation
1078 /// of the specified type.
1080
1081 /// Return the expected cost of materializing for the given integer
1082 /// immediate of the specified type.
1084 TargetCostKind CostKind) const;
1085
1086 /// Return the expected cost of materialization for the given integer
1087 /// immediate of the specified type for a given instruction. The cost can be
1088 /// zero if the immediate can be folded into the specified instruction.
1090 const APInt &Imm, Type *Ty,
1092 Instruction *Inst = nullptr) const;
1094 const APInt &Imm, Type *Ty,
1095 TargetCostKind CostKind) const;
1096
1097 /// Return the expected cost for the given integer when optimising
1098 /// for size. This is different than the other integer immediate cost
1099 /// functions in that it is subtarget agnostic. This is useful when you e.g.
1100 /// target one ISA such as Aarch32 but smaller encodings could be possible
1101 /// with another such as Thumb. This return value is used as a penalty when
1102 /// the total costs for a constant is calculated (the bigger the cost, the
1103 /// more beneficial constant hoisting is).
1105 const APInt &Imm,
1106 Type *Ty) const;
1107
1108 /// It can be advantageous to detach complex constants from their uses to make
1109 /// their generation cheaper. This hook allows targets to report when such
1110 /// transformations might negatively effect the code generation of the
1111 /// underlying operation. The motivating example is divides whereby hoisting
1112 /// constants prevents the code generator's ability to transform them into
1113 /// combinations of simpler operations.
1115 const Function &Fn) const;
1116
1117 /// @}
1118
1119 /// \name Vector Target Information
1120 /// @{
1121
1122 /// The various kinds of shuffle patterns for vector queries.
1124 SK_Broadcast, ///< Broadcast element 0 to all other elements.
1125 SK_Reverse, ///< Reverse the order of the vector.
1126 SK_Select, ///< Selects elements from the corresponding lane of
1127 ///< either source operand. This is equivalent to a
1128 ///< vector select with a constant condition operand.
1129 SK_Transpose, ///< Transpose two vectors.
1130 SK_InsertSubvector, ///< InsertSubvector. Index indicates start offset.
1131 SK_ExtractSubvector, ///< ExtractSubvector Index indicates start offset.
1132 SK_PermuteTwoSrc, ///< Merge elements from two source vectors into one
1133 ///< with any shuffle mask.
1134 SK_PermuteSingleSrc, ///< Shuffle elements of single source vector with any
1135 ///< shuffle mask.
1136 SK_Splice ///< Concatenates elements from the first input vector
1137 ///< with elements of the second input vector. Returning
1138 ///< a vector of the same type as the input vectors.
1139 ///< Index indicates start offset in first input vector.
1141
1142 /// Additional information about an operand's possible values.
1144 OK_AnyValue, // Operand can have any value.
1145 OK_UniformValue, // Operand is uniform (splat of a value).
1146 OK_UniformConstantValue, // Operand is uniform constant.
1147 OK_NonUniformConstantValue // Operand is a non uniform constant value.
1149
1150 /// Additional properties of an operand's values.
1155 };
1156
1157 // Describe the values an operand can take. We're in the process
1158 // of migrating uses of OperandValueKind and OperandValueProperties
1159 // to use this class, and then will change the internal representation.
1163
1164 bool isConstant() const {
1166 }
1167 bool isUniform() const {
1169 }
1170 bool isPowerOf2() const {
1171 return Properties == OP_PowerOf2;
1172 }
1173 bool isNegatedPowerOf2() const {
1175 }
1176
1178 return {Kind, OP_None};
1179 }
1180 };
1181
1182 /// \return the number of registers in the target-provided register class.
1183 LLVM_ABI unsigned getNumberOfRegisters(unsigned ClassID) const;
1184
1185 /// \return true if the target supports load/store that enables fault
1186 /// suppression of memory operands when the source condition is false.
1187 LLVM_ABI bool hasConditionalLoadStoreForType(Type *Ty, bool IsStore) const;
1188
1189 /// \return the target-provided register class ID for the provided type,
1190 /// accounting for type promotion and other type-legalization techniques that
1191 /// the target might apply. However, it specifically does not account for the
1192 /// scalarization or splitting of vector types. Should a vector type require
1193 /// scalarization or splitting into multiple underlying vector registers, that
1194 /// type should be mapped to a register class containing no registers.
1195 /// Specifically, this is designed to provide a simple, high-level view of the
1196 /// register allocation later performed by the backend. These register classes
1197 /// don't necessarily map onto the register classes used by the backend.
1198 /// FIXME: It's not currently possible to determine how many registers
1199 /// are used by the provided type.
1201 Type *Ty = nullptr) const;
1202
1203 /// \return the target-provided register class name
1204 LLVM_ABI const char *getRegisterClassName(unsigned ClassID) const;
1205
1207
1208 /// \return The width of the largest scalar or vector register type.
1210
1211 /// \return The width of the smallest vector register type.
1212 LLVM_ABI unsigned getMinVectorRegisterBitWidth() const;
1213
1214 /// \return The maximum value of vscale if the target specifies an
1215 /// architectural maximum vector length, and std::nullopt otherwise.
1216 LLVM_ABI std::optional<unsigned> getMaxVScale() const;
1217
1218 /// \return the value of vscale to tune the cost model for.
1219 LLVM_ABI std::optional<unsigned> getVScaleForTuning() const;
1220
1221 /// \return true if vscale is known to be a power of 2
1223
1224 /// \return True if the vectorization factor should be chosen to
1225 /// make the vector of the smallest element type match the size of a
1226 /// vector register. For wider element types, this could result in
1227 /// creating vectors that span multiple vector registers.
1228 /// If false, the vectorization factor will be chosen based on the
1229 /// size of the widest element type.
1230 /// \p K Register Kind for vectorization.
1231 LLVM_ABI bool
1233
1234 /// \return The minimum vectorization factor for types of given element
1235 /// bit width, or 0 if there is no minimum VF. The returned value only
1236 /// applies when shouldMaximizeVectorBandwidth returns true.
1237 /// If IsScalable is true, the returned ElementCount must be a scalable VF.
1238 LLVM_ABI ElementCount getMinimumVF(unsigned ElemWidth, bool IsScalable) const;
1239
1240 /// \return The maximum vectorization factor for types of given element
1241 /// bit width and opcode, or 0 if there is no maximum VF.
1242 /// Currently only used by the SLP vectorizer.
1243 LLVM_ABI unsigned getMaximumVF(unsigned ElemWidth, unsigned Opcode) const;
1244
1245 /// \return The minimum vectorization factor for the store instruction. Given
1246 /// the initial estimation of the minimum vector factor and store value type,
1247 /// it tries to find possible lowest VF, which still might be profitable for
1248 /// the vectorization.
1249 /// \param VF Initial estimation of the minimum vector factor.
1250 /// \param ScalarMemTy Scalar memory type of the store operation.
1251 /// \param ScalarValTy Scalar type of the stored value.
1252 /// Currently only used by the SLP vectorizer.
1253 LLVM_ABI unsigned getStoreMinimumVF(unsigned VF, Type *ScalarMemTy,
1254 Type *ScalarValTy) const;
1255
1256 /// \return True if it should be considered for address type promotion.
1257 /// \p AllowPromotionWithoutCommonHeader Set true if promoting \p I is
1258 /// profitable without finding other extensions fed by the same input.
1260 const Instruction &I, bool &AllowPromotionWithoutCommonHeader) const;
1261
1262 /// \return The size of a cache line in bytes.
1263 LLVM_ABI unsigned getCacheLineSize() const;
1264
1265 /// The possible cache levels
1266 enum class CacheLevel {
1267 L1D, // The L1 data cache
1268 L2D, // The L2 data cache
1269
1270 // We currently do not model L3 caches, as their sizes differ widely between
1271 // microarchitectures. Also, we currently do not have a use for L3 cache
1272 // size modeling yet.
1273 };
1274
1275 /// \return The size of the cache level in bytes, if available.
1276 LLVM_ABI std::optional<unsigned> getCacheSize(CacheLevel Level) const;
1277
1278 /// \return The associativity of the cache level, if available.
1279 LLVM_ABI std::optional<unsigned>
1280 getCacheAssociativity(CacheLevel Level) const;
1281
1282 /// \return The minimum architectural page size for the target.
1283 LLVM_ABI std::optional<unsigned> getMinPageSize() const;
1284
1285 /// \return How much before a load we should place the prefetch
1286 /// instruction. This is currently measured in number of
1287 /// instructions.
1288 LLVM_ABI unsigned getPrefetchDistance() const;
1289
1290 /// Some HW prefetchers can handle accesses up to a certain constant stride.
1291 /// Sometimes prefetching is beneficial even below the HW prefetcher limit,
1292 /// and the arguments provided are meant to serve as a basis for deciding this
1293 /// for a particular loop.
1294 ///
1295 /// \param NumMemAccesses Number of memory accesses in the loop.
1296 /// \param NumStridedMemAccesses Number of the memory accesses that
1297 /// ScalarEvolution could find a known stride
1298 /// for.
1299 /// \param NumPrefetches Number of software prefetches that will be
1300 /// emitted as determined by the addresses
1301 /// involved and the cache line size.
1302 /// \param HasCall True if the loop contains a call.
1303 ///
1304 /// \return This is the minimum stride in bytes where it makes sense to start
1305 /// adding SW prefetches. The default is 1, i.e. prefetch with any
1306 /// stride.
1307 LLVM_ABI unsigned getMinPrefetchStride(unsigned NumMemAccesses,
1308 unsigned NumStridedMemAccesses,
1309 unsigned NumPrefetches,
1310 bool HasCall) const;
1311
1312 /// \return The maximum number of iterations to prefetch ahead. If
1313 /// the required number of iterations is more than this number, no
1314 /// prefetching is performed.
1315 LLVM_ABI unsigned getMaxPrefetchIterationsAhead() const;
1316
1317 /// \return True if prefetching should also be done for writes.
1318 LLVM_ABI bool enableWritePrefetching() const;
1319
1320 /// \return if target want to issue a prefetch in address space \p AS.
1321 LLVM_ABI bool shouldPrefetchAddressSpace(unsigned AS) const;
1322
1323 /// \return The cost of a partial reduction, which is a reduction from a
1324 /// vector to another vector with fewer elements of larger size. They are
1325 /// represented by the llvm.experimental.partial.reduce.add intrinsic, which
1326 /// takes an accumulator of type \p AccumType and a second vector operand to
1327 /// be accumulated, whose element count is specified by \p VF. The type of
1328 /// reduction is specified by \p Opcode. The second operand passed to the
1329 /// intrinsic could be the result of an extend, such as sext or zext. In
1330 /// this case \p BinOp is nullopt, \p InputTypeA represents the type being
1331 /// extended and \p OpAExtend the operation, i.e. sign- or zero-extend.
1332 /// Also, \p InputTypeB should be nullptr and OpBExtend should be None.
1333 /// Alternatively, the second operand could be the result of a binary
1334 /// operation performed on two extends, i.e.
1335 /// mul(zext i8 %a -> i32, zext i8 %b -> i32).
1336 /// In this case \p BinOp may specify the opcode of the binary operation,
1337 /// \p InputTypeA and \p InputTypeB the types being extended, and
1338 /// \p OpAExtend, \p OpBExtend the form of extensions. An example of an
1339 /// operation that uses a partial reduction is a dot product, which reduces
1340 /// two vectors in binary mul operation to another of 4 times fewer and 4
1341 /// times larger elements.
1343 unsigned Opcode, Type *InputTypeA, Type *InputTypeB, Type *AccumType,
1345 PartialReductionExtendKind OpBExtend, std::optional<unsigned> BinOp,
1347
1348 /// \return The maximum interleave factor that any transform should try to
1349 /// perform for this target. This number depends on the level of parallelism
1350 /// and the number of execution units in the CPU.
1351 LLVM_ABI unsigned getMaxInterleaveFactor(ElementCount VF) const;
1352
1353 /// Collect properties of V used in cost analysis, e.g. OP_PowerOf2.
1354 LLVM_ABI static OperandValueInfo getOperandInfo(const Value *V);
1355
1356 /// This is an approximation of reciprocal throughput of a math/logic op.
1357 /// A higher cost indicates less expected throughput.
1358 /// From Agner Fog's guides, reciprocal throughput is "the average number of
1359 /// clock cycles per instruction when the instructions are not part of a
1360 /// limiting dependency chain."
1361 /// Therefore, costs should be scaled to account for multiple execution units
1362 /// on the target that can process this type of instruction. For example, if
1363 /// there are 5 scalar integer units and 2 vector integer units that can
1364 /// calculate an 'add' in a single cycle, this model should indicate that the
1365 /// cost of the vector add instruction is 2.5 times the cost of the scalar
1366 /// add instruction.
1367 /// \p Args is an optional argument which holds the instruction operands
1368 /// values so the TTI can analyze those values searching for special
1369 /// cases or optimizations based on those values.
1370 /// \p CxtI is the optional original context instruction, if one exists, to
1371 /// provide even more information.
1372 /// \p TLibInfo is used to search for platform specific vector library
1373 /// functions for instructions that might be converted to calls (e.g. frem).
1375 unsigned Opcode, Type *Ty,
1378 TTI::OperandValueInfo Opd2Info = {TTI::OK_AnyValue, TTI::OP_None},
1379 ArrayRef<const Value *> Args = {}, const Instruction *CxtI = nullptr,
1380 const TargetLibraryInfo *TLibInfo = nullptr) const;
1381
1382 /// Returns the cost estimation for alternating opcode pattern that can be
1383 /// lowered to a single instruction on the target. In X86 this is for the
1384 /// addsub instruction which corrsponds to a Shuffle + Fadd + FSub pattern in
1385 /// IR. This function expects two opcodes: \p Opcode1 and \p Opcode2 being
1386 /// selected by \p OpcodeMask. The mask contains one bit per lane and is a `0`
1387 /// when \p Opcode0 is selected and `1` when Opcode1 is selected.
1388 /// \p VecTy is the vector type of the instruction to be generated.
1390 VectorType *VecTy, unsigned Opcode0, unsigned Opcode1,
1391 const SmallBitVector &OpcodeMask,
1393
1394 /// \return The cost of a shuffle instruction of kind Kind with inputs of type
1395 /// SrcTy, producing a vector of type DstTy. The exact mask may be passed as
1396 /// Mask, or else the array will be empty. The Index and SubTp parameters
1397 /// are used by the subvector insertions shuffle kinds to show the insert
1398 /// point and the type of the subvector being inserted. The operands of the
1399 /// shuffle can be passed through \p Args, which helps improve the cost
1400 /// estimation in some cases, like in broadcast loads.
1402 ShuffleKind Kind, VectorType *DstTy, VectorType *SrcTy,
1403 ArrayRef<int> Mask = {},
1405 VectorType *SubTp = nullptr, ArrayRef<const Value *> Args = {},
1406 const Instruction *CxtI = nullptr) const;
1407
1408 /// Represents a hint about the context in which a cast is used.
1409 ///
1410 /// For zext/sext, the context of the cast is the operand, which must be a
1411 /// load of some kind. For trunc, the context is of the cast is the single
1412 /// user of the instruction, which must be a store of some kind.
1413 ///
1414 /// This enum allows the vectorizer to give getCastInstrCost an idea of the
1415 /// type of cast it's dealing with, as not every cast is equal. For instance,
1416 /// the zext of a load may be free, but the zext of an interleaving load can
1417 //// be (very) expensive!
1418 ///
1419 /// See \c getCastContextHint to compute a CastContextHint from a cast
1420 /// Instruction*. Callers can use it if they don't need to override the
1421 /// context and just want it to be calculated from the instruction.
1422 ///
1423 /// FIXME: This handles the types of load/store that the vectorizer can
1424 /// produce, which are the cases where the context instruction is most
1425 /// likely to be incorrect. There are other situations where that can happen
1426 /// too, which might be handled here but in the long run a more general
1427 /// solution of costing multiple instructions at the same times may be better.
1429 None, ///< The cast is not used with a load/store of any kind.
1430 Normal, ///< The cast is used with a normal load/store.
1431 Masked, ///< The cast is used with a masked load/store.
1432 GatherScatter, ///< The cast is used with a gather/scatter.
1433 Interleave, ///< The cast is used with an interleaved load/store.
1434 Reversed, ///< The cast is used with a reversed load/store.
1435 };
1436
1437 /// Calculates a CastContextHint from \p I.
1438 /// This should be used by callers of getCastInstrCost if they wish to
1439 /// determine the context from some instruction.
1440 /// \returns the CastContextHint for ZExt/SExt/Trunc, None if \p I is nullptr,
1441 /// or if it's another type of cast.
1443
1444 /// \return The expected cost of cast instructions, such as bitcast, trunc,
1445 /// zext, etc. If there is an existing instruction that holds Opcode, it
1446 /// may be passed in the 'I' parameter.
1448 unsigned Opcode, Type *Dst, Type *Src, TTI::CastContextHint CCH,
1450 const Instruction *I = nullptr) const;
1451
1452 /// \return The expected cost of a sign- or zero-extended vector extract. Use
1453 /// Index = -1 to indicate that there is no information about the index value.
1455 getExtractWithExtendCost(unsigned Opcode, Type *Dst, VectorType *VecTy,
1456 unsigned Index, TTI::TargetCostKind CostKind) const;
1457
1458 /// \return The expected cost of control-flow related instructions such as
1459 /// Phi, Ret, Br, Switch.
1462 const Instruction *I = nullptr) const;
1463
1464 /// \returns The expected cost of compare and select instructions. If there
1465 /// is an existing instruction that holds Opcode, it may be passed in the
1466 /// 'I' parameter. The \p VecPred parameter can be used to indicate the select
1467 /// is using a compare with the specified predicate as condition. When vector
1468 /// types are passed, \p VecPred must be used for all lanes. For a
1469 /// comparison, the two operands are the natural values. For a select, the
1470 /// two operands are the *value* operands, not the condition operand.
1472 unsigned Opcode, Type *ValTy, Type *CondTy, CmpInst::Predicate VecPred,
1474 OperandValueInfo Op1Info = {OK_AnyValue, OP_None},
1475 OperandValueInfo Op2Info = {OK_AnyValue, OP_None},
1476 const Instruction *I = nullptr) const;
1477
1478 /// \return The expected cost of vector Insert and Extract.
1479 /// Use -1 to indicate that there is no information on the index value.
1480 /// This is used when the instruction is not available; a typical use
1481 /// case is to provision the cost of vectorization/scalarization in
1482 /// vectorizer passes.
1483 LLVM_ABI InstructionCost getVectorInstrCost(unsigned Opcode, Type *Val,
1485 unsigned Index = -1,
1486 const Value *Op0 = nullptr,
1487 const Value *Op1 = nullptr) const;
1488
1489 /// \return The expected cost of vector Insert and Extract.
1490 /// Use -1 to indicate that there is no information on the index value.
1491 /// This is used when the instruction is not available; a typical use
1492 /// case is to provision the cost of vectorization/scalarization in
1493 /// vectorizer passes.
1494 /// \param ScalarUserAndIdx encodes the information about extracts from a
1495 /// vector with 'Scalar' being the value being extracted,'User' being the user
1496 /// of the extract(nullptr if user is not known before vectorization) and
1497 /// 'Idx' being the extract lane.
1499 unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index,
1500 Value *Scalar,
1501 ArrayRef<std::tuple<Value *, User *, int>> ScalarUserAndIdx) const;
1502
1503 /// \return The expected cost of vector Insert and Extract.
1504 /// This is used when instruction is available, and implementation
1505 /// asserts 'I' is not nullptr.
1506 ///
1507 /// A typical suitable use case is cost estimation when vector instruction
1508 /// exists (e.g., from basic blocks during transformation).
1509 LLVM_ABI InstructionCost getVectorInstrCost(const Instruction &I, Type *Val,
1511 unsigned Index = -1) const;
1512
1513 /// \return The expected cost of inserting or extracting a lane that is \p
1514 /// Index elements from the end of a vector, i.e. the mathematical expression
1515 /// for the lane is (VF - 1 - Index). This is required for scalable vectors
1516 /// where the exact lane index is unknown at compile time.
1518 unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind,
1519 unsigned Index) const;
1520
1521 /// \return The expected cost of aggregate inserts and extracts. This is
1522 /// used when the instruction is not available; a typical use case is to
1523 /// provision the cost of vectorization/scalarization in vectorizer passes.
1525 unsigned Opcode, TTI::TargetCostKind CostKind) const;
1526
1527 /// \return The cost of replication shuffle of \p VF elements typed \p EltTy
1528 /// \p ReplicationFactor times.
1529 ///
1530 /// For example, the mask for \p ReplicationFactor=3 and \p VF=4 is:
1531 /// <0,0,0,1,1,1,2,2,2,3,3,3>
1533 Type *EltTy, int ReplicationFactor, int VF, const APInt &DemandedDstElts,
1535
1536 /// \return The cost of Load and Store instructions.
1538 unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace,
1540 OperandValueInfo OpdInfo = {OK_AnyValue, OP_None},
1541 const Instruction *I = nullptr) const;
1542
1543 /// \return The cost of VP Load and Store instructions.
1545 unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace,
1547 const Instruction *I = nullptr) const;
1548
1549 /// \return The cost of masked Load and Store instructions.
1551 unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace,
1553
1554 /// \return The cost of Gather or Scatter operation
1555 /// \p Opcode - is a type of memory access Load or Store
1556 /// \p DataTy - a vector type of the data to be loaded or stored
1557 /// \p Ptr - pointer [or vector of pointers] - address[es] in memory
1558 /// \p VariableMask - true when the memory access is predicated with a mask
1559 /// that is not a compile-time constant
1560 /// \p Alignment - alignment of single element
1561 /// \p I - the optional original context instruction, if one exists, e.g. the
1562 /// load/store to transform or the call to the gather/scatter intrinsic
1564 unsigned Opcode, Type *DataTy, const Value *Ptr, bool VariableMask,
1566 const Instruction *I = nullptr) const;
1567
1568 /// \return The cost of Expand Load or Compress Store operation
1569 /// \p Opcode - is a type of memory access Load or Store
1570 /// \p Src - a vector type of the data to be loaded or stored
1571 /// \p VariableMask - true when the memory access is predicated with a mask
1572 /// that is not a compile-time constant
1573 /// \p Alignment - alignment of single element
1574 /// \p I - the optional original context instruction, if one exists, e.g. the
1575 /// load/store to transform or the call to the gather/scatter intrinsic
1577 unsigned Opcode, Type *DataTy, bool VariableMask, Align Alignment,
1579 const Instruction *I = nullptr) const;
1580
1581 /// \return The cost of strided memory operations.
1582 /// \p Opcode - is a type of memory access Load or Store
1583 /// \p DataTy - a vector type of the data to be loaded or stored
1584 /// \p Ptr - pointer [or vector of pointers] - address[es] in memory
1585 /// \p VariableMask - true when the memory access is predicated with a mask
1586 /// that is not a compile-time constant
1587 /// \p Alignment - alignment of single element
1588 /// \p I - the optional original context instruction, if one exists, e.g. the
1589 /// load/store to transform or the call to the gather/scatter intrinsic
1591 unsigned Opcode, Type *DataTy, const Value *Ptr, bool VariableMask,
1593 const Instruction *I = nullptr) const;
1594
1595 /// \return The cost of the interleaved memory operation.
1596 /// \p Opcode is the memory operation code
1597 /// \p VecTy is the vector type of the interleaved access.
1598 /// \p Factor is the interleave factor
1599 /// \p Indices is the indices for interleaved load members (as interleaved
1600 /// load allows gaps)
1601 /// \p Alignment is the alignment of the memory operation
1602 /// \p AddressSpace is address space of the pointer.
1603 /// \p UseMaskForCond indicates if the memory access is predicated.
1604 /// \p UseMaskForGaps indicates if gaps should be masked.
1606 unsigned Opcode, Type *VecTy, unsigned Factor, ArrayRef<unsigned> Indices,
1607 Align Alignment, unsigned AddressSpace,
1609 bool UseMaskForCond = false, bool UseMaskForGaps = false) const;
1610
1611 /// A helper function to determine the type of reduction algorithm used
1612 /// for a given \p Opcode and set of FastMathFlags \p FMF.
1613 static bool requiresOrderedReduction(std::optional<FastMathFlags> FMF) {
1614 return FMF && !(*FMF).allowReassoc();
1615 }
1616
1617 /// Calculate the cost of vector reduction intrinsics.
1618 ///
1619 /// This is the cost of reducing the vector value of type \p Ty to a scalar
1620 /// value using the operation denoted by \p Opcode. The FastMathFlags
1621 /// parameter \p FMF indicates what type of reduction we are performing:
1622 /// 1. Tree-wise. This is the typical 'fast' reduction performed that
1623 /// involves successively splitting a vector into half and doing the
1624 /// operation on the pair of halves until you have a scalar value. For
1625 /// example:
1626 /// (v0, v1, v2, v3)
1627 /// ((v0+v2), (v1+v3), undef, undef)
1628 /// ((v0+v2+v1+v3), undef, undef, undef)
1629 /// This is the default behaviour for integer operations, whereas for
1630 /// floating point we only do this if \p FMF indicates that
1631 /// reassociation is allowed.
1632 /// 2. Ordered. For a vector with N elements this involves performing N
1633 /// operations in lane order, starting with an initial scalar value, i.e.
1634 /// result = InitVal + v0
1635 /// result = result + v1
1636 /// result = result + v2
1637 /// result = result + v3
1638 /// This is only the case for FP operations and when reassociation is not
1639 /// allowed.
1640 ///
1642 unsigned Opcode, VectorType *Ty, std::optional<FastMathFlags> FMF,
1644
1648
1649 /// Calculate the cost of an extended reduction pattern, similar to
1650 /// getArithmeticReductionCost of an Add reduction with multiply and optional
1651 /// extensions. This is the cost of as:
1652 /// ResTy vecreduce.add(mul (A, B)).
1653 /// ResTy vecreduce.add(mul(ext(Ty A), ext(Ty B)).
1655 bool IsUnsigned, Type *ResTy, VectorType *Ty,
1657
1658 /// Calculate the cost of an extended reduction pattern, similar to
1659 /// getArithmeticReductionCost of a reduction with an extension.
1660 /// This is the cost of as:
1661 /// ResTy vecreduce.opcode(ext(Ty A)).
1663 unsigned Opcode, bool IsUnsigned, Type *ResTy, VectorType *Ty,
1664 std::optional<FastMathFlags> FMF,
1666
1667 /// \returns The cost of Intrinsic instructions. Analyses the real arguments.
1668 /// Three cases are handled: 1. scalar instruction 2. vector instruction
1669 /// 3. scalar instruction which is to be vectorized.
1672
1673 /// \returns The cost of Call instructions.
1677
1678 /// \returns The number of pieces into which the provided type must be
1679 /// split during legalization. Zero is returned when the answer is unknown.
1680 LLVM_ABI unsigned getNumberOfParts(Type *Tp) const;
1681
1682 /// \returns The cost of the address computation. For most targets this can be
1683 /// merged into the instruction indexing mode. Some targets might want to
1684 /// distinguish between address computation for memory operations with vector
1685 /// pointer types and scalar pointer types. Such targets should override this
1686 /// function. \p SE holds the pointer for the scalar evolution object which
1687 /// was used in order to get the Ptr step value. \p Ptr holds the SCEV of the
1688 /// access pointer.
1692
1693 /// \returns The cost, if any, of keeping values of the given types alive
1694 /// over a callsite.
1695 ///
1696 /// Some types may require the use of register classes that do not have
1697 /// any callee-saved registers, so would require a spill and fill.
1700
1701 /// \returns True if the intrinsic is a supported memory intrinsic. Info
1702 /// will contain additional information - whether the intrinsic may write
1703 /// or read to memory, volatility and the pointer. Info is undefined
1704 /// if false is returned.
1706 MemIntrinsicInfo &Info) const;
1707
1708 /// \returns The maximum element size, in bytes, for an element
1709 /// unordered-atomic memory intrinsic.
1711
1712 /// \returns A value which is the result of the given memory intrinsic. If \p
1713 /// CanCreate is true, new instructions may be created to extract the result
1714 /// from the given intrinsic memory operation. Returns nullptr if the target
1715 /// cannot create a result from the given intrinsic.
1716 LLVM_ABI Value *
1718 bool CanCreate = true) const;
1719
1720 /// \returns The type to use in a loop expansion of a memcpy call.
1722 LLVMContext &Context, Value *Length, unsigned SrcAddrSpace,
1723 unsigned DestAddrSpace, Align SrcAlign, Align DestAlign,
1724 std::optional<uint32_t> AtomicElementSize = std::nullopt) const;
1725
1726 /// \param[out] OpsOut The operand types to copy RemainingBytes of memory.
1727 /// \param RemainingBytes The number of bytes to copy.
1728 ///
1729 /// Calculates the operand types to use when copying \p RemainingBytes of
1730 /// memory, where source and destination alignments are \p SrcAlign and
1731 /// \p DestAlign respectively.
1733 SmallVectorImpl<Type *> &OpsOut, LLVMContext &Context,
1734 unsigned RemainingBytes, unsigned SrcAddrSpace, unsigned DestAddrSpace,
1735 Align SrcAlign, Align DestAlign,
1736 std::optional<uint32_t> AtomicCpySize = std::nullopt) const;
1737
1738 /// \returns True if the two functions have compatible attributes for inlining
1739 /// purposes.
1740 LLVM_ABI bool areInlineCompatible(const Function *Caller,
1741 const Function *Callee) const;
1742
1743 /// Returns a penalty for invoking call \p Call in \p F.
1744 /// For example, if a function F calls a function G, which in turn calls
1745 /// function H, then getInlineCallPenalty(F, H()) would return the
1746 /// penalty of calling H from F, e.g. after inlining G into F.
1747 /// \p DefaultCallPenalty is passed to give a default penalty that
1748 /// the target can amend or override.
1749 LLVM_ABI unsigned getInlineCallPenalty(const Function *F,
1750 const CallBase &Call,
1751 unsigned DefaultCallPenalty) const;
1752
1753 /// \returns True if the caller and callee agree on how \p Types will be
1754 /// passed to or returned from the callee.
1755 /// to the callee.
1756 /// \param Types List of types to check.
1757 LLVM_ABI bool areTypesABICompatible(const Function *Caller,
1758 const Function *Callee,
1759 const ArrayRef<Type *> &Types) const;
1760
1761 /// The type of load/store indexing.
1763 MIM_Unindexed, ///< No indexing.
1764 MIM_PreInc, ///< Pre-incrementing.
1765 MIM_PreDec, ///< Pre-decrementing.
1766 MIM_PostInc, ///< Post-incrementing.
1767 MIM_PostDec ///< Post-decrementing.
1769
1770 /// \returns True if the specified indexed load for the given type is legal.
1771 LLVM_ABI bool isIndexedLoadLegal(enum MemIndexedMode Mode, Type *Ty) const;
1772
1773 /// \returns True if the specified indexed store for the given type is legal.
1774 LLVM_ABI bool isIndexedStoreLegal(enum MemIndexedMode Mode, Type *Ty) const;
1775
1776 /// \returns The bitwidth of the largest vector type that should be used to
1777 /// load/store in the given address space.
1778 LLVM_ABI unsigned getLoadStoreVecRegBitWidth(unsigned AddrSpace) const;
1779
1780 /// \returns True if the load instruction is legal to vectorize.
1782
1783 /// \returns True if the store instruction is legal to vectorize.
1785
1786 /// \returns True if it is legal to vectorize the given load chain.
1787 LLVM_ABI bool isLegalToVectorizeLoadChain(unsigned ChainSizeInBytes,
1788 Align Alignment,
1789 unsigned AddrSpace) const;
1790
1791 /// \returns True if it is legal to vectorize the given store chain.
1792 LLVM_ABI bool isLegalToVectorizeStoreChain(unsigned ChainSizeInBytes,
1793 Align Alignment,
1794 unsigned AddrSpace) const;
1795
1796 /// \returns True if it is legal to vectorize the given reduction kind.
1798 ElementCount VF) const;
1799
1800 /// \returns True if the given type is supported for scalable vectors
1802
1803 /// \returns The new vector factor value if the target doesn't support \p
1804 /// SizeInBytes loads or has a better vector factor.
1805 LLVM_ABI unsigned getLoadVectorFactor(unsigned VF, unsigned LoadSize,
1806 unsigned ChainSizeInBytes,
1807 VectorType *VecTy) const;
1808
1809 /// \returns The new vector factor value if the target doesn't support \p
1810 /// SizeInBytes stores or has a better vector factor.
1811 LLVM_ABI unsigned getStoreVectorFactor(unsigned VF, unsigned StoreSize,
1812 unsigned ChainSizeInBytes,
1813 VectorType *VecTy) const;
1814
1815 /// \returns True if the targets prefers fixed width vectorization if the
1816 /// loop vectorizer's cost-model assigns an equal cost to the fixed and
1817 /// scalable version of the vectorized loop.
1819
1820 /// \returns True if target prefers SLP vectorizer with altermate opcode
1821 /// vectorization, false - otherwise.
1823
1824 /// \returns True if the target prefers reductions of \p Kind to be performed
1825 /// in the loop.
1826 LLVM_ABI bool preferInLoopReduction(RecurKind Kind, Type *Ty) const;
1827
1828 /// \returns True if the target prefers reductions select kept in the loop
1829 /// when tail folding. i.e.
1830 /// loop:
1831 /// p = phi (0, s)
1832 /// a = add (p, x)
1833 /// s = select (mask, a, p)
1834 /// vecreduce.add(s)
1835 ///
1836 /// As opposed to the normal scheme of p = phi (0, a) which allows the select
1837 /// to be pulled out of the loop. If the select(.., add, ..) can be predicated
1838 /// by the target, this can lead to cleaner code generation.
1840
1841 /// Return true if the loop vectorizer should consider vectorizing an
1842 /// otherwise scalar epilogue loop.
1844
1845 /// \returns True if the target wants to expand the given reduction intrinsic
1846 /// into a shuffle sequence.
1848
1850
1851 /// \returns The shuffle sequence pattern used to expand the given reduction
1852 /// intrinsic.
1855
1856 /// \returns the size cost of rematerializing a GlobalValue address relative
1857 /// to a stack reload.
1858 LLVM_ABI unsigned getGISelRematGlobalCost() const;
1859
1860 /// \returns the lower bound of a trip count to decide on vectorization
1861 /// while tail-folding.
1863
1864 /// \returns True if the target supports scalable vectors.
1865 LLVM_ABI bool supportsScalableVectors() const;
1866
1867 /// \return true when scalable vectorization is preferred.
1869
1870 /// \name Vector Predication Information
1871 /// @{
1872 /// Whether the target supports the %evl parameter of VP intrinsic efficiently
1873 /// in hardware. (see LLVM Language Reference - "Vector Predication
1874 /// Intrinsics"). Use of %evl is discouraged when that is not the case.
1875 LLVM_ABI bool hasActiveVectorLength() const;
1876
1877 /// Return true if sinking I's operands to the same basic block as I is
1878 /// profitable, e.g. because the operands can be folded into a target
1879 /// instruction during instruction selection. After calling the function
1880 /// \p Ops contains the Uses to sink ordered by dominance (dominating users
1881 /// come first).
1883 SmallVectorImpl<Use *> &Ops) const;
1884
1885 /// Return true if it's significantly cheaper to shift a vector by a uniform
1886 /// scalar than by an amount which will vary across each lane. On x86 before
1887 /// AVX2 for example, there is a "psllw" instruction for the former case, but
1888 /// no simple instruction for a general "a << b" operation on vectors.
1889 /// This should also apply to lowering for vector funnel shifts (rotates).
1891
1894 // keep the predicating parameter
1896 // where legal, discard the predicate parameter
1898 // transform into something else that is also predicating
1899 Convert = 2
1901
1902 // How to transform the EVL parameter.
1903 // Legal: keep the EVL parameter as it is.
1904 // Discard: Ignore the EVL parameter where it is safe to do so.
1905 // Convert: Fold the EVL into the mask parameter.
1907
1908 // How to transform the operator.
1909 // Legal: The target supports this operator.
1910 // Convert: Convert this to a non-VP operation.
1911 // The 'Discard' strategy is invalid.
1913
1914 bool shouldDoNothing() const {
1915 return (EVLParamStrategy == Legal) && (OpStrategy == Legal);
1916 }
1919 };
1920
1921 /// \returns How the target needs this vector-predicated operation to be
1922 /// transformed.
1924 getVPLegalizationStrategy(const VPIntrinsic &PI) const;
1925 /// @}
1926
1927 /// \returns Whether a 32-bit branch instruction is available in Arm or Thumb
1928 /// state.
1929 ///
1930 /// Used by the LowerTypeTests pass, which constructs an IR inline assembler
1931 /// node containing a jump table in a format suitable for the target, so it
1932 /// needs to know what format of jump table it can legally use.
1933 ///
1934 /// For non-Arm targets, this function isn't used. It defaults to returning
1935 /// false, but it shouldn't matter what it returns anyway.
1936 LLVM_ABI bool hasArmWideBranch(bool Thumb) const;
1937
1938 /// Returns a bitmask constructed from the target-features or fmv-features
1939 /// metadata of a function.
1940 LLVM_ABI APInt getFeatureMask(const Function &F) const;
1941
1942 /// Returns true if this is an instance of a function with multiple versions.
1943 LLVM_ABI bool isMultiversionedFunction(const Function &F) const;
1944
1945 /// \return The maximum number of function arguments the target supports.
1946 LLVM_ABI unsigned getMaxNumArgs() const;
1947
1948 /// \return For an array of given Size, return alignment boundary to
1949 /// pad to. Default is no padding.
1950 LLVM_ABI unsigned getNumBytesToPadGlobalArray(unsigned Size,
1951 Type *ArrayType) const;
1952
1953 /// @}
1954
1955 /// Collect kernel launch bounds for \p F into \p LB.
1957 const Function &F,
1958 SmallVectorImpl<std::pair<StringRef, int64_t>> &LB) const;
1959
1960 /// Returns true if GEP should not be used to index into vectors for this
1961 /// target.
1963
1964private:
1965 std::unique_ptr<const TargetTransformInfoImplBase> TTIImpl;
1966};
1967
1968/// Analysis pass providing the \c TargetTransformInfo.
1969///
1970/// The core idea of the TargetIRAnalysis is to expose an interface through
1971/// which LLVM targets can analyze and provide information about the middle
1972/// end's target-independent IR. This supports use cases such as target-aware
1973/// cost modeling of IR constructs.
1974///
1975/// This is a function analysis because much of the cost modeling for targets
1976/// is done in a subtarget specific way and LLVM supports compiling different
1977/// functions targeting different subtargets in order to support runtime
1978/// dispatch according to the observed subtarget.
1979class TargetIRAnalysis : public AnalysisInfoMixin<TargetIRAnalysis> {
1980public:
1982
1983 /// Default construct a target IR analysis.
1984 ///
1985 /// This will use the module's datalayout to construct a baseline
1986 /// conservative TTI result.
1988
1989 /// Construct an IR analysis pass around a target-provide callback.
1990 ///
1991 /// The callback will be called with a particular function for which the TTI
1992 /// is needed and must return a TTI object for that function.
1993 LLVM_ABI
1994 TargetIRAnalysis(std::function<Result(const Function &)> TTICallback);
1995
1996 // Value semantics. We spell out the constructors for MSVC.
1998 : TTICallback(Arg.TTICallback) {}
2000 : TTICallback(std::move(Arg.TTICallback)) {}
2002 TTICallback = RHS.TTICallback;
2003 return *this;
2004 }
2006 TTICallback = std::move(RHS.TTICallback);
2007 return *this;
2008 }
2009
2011
2012private:
2014 LLVM_ABI static AnalysisKey Key;
2015
2016 /// The callback used to produce a result.
2017 ///
2018 /// We use a completely opaque callback so that targets can provide whatever
2019 /// mechanism they desire for constructing the TTI for a given function.
2020 ///
2021 /// FIXME: Should we really use std::function? It's relatively inefficient.
2022 /// It might be possible to arrange for even stateful callbacks to outlive
2023 /// the analysis and thus use a function_ref which would be lighter weight.
2024 /// This may also be less error prone as the callback is likely to reference
2025 /// the external TargetMachine, and that reference needs to never dangle.
2026 std::function<Result(const Function &)> TTICallback;
2027
2028 /// Helper function used as the callback in the default constructor.
2029 static Result getDefaultTTI(const Function &F);
2030};
2031
2032/// Wrapper pass for TargetTransformInfo.
2033///
2034/// This pass can be constructed from a TTI object which it stores internally
2035/// and is queried by passes.
2037 TargetIRAnalysis TIRA;
2038 std::optional<TargetTransformInfo> TTI;
2039
2040 virtual void anchor();
2041
2042public:
2043 static char ID;
2044
2045 /// We must provide a default constructor for the pass but it should
2046 /// never be used.
2047 ///
2048 /// Use the constructor below or call one of the creation routines.
2050
2052
2053 TargetTransformInfo &getTTI(const Function &F);
2054};
2055
2056/// Create an analysis pass wrapper around a TTI object.
2057///
2058/// This analysis pass just holds the TTI instance and makes it available to
2059/// clients.
2062
2063} // namespace llvm
2064
2065#endif
AMDGPU Lower Kernel Arguments
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Atomic ordering constants.
RelocType Type
Definition: COFFYAML.cpp:410
Analysis containing CSE Info
Definition: CSEInfo.cpp:27
#define LLVM_ABI
Definition: Compiler.h:213
static cl::opt< OutputCostKind > CostKind("cost-kind", cl::desc("Target cost kind"), cl::init(OutputCostKind::RecipThroughput), cl::values(clEnumValN(OutputCostKind::RecipThroughput, "throughput", "Reciprocal throughput"), clEnumValN(OutputCostKind::Latency, "latency", "Instruction latency"), clEnumValN(OutputCostKind::CodeSize, "code-size", "Code size"), clEnumValN(OutputCostKind::SizeAndLatency, "size-latency", "Code size and latency"), clEnumValN(OutputCostKind::All, "all", "Print all cost kinds")))
return RetTy
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
uint32_t Index
uint64_t Size
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,...
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
mir Rename Register Operands
Machine InstCombiner
uint64_t IntrinsicInst * II
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")))
Value * RHS
Class for arbitrary precision integers.
Definition: APInt.h:78
an instruction to allocate memory on the stack
Definition: Instructions.h:64
API to communicate dependencies between analyses during invalidation.
Definition: PassManager.h:294
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:255
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
Class to represent array types.
Definition: DerivedTypes.h:398
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
Definition: BasicBlock.h:62
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Conditional or Unconditional Branch instruction.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Definition: InstrTypes.h:1116
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition: InstrTypes.h:678
This is an important base class in LLVM.
Definition: Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:63
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition: Dominators.h:165
Convenience struct for specifying and reasoning about fast-math flags.
Definition: FMF.h:22
ImmutablePass class - This class is used to provide information that does not need to be run.
Definition: Pass.h:285
The core instruction combiner logic.
Definition: InstCombiner.h:48
static InstructionCost getInvalid(CostType Val=0)
Class to represent integer types.
Definition: DerivedTypes.h:42
Drive the analysis of interleaved memory accesses in the loop.
Definition: VectorUtils.h:669
const TargetLibraryInfo * getLibInfo() const
const SmallVectorImpl< Type * > & getArgTypes() const
const SmallVectorImpl< const Value * > & getArgs() const
InstructionCost getScalarizationCost() const
const IntrinsicInst * getInst() const
A wrapper class for inspecting calls to intrinsic functions.
Definition: IntrinsicInst.h:49
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:68
An instruction for reading from memory.
Definition: Instructions.h:180
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
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.
Definition: IVDescriptors.h:90
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...
Definition: SmallVector.h:574
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
StackOffset holds a fixed and a scalable offset in bytes.
Definition: TypeSize.h:34
An instruction for storing to memory.
Definition: Instructions.h:296
Multiway switch.
Analysis pass providing the TargetTransformInfo.
TargetIRAnalysis(const TargetIRAnalysis &Arg)
TargetIRAnalysis & operator=(const TargetIRAnalysis &RHS)
LLVM_ABI Result run(const Function &F, FunctionAnalysisManager &)
TargetTransformInfo Result
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.
Wrapper pass for TargetTransformInfo.
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
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 InstructionCost getStridedMemoryOpCost(unsigned Opcode, Type *DataTy, const Value *Ptr, bool VariableMask, Align Alignment, TTI::TargetCostKind CostKind=TTI::TCK_RecipThroughput, const Instruction *I=nullptr) const
LLVM_ABI bool shouldBuildLookupTables() const
Return true if switches should be turned into lookup tables for the target.
LLVM_ABI bool isLegalToVectorizeStore(StoreInst *SI) const
LLVM_ABI InstructionCost getVectorInstrCost(unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index=-1, const Value *Op0=nullptr, const Value *Op1=nullptr) const
LLVM_ABI bool enableAggressiveInterleaving(bool LoopHasReductions) const
Don't restrict interleaved unrolling to small loops.
LLVM_ABI InstructionCost getScalarizationOverhead(VectorType *Ty, const APInt &DemandedElts, bool Insert, bool Extract, TTI::TargetCostKind CostKind, bool ForPoisonSrc=true, ArrayRef< Value * > VL={}) const
Estimate the overhead of scalarizing an instruction.
LLVM_ABI bool isLegalMaskedLoad(Type *DataType, Align Alignment, unsigned AddressSpace) const
Return true if the target supports masked load.
LLVM_ABI bool isMultiversionedFunction(const Function &F) const
Returns true if this is an instance of a function with multiple versions.
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 supportsEfficientVectorElementLoadStore() const
If target has efficient vector element load/store instructions, it can return true here so that inser...
LLVM_ABI bool isAlwaysUniform(const Value *V) const
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 getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy, CmpInst::Predicate VecPred, TTI::TargetCostKind CostKind=TTI::TCK_RecipThroughput, OperandValueInfo Op1Info={OK_AnyValue, OP_None}, OperandValueInfo Op2Info={OK_AnyValue, OP_None}, const Instruction *I=nullptr) const
LLVM_ABI bool hasBranchDivergence(const Function *F=nullptr) const
Return true if branch divergence exists.
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 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
LLVM_ABI unsigned getInlineCallPenalty(const Function *F, const CallBase &Call, unsigned DefaultCallPenalty) const
Returns a penalty for invoking call Call in F.
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 bool isLegalMaskedGather(Type *DataType, Align Alignment) const
Return true if the target supports masked gather.
LLVM_ABI InstructionCost getMemoryOpCost(unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind=TTI::TCK_RecipThroughput, OperandValueInfo OpdInfo={OK_AnyValue, OP_None}, const Instruction *I=nullptr) const
LLVM_ABI std::optional< unsigned > getMaxVScale() const
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 InstructionCost getInterleavedMemoryOpCost(unsigned Opcode, Type *VecTy, unsigned Factor, ArrayRef< unsigned > Indices, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind=TTI::TCK_RecipThroughput, bool UseMaskForCond=false, bool UseMaskForGaps=false) const
LLVM_ABI bool isSingleThreaded() const
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 InstructionCost getShuffleCost(ShuffleKind Kind, VectorType *DstTy, VectorType *SrcTy, ArrayRef< int > Mask={}, TTI::TargetCostKind CostKind=TTI::TCK_RecipThroughput, int Index=0, VectorType *SubTp=nullptr, ArrayRef< const Value * > Args={}, const Instruction *CxtI=nullptr) const
LLVM_ABI InstructionCost getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, TTI::TargetCostKind CostKind) const
LLVM_ABI InstructionCost getArithmeticReductionCost(unsigned Opcode, VectorType *Ty, std::optional< FastMathFlags > FMF, TTI::TargetCostKind CostKind=TTI::TCK_RecipThroughput) const
Calculate the cost of vector reduction intrinsics.
LLVM_ABI unsigned getAtomicMemIntrinsicMaxElementSize() const
LLVM_ABI InstructionCost getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src, TTI::CastContextHint CCH, TTI::TargetCostKind CostKind=TTI::TCK_SizeAndLatency, const Instruction *I=nullptr) 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 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 TailFoldingStyle getPreferredTailFoldingStyle(bool IVUpdateMayOverflow=true) const
Query the target what the preferred style of tail folding is.
LLVM_ABI InstructionCost getGEPCost(Type *PointeeType, const Value *Ptr, ArrayRef< const Value * > Operands, Type *AccessType=nullptr, TargetCostKind CostKind=TCK_SizeAndLatency) const
Estimate the cost of a GEP operation when lowered.
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
LLVM_ABI InstructionCost getExtendedReductionCost(unsigned Opcode, bool IsUnsigned, Type *ResTy, VectorType *Ty, std::optional< FastMathFlags > FMF, TTI::TargetCostKind CostKind=TTI::TCK_RecipThroughput) const
Calculate the cost of an extended reduction pattern, similar to getArithmeticReductionCost of a reduc...
LLVM_ABI unsigned getLoadStoreVecRegBitWidth(unsigned AddrSpace) 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 getMulAccReductionCost(bool IsUnsigned, Type *ResTy, VectorType *Ty, TTI::TargetCostKind CostKind=TTI::TCK_RecipThroughput) const
Calculate the cost of an extended reduction pattern, similar to getArithmeticReductionCost of an Add ...
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 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 getMinMaxReductionCost(Intrinsic::ID IID, VectorType *Ty, FastMathFlags FMF=FastMathFlags(), TTI::TargetCostKind CostKind=TTI::TCK_RecipThroughput) const
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 InstructionCost getArithmeticInstrCost(unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind=TTI::TCK_RecipThroughput, TTI::OperandValueInfo Opd1Info={TTI::OK_AnyValue, TTI::OP_None}, TTI::OperandValueInfo Opd2Info={TTI::OK_AnyValue, TTI::OP_None}, ArrayRef< const Value * > Args={}, const Instruction *CxtI=nullptr, const TargetLibraryInfo *TLibInfo=nullptr) const
This is an approximation of reciprocal throughput of a math/logic op.
LLVM_ABI bool areTypesABICompatible(const Function *Caller, const Function *Callee, const ArrayRef< Type * > &Types) const
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 InstructionCost getPointersChainCost(ArrayRef< const Value * > Ptrs, const Value *Base, const PointersChainInfo &Info, Type *AccessTy, TargetCostKind CostKind=TTI::TCK_RecipThroughput) const
Estimate the cost of a chain of pointers (typically pointer operands of a chain of loads or stores wi...
LLVM_ABI bool isVScaleKnownToBeAPowerOfTwo() const
LLVM_ABI bool isIndexedLoadLegal(enum MemIndexedMode Mode, Type *Ty) const
LLVM_ABI unsigned getMaximumVF(unsigned ElemWidth, unsigned Opcode) const
LLVM_ABI bool isSourceOfDivergence(const Value *V) const
Returns whether V is a source of divergence.
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 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 getMaskedMemoryOpCost(unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind=TTI::TCK_RecipThroughput) const
LLVM_ABI bool canSaveCmp(Loop *L, BranchInst **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 bool isTargetIntrinsicTriviallyScalarizable(Intrinsic::ID ID) 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 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 InstructionCost getPartialReductionCost(unsigned Opcode, Type *InputTypeA, Type *InputTypeB, Type *AccumType, ElementCount VF, PartialReductionExtendKind OpAExtend, PartialReductionExtendKind OpBExtend, std::optional< unsigned > BinOp, TTI::TargetCostKind CostKind) const
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
LLVM_ABI bool preferEpilogueVectorization() const
Return true if the loop vectorizer should consider vectorizing an otherwise scalar epilogue loop.
LLVM_ABI bool shouldConsiderAddressTypePromotion(const Instruction &I, bool &AllowPromotionWithoutCommonHeader) const
LLVM_ABI BranchProbability getPredictableBranchThreshold() const
If a branch or a select condition is skewed in one direction by more than this factor,...
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 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 getGatherScatterOpCost(unsigned Opcode, Type *DataTy, const Value *Ptr, bool VariableMask, Align Alignment, TTI::TargetCostKind CostKind=TTI::TCK_RecipThroughput, const Instruction *I=nullptr) const
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_ABI bool isLegalMaskedStore(Type *DataType, Align Alignment, unsigned AddressSpace) const
Return true if the target supports masked store.
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 isLegalAltInstr(VectorType *VecTy, unsigned Opcode0, unsigned Opcode1, const SmallBitVector &OpcodeMask) const
Return true if this is an alternating opcode pattern that can be lowered to a single instruction on t...
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 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 unsigned getStoreMinimumVF(unsigned VF, Type *ScalarMemTy, Type *ScalarValTy) const
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 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.
LLVM_ABI InstructionCost getAltInstrCost(VectorType *VecTy, unsigned Opcode0, unsigned Opcode1, const SmallBitVector &OpcodeMask, TTI::TargetCostKind CostKind=TTI::TCK_RecipThroughput) const
Returns the cost estimation for alternating opcode pattern that can be lowered to a single instructio...
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 getInstructionCost(const User *U, ArrayRef< const Value * > Operands, TargetCostKind CostKind) const
Estimate the cost of a given IR user when lowered.
LLVM_ABI unsigned getMaxInterleaveFactor(ElementCount VF) const
LLVM_ABI bool enableScalableVectorization() const
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 InstructionCost getExpandCompressMemoryOpCost(unsigned Opcode, Type *DataTy, bool VariableMask, Align Alignment, TTI::TargetCostKind CostKind=TTI::TCK_RecipThroughput, const Instruction *I=nullptr) const
LLVM_ABI unsigned getGISelRematGlobalCost() const
LLVM_ABI unsigned getNumBytesToPadGlobalArray(unsigned Size, Type *ArrayType) const
MemIndexedMode
The type of load/store indexing.
@ MIM_PostInc
Post-incrementing.
@ MIM_PostDec
Post-decrementing.
LLVM_ABI InstructionCost getIndexedVectorInstrCostFromEnd(unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index) const
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
LLVM_ABI InstructionCost getOperandsScalarizationOverhead(ArrayRef< Type * > Tys, TTI::TargetCostKind CostKind) const
Estimate the overhead of scalarizing operands with the given types.
LLVM_ABI InstructionCost getVPMemoryOpCost(unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind=TTI::TCK_RecipThroughput, const Instruction *I=nullptr) const
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 bool isProfitableToSinkOperands(Instruction *I, SmallVectorImpl< Use * > &Ops) const
Return true if sinking I's operands to the same basic block as I is profitable, e....
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 preferPredicateOverEpilogue(TailFoldingInfo *TFI) const
Query the target whether it would be prefered to create a predicated vector loop, which can avoid the...
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...
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 uint64_t getMaxMemIntrinsicInlineSizeThreshold() const
Returns the maximum memset / memcpy size in bytes that still makes it profitable to inline the call.
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.
LLVM_ABI void getPeelingPreferences(Loop *L, ScalarEvolution &SE, PeelingPreferences &PP) const
Get target-customized preferences for the generic loop peeling transformation.
LLVM_ABI InstructionCost getCallInstrCost(Function *F, Type *RetTy, ArrayRef< Type * > Tys, TTI::TargetCostKind CostKind=TTI::TCK_SizeAndLatency) const
LLVM_ABI InstructionCost getCFInstrCost(unsigned Opcode, TTI::TargetCostKind CostKind=TTI::TCK_SizeAndLatency, const Instruction *I=nullptr) const
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.
@ None
The cast is not used with a load/store of any kind.
@ 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
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:45
This is the common base class for vector predication intrinsics.
LLVM Value Representation.
Definition: Value.h:75
Base class of all SIMD vector types.
Definition: DerivedTypes.h:430
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition: CallingConv.h:41
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Length
Definition: DWP.cpp:477
@ None
Definition: CodeGenData.h:107
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.
Definition: IVDescriptors.h:34
constexpr unsigned BitWidth
Definition: BitmaskEnum.h:223
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:1886
@ DataAndControlFlowWithoutRuntimeCheck
Use predicate to control both data and control flow, but modify the trip count so that a runtime over...
@ 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...
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:856
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.
Definition: PassManager.h:93
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition: Analysis.h:29
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.
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
unsigned Insns
TODO: Some of these could be merged.
Returns options for expansion of memcmp. IsZeroCmp is.
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.
unsigned Count
A forced unrolling factor (the number of concatenated bodies of the original loop in the unrolled loo...
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
Don't disable runtime unroll for the loops which were vectorized.
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.
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)