summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnold Schwaighofer <aschwaighofer@apple.com>2013-02-12 02:40:37 +0000
committerArnold Schwaighofer <aschwaighofer@apple.com>2013-02-12 02:40:37 +0000
commit7e2ca6e74ec13fb60d12dd913edd65c86c00f57b (patch)
tree30016824ca0b85143ebff949c39aad16204bff81
parenta00399c94983fb424858113ca5cfab780834f184 (diff)
downloadbcm5719-llvm-7e2ca6e74ec13fb60d12dd913edd65c86c00f57b.tar.gz
bcm5719-llvm-7e2ca6e74ec13fb60d12dd913edd65c86c00f57b.zip
Cost model: Add check for reverse shuffles to CostModel analysis
Check for reverse shuffles in the CostModel analysis pass and query TargetTransform info accordingly. This allows us we can write test cases for reverse shuffles. radar://13171406 llvm-svn: 174932
-rw-r--r--llvm/lib/Analysis/CostModel.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/CostModel.cpp b/llvm/lib/Analysis/CostModel.cpp
index 8435e397077..44684a9685b 100644
--- a/llvm/lib/Analysis/CostModel.cpp
+++ b/llvm/lib/Analysis/CostModel.cpp
@@ -80,6 +80,13 @@ CostModelAnalysis::runOnFunction(Function &F) {
return false;
}
+static bool isReverseVectorMask(SmallVector<int, 16> &Mask) {
+ for (unsigned i = 0, MaskSize = Mask.size(); i < MaskSize; ++i)
+ if (Mask[i] > 0 && Mask[i] != (int)(MaskSize - 1 - i))
+ return false;
+ return true;
+}
+
unsigned CostModelAnalysis::getInstructionCost(const Instruction *I) const {
if (!TTI)
return -1;
@@ -171,6 +178,17 @@ unsigned CostModelAnalysis::getInstructionCost(const Instruction *I) const {
return TTI->getVectorInstrCost(I->getOpcode(),
IE->getType(), Idx);
}
+ case Instruction::ShuffleVector: {
+ const ShuffleVectorInst *Shuffle = cast<ShuffleVectorInst>(I);
+ Type *VecTypOp0 = Shuffle->getOperand(0)->getType();
+ unsigned NumVecElems = VecTypOp0->getVectorNumElements();
+ SmallVector<int, 16> Mask = Shuffle->getShuffleMask();
+
+ if (NumVecElems == Mask.size() && isReverseVectorMask(Mask))
+ return TTI->getShuffleCost(TargetTransformInfo::SK_Reverse, VecTypOp0, 0,
+ 0);
+ return -1;
+ }
default:
// We don't have any information on this instruction.
return -1;
OpenPOWER on IntegriCloud