Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 15 Jan 2018 18:20:15 +0000 (UTC)
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r328010 - head/contrib/llvm/lib/Transforms/Vectorize
Message-ID:  <201801151820.w0FIKFCu090254@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dim
Date: Mon Jan 15 18:20:15 2018
New Revision: 328010
URL: https://svnweb.freebsd.org/changeset/base/328010

Log:
  Pull in r322473 from upstream llvm trunk (by Andrei Elovikov):
  
    [LV] Don't call recordVectorLoopValueForInductionCast for
    newly-created IV from a trunc.
  
    Summary:
    This method is supposed to be called for IVs that have casts in their
    use-def chains that are completely ignored after vectorization under
    PSE. However, for truncates of such IVs the same InductionDescriptor
    is used during creation/widening of both original IV based on PHINode
    and new IV based on TruncInst.
  
    This leads to unintended second call to
    recordVectorLoopValueForInductionCast with a VectorLoopVal set to the
    newly created IV for a trunc and causes an assert due to attempt to
    store new information for already existing entry in the map. This is
    wrong and should not be done.
  
    Fixes PR35773.
  
    Reviewers: dorit, Ayal, mssimpso
  
    Reviewed By: dorit
  
    Subscribers: RKSimon, dim, dcaballe, hsaito, llvm-commits, hiraditya
  
    Differential Revision: https://reviews.llvm.org/D41913
  
  This should fix "Vector value already set for part" assertions when
  building the net/iodine and sysutils/daa2iso ports.
  
  Reported by:	jbeich
  PR:		224867,224868

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	Mon Jan 15 18:08:01 2018	(r328009)
+++ head/contrib/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp	Mon Jan 15 18:20:15 2018	(r328010)
@@ -2630,9 +2630,12 @@ void InnerLoopVectorizer::createVectorIntOrFpInduction
   Instruction *LastInduction = VecInd;
   for (unsigned Part = 0; Part < UF; ++Part) {
     VectorLoopValueMap.setVectorValue(EntryVal, Part, LastInduction);
-    recordVectorLoopValueForInductionCast(II, LastInduction, Part);
+
     if (isa<TruncInst>(EntryVal))
       addMetadata(LastInduction, EntryVal);
+    else
+      recordVectorLoopValueForInductionCast(II, LastInduction, Part);
+
     LastInduction = cast<Instruction>(addFastMathFlag(
         Builder.CreateBinOp(AddOp, LastInduction, SplatVF, "step.add")));
   }
@@ -2754,15 +2757,17 @@ void InnerLoopVectorizer::widenIntOrFpInduction(PHINod
 
   // If we haven't yet vectorized the induction variable, splat the scalar
   // induction variable, and build the necessary step vectors.
+  // TODO: Don't do it unless the vectorized IV is really required.
   if (!VectorizedIV) {
     Value *Broadcasted = getBroadcastInstrs(ScalarIV);
     for (unsigned Part = 0; Part < UF; ++Part) {
       Value *EntryPart =
           getStepVector(Broadcasted, VF * Part, Step, ID.getInductionOpcode());
       VectorLoopValueMap.setVectorValue(EntryVal, Part, EntryPart);
-      recordVectorLoopValueForInductionCast(ID, EntryPart, Part);
       if (Trunc)
         addMetadata(EntryPart, Trunc);
+      else
+        recordVectorLoopValueForInductionCast(ID, EntryPart, Part);
     }
   }
 



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