This is an archive of the discontinued LLVM Phabricator instance.

[GlobalISel][AArch64] Import + select LDR*roW and STR*roW patterns
ClosedPublic

Authored by paquette on Jan 8 2020, 4:23 PM.

Details

Summary

This adds support for selecting a large chunk of the load/store *roW patterns.

This is pretty much a straight port of AArch64DAGToDAGISel::SelectAddrModeWRO into GISel. The code is very similar to the XRO code. The main difference is that in the *roW patterns, we want to try and fold in an extend, and *possibly* a shift along with it. A good portion of this patch is refactoring the existing XRO code.

  • Add AArch64InstructionSelector::selectAddrModeWRO
  • Factor out the code from AArch64InstructionSelector::selectAddrModeShiftedExtendXReg which is used by both AArch64InstructionSelector::selectAddrModeXRO and AArch64InstructionSelector::selectAddrModeWRO into AArch64InstructionSelector::selectExtendedSHL. This is similar to the function of the same name in AArch64DAGToDAGISel.
  • Add support for extends to the factored out code in selectExtendedSHL.
  • Teach getExtendTypeForInst how to handle AND masks that are intended to be used in loads/stores (necessary for this addressing mode.)
  • Make getExtendTypeForInst not static because moving it made an annoying diff and I wanted to have the WRO/XRO functions close to each other while I was writing the code.

Also add two tests. It seems like we just import more load patterns than store patterns, so I didn't put too much in the store test for now.

Also we're missing a couple of the load patterns right now, so I didn't include them in the test.

Diff Detail

Event Timeline

paquette created this revision.Jan 8 2020, 4:23 PM
aemerson accepted this revision.Jan 9 2020, 9:33 AM

LGTM with some minor comments.

llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp
4380

While we're here maybe rename this variable from Gep to PtrAdd?

4389

Can you add a comment to the WantsExt parameter like: /* WantsExt */

4491

Same for WantsExt parameter here.

llvm/test/CodeGen/AArch64/GlobalISel/load-wro-addressing-modes.mir
195

This test looks the same as the one above? Should the G_ZEXT be G_ANYEXT?

This revision is now accepted and ready to land.Jan 9 2020, 9:33 AM
This revision was automatically updated to reflect the committed changes.
paquette marked 2 inline comments as done.