X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FAnalysis%2FTargetTransformInfo.h;h=eb29e3483d831077cc56e1c4e650ee853df12b70;hb=326ae27c4f744cc7fb43f5a413d042d54fc1ddc0;hp=681b838bc734d0dcb87dc803d0af4ea8627f63fe;hpb=13086a658ae06046ded902229f9918b8bad505bd;p=oota-llvm.git diff --git a/include/llvm/Analysis/TargetTransformInfo.h b/include/llvm/Analysis/TargetTransformInfo.h index 681b838bc73..eb29e3483d8 100644 --- a/include/llvm/Analysis/TargetTransformInfo.h +++ b/include/llvm/Analysis/TargetTransformInfo.h @@ -22,15 +22,17 @@ #ifndef LLVM_ANALYSIS_TARGETTRANSFORMINFO_H #define LLVM_ANALYSIS_TARGETTRANSFORMINFO_H -#include "llvm/CodeGen/ValueTypes.h" -#include "llvm/IR/GlobalValue.h" #include "llvm/IR/Intrinsics.h" -#include "llvm/IR/Type.h" #include "llvm/Pass.h" #include "llvm/Support/DataTypes.h" namespace llvm { +class GlobalValue; +class Type; +class User; +class Value; + /// TargetTransformInfo - This pass provides access to the codegen /// interfaces that are needed for IR-level transformations. class TargetTransformInfo { @@ -77,7 +79,7 @@ public: /// 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 dircetly + /// 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. /// @@ -194,7 +196,7 @@ public: /// 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 implementaion when the population is sparse; otherwise, it is + /// with, SW implementation when the population is sparse; otherwise, it is /// considered as "Slow". enum PopcntSupportKind { PSK_Software, @@ -223,6 +225,16 @@ public: int64_t BaseOffset, bool HasBaseReg, int64_t Scale) const; + /// \brief 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. + virtual int getScalingFactorCost(Type *Ty, GlobalValue *BaseGV, + int64_t BaseOffset, bool HasBaseReg, + int64_t Scale) const; + /// isTruncateFree - 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. @@ -261,6 +273,13 @@ public: SK_ExtractSubvector ///< ExtractSubvector Index indicates start offset. }; + /// \brief Additonal information about an operand's possible values. + enum OperandValueKind { + OK_AnyValue, // Operand can have any value. + OK_UniformValue, // Operand is uniform (splat of a value). + OK_UniformConstantValue // Operand is uniform constant. + }; + /// \return The number of scalar or vector registers that the target has. /// If 'Vectors' is true, it returns the number of vector registers. If it is /// set to false, it returns the number of scalar registers. @@ -275,7 +294,9 @@ public: virtual unsigned getMaximumUnrollFactor() const; /// \return The expected cost of arithmetic ops, such as mul, xor, fsub, etc. - virtual unsigned getArithmeticInstrCost(unsigned Opcode, Type *Ty) const; + virtual unsigned getArithmeticInstrCost(unsigned Opcode, Type *Ty, + OperandValueKind Opd1Info = OK_AnyValue, + OperandValueKind Opd2Info = OK_AnyValue) const; /// \return The cost of a shuffle instruction of kind Kind and of type Tp. /// The index and subtype parameters are used by the subvector insertion and @@ -288,7 +309,7 @@ public: virtual unsigned getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src) const; - /// \return The expected cost of control-flow related instrutctions such as + /// \return The expected cost of control-flow related instructions such as /// Phi, Ret, Br. virtual unsigned getCFInstrCost(unsigned Opcode) const; @@ -314,6 +335,12 @@ public: /// split during legalization. Zero is returned when the answer is unknown. virtual unsigned getNumberOfParts(Type *Tp) const; + /// \returns The cost of the address computation. For most targets this can be + /// merged into the instruction indexing mode. Some targets might want to + /// distinguish between address computation for memory operations on vector + /// types and scalar types. Such targets should override this function. + virtual unsigned getAddressComputationCost(Type *Ty) const; + /// @} /// Analysis group identification. @@ -322,7 +349,7 @@ public: /// \brief Create the base case instance of a pass in the TTI analysis group. /// -/// This class provides the base case for the stack of TTI analyses. It doesn't +/// This class provides the base case for the stack of TTI analyzes. It doesn't /// delegate to anything and uses the STTI and VTTI objects passed in to /// satisfy the queries. ImmutablePass *createNoTargetTransformInfoPass();