svn commit: r275742 - in stable: 10/contrib/llvm/lib/Transforms/Vectorize 10/sys/sys 9/contrib/llvm/lib/Transforms/Vectorize 9/sys/sys

Dimitry Andric dim at FreeBSD.org
Sat Dec 13 12:14:28 UTC 2014


Author: dim
Date: Sat Dec 13 12:14:26 2014
New Revision: 275742
URL: https://svnweb.freebsd.org/changeset/base/275742

Log:
  MFC r275633:
  
  Pull in r223171 from upstream llvm trunk (by Michael Zolotukhin):
  
    PR21302. Vectorize only bottom-tested loops.
  
    rdar://problem/18886083
  
  This fixes a bug in the llvm vectorizer, which could sometimes cause
  vectorized loops to perform an additional iteration, leading to possible
  buffer overruns.  Symptoms of this, which are usually segfaults, were
  first noticed when building gcc ports, here:
  
  https://lists.freebsd.org/pipermail/freebsd-ports/2014-September/095466.html
  https://lists.freebsd.org/pipermail/freebsd-toolchain/2014-September/001211.html
  
  Since this fix is very important for ports, bump __FreeBSD_version to
  make it easier for port maintainers to test whether the fix has been
  applied.
  
  Upstream PR:	http://llvm.org/PR21302

Modified:
  stable/9/contrib/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
  stable/9/sys/sys/param.h
Directory Properties:
  stable/9/contrib/llvm/   (props changed)
  stable/9/sys/   (props changed)

Changes in other areas also in this revision:
Modified:
  stable/10/contrib/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
  stable/10/sys/sys/param.h
Directory Properties:
  stable/10/   (props changed)

Modified: stable/9/contrib/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
==============================================================================
--- stable/9/contrib/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp	Sat Dec 13 04:50:14 2014	(r275741)
+++ stable/9/contrib/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp	Sat Dec 13 12:14:26 2014	(r275742)
@@ -2864,6 +2864,14 @@ bool LoopVectorizationLegality::canVecto
   if (!TheLoop->getExitingBlock())
     return false;
 
+  // We only handle bottom-tested loops, i.e. loop in which the condition is
+  // checked at the end of each iteration. With that we can assume that all
+  // instructions in the loop are executed the same number of times.
+  if (TheLoop->getExitingBlock() != TheLoop->getLoopLatch()) {
+    DEBUG(dbgs() << "LV: loop control flow is not understood by vectorizer\n");
+    return false;
+  }
+
   // We need to have a loop header.
   DEBUG(dbgs() << "LV: Found a loop: " <<
         TheLoop->getHeader()->getName() << '\n');

Modified: stable/9/sys/sys/param.h
==============================================================================
--- stable/9/sys/sys/param.h	Sat Dec 13 04:50:14 2014	(r275741)
+++ stable/9/sys/sys/param.h	Sat Dec 13 12:14:26 2014	(r275742)
@@ -58,7 +58,7 @@
  *		in the range 5 to 9.
  */
 #undef __FreeBSD_version
-#define __FreeBSD_version 903506	/* Master, propagated to newvers */
+#define __FreeBSD_version 903507	/* Master, propagated to newvers */
 
 /*
  * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,


More information about the svn-src-stable mailing list