[llvm] c2deb2a - [SLP]Fix a crash in gathered loads analysis.

Alexey Bataev via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 30 05:22:40 PDT 2021


Author: Alexey Bataev
Date: 2021-07-30T05:19:17-07:00
New Revision: c2deb2afafee991c06cc96dc5beecb6de448b9fc

URL: https://github.com/llvm/llvm-project/commit/c2deb2afafee991c06cc96dc5beecb6de448b9fc
DIFF: https://github.com/llvm/llvm-project/commit/c2deb2afafee991c06cc96dc5beecb6de448b9fc.diff

LOG: [SLP]Fix a crash in gathered loads analysis.

Need to check that the minimum acceptable vector factor is at least 2,
not 0, to avoid compiler crash during gathered loads analysis.

Differential Revision: https://reviews.llvm.org/D107058

Added: 
    llvm/test/Transforms/SLPVectorizer/AArch64/gather-load-min-required-vf-2.ll

Modified: 
    llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index f88d07f0b9326..06a735cad9aa3 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -734,6 +734,10 @@ class BoUpSLP {
     return MinVecRegSize;
   }
 
+  unsigned getMinVF(unsigned Sz) const {
+    return std::max(2U, getMinVecRegSize() / Sz);
+  }
+
   unsigned getMaximumVF(unsigned ElemWidth, unsigned Opcode) const {
     unsigned MaxVF = MaxVFOption.getNumOccurrences() ?
       MaxVFOption : TTI->getMaximumVF(ElemWidth, Opcode);
@@ -4187,8 +4191,7 @@ InstructionCost BoUpSLP::getEntryCost(const TreeEntry *E,
       unsigned VectorizedCnt = 0;
       unsigned ScatterVectorizeCnt = 0;
       const unsigned Sz = DL->getTypeSizeInBits(E->getMainOp()->getType());
-      for (unsigned MinVF = getMinVecRegSize() / (2 * Sz); VF >= MinVF;
-           VF /= 2) {
+      for (unsigned MinVF = getMinVF(2 * Sz); VF >= MinVF; VF /= 2) {
         for (unsigned Cnt = StartIdx, End = VL.size(); Cnt + VF <= End;
              Cnt += VF) {
           ArrayRef<Value *> Slice = VL.slice(Cnt, VF);
@@ -7448,7 +7451,7 @@ bool SLPVectorizerPass::vectorizeStores(ArrayRef<StoreInst *> Stores,
     unsigned EltSize = R.getVectorElementSize(Operands[0]);
     unsigned MaxElts = llvm::PowerOf2Floor(MaxVecRegSize / EltSize);
 
-    unsigned MinVF = std::max(2U, R.getMinVecRegSize() / EltSize);
+    unsigned MinVF = R.getMinVF(EltSize);
     unsigned MaxVF = std::min(R.getMaximumVF(EltSize, Instruction::Store),
                               MaxElts);
 
@@ -7559,7 +7562,7 @@ bool SLPVectorizerPass::tryToVectorizeList(ArrayRef<Value *> VL, BoUpSLP &R,
   }
 
   unsigned Sz = R.getVectorElementSize(I0);
-  unsigned MinVF = std::max(2U, R.getMinVecRegSize() / Sz);
+  unsigned MinVF = R.getMinVF(Sz);
   unsigned MaxVF = std::max<unsigned>(PowerOf2Floor(VL.size()), MinVF);
   MaxVF = std::min(R.getMaximumVF(Sz, S.getOpcode()), MaxVF);
   if (MaxVF < 2) {

diff  --git a/llvm/test/Transforms/SLPVectorizer/AArch64/gather-load-min-required-vf-2.ll b/llvm/test/Transforms/SLPVectorizer/AArch64/gather-load-min-required-vf-2.ll
new file mode 100644
index 0000000000000..fbcb0157c9fc3
--- /dev/null
+++ b/llvm/test/Transforms/SLPVectorizer/AArch64/gather-load-min-required-vf-2.ll
@@ -0,0 +1,32 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -slp-vectorizer -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s
+
+define void @foo() local_unnamed_addr {
+; CHECK-LABEL: @foo(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[TMP0:%.*]] = load volatile double, double* poison, align 8
+; CHECK-NEXT:    [[TMP1:%.*]] = load volatile double, double* poison, align 8
+; CHECK-NEXT:    [[TMP2:%.*]] = load volatile double, double* poison, align 8
+; CHECK-NEXT:    [[TMP3:%.*]] = load volatile double, double* poison, align 8
+; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
+; CHECK:       for.body:
+; CHECK-NEXT:    [[D30_0734:%.*]] = phi double [ undef, [[FOR_BODY]] ], [ [[TMP0]], [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[D01_0733:%.*]] = phi double [ undef, [[FOR_BODY]] ], [ [[TMP1]], [[ENTRY]] ]
+; CHECK-NEXT:    [[D11_0732:%.*]] = phi double [ undef, [[FOR_BODY]] ], [ [[TMP2]], [[ENTRY]] ]
+; CHECK-NEXT:    [[D21_0731:%.*]] = phi double [ undef, [[FOR_BODY]] ], [ [[TMP3]], [[ENTRY]] ]
+; CHECK-NEXT:    br label [[FOR_BODY]]
+;
+entry:
+  %0 = load volatile double, double* poison, align 8
+  %1 = load volatile double, double* poison, align 8
+  %2 = load volatile double, double* poison, align 8
+  %3 = load volatile double, double* poison, align 8
+  br label %for.body
+
+for.body:                                         ; preds = %for.body, %entry
+  %d30.0734 = phi double [ undef, %for.body ], [ %0, %entry ]
+  %d01.0733 = phi double [ undef, %for.body ], [ %1, %entry ]
+  %d11.0732 = phi double [ undef, %for.body ], [ %2, %entry ]
+  %d21.0731 = phi double [ undef, %for.body ], [ %3, %entry ]
+  br label %for.body
+}


        


More information about the llvm-commits mailing list