[InstCombine] Teach InstCombine how to handle an obfuscated splat.
authorMichael Gottesman <mgottesman@apple.com>
Tue, 16 Oct 2012 21:29:38 +0000 (21:29 +0000)
committerMichael Gottesman <mgottesman@apple.com>
Tue, 16 Oct 2012 21:29:38 +0000 (21:29 +0000)
commit02a1141e5a36928f7a0ac9d2e0ee44dca3be3a01
tree0f25b56d0218a647f87ffb1bf12285ca610f7108
parent430e540b6b602430490d87001cc386101172ccf4
[InstCombine] Teach InstCombine how to handle an obfuscated splat.

An obfuscated splat is where the frontend poorly generates code for a splat
using several different shuffles to create the splat, i.e.,

  %A = load <4 x float>* %in_ptr, align 16
  %B = shufflevector <4 x float> %A, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 undef, i32 undef>
  %C = shufflevector <4 x float> %B, <4 x float> %A, <4 x i32> <i32 0, i32 1, i32 4, i32 undef>
  %D = shufflevector <4 x float> %C, <4 x float> %A, <4 x i32> <i32 0, i32 1, i32 2, i32 4>

llvm-svn: 166061
llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
llvm/test/Transforms/InstCombine/obfuscated_splat.ll [new file with mode: 0644]