From 9a81b62a0143da6a057084638adc0658c59a77ba Mon Sep 17 00:00:00 2001 From: Michael Kuperstein Date: Thu, 26 May 2016 18:43:57 +0000 Subject: [BBVectorize] Don't vectorize selects with a scalar condition and vector operands. This fixes PR27879. Differential Revision: http://reviews.llvm.org/D20659 llvm-svn: 270888 --- llvm/lib/Transforms/Vectorize/BBVectorize.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'llvm/lib/Transforms') diff --git a/llvm/lib/Transforms/Vectorize/BBVectorize.cpp b/llvm/lib/Transforms/Vectorize/BBVectorize.cpp index 72ac7a5ba2b..af594cb751a 100644 --- a/llvm/lib/Transforms/Vectorize/BBVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/BBVectorize.cpp @@ -886,9 +886,16 @@ namespace { Type *DestTy = C->getDestTy(); if (!DestTy->isSingleValueType()) return false; - } else if (isa(I)) { + } else if (SelectInst *SI = dyn_cast(I)) { if (!Config.VectorizeSelect) return false; + // We can vectorize a select if either all operands are scalars, + // or all operands are vectors. Trying to "widen" a select between + // vectors that has a scalar condition results in a malformed select. + // FIXME: We could probably be smarter about this by rewriting the select + // with different types instead. + return (SI->getCondition()->getType()->isVectorTy() == + SI->getTrueValue()->getType()->isVectorTy()); } else if (isa(I)) { if (!Config.VectorizeCmp) return false; -- cgit v1.2.3