[llvm] r274829 - Bug 28444: Fix assertion when extract_vector_elt has mismatched type

Mikael Holmén via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 11 23:57:50 PDT 2016


Hi Matt and Hal,

On 07/08/2016 09:05 AM, Matt Arsenault via llvm-commits wrote:
> Author: arsenm
> Date: Fri Jul  8 02:05:00 2016
> New Revision: 274829
>
> URL: http://llvm.org/viewvc/llvm-project?rev=274829&view=rev
> Log:
> Bug 28444: Fix assertion when extract_vector_elt has mismatched type
>
> For some reason extract_vector_elt is sometimes allowed to have
> a different result type than the vector element type.
>
> Added:
>      llvm/trunk/test/CodeGen/X86/pr28444.ll
> Modified:
>      llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=274829&r1=274828&r2=274829&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Fri Jul  8 02:05:00 2016
> @@ -12408,7 +12408,7 @@ SDValue DAGCombiner::visitEXTRACT_VECTOR
>     // on the constant elements already work.
>     if (InVec.getOpcode() == ISD::INSERT_VECTOR_ELT &&
>         EltNo == InVec.getOperand(2))
> -    return InVec.getOperand(1);
> +    return DAG.getAnyExtOrTrunc(InVec.getOperand(1), SDLoc(N), NVT);

Getting a trunc will fail in case NVT isn't an integer.

On my target I see this for the following code:

define void @autogen_SD11193(i16) {
BB:
   br label %CF248

CF248:                                            ; preds = %CF248, %BB
   %Cmp143 = icmp uge i1 undef, undef
   %I178 = insertelement <4 x float> undef, float undef, i32 0
   %Sl192 = select i1 %Cmp143, <4 x float> %I178, <4 x float> undef
   %Cmp193 = icmp ult i16 -17157, %0
   br i1 %Cmp193, label %CF248, label %CF255

CF255:                                            ; preds = %CF248
   %I229 = insertelement <4 x float> %Sl192, float 0xBB38ECDCC0000000, i32 1
   ret void
}

Both INSERT_VECTOR_ELT and EXTRACT_VECTOR_ELT on v4f32 are legal on my 
target and

   // extract_vector_elt (insert_vector_elt vec, val, idx), idx) -> val
   //
   // This only really matters if the index is non-constant since other 
combines
   // on the constant elements already work.
   if (InVec.getOpcode() == ISD::INSERT_VECTOR_ELT &&
       EltNo == InVec.getOperand(2))
     return DAG.getAnyExtOrTrunc(InVec.getOperand(1), SDLoc(N), NVT);

triggers but then an assert hits in getNode since VT isn't integer but 
rather f32:

3156      case ISD::TRUNCATE:
3157        assert(VT.isInteger() && Operand.getValueType().isInteger() &&
3158               "Invalid TRUNCATE!");

Regards,
Mikael

>
>     // Transform: (EXTRACT_VECTOR_ELT( VECTOR_SHUFFLE )) -> EXTRACT_VECTOR_ELT.
>     // We only perform this optimization before the op legalization phase because
>
> Added: llvm/trunk/test/CodeGen/X86/pr28444.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/pr28444.ll?rev=274829&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/pr28444.ll (added)
> +++ llvm/trunk/test/CodeGen/X86/pr28444.ll Fri Jul  8 02:05:00 2016
> @@ -0,0 +1,27 @@
> +; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7 < %s | FileCheck %s
> +; https://llvm.org/bugs/show_bug.cgi?id=28444
> +
> +; extract_vector_elt is allowed to have a different result type than
> +; the vector scalar type.
> +; This uses both
> +;  i8 = extract_vector_elt v1i1, Constant:i64<0>
> +;  i1 = extract_vector_elt v1i1, Constant:i64<0>
> +
> +
> +; CHECK-LABEL: {{^}}extractelt_mismatch_vector_element_type:
> +; CHECK: movb $1, %al
> +; CHECK: movb %al
> +; CHECK: movb %al
> +define void @extractelt_mismatch_vector_element_type(i32 %arg) {
> +bb:
> +  %tmp = icmp ult i32 %arg, 0
> +  %tmp2 = insertelement <1 x i1> undef, i1 true, i32 0
> +  %tmp3 = select i1 %tmp, <1 x i1> undef, <1 x i1> %tmp2
> +  %tmp6 = extractelement <1 x i1> %tmp3, i32 0
> +  br label %bb1
> +
> +bb1:
> +  store volatile <1 x i1> %tmp3, <1 x i1>* undef
> +  store volatile i1 %tmp6, i1* undef
> +  ret void
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>


More information about the llvm-commits mailing list