Transform a load from an undef/zero global into an undef/global even if we
authorChris Lattner <sabre@nondot.org>
Sat, 11 Aug 2007 18:48:48 +0000 (18:48 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 11 Aug 2007 18:48:48 +0000 (18:48 +0000)
commit8d2e88806be0fbacb1fcba3f04ec57f16b417a11
treeaba6e5b75cc93bee5536046cbba571be5dceae75
parentace2e8ad0c5a8bef03ab3da9d9c6041ce2a1f987
Transform a load from an undef/zero global into an undef/global even if we
have complex pointer manipulation going on.  This allows us to compile
stuff like this:

__m128i foo(__m128i x){
                static const unsigned int c_0[4] = { 0, 0, 0, 0 };
                __m128i v_Zero = _mm_loadu_si128((__m128i*)c_0);
                x  = _mm_unpacklo_epi8(x,  v_Zero);
                return x;
}

into:

_foo:
        xorps   %xmm1, %xmm1
        punpcklbw       %xmm1, %xmm0
        ret

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41022 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/Scalar/InstructionCombining.cpp
test/Transforms/InstCombine/load2.ll [new file with mode: 0644]