Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 18 Mar 2014 19:35:26 +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: r263313 - head/contrib/llvm/lib/CodeGen/SelectionDAG
Message-ID:  <201403181935.s2IJZQif011253@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dim
Date: Tue Mar 18 19:35:26 2014
New Revision: 263313
URL: http://svnweb.freebsd.org/changeset/base/263313

Log:
  Pull in r203311 from upstream llvm trunk (by Arnold Schwaighofer):
  
    ISel: Make VSELECT selection terminate in cases where the condition type has to
    be split and the result type widened.
  
    When the condition of a vselect has to be split it makes no sense widening the
    vselect and thereby widening the condition. We end up in an endless loop of
    widening (vselect result type) and splitting (condition mask type) doing this.
    Instead, split both the condition and the vselect and widen the result.
  
    I ran this over the test suite with i686 and mattr=+sse and saw no regressions.
  
    Fixes PR18036.
  
  With this fix the original problem case from the graphics/rawtherapee
  port (posted in http://llvm.org/PR18036 ) now compiles within ~97MB RSS.
  
  Reported by:	mandree
  MFC after:	1 week

Modified:
  head/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

Modified: head/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
==============================================================================
--- head/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp	Tue Mar 18 19:23:41 2014	(r263312)
+++ head/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp	Tue Mar 18 19:35:26 2014	(r263313)
@@ -2180,6 +2180,17 @@ SDValue DAGTypeLegalizer::WidenVecRes_SE
     if (getTypeAction(CondVT) == TargetLowering::TypeWidenVector)
       Cond1 = GetWidenedVector(Cond1);
 
+    // If we have to split the condition there is no point in widening the
+    // select. This would result in an cycle of widening the select ->
+    // widening the condition operand -> splitting the condition operand ->
+    // splitting the select -> widening the select. Instead split this select
+    // further and widen the resulting type.
+    if (getTypeAction(CondVT) == TargetLowering::TypeSplitVector) {
+      SDValue SplitSelect = SplitVecOp_VSELECT(N, 0);
+      SDValue Res = ModifyToType(SplitSelect, WidenVT);
+      return Res;
+    }
+
     if (Cond1.getValueType() != CondWidenVT)
       Cond1 = ModifyToType(Cond1, CondWidenVT);
   }



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