[x86] Fix PR20540 where the x86 shuffle DAG combiner had completely
authorChandler Carruth <chandlerc@gmail.com>
Fri, 15 Aug 2014 02:43:18 +0000 (02:43 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Fri, 15 Aug 2014 02:43:18 +0000 (02:43 +0000)
commit477f28c48da60e44da4eb98e0c330e62394d4b12
tree0aa2ef70f4c10cefc3a59cef55127989f6038772
parentfeb45e3f0f7e7616cfac4f4cfba27f2c480ac33c
[x86] Fix PR20540 where the x86 shuffle DAG combiner had completely
broken logic for merging shuffle masks in the face of SM_SentinelZero
mask operands.

While these are '-1' they don't mean 'undef' the way '-1' means in the
pre-legalized shuffle masks. Instead, they mean that the shuffle
operation is forcibly zeroing that lane. Reflect this and explicitly
handle it in a bunch of places. In one place the effect is equivalent
but much more clear. In the rest it was really weirdly broken.

Also, rewrite the entire merging thing to be a more directy operation
with a single loop and just doing math to map the indices through the
various masks.

Also add a bunch of asserts to try to make in extremely clear what the
different masks can possibly look like.

Finally, add some comments to clarify that we're merging shuffle masks
*up* here rather than *down* as we do everywhere else, and thus the
logic is quite confusing.

Thanks to several different people for sending test cases, and for
Robert Khasanov for an initial attempt at fixing.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@215687 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/vector-shuffle-128-v16.ll