diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index dc67c9e42e30..cbf57366126e 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -6275,6 +6275,10 @@ InstructionCost BoUpSLP::getEntryCost(const TreeEntry *E, // FIXME: it tries to fix a problem with MSVC buildbots. TargetTransformInfo *TTI = this->TTI; auto AdjustExtractsCost = [=](InstructionCost &Cost) { + // If the resulting type is scalarized, do not adjust the cost. + unsigned VecNumParts = TTI->getNumberOfParts(VecTy); + if (VecNumParts == VecTy->getNumElements()) + return; DenseMap ExtractVectorsTys; SmallPtrSet CheckedExtracts; for (auto *V : VL) { @@ -6296,8 +6300,7 @@ InstructionCost BoUpSLP::getEntryCost(const TreeEntry *E, if (!EEIdx) continue; unsigned Idx = *EEIdx; - if (TTI->getNumberOfParts(VecTy) != - TTI->getNumberOfParts(EE->getVectorOperandType())) { + if (VecNumParts != TTI->getNumberOfParts(EE->getVectorOperandType())) { auto It = ExtractVectorsTys.try_emplace(EE->getVectorOperand(), Idx).first; It->getSecond() = std::min(It->second, Idx); @@ -6328,7 +6331,7 @@ InstructionCost BoUpSLP::getEntryCost(const TreeEntry *E, unsigned NumElts = VecTy->getNumElements(); if (Data.second % NumElts == 0) continue; - if (TTI->getNumberOfParts(EEVTy) > TTI->getNumberOfParts(VecTy)) { + if (TTI->getNumberOfParts(EEVTy) > VecNumParts) { unsigned Idx = (Data.second / NumElts) * NumElts; unsigned EENumElts = EEVTy->getNumElements(); if (Idx + NumElts <= EENumElts) { diff --git a/llvm/test/Transforms/SLPVectorizer/X86/scalarazied-result.ll b/llvm/test/Transforms/SLPVectorizer/X86/scalarazied-result.ll new file mode 100644 index 000000000000..53f17083bd4b --- /dev/null +++ b/llvm/test/Transforms/SLPVectorizer/X86/scalarazied-result.ll @@ -0,0 +1,19 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -passes=slp-vectorizer -mtriple=x86_64-unknown-linux-gnu -S < %s | FileCheck %s + +define void @test() { +; CHECK-LABEL: @test( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = extractelement <8 x half> zeroinitializer, i64 1 +; CHECK-NEXT: [[TOBOOL:%.*]] = fcmp une half [[TMP0]], 0xH0000 +; CHECK-NEXT: [[TMP1:%.*]] = extractelement <8 x half> zeroinitializer, i64 1 +; CHECK-NEXT: [[TOBOOL3:%.*]] = fcmp une half [[TMP1]], 0xH0000 +; CHECK-NEXT: ret void +; +entry: + %0 = extractelement <8 x half> zeroinitializer, i64 1 + %tobool = fcmp une half %0, 0xH0000 + %1 = extractelement <8 x half> zeroinitializer, i64 1 + %tobool3 = fcmp une half %1, 0xH0000 + ret void +}