From ac93b611659d94fd94b0394e78888b1402cd5199 Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Mon, 21 Nov 2022 09:59:56 -0800 Subject: [PATCH] [SLP]Fix PR59098: check if the vector type is scalarized for extractelements. If the resulting type is going to be scalarized, no need to adjust the cost of removed extractelement and insert/extract subvector costs. Otherwise, the compiler can crash because of the wrong type sizes. --- llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp | 9 ++++++--- .../SLPVectorizer/X86/scalarazied-result.ll | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 llvm/test/Transforms/SLPVectorizer/X86/scalarazied-result.ll diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index dc67c9e..cbf5736 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 0000000..53f1708 --- /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 +} -- 2.7.4