HomePhabricator

[GlobalISel] Import patterns containing INSERT_SUBREG

Description

[GlobalISel] Import patterns containing INSERT_SUBREG

This teaches the importer to handle INSERT_SUBREG instructions.

We were missing patterns involving INSERT_SUBREG in AArch64. It appears in
AArch64InstrInfo.td 107 times, and 14 times in AArch64InstrFormats.td.

To meaningfully import it, the GlobalISelEmitter needs to know how to infer a
super register class for a given register class.

This patch introduces the following:

  • getSuperRegForSubReg, a function which finds the largest register class

which supports a value type and subregister index

  • inferSuperRegisterClass, a function which finds the appropriate super

register class for an INSERT_SUBREG'

  • inferRegClassFromPattern, a function which allows for some trivial

lookthrough into instructions

  • getRegClassFromLeaf, a helper function which returns the register class for

a leaf TreePatternNode

  • Support for subregister index operands in importExplicitUseRenderer

It also

  • Updates tests in each backend which are impacted by the change
  • Adds GlobalISelEmitterSubreg.td to test that we import and skip the expected

patterns

As a result of this patch, INSERT_SUBREG patterns in X86 may use the
LOW32_ADDR_ACCESS_RBP register class instead of GR32. This is correct, since the
register class contains the same registers as GR32 (except with the addition of
RBP). So, this also teaches X86 to handle that register class. This is in line
with X86ISelLowering, which treats this as a GR class.

Differential Revision: https://reviews.llvm.org/D66498