HomePhabricator

[GlobalISel] Add G_ASSERT_ZEXT

Authored by paquette on Jan 27 2021, 12:09 PM.

Description

[GlobalISel] Add G_ASSERT_ZEXT

This adds a generic opcode which communicates that a type has already been
zero-extended from a narrower type.

This is intended to be similar to AssertZext in SelectionDAG.

For example,

%x_was_extended:_(s64) = G_ASSERT_ZEXT %x, 16

Signifies that the top 48 bits of %x are known to be 0.

This is useful in cases like this:

define i1 @zeroext_param(i8 zeroext %x) {
  %cmp = icmp ult i8 %x, -20
  ret i1 %cmp
}

In AArch64, %x must use a 32-bit register, which is then truncated to a 8-bit
value.

If we know that %x is already zero-ed out in the relevant high bits, we can
avoid the truncate.

Currently, in GISel, this looks like this:

_zeroext_param:
  and w8, w0, #0xff ; We don't actually need this!
  cmp w8, #236
  cset w0, lo
  ret

While SDAG does not produce the truncation, since it knows that it's
unnecessary:

_zeroext_param:
  cmp w0, #236
  cset w0, lo
  ret

This patch

  • Adds G_ASSERT_ZEXT
  • Adds MIRBuilder support for it
  • Adds MachineVerifier support for it
  • Documents it

It also puts G_ASSERT_ZEXT into its own class of "hint instruction." (There
should be a G_ASSERT_SEXT in the future, maybe a G_ASSERT_ALIGN as well.)

This allows us to skip over hints in the legalizer etc. These can then later
be selected like COPY instructions or removed.

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

Details

Committed
paquetteJan 28 2021, 1:58 PM
Differential Revision
D95564: [GlobalISel] Add G_ASSERT_ZEXT
Parents
rGac70a53653d4: [OpenMP] NFC: disabled two flakey tests as the bug in libomp not fixed yet
Branches
Unknown
Tags
Unknown