diff options
author | Michael Maitland <michaeltmaitland@gmail.com> | 2024-03-11 13:47:30 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-11 13:47:30 -0400 |
commit | 034cc2f5d0abcf7a465665246f16a1b75fbde93a (patch) | |
tree | 3a81933fa2ef3b27e0f09d433b5a8f20873b17b1 /llvm/test/MachineVerifier | |
parent | 8467457afc61d70e881c9817ace26356ef757733 (diff) | |
download | llvm-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.mir | 31 | ||||
-rw-r--r-- | llvm/test/MachineVerifier/test_g_insert_subvector.mir | 43 |
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 +... |