[AArch64][GlobalISel] Add selection support for rev16, rev32, and rev64
authorJessica Paquette <jpaquette@apple.com>
Tue, 2 Jun 2020 18:13:56 +0000 (11:13 -0700)
committerJessica Paquette <jpaquette@apple.com>
Wed, 3 Jun 2020 22:30:30 +0000 (15:30 -0700)
commit969d2d1ea9466143e7099040f5f0735cc81963b1
treeda8b5ec004ad7af0e167b45f0105a7f819da6191
parentcab4b3b8e3a4a2822e459e5f103e49fcab16efaf
[AArch64][GlobalISel] Add selection support for rev16, rev32, and rev64

This does three things:

1) Adds G_REV16, G_REV32, and G_REV64. These are equivalent to AArch64rev16,
   AArch64rev32, and AArch64rev64 respectively.

2) Adds support for producing G_REV64 in the postlegalizer combiner.
   We don't legalize any of the shuffles which could give us a G_REV32 or
   G_REV16 yet. Since the function for detecting the rev mask is lifted from
   AArch64ISelLowering, it should work for G_REV32 and G_REV16 when we get
   there.

3) Adds a selection test for a good portion of the patterns imported for the rev
   family. The only ones which are not tested are the ones with bitconvert.

This also does a little cleanup, and adds a struct for shuffle vector pseudo
matchdata. This lets us still use `applyShuffleVectorPseudo` rather than adding
a new function.

It should also make it a bit easier to port some of the other masks from
AArch64ISelLowering. (e.g. `isZIP_v_undef_Mask` and friends)

Differential Revision: https://reviews.llvm.org/D81112
llvm/lib/Target/AArch64/AArch64Combine.td
llvm/lib/Target/AArch64/AArch64InstrGISel.td
llvm/lib/Target/AArch64/AArch64PostLegalizerCombiner.cpp
llvm/test/CodeGen/AArch64/GlobalISel/postlegalizer-combiner-rev.mir [new file with mode: 0644]
llvm/test/CodeGen/AArch64/GlobalISel/select-rev.mir [new file with mode: 0644]