[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
Tue Jul 12 00:19:09 PDT 2016


Hi again,

Just realized you had already fixed this on trunk Matt :)

Thanks,
Mikael

On 07/12/2016 08:57 AM, Mikael Holmén via llvm-commits wrote:
> 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
>>
> _______________________________________________
> 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