aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/MachineVerifier
diff options
context:
space:
mode:
authorMichael Maitland <michaeltmaitland@gmail.com>2024-03-11 13:47:30 -0400
committerGitHub <noreply@github.com>2024-03-11 13:47:30 -0400
commit034cc2f5d0abcf7a465665246f16a1b75fbde93a (patch)
tree3a81933fa2ef3b27e0f09d433b5a8f20873b17b1 /llvm/test/MachineVerifier
parent8467457afc61d70e881c9817ace26356ef757733 (diff)
downloadllvm-034cc2f5d0abcf7a465665246f16a1b75fbde93a.zip
llvm-034cc2f5d0abcf7a465665246f16a1b75fbde93a.tar.gz
llvm-034cc2f5d0abcf7a465665246f16a1b75fbde93a.tar.bz2
[GISEL] Add G_INSERT_SUBVECTOR and G_EXTRACT_SUBVECTOR (#84538)
G_INSERT and G_EXTRACT are not sufficient to use to represent both INSERT/EXTRACT on a subregister and INSERT/EXTRACT on a vector. We would like to be able to INSERT/EXTRACT on vectors in cases that INSERT/EXTRACT on vector subregisters are not sufficient, so we add these opcodes. I tried to do a patch where we treated G_EXTRACT as both G_EXTRACT_SUBVECTOR and G_EXTRACT_SUBREG, but ran into an infinite loop at this [point](https://github.com/llvm/llvm-project/blob/8b5b294ec2cf876bc5eb5bd5fcb56ef487e36d60/llvm/lib/Target/RISCV/RISCVISelLowering.cpp#L9932) in the SDAG equivalent code.
Diffstat (limited to 'llvm/test/MachineVerifier')
-rw-r--r--llvm/test/MachineVerifier/test_g_extract_subvector.mir31
-rw-r--r--llvm/test/MachineVerifier/test_g_insert_subvector.mir43
2 files changed, 74 insertions, 0 deletions
diff --git a/llvm/test/MachineVerifier/test_g_extract_subvector.mir b/llvm/test/MachineVerifier/test_g_extract_subvector.mir
new file mode 100644
index 0000000..bc167d2
--- /dev/null
+++ b/llvm/test/MachineVerifier/test_g_extract_subvector.mir
@@ -0,0 +1,31 @@
+# RUN: not --crash llc -o - -run-pass=none -verify-machineinstrs %s 2>&1 | FileCheck %s
+---
+name: g_extract_subvector
+tracksRegLiveness: true
+liveins:
+body: |
+ bb.0:
+ %0:_(s32) = G_CONSTANT i32 0
+ %1:_(<vscale x 2 x s32>) = G_IMPLICIT_DEF
+ %2:_(<vscale x 1 x s32>) = G_IMPLICIT_DEF
+
+ ; CHECK: G_EXTRACT_SUBVECTOR first source must be a register
+ %3:_(<vscale x 2 x s32>) = G_EXTRACT_SUBVECTOR 1, 0
+
+ ; CHECK: G_EXTRACT_SUBVECTOR index must be an immediate
+ %4:_(<vscale x 1 x s32>) = G_EXTRACT_SUBVECTOR %2, %0
+
+ ; CHECK: Destination type must be a vector
+ %5:_(s32) = G_EXTRACT_SUBVECTOR %2, 0
+
+ ; CHECK: First source must be a vector
+ %6:_(<vscale x 2 x s32>) = G_EXTRACT_SUBVECTOR %0, 0
+
+ %7:_(<vscale x 1 x s16>) = G_IMPLICIT_DEF
+
+ ; CHECK: Element type of vectors must be the same
+ %8:_(<vscale x 2 x s32>) = G_EXTRACT_SUBVECTOR %7, 0
+
+ ; CHECK: Index must be a multiple of the source vector's minimum vector length
+ %9:_(<vscale x 4 x s32>) = G_EXTRACT_SUBVECTOR %1, 3
+...
diff --git a/llvm/test/MachineVerifier/test_g_insert_subvector.mir b/llvm/test/MachineVerifier/test_g_insert_subvector.mir
new file mode 100644
index 0000000..dce30cd
--- /dev/null
+++ b/llvm/test/MachineVerifier/test_g_insert_subvector.mir
@@ -0,0 +1,43 @@
+# RUN: not --crash llc -o - -run-pass=none -verify-machineinstrs %s 2>&1 | FileCheck %s
+
+---
+name: g_splat_vector
+tracksRegLiveness: true
+liveins:
+body: |
+ bb.0:
+ %0:_(s32) = G_CONSTANT i32 0
+ %1:_(<vscale x 2 x s32>) = G_IMPLICIT_DEF
+ %2:_(<vscale x 1 x s32>) = G_IMPLICIT_DEF
+
+ ; CHECK: G_INSERT_SUBVECTOR first source must be a register
+ %3:_(<vscale x 2 x s32>) = G_INSERT_SUBVECTOR 1, %2, 0
+
+ ; CHECK: G_INSERT_SUBVECTOR second source must be a register
+ %4:_(<vscale x 2 x s32>) = G_INSERT_SUBVECTOR %1, 1, 0
+
+ ; CHECK: G_INSERT_SUBVECTOR index must be an immediate
+ %5:_(<vscale x 2 x s32>) = G_INSERT_SUBVECTOR %1, %2, %0
+
+ ; CHECK: Destination type must be a vector
+ %6:_(s32) = G_INSERT_SUBVECTOR %1, %2, 0
+
+ ; CHECK: First source must be a vector
+ %7:_(<vscale x 2 x s32>) = G_INSERT_SUBVECTOR %0, %2, 0
+
+ ; CHECK: Second source must be a vector
+ %8:_(<vscale x 2 x s32>) = G_INSERT_SUBVECTOR %1, %0, 0
+
+ ; CHECK: Destination type must match the first source vector type
+ %9:_(<vscale x 2 x s32>) = G_INSERT_SUBVECTOR %2, %1, 0
+
+ %10:_(<vscale x 1 x s16>) = G_IMPLICIT_DEF
+
+ ; CHECK: Element type of source vectors must be the same
+ %11:_(<vscale x 2 x s32>) = G_INSERT_SUBVECTOR %1, %10, 0
+
+ %12:_(<vscale x 4 x s32>) = G_IMPLICIT_DEF
+
+ ; CHECK: Index must be a multiple of the second source vector's minimum vector length
+ %13:_(<vscale x 4 x s32>) = G_INSERT_SUBVECTOR %12, %1, 3
+...