diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -4750,7 +4750,8 @@ // Keeps the reordered operands to avoid code duplication. SmallVector OperandsVec; for (unsigned I = 0, E = PH->getNumIncomingValues(); I < E; ++I) { - if (!DT->isReachableFromEntry(PH->getIncomingBlock(I))) { + if (!DT->isReachableFromEntry(PH->getIncomingBlock(I)) && + !isa(PH->getIncomingValue(I))) { ValueList Operands(VL.size(), PoisonValue::get(PH->getType())); TE->setOperand(I, Operands); OperandsVec.push_back(Operands); diff --git a/llvm/test/Transforms/SLPVectorizer/X86/malformed_phis.ll b/llvm/test/Transforms/SLPVectorizer/X86/malformed_phis.ll --- a/llvm/test/Transforms/SLPVectorizer/X86/malformed_phis.ll +++ b/llvm/test/Transforms/SLPVectorizer/X86/malformed_phis.ll @@ -116,7 +116,7 @@ ; CHECK: bb2: ; CHECK-NEXT: br label [[BB3]] ; CHECK: bb3: -; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x i32> [ undef, [[BB1]] ], [ poison, [[BB2:%.*]] ] +; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x i32> [ undef, [[BB1]] ], [ undef, [[BB2:%.*]] ] ; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x i32> [[TMP0]], <2 x i32> poison, <8 x i32> ; CHECK-NEXT: [[TMP1:%.*]] = extractelement <8 x i32> [[SHUFFLE]], i32 0 ; CHECK-NEXT: [[TMP2:%.*]] = insertelement <16 x i32> poison, i32 [[TMP1]], i32 0 diff --git a/llvm/test/Transforms/SLPVectorizer/X86/phi-unreachable-input-block.ll b/llvm/test/Transforms/SLPVectorizer/X86/phi-unreachable-input-block.ll --- a/llvm/test/Transforms/SLPVectorizer/X86/phi-unreachable-input-block.ll +++ b/llvm/test/Transforms/SLPVectorizer/X86/phi-unreachable-input-block.ll @@ -15,7 +15,7 @@ ; CHECK: bb2: ; CHECK-NEXT: br label [[BB3]] ; CHECK: bb3: -; CHECK-NEXT: [[TMP2:%.*]] = phi <2 x i8> [ [[TMP1]], [[BB1:%.*]] ], [ poison, [[BB2:%.*]] ] +; CHECK-NEXT: [[TMP2:%.*]] = phi <2 x i8> [ [[TMP1]], [[BB1:%.*]] ], [ , [[BB2:%.*]] ] ; CHECK-NEXT: [[TMP3:%.*]] = zext <2 x i8> [[TMP2]] to <2 x i64> ; CHECK-NEXT: [[GEP0:%.*]] = getelementptr i64, i64* [[PTR:%.*]], i64 0 ; CHECK-NEXT: [[TMP4:%.*]] = bitcast i64* [[GEP0]] to <2 x i64>*