Index: llvm/lib/Transforms/Vectorize/LoopVectorize.cpp =================================================================== --- llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -4048,8 +4048,11 @@ // getOrCreateVectorValue calls below. Builder.SetInsertPoint(NewPhi); - // The predecessor order is preserved and we can rely on mapping between - // scalar and vector block predecessors. + // The order of predecessors can be different between OrigPhi BB and NewPhi + // BB. Check dominance of incoming values and map incoming value and BB + // according to the dominace. + SmallVector NewIncomingValues; + bool NeedSwap = false; for (unsigned i = 0; i < NumIncomingValues; ++i) { BasicBlock *NewPredBB = VectorBBPredecessors[i]; @@ -4060,6 +4063,23 @@ // Scalar incoming value may need a broadcast Value *NewIncV = getOrCreateVectorValue(ScIncV, 0); + + // Check dominance of NewIncV with NewPredBB. + if (Instruction *NewIncI = dyn_cast(NewIncV)) { + if (!DT->dominates(NewIncI, NewPredBB)) { + NeedSwap = true; + } + } + NewIncomingValues.push_back(NewIncV); + } + + if (NeedSwap) { + std::swap(NewIncomingValues[0], NewIncomingValues[1]); + } + + for (unsigned i = 0; i < NumIncomingValues; ++i) { + BasicBlock *NewPredBB = VectorBBPredecessors[i]; + Value *NewIncV = NewIncomingValues[i]; NewPhi->addIncoming(NewIncV, NewPredBB); } }