aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/MachineVerifier
diff options
context:
space:
mode:
authorJay Foad <jay.foad@amd.com>2021-10-05 11:05:05 +0100
committerJay Foad <jay.foad@amd.com>2022-11-17 08:19:57 +0000
commit96a661de4b103e05993bec2783b90d300539a05e (patch)
tree60c638403be26538f7f8a24939a680c771940ec0 /llvm/test/MachineVerifier
parent38d6202a425462ce5923d038bc54532115a80a1f (diff)
downloadllvm-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.mir33
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
+...