svn commit: r249817 - head/contrib/llvm/lib/Transforms/Vectorize
Dimitry Andric
dim at FreeBSD.org
Tue Apr 23 18:58:40 UTC 2013
Author: dim
Date: Tue Apr 23 18:58:39 2013
New Revision: 249817
URL: http://svnweb.freebsd.org/changeset/base/249817
Log:
Pull in r180121 from upstream llvm trunk:
LoopVectorizer: Fix 15830. When scalarizing and unrolling stores make
sure that the order in which the elements are scalarized is the same
as the original order.
This fixes a miscompilation in FreeBSD's regex library.
This should fix lib/libc/regex/regcomp.c at -O3 with clang 3.3 r178860
on CPUs with SSE. Before this change, the vectorizer could incorrectly
rearrange the second loop in computejumps(), leading to possibly invalid
entries in the re_gets::charjump table.
The net result was that for example "sed s/@CC@/foo/" failed to work
correctly, leading to trouble with many configure scripts.
Modified:
head/contrib/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
Modified: head/contrib/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
==============================================================================
--- head/contrib/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp Tue Apr 23 18:30:33 2013 (r249816)
+++ head/contrib/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp Tue Apr 23 18:58:39 2013 (r249817)
@@ -1040,10 +1040,10 @@ void InnerLoopVectorizer::scalarizeInstr
// Create a new entry in the WidenMap and initialize it to Undef or Null.
VectorParts &VecResults = WidenMap.splat(Instr, UndefVec);
- // For each scalar that we create:
- for (unsigned Width = 0; Width < VF; ++Width) {
- // For each vector unroll 'part':
- for (unsigned Part = 0; Part < UF; ++Part) {
+ // For each vector unroll 'part':
+ for (unsigned Part = 0; Part < UF; ++Part) {
+ // For each scalar that we create:
+ for (unsigned Width = 0; Width < VF; ++Width) {
Instruction *Cloned = Instr->clone();
if (!IsVoidRetTy)
Cloned->setName(Instr->getName() + ".cloned");
More information about the svn-src-all
mailing list