mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-14 14:24:05 +00:00
Add Support to Recognize and Vectorize NON SIMD instructions in SLPVectorizer.
This patch adds support to recognize patterns such as fadd,fsub,fadd,fsub.../add,sub,add,sub... and vectorizes them as vector shuffles if they are profitable. These patterns of vector shuffle can later be converted to instructions such as addsubpd etc on X86. Thanks to Arnold and Hal for the reviews. http://reviews.llvm.org/D4015 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211339 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -39,6 +39,9 @@ class BasicTTI final : public ImmutablePass, public TargetTransformInfo {
|
||||
/// are set if the result needs to be inserted and/or extracted from vectors.
|
||||
unsigned getScalarizationOverhead(Type *Ty, bool Insert, bool Extract) const;
|
||||
|
||||
/// Estimate the cost overhead of SK_Alternate shuffle.
|
||||
unsigned getAltShuffleOverhead(Type *Ty) const;
|
||||
|
||||
const TargetLoweringBase *getTLI() const { return TM->getTargetLowering(); }
|
||||
|
||||
public:
|
||||
@ -327,8 +330,28 @@ unsigned BasicTTI::getArithmeticInstrCost(unsigned Opcode, Type *Ty,
|
||||
return OpCost;
|
||||
}
|
||||
|
||||
unsigned BasicTTI::getAltShuffleOverhead(Type *Ty) const {
|
||||
assert(Ty->isVectorTy() && "Can only shuffle vectors");
|
||||
unsigned Cost = 0;
|
||||
// Shuffle cost is equal to the cost of extracting element from its argument
|
||||
// plus the cost of inserting them onto the result vector.
|
||||
|
||||
// e.g. <4 x float> has a mask of <0,5,2,7> i.e we need to extract from index
|
||||
// 0 of first vector, index 1 of second vector,index 2 of first vector and
|
||||
// finally index 3 of second vector and insert them at index <0,1,2,3> of
|
||||
// result vector.
|
||||
for (int i = 0, e = Ty->getVectorNumElements(); i < e; ++i) {
|
||||
Cost += TopTTI->getVectorInstrCost(Instruction::InsertElement, Ty, i);
|
||||
Cost += TopTTI->getVectorInstrCost(Instruction::ExtractElement, Ty, i);
|
||||
}
|
||||
return Cost;
|
||||
}
|
||||
|
||||
unsigned BasicTTI::getShuffleCost(ShuffleKind Kind, Type *Tp, int Index,
|
||||
Type *SubTp) const {
|
||||
if (Kind == SK_Alternate) {
|
||||
return getAltShuffleOverhead(Tp);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user