llvm-project/llvm/test/MachineVerifier
Jessica Paquette 24261729a4 [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
2021-01-28 13:58:37 -08:00
..
generic-vreg-undef-use.mir GlobalISel: Disallow undef generic virtual register uses 2020-06-30 19:18:01 -04:00
live-ins-01.mir
live-ins-02.mir
live-ins-03.mir
test_copy.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_copy_mismatch_types.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_add.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_addrspacecast.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_assert_zext.mir [GlobalISel] Add G_ASSERT_ZEXT 2021-01-28 13:58:37 -08:00
test_g_assert_zext_register_bank_class.mir [GlobalISel] Add G_ASSERT_ZEXT 2021-01-28 13:58:37 -08:00
test_g_bitcast.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_brindirect_is_indirect_branch.mir [NFC] Remove unnecessary require global-isel from tests 2020-06-15 16:35:18 +02:00
test_g_brjt.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_brjt_is_indirect_branch.mir [NFC] Remove unnecessary require global-isel from tests 2020-06-15 16:35:18 +02:00
test_g_build_vector.mir
test_g_build_vector_trunc.mir
test_g_concat_vectors.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_constant.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_dyn_stackalloc.mir
test_g_extract.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_fcmp.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_fconstant.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_icmp.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_insert.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_intrinsic.mir
test_g_intrinsic_w_side_effects.mir
test_g_inttoptr.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_jump_table.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_load.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_memcpy.mir Fix for PS4 bots after 0b7f6cc71a 2020-08-27 12:47:26 +01:00
test_g_memset.mir Fix for PS4 bots after 0b7f6cc71a 2020-08-27 12:47:26 +01:00
test_g_merge_values.mir
test_g_phi.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_ptr_add.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_ptrmask.mir
test_g_ptrtoint.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_select.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_sext_inreg.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_sextload.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_shuffle_vector.mir
test_g_store.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_trunc.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_g_zextload.mir [Test] Tidy up loose ends from LLVM_HAS_GLOBAL_ISEL 2020-08-27 16:36:27 +01:00
test_phis_precede_nonphis.mir
test_vector_reductions.mir [GlobalISel] Remove scalar src from non-sequential fadd/fmul reductions. 2020-10-15 15:51:44 -07:00
verifier-generic-extend-truncate.mir
verifier-generic-types-1.mir
verifier-generic-types-2.mir
verifier-implicit-virtreg-invalid-physreg-liveness.mir
verifier-phi-fail0.mir
verifier-phi.mir
verifier-pseudo-terminators.mir
verifier-statepoint.mir [Verifier] Add tied-ness verification to statepoint intsruction 2021-01-13 14:40:44 +07:00
verify-regbankselected.mir
verify-regops.mir
verify-selected.mir