This is an archive of the discontinued LLVM Phabricator instance.

[AArch64][GlobalISel] Add selection support for rev16, rev32, and rev64
ClosedPublic

Authored by paquette on Jun 3 2020, 11:54 AM.

Details

Summary

This does three things:

  1. Adds G_REV16, G_REV32, and G_REV64. These are equivalent to AArch64rev16, AArch64rev32, and AArch64rev64 respectively.
  1. 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.
  1. 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)

Diff Detail

Event Timeline

paquette created this revision.Jun 3 2020, 11:54 AM
aemerson accepted this revision.Jun 3 2020, 2:44 PM

LGTM with nit/

llvm/lib/Target/AArch64/AArch64PostLegalizerCombiner.cpp
38

We don't need to pass Dst by ref here do we?

This revision is now accepted and ready to land.Jun 3 2020, 2:44 PM
This revision was automatically updated to reflect the committed changes.