[InstCombine] fix shuffle-of-binops transform to avoid poison/undef
authorSanjay Patel <spatel@rotateright.com>
Mon, 9 Jul 2018 13:21:46 +0000 (13:21 +0000)
committerSanjay Patel <spatel@rotateright.com>
Mon, 9 Jul 2018 13:21:46 +0000 (13:21 +0000)
commit5bd36644c815ab7c661dd6e21ec785f2f6776ea0
tree975c2c1569b3a66cc148a8536acc85cdb7520edb
parent0a23998fe75d10322968f9ee36bacaa1384be01e
[InstCombine] fix shuffle-of-binops transform to avoid poison/undef

As noted in D48987, there are many different ways for this transform to go wrong.
In particular, the poison potential for shifts means we have to more careful with those ops.
I added tests to make that behavior visible for all of the different cases that I could find.

This is a partial fix. To make this review easier, I did not make changes for the single binop
pattern (handled in foldSelectShuffleWith1Binop()). I also left out some potential optimizations
noted with TODO comments. I'll follow-up once we're confident that things are correct here.

The goal is to correct all marked FIXME tests to either avoid the shuffle transform or do it safely.

Note that distinguishing when the shuffle mask contains undefs and using getBinOpIdentity() allows
for some improvements to div/rem patterns, so there are wins along with the missed opportunities
and fixes.

Differential Revision: https://reviews.llvm.org/D49047

llvm-svn: 336546
llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
llvm/test/Transforms/InstCombine/shuffle_select.ll