[X86][SSE] getFauxShuffleMask - don't decode OR(SHUFFLE,SHUFFLE) containing UNDEFs...
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Wed, 21 Apr 2021 16:43:23 +0000 (17:43 +0100)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Wed, 21 Apr 2021 17:47:00 +0000 (18:47 +0100)
commita511b55cfd67acecc58f1ccf1f3ce5c917dc1d90
treee1dac7498cc548acef57f963d33e6e96192930bb
parente414ede2cd54b03f3ff7d547132f06d1b836e5bb
[X86][SSE] getFauxShuffleMask - don't decode OR(SHUFFLE,SHUFFLE) containing UNDEFs. (PR50049)

PR50049 demonstrated an infinite loop between OR(SHUFFLE,SHUFFLE) <-> BLEND(SHUFFLE,SHUFFLE) patterns.

The UNDEF elements were allowing a combined shuffle mask to be widened which lost the undef element, resulting us needing to use the BLEND pattern (as the undef element would need to be zero for the OR pattern). But then bitcast folds would re-expose the undef element allowing us to use OR again.....
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/shuffle-vs-trunc-256.ll
llvm/test/CodeGen/X86/vector-shuffle-128-v8.ll
llvm/test/CodeGen/X86/vector-shuffle-256-v32.ll
llvm/test/CodeGen/X86/vector-shuffle-combining-sse41.ll