[llvm-commits] Fix for assertion in DAGCombiner

Villmow, Micah Micah.Villmow at amd.com
Mon Apr 26 13:37:46 PDT 2010


Jan,
 One thing you can try is to use the helper function DAG.gteSExtOrTrunc() instead of return DAG.getNode(ISD::TRUNCATE, N->getDebugLoc(),  VT,  VsetCC); This should fix the problem of the case where the type is larger without duplicating code.

Micah

-----Original Message-----
From: llvm-commits-bounces at cs.uiuc.edu [mailto:llvm-commits-bounces at cs.uiuc.edu] On Behalf Of Jan Sjodin
Sent: Monday, April 26, 2010 12:11 PM
To: Dan Gohman
Cc: llvm-commits at cs.uiuc.edu
Subject: Re: [llvm-commits] Fix for assertion in DAGCombiner

Below is one way of fixing the issue of sign extending a vector of smaller element types.
I suppose it would be fairly trivial to include the case where the type is larger by replacing
truncate with a second sign extend, but I wanted to get feedback on this code:

Index: lib/CodeGen/SelectionDAG/DAGCombiner.cpp
===================================================================
--- lib/CodeGen/SelectionDAG/DAGCombiner.cpp    (revision 102340)
+++ lib/CodeGen/SelectionDAG/DAGCombiner.cpp    (working copy)
@@ -3495,20 +3495,34 @@
 
   if (N0.getOpcode() == ISD::SETCC) {
     // sext(setcc) -> sext_in_reg(vsetcc) for vectors.
-    if (VT.isVector() &&
+    // Only do this before legalize for now.
+    if (VT.isVector() && !LegalOperations) {
+      EVT N0VT = N0.getOperand(0).getValueType();
         // We know that the # elements of the results is the same as the
         // # elements of the compare (and the # elements of the compare result
         // for that matter).  Check to see that they are the same size.  If so,
         // we know that the element size of the sext'd result matches the
         // element size of the compare operands.
-        VT.getSizeInBits() == N0.getOperand(0).getValueType().getSizeInBits() &&
-      
-        // Only do this before legalize for now.
-        !LegalOperations) {
-      return DAG.getVSetCC(N->getDebugLoc(), VT, N0.getOperand(0),
-                           N0.getOperand(1),
-                           cast<CondCodeSDNode>(N0.getOperand(2))->get());
-    }
+      if(VT.getSizeInBits() == N0VT.getSizeInBits())
+       return DAG.getVSetCC(N->getDebugLoc(), VT, N0.getOperand(0),
+                            N0.getOperand(1),
+                            cast<CondCodeSDNode>(N0.getOperand(2))->get());
+      // If the desired elements are smaller than the source elements we can
+      // use a matching integer vector type and then truncate
+      else if(VT.getSizeInBits() < N0VT.getSizeInBits()) {
+       EVT MatchingElementType =
+         EVT::getIntegerVT(*DAG.getContext(),
+                           N0VT.getScalarType().getSizeInBits());
+       EVT MatchingVectorType =
+         EVT::getVectorVT(*DAG.getContext(), MatchingElementType,
+                          N0VT.getVectorNumElements());
+       SDValue VsetCC = 
+         DAG.getVSetCC(N->getDebugLoc(), MatchingVectorType, N0.getOperand(0),
+                       N0.getOperand(1),
+                       cast<CondCodeSDNode>(N0.getOperand(2))->get());
+       return DAG.getNode(ISD::TRUNCATE, N->getDebugLoc(),  VT,  VsetCC);
+      }
+    }
     
     // sext(setcc x, y, cc) -> (select_cc x, y, -1, 0, cc)
     unsigned ElementWidth = VT.getScalarType().getSizeInBits();




----- Original Message ----
> From: Dan Gohman <gohman at apple.com>
> To: Jan Sjodin <jan_sjodin at yahoo.com>
> Cc: llvm-commits at cs.uiuc.edu
> Sent: Fri, April 23, 2010 9:22:30 PM
> Subject: Re: [llvm-commits] Fix for assertion in DAGCombiner
> 
> 
On Apr 23, 2010, at 9:41 AM, Jan Sjodin wrote:

> Small fix that 
> prevents an assertion in getConstant if VT is a vector type.
> 
> 
> Index: lib/CodeGen/SelectionDAG/DAGCombiner.cpp
> 
> ===================================================================
> --- 
> lib/CodeGen/SelectionDAG/DAGCombiner.cpp    (revision 102107)
> 
> +++ lib/CodeGen/SelectionDAG/DAGCombiner.cpp    (working copy)
> 
> @@ -3453,7 +3453,8 @@
> 
>     // sext(setcc x, y, cc) 
> -> (select_cc x, y, -1, 0, cc)
>     SDValue NegOne =
> 
> -      
> DAG.getConstant(APInt::getAllOnesValue(VT.getSizeInBits()), VT);
> +  
>     
> DAG.getConstant(APInt::getAllOnesValue(VT.getScalarType().getSizeInBits()),
> 
> +                    
> VT);
>     SDValue SCC =
>      
> SimplifySelectCC(N->getDebugLoc(), N0.getOperand(0), 
> N0.getOperand(1),
>                
>         NegOne, DAG.getConstant(0, VT),

Thanks! This 
> is now applied (with a trivial edit for 80 columns).

> 
> I was 
> going to use the example below, but there are still more errors to be fixed (see 
> below):
> 
> ; ModuleID = 'minimal.bc'
> target datalayout = 
> "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:6\
> 
> 4:64-f80:128:128"
> target triple = "x86_64-pc-linux-gnu"
> 
> 
> define void @myfunction(<3 x double>* %foo, <3 x double>* %bar, 
> <3 x i32>* %result) {
> entry:
>  %foo.value = load <3 
> x double>* %foo            ; <<3 x 
> double>> [#uses=1]
>  %bar.value = load <3 x double>* 
> %bar            ; <<3 x double>> 
> [#uses=1]
>  %cmp.i.i = fcmp oeq <3 x double> %foo.value, 
> %bar.value ; <<3 x i1>> [#uses=1]
>  %cmp.ext.i.i = sext 
> <3 x i1> %cmp.i.i to <3 x i32> ; <<3 x i32>> 
> [#uses=1]
>  store <3 x i32> %cmp.ext.i.i, <3 x i32>* 
> %result
>  ret void
> }
> 
> 
> llc 
> fails:
> WidenVectorOperand op #0: 0xb7fc520: i8 = setcc 0xb7fbe38, 
> 0xb7fbec0, 0xb7fbf48
> [ID=0]
> Do not know how to widen this 
> operator's operand!
> UNREACHABLE executed at 
> LegalizeVectorTypes.cpp:1898!
> 
> I will try and look into this as 
> well.

On x86, support for vector SETCC is currently limited to cases 
> where the
result is sign-extended to a vector of the same width as the SETCC 
> operand
vector. In other words, if you change the <3 x i32> to <3 x 
> i64> here 
it'll work, because i64 is the same width as 
> double.

Dan
_______________________________________________
llvm-commits mailing list
llvm-commits at cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits






More information about the llvm-commits mailing list