[AArch64][GlobalISel] Port buildvector -> dup pattern from AArch64ISelLowering
authorJessica Paquette <jpaquette@apple.com>
Tue, 16 Jun 2020 22:57:28 +0000 (15:57 -0700)
committerJessica Paquette <jpaquette@apple.com>
Thu, 25 Jun 2020 21:19:06 +0000 (14:19 -0700)
commit7fb84dff69572b59dc730f9616fea918bedc7384
treed833573a6317edd0ec1dbc6f34437706c56ec363
parent2c09e910545950f966d282a5d567ae85c8976252
[AArch64][GlobalISel] Port buildvector -> dup pattern from AArch64ISelLowering

Given this:

```
%x:_(<n x sK>) = G_BUILD_VECTOR %lane, ...
...
%y:_(<n x sK>) = G_SHUFFLE_VECTOR %x(<n x sK>), %foo, shufflemask(0, 0, ...)
```

We can produce:

```
%y:_(<n x sK) = G_DUP %lane(sK)
```

Doesn't seem to be too common, but AArch64ISelLowering attempts to do this
before trying to produce a DUPLANE. Might as well port it.

Also make it so that when the splat has an undef mask, we try setting it to
0. SDAG does this, and it makes sure that when we get the build vector operand,
we actually get a source operand.

Differential Revision: https://reviews.llvm.org/D81979
llvm/lib/Target/AArch64/GISel/AArch64PostLegalizerCombiner.cpp
llvm/test/CodeGen/AArch64/GlobalISel/postlegalizer-combiner-shuffle-splat.mir