Index: lib/Transforms/Vectorize/LoopVectorize.cpp =================================================================== --- lib/Transforms/Vectorize/LoopVectorize.cpp +++ lib/Transforms/Vectorize/LoopVectorize.cpp @@ -450,10 +450,10 @@ /// vectorizing this phi node. void fixReduction(PHINode *Phi); - /// \brief The Loop exit block may have single value PHI nodes where the - /// incoming value is 'Undef'. While vectorizing we only handled real values - /// that were defined inside the loop. Here we fix the 'undef case'. - /// See PR14725. + /// \brief The Loop exit block may have single value PHI nodes with some + /// incoming value. While vectorizing we only handled real values + /// that were defined inside the loop and we should have one value for + /// each predecessor of its parent basic block. See PR14725. void fixLCSSAPHIs(); /// Iteratively sink the scalarized operands of a predicated instruction into @@ -4346,7 +4346,7 @@ if (!LCSSAPhi) break; if (LCSSAPhi->getNumIncomingValues() == 1) - LCSSAPhi->addIncoming(UndefValue::get(LCSSAPhi->getType()), + LCSSAPhi->addIncoming(LCSSAPhi->getIncomingValue(0), LoopMiddleBlock); } } Index: test/Transforms/LoopVectorize/pr32859.ll =================================================================== --- /dev/null +++ test/Transforms/LoopVectorize/pr32859.ll @@ -0,0 +1,30 @@ +; RUN: opt < %s -loop-vectorize -S 2>&1 | FileCheck %s + +; CHECK-LABEL: for.cond.preheader: +; CHECK: %e.0.ph = phi i32 [ 0, %if.end.2.i ], [ 0, %middle.block ] + +; Function Attrs: nounwind uwtable +define void @main() #0 { +entry: + br label %for.cond1.preheader.i + +for.cond1.preheader.i: ; preds = %if.end.2.i, %entry + %c.06.i = phi i32 [ 0, %entry ], [ %inc5.i, %if.end.2.i ] + %tobool.i = icmp ne i32 undef, 0 + br label %if.end.2.i + +if.end.2.i: ; preds = %for.cond1.preheader.i + %inc5.i = add nsw i32 %c.06.i, 1 + %cmp.i = icmp slt i32 %inc5.i, 16 + br i1 %cmp.i, label %for.cond1.preheader.i, label %for.cond.preheader + +for.cond.preheader: ; preds = %if.end.2.i + %e.0.ph = phi i32 [ 0, %if.end.2.i ] + unreachable +} + +attributes #0 = { nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.ident = !{!0} + +!0 = !{!"clang version 5.0.0 (http://llvm.org/git/clang.git 08c94e4bd75c5a2e4de5ea108d98739f5179dbeb) (http://llvm.org/git/llvm.git 7d66f52694bdfabf0081a1d40b99fca0c189a988)"}