[llvm] r262397 - DAGCombiner: Turn truncate of a bitcasted vector to an extract
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Sun Apr 24 20:06:17 PDT 2016
> On Mar 4, 2016, at 05:38, Mikael Holmén <mikael.holmen at ericsson.com> wrote:
>
> Hi,
>
> On 03/04/2016 02:33 AM, Matt Arsenault wrote:
>>
>>> On Mar 3, 2016, at 00:27, Mikael Holmén via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>>>
>>> Hi Matt,
>>>
>>> What about Big Endian targets? Shouldn't we extract the highest vector element instead of element 0 then?
>>>
>>> Regards,
>>> Mikael
>>
>> I don’t know how vectors types work on big endian targets
>
> Me neither. :D
>
> But one case I've seen for my big-endian out-of-tree target is that we have:
>
> @g_cm_s = addrspace(21) global %rec802 { [4 x i16] [i16 111, i16 112, i16 113, i16 114] }
>
> and then:
>
> %1 = load <4 x i16>, <4 x i16> addrspace(21)* bitcast (%rec802 addrspace(21)* @g_cm_s to <4 x i16> addrspace(21)*)
> %2 = bitcast <4 x i16> %1 to i64
> %3 = trunc i64 %2 to i16
> %_tmp7 = icmp eq i16 %3, 114
>
> Without the new optimization in visitTRUNCATE this code works well for me. The result of the trunc is 114 as expected, but with your change we get 111.
>
> So I've changed
>
> +
> + // We need to consider endianness when deciding which vector
> + // element to extract.
> + unsigned ElmtIdx =
> + DAG.getDataLayout().isBigEndian()
> + ? SrcVT.getVectorNumElements() - 1
> + : 0;
> return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, VT,
> - VecSrc, DAG.getConstant(0, SL, IdxVT));
> + VecSrc, DAG.getConstant(ElmtIdx, SL, IdxVT));
>
> locally to get my test to pass.
>
> I've no idea if there are any big-endian in-tree targets that has vectors where this can be an issue.
>
> /Mikael
>
>>
>> -Matt
>>
>
This might be the case on PPC? Can you try to write a test for that?
-Matt
More information about the llvm-commits
mailing list