From 688b5103eb4b70410d1ea54bcd8df4ef2f2ff8e8 Mon Sep 17 00:00:00 2001 From: Arnold Schwaighofer Date: Sat, 18 May 2013 18:38:34 +0000 Subject: LoopVectorize: Handle single edge PHIs We might encouter single edge PHIs - handle them with an identity select. Fixes PR15990. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@182199 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Vectorize/LoopVectorize.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'lib/Transforms/Vectorize') diff --git a/lib/Transforms/Vectorize/LoopVectorize.cpp b/lib/Transforms/Vectorize/LoopVectorize.cpp index fce2cf211c..d5c6ff8cad 100644 --- a/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -2105,7 +2105,6 @@ InnerLoopVectorizer::vectorizeBlockInLoop(LoopVectorizationLegality *Legal, // optimizations will clean it up. unsigned NumIncoming = P->getNumIncomingValues(); - assert(NumIncoming > 1 && "Invalid PHI"); // Generate a sequence of selects of the form: // SELECT(Mask3, In3, @@ -2117,10 +2116,11 @@ InnerLoopVectorizer::vectorizeBlockInLoop(LoopVectorizationLegality *Legal, VectorParts &In0 = getVectorValue(P->getIncomingValue(In)); for (unsigned part = 0; part < UF; ++part) { - // We don't need to 'select' the first PHI operand because it is - // the default value if all of the other masks don't match. + // We might have single edge PHIs (blocks) - use an identity + // 'select' for the first PHI operand. if (In == 0) - Entry[part] = In0[part]; + Entry[part] = Builder.CreateSelect(Cond[part], In0[part], + In0[part]); else // Select between the current value and the previous incoming edge // based on the incoming mask. -- cgit v1.2.3