[llvm] 26fec4e - [SLP]Fix crash on casting non-instruction extractelement.

Alexey Bataev via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 3 09:47:39 PST 2023


Author: Alexey Bataev
Date: 2023-01-03T09:45:57-08:00
New Revision: 26fec4e845a833214d2b0036ea90f1b1c2418d50

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

LOG: [SLP]Fix crash on casting non-instruction extractelement.

Need to check if the extractelement operation is an extraction before
trying to move it around the buildblocks to avoid crash on cast.

Added: 
    llvm/test/Transforms/SLPVectorizer/AArch64/external-non-inst-use.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 f852a21692a5c..f11dc59d02f41 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -9556,7 +9556,7 @@ Value *BoUpSLP::vectorizeTree(ExtraValueToDebugLocsMap &ExternallyUsedValues,
   DenseMap<Value *, InsertElementInst *> VectorToInsertElement;
   // Maps extract Scalar to the corresponding extractelement instruction in the
   // basic block. Only one extractelement per block should be emitted.
-  DenseMap<Value *, DenseMap<BasicBlock *, Value *>> ScalarToEEs;
+  DenseMap<Value *, DenseMap<BasicBlock *, Instruction *>> ScalarToEEs;
   // Extract all of the elements with the external uses.
   for (const auto &ExternalUse : ExternalUses) {
     Value *Scalar = ExternalUse.Scalar;
@@ -9588,7 +9588,7 @@ Value *BoUpSLP::vectorizeTree(ExtraValueToDebugLocsMap &ExternallyUsedValues,
           // current block.
           auto EEIt = It->second.find(Builder.GetInsertBlock());
           if (EEIt != It->second.end()) {
-            auto *I = cast<Instruction>(EEIt->second);
+            Instruction *I = EEIt->second;
             if (Builder.GetInsertPoint() != Builder.GetInsertBlock()->end() &&
                 Builder.GetInsertPoint()->comesBefore(I))
               I->moveBefore(&*Builder.GetInsertPoint());
@@ -9603,7 +9603,8 @@ Value *BoUpSLP::vectorizeTree(ExtraValueToDebugLocsMap &ExternallyUsedValues,
           } else {
             Ex = Builder.CreateExtractElement(Vec, Lane);
           }
-          ScalarToEEs[Scalar].try_emplace(Builder.GetInsertBlock(), Ex);
+          if (auto *I = dyn_cast<Instruction>(Ex))
+            ScalarToEEs[Scalar].try_emplace(Builder.GetInsertBlock(), I);
         }
         // The then branch of the previous if may produce constants, since 0
         // operand might be a constant.

diff  --git a/llvm/test/Transforms/SLPVectorizer/AArch64/external-non-inst-use.ll b/llvm/test/Transforms/SLPVectorizer/AArch64/external-non-inst-use.ll
new file mode 100644
index 0000000000000..d4e3fb3e24853
--- /dev/null
+++ b/llvm/test/Transforms/SLPVectorizer/AArch64/external-non-inst-use.ll
@@ -0,0 +1,21 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -passes="slp-vectorizer" -mtriple=aarch64--linux-gnu -S %s | FileCheck %s
+
+define i16 @foo(ptr %p1, ptr %p2) {
+; CHECK-LABEL: @foo(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    store i32 0, ptr [[P1:%.*]], align 1
+; CHECK-NEXT:    [[CONST_MAT:%.*]] = or i32 0, 0
+; CHECK-NEXT:    store <2 x i32> zeroinitializer, ptr [[P2:%.*]], align 1
+; CHECK-NEXT:    ret i16 0
+;
+entry:
+  %const1 = bitcast i32 0 to i32
+  %const = bitcast i32 0 to i32
+  store i32 %const, ptr %p1, align 1
+  %const_mat = or i32 %const, 0
+  %v_332.imagp = getelementptr { i32, i32 }, ptr %p2, i32 0, i32 1
+  store i32 %const, ptr %p2, align 1
+  store i32 %const1, ptr %v_332.imagp, align 1
+  ret i16 0
+}


        


More information about the llvm-commits mailing list