diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2014-08-15 02:43:18 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2014-08-15 02:43:18 +0000 |
commit | 372c143c2f0e12a496fce84966bc0ce7f84f90eb (patch) | |
tree | caa1133a2499cfe2ced68c63d14384b44f1d584c /llvm/lib/MC | |
parent | 070db177bd530a935237097ee53e4480d90cf830 (diff) | |
download | bcm5719-llvm-372c143c2f0e12a496fce84966bc0ce7f84f90eb.tar.gz bcm5719-llvm-372c143c2f0e12a496fce84966bc0ce7f84f90eb.zip |
[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.
llvm-svn: 215687
Diffstat (limited to 'llvm/lib/MC')
0 files changed, 0 insertions, 0 deletions