diff options
author | Jay Foad <jay.foad@amd.com> | 2021-10-05 11:05:05 +0100 |
---|---|---|
committer | Jay Foad <jay.foad@amd.com> | 2022-11-17 08:19:57 +0000 |
commit | 96a661de4b103e05993bec2783b90d300539a05e (patch) | |
tree | 60c638403be26538f7f8a24939a680c771940ec0 /llvm/test/MachineVerifier | |
parent | 38d6202a425462ce5923d038bc54532115a80a1f (diff) | |
download | llvm-96a661de4b103e05993bec2783b90d300539a05e.zip llvm-96a661de4b103e05993bec2783b90d300539a05e.tar.gz llvm-96a661de4b103e05993bec2783b90d300539a05e.tar.bz2 |
[GlobalISel] Better verification of G_UNMERGE_VALUES
Verify three cases of G_UNMERGE_VALUES separately:
1. Splitting a vector into subvectors (the converse of
G_CONCAT_VECTORS).
2. Splitting a vector into its elements (the converse of
G_BUILD_VECTOR).
3. Splitting a scalar into smaller scalars (the converse of
G_MERGE_VALUES).
Previously #1 allowed strange combinations like this:
%1:_(<2 x s16>),%2:_(<2 x s16>) = G_UNMERGE_VALUES %0(<2 x s32>)
This has been tightened up to check that the source and destination
element types match, and some MIR test cases updated accordingly.
Differential Revision: https://reviews.llvm.org/D111132
Diffstat (limited to 'llvm/test/MachineVerifier')
-rw-r--r-- | llvm/test/MachineVerifier/test_g_unmerge_values.mir | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/llvm/test/MachineVerifier/test_g_unmerge_values.mir b/llvm/test/MachineVerifier/test_g_unmerge_values.mir new file mode 100644 index 0000000..bad11fd --- /dev/null +++ b/llvm/test/MachineVerifier/test_g_unmerge_values.mir @@ -0,0 +1,33 @@ +# RUN: not --crash llc -o - -march=arm64 -run-pass=none -verify-machineinstrs %s 2>&1 | FileCheck %s +# REQUIRES: aarch64-registered-target + +--- +name: g_unmerge_values +tracksRegLiveness: true +body: | + bb.0: + ; CHECK: Bad machine code: G_UNMERGE_VALUES destination types do not match + %0:_(s64) = IMPLICIT_DEF + %1:_(s32), %2:_(s16) = G_UNMERGE_VALUES %0 + + ; CHECK: Bad machine code: G_UNMERGE_VALUES source operand does not match vector destination operands + %3:_(<4 x s32>) = IMPLICIT_DEF + %4:_(<3 x s32>), %5:_(<3 x s32>) = G_UNMERGE_VALUES %3 + + ; CHECK: Bad machine code: G_UNMERGE_VALUES source operand does not match vector destination operands + %6:_(<2 x s16>), %7:_(<2 x s16>) = G_UNMERGE_VALUES %3 + + ; CHECK: Bad machine code: G_UNMERGE_VALUES vector source operand does not match scalar destination operands + %8:_(<2 x s32>) = IMPLICIT_DEF + %9:_(s32), %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %8 + + ; CHECK: Bad machine code: G_UNMERGE_VALUES vector source operand does not match scalar destination operands + %12:_(s16), %13:_(s16) = G_UNMERGE_VALUES %8 + + ; CHECK: Bad machine code: G_UNMERGE_VALUES scalar source operand does not match scalar destination operands + %14:_(s64) = IMPLICIT_DEF + %15:_(s16), %16:_(s16) = G_UNMERGE_VALUES %14 + + ; CHECK: Bad machine code: G_UNMERGE_VALUES scalar source operand does not match scalar destination operands + %17:_(s32), %18:_(s32), %19:_(s32) = G_UNMERGE_VALUES %14 +... |