diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index db078b2b261262..122caaccd5d6f3 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -9512,7 +9512,8 @@ Value *BoUpSLP::vectorizeTree(ExtraValueToDebugLocsMap &ExternallyUsedValues, for (const std::unique_ptr &E : VectorizableTree) { if ((E->State == TreeEntry::NeedToGather && (!E->getMainOp() || E->Idx > 0)) || - E->getOpcode() == Instruction::ExtractValue || + (E->State != TreeEntry::NeedToGather && + E->getOpcode() == Instruction::ExtractValue) || E->getOpcode() == Instruction::InsertElement) continue; Instruction *LastInst = &getLastInstructionInBundle(E.get()); diff --git a/llvm/test/Transforms/SLPVectorizer/X86/buildvector_splat_extractvalue.ll b/llvm/test/Transforms/SLPVectorizer/X86/buildvector_splat_extractvalue.ll new file mode 100644 index 00000000000000..a5130cc887ddd5 --- /dev/null +++ b/llvm/test/Transforms/SLPVectorizer/X86/buildvector_splat_extractvalue.ll @@ -0,0 +1,55 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -mtriple=x86_64-unknown-linux-gnu --passes=slp-vectorizer -S -o - %s | FileCheck %s + +define float @test() { +; CHECK-LABEL: @test( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[DOTOBIT1683:%.*]] = extractvalue { i64, i1 } zeroinitializer, 1 +; CHECK-NEXT: [[TMP0:%.*]] = insertelement <8 x i1> poison, i1 [[DOTOBIT1683]], i32 0 +; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <8 x i1> [[TMP0]], <8 x i1> poison, <8 x i32> zeroinitializer +; CHECK-NEXT: [[TMP2:%.*]] = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> zeroinitializer) +; CHECK-NEXT: [[TMP3:%.*]] = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> [[TMP1]]) +; CHECK-NEXT: [[OP_RDX:%.*]] = or i1 [[TMP2]], [[TMP3]] +; CHECK-NEXT: [[OP_RDX1:%.*]] = or i1 [[OP_RDX]], false +; CHECK-NEXT: [[OP_RDX2:%.*]] = or i1 [[OP_RDX1]], false +; CHECK-NEXT: br i1 [[OP_RDX2]], label [[EXIT1:%.*]], label [[EXIT2:%.*]] +; CHECK: exit2: +; CHECK-NEXT: ret float 0.000000e+00 +; CHECK: exit1: +; CHECK-NEXT: ret float 0.000000e+00 +; +entry: + %.obit1683 = extractvalue { i64, i1 } zeroinitializer, 1 + %state907 = or i1 %.obit1683, %.obit1683 + %state915 = or i1 false, %state907 + %state1017 = or i1 false, %state915 + %state1021 = or i1 false, %state1017 + %state1032 = or i1 %.obit1683, %state1021 + %state1035 = or i1 false, %state1032 + %state1052 = or i1 false, %state1035 + %state1067 = or i1 false, %state1052 + %state1076 = or i1 %.obit1683, %state1067 + %state1142 = or i1 false, %state1076 + %state1156 = or i1 false, %state1142 + %state1161 = or i1 false, %state1156 + %state1165 = or i1 %.obit1683, %state1161 + %state1173 = or i1 false, %state1165 + %state1193 = or i1 false, %state1173 + %state1240 = or i1 false, %state1193 + %state1258 = or i1 %.obit1683, %state1240 + %state1278 = or i1 false, %state1258 + %state1293 = or i1 false, %state1278 + %state1298 = or i1 false, %state1293 + %state1302 = or i1 %.obit1683, %state1298 + %state1329 = or i1 false, %state1302 + %state1336 = or i1 false, %state1329 + %state1350 = or i1 false, %state1336 + %state1359 = or i1 %.obit1683, %state1350 + br i1 %state1359, label %exit1, label %exit2 + +exit2: + ret float 0.000000e+00 + +exit1: + ret float 0.000000e+00 +}