diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/Vectorize/BBVectorize.cpp | 27 | 
1 files changed, 23 insertions, 4 deletions
| diff --git a/llvm/lib/Transforms/Vectorize/BBVectorize.cpp b/llvm/lib/Transforms/Vectorize/BBVectorize.cpp index 4bd11c68446..9bf09ff122e 100644 --- a/llvm/lib/Transforms/Vectorize/BBVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/BBVectorize.cpp @@ -1824,6 +1824,16 @@ namespace {                    R->second == PairConnectionSplat) {                  int ESContrib = (int) getInstrCost(Instruction::ShuffleVector,                                                     VTy, VTy); + +                if (VTy->getVectorNumElements() == 2) { +                  if (R->second == PairConnectionSplat) +                    ESContrib = std::min(ESContrib, (int) TTI->getShuffleCost( +                      TargetTransformInfo::SK_Broadcast, VTy)); +                  else +                    ESContrib = std::min(ESContrib, (int) TTI->getShuffleCost( +                      TargetTransformInfo::SK_Reverse, VTy)); +                } +                  DEBUG(if (DebugPairSelection) dbgs() << "\tcost {" <<                    *Q->second.first << " <-> " << *Q->second.second <<                      "} -> {" << @@ -1860,10 +1870,12 @@ namespace {              if (NeedsExtraction) {                int ESContrib; -              if (Ty1->isVectorTy()) +              if (Ty1->isVectorTy()) {                  ESContrib = (int) getInstrCost(Instruction::ShuffleVector,                                                 Ty1, VTy); -              else +                ESContrib = std::min(ESContrib, (int) TTI->getShuffleCost( +                  TargetTransformInfo::SK_ExtractSubvector, VTy, 0, Ty1)); +              } else                  ESContrib = (int) TTI->getVectorInstrCost(                                      Instruction::ExtractElement, VTy, 0); @@ -1890,10 +1902,13 @@ namespace {              if (NeedsExtraction) {                int ESContrib; -              if (Ty2->isVectorTy()) +              if (Ty2->isVectorTy()) {                  ESContrib = (int) getInstrCost(Instruction::ShuffleVector,                                                 Ty2, VTy); -              else +                ESContrib = std::min(ESContrib, (int) TTI->getShuffleCost( +                  TargetTransformInfo::SK_ExtractSubvector, VTy, +                  Ty1->isVectorTy() ? Ty1->getVectorNumElements() : 1, Ty2)); +              } else                  ESContrib = (int) TTI->getVectorInstrCost(                                      Instruction::ExtractElement, VTy, 1);                DEBUG(if (DebugPairSelection) dbgs() << "\tcost {" << @@ -1969,6 +1984,10 @@ namespace {                } else if (IncomingPairs.count(VPR)) {                  ESContrib = (int) getInstrCost(Instruction::ShuffleVector,                                                 VTy, VTy); + +                if (VTy->getVectorNumElements() == 2) +                  ESContrib = std::min(ESContrib, (int) TTI->getShuffleCost( +                    TargetTransformInfo::SK_Reverse, VTy));                } else if (!Ty1->isVectorTy() && !Ty2->isVectorTy()) {                  ESContrib = (int) TTI->getVectorInstrCost(                                      Instruction::InsertElement, VTy, 0); | 

