Fix big-endian codegen bug in DAGTypeLegalizer::ExpandRes_BITCAST
authorUlrich Weigand <ulrich.weigand@de.ibm.com>
Fri, 12 Oct 2012 15:42:58 +0000 (15:42 +0000)
committerUlrich Weigand <ulrich.weigand@de.ibm.com>
Fri, 12 Oct 2012 15:42:58 +0000 (15:42 +0000)
commit7bbb9c7b4a21364c5b92e60520babf326beff3d8
tree031d6fa9ee98f49328067155daee1c024ef7168c
parent4c856ee1f8672de5da97d73c05687420eb0049e2
Fix big-endian codegen bug in DAGTypeLegalizer::ExpandRes_BITCAST

On PowerPC, a bitcast of <16 x i8> to i128 may run through a code
path in ExpandRes_BITCAST that attempts to do an intermediate
bitcast to a <4 x i32> vector, and then construct the Hi and Lo parts
of the resulting i128 by pairing up two of those i32 vector elements
each.  The code already recognizes that on a big-endian system, the
first two vector elements form the Hi part, and the final two vector
elements form the Lo part (vice-versa from the little-endian situation).

However, we also need to take endianness into account when forming each
of those separate pairs:  on a big-endian system, vector element 0 is
the *high* part of the pair making up the Hi part of the result, and
vector element 1 is the low part of the pair.  The code currently always
uses vector element 0 as the low part and vector element 1 as the high
part, as is appropriate for little-endian platforms only.

This patch fixes this by swapping the vector elements as they are
paired up as appropriate.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165802 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp
test/CodeGen/PowerPC/2012-10-12-bitcast.ll [new file with mode: 0644]