|
LLVM
3.7.0
|
This pass provides access to the codegen interfaces that are needed for IR-level transformations. More...
#include <TargetTransformInfo.h>
Classes | |
| class | Concept |
| struct | UnrollingPreferences |
| Parameters that control the generic loop unrolling transformation. More... | |
Public Member Functions | |
| template<typename T > | |
| TargetTransformInfo (T Impl) | |
Construct a TTI object using a type implementing the Concept API below. More... | |
| TargetTransformInfo (const DataLayout &DL) | |
Construct a baseline TTI object using a minimal implementation of the Concept API below. More... | |
| TargetTransformInfo (TargetTransformInfo &&Arg) | |
| TargetTransformInfo & | operator= (TargetTransformInfo &&RHS) |
| ~TargetTransformInfo () | |
| bool | invalidate (Function &, const PreservedAnalyses &) |
| Handle the invalidation of this information. More... | |
Generic Target Information | |
| enum | TargetCostConstants { TCC_Free = 0, TCC_Basic = 1, TCC_Expensive = 4 } |
| Underlying constants for 'cost' values in this interface. More... | |
| unsigned | getOperationCost (unsigned Opcode, Type *Ty, Type *OpTy=nullptr) const |
| Estimate the cost of a specific operation when lowered. More... | |
| unsigned | getGEPCost (const Value *Ptr, ArrayRef< const Value * > Operands) const |
| Estimate the cost of a GEP operation when lowered. More... | |
| unsigned | getCallCost (FunctionType *FTy, int NumArgs=-1) const |
| Estimate the cost of a function call when lowered. More... | |
| unsigned | getCallCost (const Function *F, int NumArgs=-1) const |
| Estimate the cost of calling a specific function when lowered. More... | |
| unsigned | getCallCost (const Function *F, ArrayRef< const Value * > Arguments) const |
| Estimate the cost of calling a specific function when lowered. More... | |
| unsigned | getIntrinsicCost (Intrinsic::ID IID, Type *RetTy, ArrayRef< Type * > ParamTys) const |
| Estimate the cost of an intrinsic when lowered. More... | |
| unsigned | getIntrinsicCost (Intrinsic::ID IID, Type *RetTy, ArrayRef< const Value * > Arguments) const |
| Estimate the cost of an intrinsic when lowered. More... | |
| unsigned | getUserCost (const User *U) const |
| Estimate the cost of a given IR user when lowered. More... | |
| bool | hasBranchDivergence () const |
| Return true if branch divergence exists. More... | |
| bool | isSourceOfDivergence (const Value *V) const |
| Returns whether V is a source of divergence. More... | |
| bool | isLoweredToCall (const Function *F) const |
| Test whether calls to a function lower to actual program function calls. More... | |
| void | getUnrollingPreferences (Loop *L, UnrollingPreferences &UP) const |
| Get target-customized preferences for the generic loop unrolling transformation. More... | |
Scalar Target Information | |
| enum | PopcntSupportKind { PSK_Software, PSK_SlowHardware, PSK_FastHardware } |
| Flags indicating the kind of support for population count. More... | |
| bool | isLegalAddImmediate (int64_t Imm) const |
| Return true if the specified immediate is legal add immediate, that is the target has add instructions which can add a register with the immediate without having to materialize the immediate into a register. More... | |
| bool | isLegalICmpImmediate (int64_t Imm) const |
| Return true if the specified immediate is legal icmp immediate, that is the target has icmp instructions which can compare a register against the immediate without having to materialize the immediate into a register. More... | |
| bool | isLegalAddressingMode (Type *Ty, GlobalValue *BaseGV, int64_t BaseOffset, bool HasBaseReg, int64_t Scale, unsigned AddrSpace=0) const |
| Return true if the addressing mode represented by AM is legal for this target, for a load/store of the specified type. More... | |
| bool | isLegalMaskedStore (Type *DataType, int Consecutive) const |
| Return true if the target works with masked instruction AVX2 allows masks for consecutive load and store for i32 and i64 elements. More... | |
| bool | isLegalMaskedLoad (Type *DataType, int Consecutive) const |
| int | getScalingFactorCost (Type *Ty, GlobalValue *BaseGV, int64_t 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, for a load/store of the specified type. More... | |
| bool | isTruncateFree (Type *Ty1, Type *Ty2) const |
| Return true if it's free to truncate a value of type Ty1 to type Ty2. More... | |
| bool | isProfitableToHoist (Instruction *I) const |
| Return true if it is profitable to hoist instruction in the then/else to before if. More... | |
| bool | isTypeLegal (Type *Ty) const |
| Return true if this type is legal. More... | |
| unsigned | getJumpBufAlignment () const |
| Returns the target's jmp_buf alignment in bytes. More... | |
| unsigned | getJumpBufSize () const |
| Returns the target's jmp_buf size in bytes. More... | |
| bool | shouldBuildLookupTables () const |
| Return true if switches should be turned into lookup tables for the target. More... | |
| bool | enableAggressiveInterleaving (bool LoopHasReductions) const |
| Don't restrict interleaved unrolling to small loops. More... | |
| PopcntSupportKind | getPopcntSupport (unsigned IntTyWidthInBit) const |
| Return hardware support for population count. More... | |
| bool | haveFastSqrt (Type *Ty) const |
| Return true if the hardware has a fast square-root instruction. More... | |
| unsigned | getFPOpCost (Type *Ty) const |
| Return the expected cost of supporting the floating point operation of the specified type. More... | |
| unsigned | getIntImmCost (const APInt &Imm, Type *Ty) const |
| Return the expected cost of materializing for the given integer immediate of the specified type. More... | |
| unsigned | getIntImmCost (unsigned Opc, unsigned Idx, const APInt &Imm, Type *Ty) const |
| Return the expected cost of materialization for the given integer immediate of the specified type for a given instruction. More... | |
| unsigned | getIntImmCost (Intrinsic::ID IID, unsigned Idx, const APInt &Imm, Type *Ty) const |
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
Definition at line 58 of file TargetTransformInfo.h.
Additional information about an operand's possible values.
| Enumerator | |
|---|---|
| OK_AnyValue | |
| OK_UniformValue | |
| OK_UniformConstantValue | |
| OK_NonUniformConstantValue | |
Definition at line 389 of file TargetTransformInfo.h.
Additional properties of an operand's values.
| Enumerator | |
|---|---|
| OP_None | |
| OP_PowerOf2 | |
Definition at line 397 of file TargetTransformInfo.h.
Flags indicating the kind of support for population count.
Compared to the SW implementation, HW support is supposed to significantly boost the performance when the population is dense, and it may or may not degrade performance if the population is sparse. A HW support is considered as "Fast" if it can outperform, or is on a par with, SW implementation when the population is sparse; otherwise, it is considered as "Slow".
| Enumerator | |
|---|---|
| PSK_Software | |
| PSK_SlowHardware | |
| PSK_FastHardware | |
Definition at line 289 of file TargetTransformInfo.h.
The various kinds of shuffle patterns for vector queries.
Definition at line 380 of file TargetTransformInfo.h.
Underlying constants for 'cost' values in this interface.
Many APIs in this interface return a cost. This enum defines the fundamental values that should be used to interpret (and produce) those costs. The costs are returned as an unsigned rather than a member of this enumeration because it is expected that the cost of one IR instruction may have a multiplicative factor to it or otherwise won't fit directly into the enum. Moreover, it is common to sum or average costs which works better as simple integral values. Thus this enum only provides constants.
Note that these costs should usually reflect the intersection of code-size cost and execution cost. A free instruction is typically one that folds into another instruction. For example, reg-to-reg moves can often be skipped by renaming the registers in the CPU, but they still are encoded and thus wouldn't be considered 'free' here.
| Enumerator | |
|---|---|
| TCC_Free |
Expected to fold away in lowering. |
| TCC_Basic |
The cost of a typical 'add' instruction. |
| TCC_Expensive |
The cost of a 'div' instruction on x86. |
Definition at line 111 of file TargetTransformInfo.h.
| llvm::TargetTransformInfo::TargetTransformInfo | ( | T | Impl | ) |
Construct a TTI object using a type implementing the Concept API below.
This is used by targets to construct a TTI wrapping their target-specific implementaion that encodes appropriate costs for their target.
Definition at line 825 of file TargetTransformInfo.h.
|
explicit |
Construct a baseline TTI object using a minimal implementation of the Concept API below.
The TTI implementation will reflect the information in the DataLayout provided if non-null.
Definition at line 36 of file TargetTransformInfo.cpp.
| TargetTransformInfo::TargetTransformInfo | ( | TargetTransformInfo && | Arg | ) |
Definition at line 41 of file TargetTransformInfo.cpp.
| TargetTransformInfo::~TargetTransformInfo | ( | ) |
Definition at line 39 of file TargetTransformInfo.cpp.
Don't restrict interleaved unrolling to small loops.
Definition at line 152 of file TargetTransformInfo.cpp.
Definition at line 262 of file TargetTransformInfo.cpp.
Referenced by chainToBasePointerCost().
| unsigned TargetTransformInfo::getArithmeticInstrCost | ( | unsigned | Opcode, |
| Type * | Ty, | ||
| OperandValueKind | Opd1Info = OK_AnyValue, |
||
| OperandValueKind | Opd2Info = OK_AnyValue, |
||
| OperandValueProperties | Opd1PropInfo = OP_None, |
||
| OperandValueProperties | Opd2PropInfo = OP_None |
||
| ) | const |
Definition at line 195 of file TargetTransformInfo.cpp.
Referenced by visitIVCast().
| unsigned TargetTransformInfo::getCallCost | ( | FunctionType * | FTy, |
| int | NumArgs = -1 |
||
| ) | const |
Estimate the cost of a function call when lowered.
The contract for this is the same as getOperationCost except that it supports an interface that provides extra information specific to call instructions.
This is the most basic query for estimating call cost: it only knows the function type and (potentially) the number of arguments at the call site. The latter is only interesting for varargs function types.
Definition at line 54 of file TargetTransformInfo.cpp.
Estimate the cost of calling a specific function when lowered.
This overload adds the ability to reason about the particular function being called in the event it is a library call with special lowering.
| unsigned TargetTransformInfo::getCallCost | ( | const Function * | F, |
| ArrayRef< const Value * > | Arguments | ||
| ) | const |
Estimate the cost of calling a specific function when lowered.
This overload allows specifying a set of candidate argument values.
Definition at line 60 of file TargetTransformInfo.cpp.
| unsigned TargetTransformInfo::getCallInstrCost | ( | Function * | F, |
| Type * | RetTy, | ||
| ArrayRef< Type * > | Tys | ||
| ) | const |
Definition at line 253 of file TargetTransformInfo.cpp.
Referenced by getVectorCallCost().
Definition at line 208 of file TargetTransformInfo.cpp.
Referenced by chainToBasePointerCost().
Definition at line 213 of file TargetTransformInfo.cpp.
| unsigned TargetTransformInfo::getCmpSelInstrCost | ( | unsigned | Opcode, |
| Type * | ValTy, | ||
| Type * | CondTy = nullptr |
||
| ) | const |
Definition at line 217 of file TargetTransformInfo.cpp.
Some types may require the use of register classes that do not have any callee-saved registers, so would require a spill and fill.
Definition at line 273 of file TargetTransformInfo.cpp.
Return the expected cost of supporting the floating point operation of the specified type.
Definition at line 165 of file TargetTransformInfo.cpp.
| unsigned llvm::TargetTransformInfo::getGEPCost | ( | const Value * | Ptr, |
| ArrayRef< const Value * > | Operands | ||
| ) | const |
Estimate the cost of a GEP operation when lowered.
The contract for this function is the same as getOperationCost except that it supports an interface that provides extra information specific to the GEP operation.
| unsigned TargetTransformInfo::getInterleavedMemoryOpCost | ( | unsigned | Opcode, |
| Type * | VecTy, | ||
| unsigned | Factor, | ||
| ArrayRef< unsigned > | Indices, | ||
| unsigned | Alignment, | ||
| unsigned | AddressSpace | ||
| ) | const |
Opcode is the memory operation code VecTy is the vector type of the interleaved access. Factor is the interleave factor Indices is the indices for interleaved load members (as interleaved load allows gaps) Alignment is the alignment of the memory operation AddressSpace is address space of the pointer. Definition at line 240 of file TargetTransformInfo.cpp.
Return the expected cost of materializing for the given integer immediate of the specified type.
Definition at line 169 of file TargetTransformInfo.cpp.
| unsigned TargetTransformInfo::getIntImmCost | ( | unsigned | Opc, |
| unsigned | Idx, | ||
| const APInt & | Imm, | ||
| Type * | Ty | ||
| ) | const |
Return the expected cost of materialization for the given integer immediate of the specified type for a given instruction.
The cost can be zero if the immediate can be folded into the specified instruction.
Definition at line 173 of file TargetTransformInfo.cpp.
| unsigned TargetTransformInfo::getIntImmCost | ( | Intrinsic::ID | IID, |
| unsigned | Idx, | ||
| const APInt & | Imm, | ||
| Type * | Ty | ||
| ) | const |
Definition at line 178 of file TargetTransformInfo.cpp.
| unsigned llvm::TargetTransformInfo::getIntrinsicCost | ( | Intrinsic::ID | IID, |
| Type * | RetTy, | ||
| ArrayRef< Type * > | ParamTys | ||
| ) | const |
Estimate the cost of an intrinsic when lowered.
Mirrors the getCallCost method but uses an intrinsic identifier.
| unsigned TargetTransformInfo::getIntrinsicCost | ( | Intrinsic::ID | IID, |
| Type * | RetTy, | ||
| ArrayRef< const Value * > | Arguments | ||
| ) | const |
Estimate the cost of an intrinsic when lowered.
Mirrors the getCallCost method but uses an intrinsic identifier.
Definition at line 66 of file TargetTransformInfo.cpp.
| unsigned TargetTransformInfo::getIntrinsicInstrCost | ( | Intrinsic::ID | ID, |
| Type * | RetTy, | ||
| ArrayRef< Type * > | Tys | ||
| ) | const |
Definition at line 248 of file TargetTransformInfo.cpp.
Referenced by getVectorIntrinsicCost().
| unsigned TargetTransformInfo::getJumpBufAlignment | ( | ) | const |
Returns the target's jmp_buf alignment in bytes.
Definition at line 140 of file TargetTransformInfo.cpp.
| unsigned TargetTransformInfo::getJumpBufSize | ( | ) | const |
Returns the target's jmp_buf size in bytes.
Definition at line 144 of file TargetTransformInfo.cpp.
| unsigned TargetTransformInfo::getMaskedMemoryOpCost | ( | unsigned | Opcode, |
| Type * | Src, | ||
| unsigned | Alignment, | ||
| unsigned | AddressSpace | ||
| ) | const |
Definition at line 234 of file TargetTransformInfo.cpp.
Definition at line 191 of file TargetTransformInfo.cpp.
| unsigned TargetTransformInfo::getMemoryOpCost | ( | unsigned | Opcode, |
| Type * | Src, | ||
| unsigned | Alignment, | ||
| unsigned | AddressSpace | ||
| ) | const |
Definition at line 227 of file TargetTransformInfo.cpp.
Definition at line 258 of file TargetTransformInfo.cpp.
Definition at line 183 of file TargetTransformInfo.cpp.
| unsigned TargetTransformInfo::getOperationCost | ( | unsigned | Opcode, |
| Type * | Ty, | ||
| Type * | OpTy = nullptr |
||
| ) | const |
Estimate the cost of a specific operation when lowered.
Note that this is designed to work on an arbitrary synthetic opcode, and thus work for hypothetical queries before an instruction has even been formed. However, this does not work for GEPs, and must not be called for a GEP instruction. Instead, use the dedicated getGEPCost interface as analyzing a GEP's cost required more information.
Typically only the result type is required, and the operand type can be omitted. However, if the opcode is one of the cast instructions, the operand type is required.
The returned cost is defined in terms of TargetCostConstants, see its comments for a detailed explanation of the cost values.
Definition at line 49 of file TargetTransformInfo.cpp.
| Value * TargetTransformInfo::getOrCreateResultFromMemIntrinsic | ( | IntrinsicInst * | Inst, |
| Type * | ExpectedType | ||
| ) | const |
Definition at line 282 of file TargetTransformInfo.cpp.
| TargetTransformInfo::PopcntSupportKind TargetTransformInfo::getPopcntSupport | ( | unsigned | IntTyWidthInBit | ) | const |
Return hardware support for population count.
Definition at line 157 of file TargetTransformInfo.cpp.
| unsigned TargetTransformInfo::getReductionCost | ( | unsigned | Opcode, |
| Type * | Ty, | ||
| bool | IsPairwiseForm | ||
| ) | const |
Calculate the cost of performing a vector reduction.
This is the cost of reducing the vector value of type Ty to a scalar value using the operation denoted by Opcode. The form of the reduction can either be a pairwise reduction or a reduction that splits the vector at every reduction level.
Pairwise: (v0, v1, v2, v3) ((v0+v1), (v2, v3), undef, undef) Split: (v0, v1, v2, v3) ((v0+v2), (v1+v3), undef, undef)
Definition at line 267 of file TargetTransformInfo.cpp.
Definition at line 187 of file TargetTransformInfo.cpp.
| int TargetTransformInfo::getScalingFactorCost | ( | Type * | Ty, |
| GlobalValue * | BaseGV, | ||
| int64_t | 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, for a load/store of the specified type.
If the AM is supported, the return value must be >= 0. If the AM is not supported, it returns a negative value. TODO: Handle pre/postinc as well.
Definition at line 119 of file TargetTransformInfo.cpp.
Referenced by getScalingFactorCost().
| unsigned TargetTransformInfo::getShuffleCost | ( | ShuffleKind | Kind, |
| Type * | Tp, | ||
| int | Index = 0, |
||
| Type * | SubTp = nullptr |
||
| ) | const |
Definition at line 203 of file TargetTransformInfo.cpp.
| bool TargetTransformInfo::getTgtMemIntrinsic | ( | IntrinsicInst * | Inst, |
| MemIntrinsicInfo & | Info | ||
| ) | const |
Definition at line 277 of file TargetTransformInfo.cpp.
| void TargetTransformInfo::getUnrollingPreferences | ( | Loop * | L, |
| UnrollingPreferences & | UP | ||
| ) | const |
Get target-customized preferences for the generic loop unrolling transformation.
The caller will initialize UP with the current target-independent defaults.
Definition at line 87 of file TargetTransformInfo.cpp.
Estimate the cost of a given IR user when lowered.
This can estimate the cost of either a ConstantExpr or Instruction when lowered. It has two primary advantages over the getOperationCost and getGEPCost above, and one significant disadvantage: it can only be used when the IR construct has already been formed.
The advantages are that it can inspect the SSA use graph to reason more accurately about the cost. For example, all-constant-GEPs can often be folded into a load or other instruction, but if they are used in some other context they may not be folded. This routine can distinguish such cases.
The returned cost is defined in terms of TargetCostConstants, see its comments for a detailed explanation of the cost values.
Definition at line 71 of file TargetTransformInfo.cpp.
Referenced by llvm::CodeMetrics::analyzeBasicBlock(), analyzeLoopUnrollCost(), and ComputeSpeculationCost().
| unsigned TargetTransformInfo::getVectorInstrCost | ( | unsigned | Opcode, |
| Type * | Val, | ||
| unsigned | Index = -1 |
||
| ) | const |
Definition at line 222 of file TargetTransformInfo.cpp.
Referenced by getScalarizationOverhead().
| bool TargetTransformInfo::hasBranchDivergence | ( | ) | const |
Return true if branch divergence exists.
Branch divergence has a significantly negative impact on GPU performance when threads in the same wavefront take different paths due to conditional branches.
Definition at line 75 of file TargetTransformInfo.cpp.
| bool TargetTransformInfo::hasCompatibleFunctionAttributes | ( | const Function * | Caller, |
| const Function * | Callee | ||
| ) | const |
Definition at line 287 of file TargetTransformInfo.cpp.
Referenced by functionsHaveCompatibleAttributes().
Return true if the hardware has a fast square-root instruction.
Definition at line 161 of file TargetTransformInfo.cpp.
|
inline |
Handle the invalidation of this information.
When used as a result of TargetIRAnalysis this method will be called when the function this was computed for changes. When it returns false, the information is preserved across those changes.
Definition at line 87 of file TargetTransformInfo.h.
| bool TargetTransformInfo::isLegalAddImmediate | ( | int64_t | Imm | ) | const |
Return true if the specified immediate is legal add immediate, that is the target has add instructions which can add a register with the immediate without having to materialize the immediate into a register.
Definition at line 92 of file TargetTransformInfo.cpp.
| bool TargetTransformInfo::isLegalAddressingMode | ( | Type * | Ty, |
| GlobalValue * | BaseGV, | ||
| int64_t | BaseOffset, | ||
| bool | HasBaseReg, | ||
| int64_t | Scale, | ||
| unsigned | AddrSpace = 0 |
||
| ) | const |
Return true if the addressing mode represented by AM is legal for this target, for a load/store of the specified type.
The type may be VoidTy, in which case only return true if the addressing mode is legal for a load/store of any legal type. TODO: Handle pre/postinc as well.
Definition at line 100 of file TargetTransformInfo.cpp.
Referenced by isAddFoldable(), isAMCompletelyFolded(), and isGEPFoldable().
| bool TargetTransformInfo::isLegalICmpImmediate | ( | int64_t | Imm | ) | const |
Return true if the specified immediate is legal icmp immediate, that is the target has icmp instructions which can compare a register against the immediate without having to materialize the immediate into a register.
Definition at line 96 of file TargetTransformInfo.cpp.
Referenced by isAMCompletelyFolded().
Definition at line 114 of file TargetTransformInfo.cpp.
Return true if the target works with masked instruction AVX2 allows masks for consecutive load and store for i32 and i64 elements.
AVX-512 architecture will also allow masks for non-consecutive memory accesses.
Definition at line 109 of file TargetTransformInfo.cpp.
Test whether calls to a function lower to actual program function calls.
The idea is to test whether the program is likely to require a 'call' instruction or equivalent in order to call the given function.
FIXME: It's not clear that this is a good or useful query API. Client's should probably move to simpler cost metrics using the above. Alternatively, we could split the cost interface into distinct code-size and execution-speed costs. This would allow modelling the core of this query more accurately as a call is a single small instruction, but incurs significant execution cost.
Definition at line 83 of file TargetTransformInfo.cpp.
Referenced by llvm::CodeMetrics::analyzeBasicBlock().
| bool TargetTransformInfo::isProfitableToHoist | ( | Instruction * | I | ) | const |
Return true if it is profitable to hoist instruction in the then/else to before if.
Definition at line 132 of file TargetTransformInfo.cpp.
Referenced by HoistThenElseCodeToIf().
Returns whether V is a source of divergence.
This function provides the target-dependent information for the target-independent DivergenceAnalysis. DivergenceAnalysis first builds the dependency graph, and then runs the reachability algorithm starting with the sources of divergence.
Definition at line 79 of file TargetTransformInfo.cpp.
Return true if it's free to truncate a value of type Ty1 to type Ty2.
e.g. On x86 it's free to truncate a i32 value in register EAX to i16 by referencing its sub-register AX.
Definition at line 128 of file TargetTransformInfo.cpp.
Referenced by llvm::SCEVExpander::replaceCongruentIVs().
Return true if this type is legal.
Definition at line 136 of file TargetTransformInfo.cpp.
Referenced by ShouldBuildLookupTable().
| TargetTransformInfo & TargetTransformInfo::operator= | ( | TargetTransformInfo && | RHS | ) |
Definition at line 44 of file TargetTransformInfo.cpp.
| bool TargetTransformInfo::shouldBuildLookupTables | ( | ) | const |
Return true if switches should be turned into lookup tables for the target.
Definition at line 148 of file TargetTransformInfo.cpp.
Referenced by SwitchToLookupTable().
1.8.6