Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 9 Dec 2014 07:48:26 +0000 (UTC)
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r275634 - projects/clang350-import/contrib/llvm/lib/Transforms/Vectorize
Message-ID:  <201412090748.sB97mQub087197@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dim
Date: Tue Dec  9 07:48:25 2014
New Revision: 275634
URL: https://svnweb.freebsd.org/changeset/base/275634

Log:
  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
  
  Note: because this is applied on top of llvm/clang 3.5.0, this fix is
  slightly different from the one just checked into head in r275633.

Modified:
  projects/clang350-import/contrib/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Modified: projects/clang350-import/contrib/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
==============================================================================
--- projects/clang350-import/contrib/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp	Tue Dec  9 07:34:28 2014	(r275633)
+++ projects/clang350-import/contrib/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp	Tue Dec  9 07:48:25 2014	(r275634)
@@ -3466,6 +3466,15 @@ bool LoopVectorizationLegality::canVecto
     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()) {
+    emitAnalysis(
+        Report() << "loop control flow is not understood by vectorizer");
+    return false;
+  }
+
   // We need to have a loop header.
   DEBUG(dbgs() << "LV: Found a loop: " <<
         TheLoop->getHeader()->getName() << '\n');



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201412090748.sB97mQub087197>