[InstCombine] Fix big-endian miscompile of (bitcast (zext/trunc (bitcast)))
authorBjorn Pettersson <bjorn.a.pettersson@ericsson.com>
Thu, 28 Nov 2019 22:18:28 +0000 (23:18 +0100)
committerBjorn Pettersson <bjorn.a.pettersson@ericsson.com>
Mon, 2 Dec 2019 10:05:25 +0000 (11:05 +0100)
commita9d6b0e5444741d08ff1df7cf71d1559e7fefc1f
tree36f6d6da60c37f0f812bd84c4a450f4034d9dfbc
parent7eecf2b872e506927f59b6a1f4a8546d8baaa700
[InstCombine] Fix big-endian miscompile of (bitcast (zext/trunc (bitcast)))

Summary:
optimizeVectorResize is rewriting patterns like:
  %1 = bitcast vector %src to integer
  %2 = trunc/zext %1
  %dst = bitcast %2 to vector

Since bitcasting between integer an vector types gives
different integer values depending on endianness, we need
to take endianness into account. As it happens the old
implementation only produced the correct result for little
endian targets.

Fixes: https://bugs.llvm.org/show_bug.cgi?id=44178

Reviewers: spatel, lattner, lebedev.ri

Reviewed By: spatel, lebedev.ri

Subscribers: lebedev.ri, hiraditya, uabelho, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D70844
llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
llvm/test/Transforms/InstCombine/cast.ll