summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorArnold Schwaighofer <aschwaighofer@apple.com>2013-04-04 23:26:21 +0000
committerArnold Schwaighofer <aschwaighofer@apple.com>2013-04-04 23:26:21 +0000
commit6bf4f676413b8f7d97aaff289997aab344180957 (patch)
tree2544afd1429b314cf812ace0b344c2077547f805 /include
parent624a93ee47fd05adbad4ea22b50c554ca23ac0ef (diff)
downloadllvm-6bf4f676413b8f7d97aaff289997aab344180957.tar.gz
llvm-6bf4f676413b8f7d97aaff289997aab344180957.tar.bz2
llvm-6bf4f676413b8f7d97aaff289997aab344180957.tar.xz
CostModel: Add parameter to instruction cost to further classify operand values
On certain architectures we can support efficient vectorized version of instructions if the operand value is uniform (splat) or a constant scalar. An example of this is a vector shift on x86. We can efficiently support for (i = 0 ; i < ; i += 4) w[0:3] = v[0:3] << <2, 2, 2, 2> but not for (i = 0; i < ; i += 4) w[0:3] = v[0:3] << x[0:3] This patch adds a parameter to getArithmeticInstrCost to further qualify operand values as uniform or uniform constant. Targets can then choose to return a different cost for instructions with such operand values. A follow-up commit will test this feature on x86. radar://13576547 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178807 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r--include/llvm/Analysis/TargetTransformInfo.h11
1 files changed, 10 insertions, 1 deletions
diff --git a/include/llvm/Analysis/TargetTransformInfo.h b/include/llvm/Analysis/TargetTransformInfo.h
index ccab19495f..a9d6725d86 100644
--- a/include/llvm/Analysis/TargetTransformInfo.h
+++ b/include/llvm/Analysis/TargetTransformInfo.h
@@ -263,6 +263,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.
@@ -277,7 +284,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