Skip to content

[ValueTypes] Add v3, v5, v7 and v15 vector type support for i1, i8, i16, f16, … #96481

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

kito-cheng
Copy link
Member

@kito-cheng kito-cheng commented Jun 24, 2024

…i64, f64

This patch is a preliminary step to prepare RISC-V for supporting more VLS type code generation. The currently affected targets are x86, AArch64, and AMDGPU:

  • AMDGPU: TruncStore from MVT::v5i32 to MVT::v5i8 was previously illegal because MVT::v5i8 did not exist. Now, it must be explicitly declared as Expand. Additionally, the calling convention need to correctly handle the newly added non-power-of-2 vector types.

@llvmbot
Copy link
Member

llvmbot commented Jun 24, 2024

@llvm/pr-subscribers-llvm-globalisel
@llvm/pr-subscribers-backend-x86
@llvm/pr-subscribers-backend-amdgpu

@llvm/pr-subscribers-backend-aarch64

Author: Kito Cheng (kito-cheng)

Changes

…i64, f64

This patch is a preliminary step to prepare RISC-V for supporting more VLS type code generation. The currently affected targets are x86, AArch64, and AMDGPU:

  • x86: The code generation order and register usage are different, but the generated instructions remain the same.

  • AArch64: There is a slight change in a GlobalISel dump.

  • AMDGPU: TruncStore from MVT::v5i32 to MVT::v5i8 was previously illegal because MVT::v5i8 did not exist. Now, it must be explicitly declared as Expand. Additionally, the calling convention need to correctly handle the newly added non-power-of-2 vector types.


Patch is 41.47 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/96481.diff

5 Files Affected:

  • (modified) llvm/include/llvm/CodeGen/ValueTypes.td (+244-201)
  • (modified) llvm/lib/CodeGen/ValueTypes.cpp (+86)
  • (modified) llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp (+2-1)
  • (modified) llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll (+1-1)
  • (modified) llvm/test/CodeGen/X86/vector-interleaved-load-i64-stride-5.ll (+45-45)
diff --git a/llvm/include/llvm/CodeGen/ValueTypes.td b/llvm/include/llvm/CodeGen/ValueTypes.td
index 963b6a71de380..86278261a3443 100644
--- a/llvm/include/llvm/CodeGen/ValueTypes.td
+++ b/llvm/include/llvm/CodeGen/ValueTypes.td
@@ -83,210 +83,253 @@ def v1i1    : VTVec<1,    i1, 17>;  //    1 x i1 vector value
 def v2i1    : VTVec<2,    i1, 18>;  //    2 x i1 vector value
 def v3i1    : VTVec<3,    i1, 19>;  //    3 x i1 vector value
 def v4i1    : VTVec<4,    i1, 20>;  //    4 x i1 vector value
-def v8i1    : VTVec<8,    i1, 21>;  //    8 x i1 vector value
-def v16i1   : VTVec<16,   i1, 22>;  //   16 x i1 vector value
-def v32i1   : VTVec<32,   i1, 23>;  //   32 x i1 vector value
-def v64i1   : VTVec<64,   i1, 24>;  //   64 x i1 vector value
-def v128i1  : VTVec<128,  i1, 25>;  //  128 x i1 vector value
-def v256i1  : VTVec<256,  i1, 26>;  //  256 x i1 vector value
-def v512i1  : VTVec<512,  i1, 27>;  //  512 x i1 vector value
-def v1024i1 : VTVec<1024, i1, 28>;  // 1024 x i1 vector value
-def v2048i1 : VTVec<2048, i1, 29>;  // 2048 x i1 vector value
-
-def v128i2  : VTVec<128,  i2, 30>;   //  128 x i2 vector value
-def v256i2  : VTVec<256,  i2, 31>;   //  256 x i2 vector value
-
-def v64i4   : VTVec<64,   i4, 32>;   //   64 x i4 vector value
-def v128i4  : VTVec<128,  i4, 33>;   //  128 x i4 vector value
-
-def v1i8    : VTVec<1,    i8, 34>;  //    1 x i8 vector value
-def v2i8    : VTVec<2,    i8, 35>;  //    2 x i8 vector value
-def v3i8    : VTVec<3,    i8, 36>;  //    3 x i8 vector value
-def v4i8    : VTVec<4,    i8, 37>;  //    4 x i8 vector value
-def v8i8    : VTVec<8,    i8, 38>;  //    8 x i8 vector value
-def v16i8   : VTVec<16,   i8, 39>;  //   16 x i8 vector value
-def v32i8   : VTVec<32,   i8, 40>;  //   32 x i8 vector value
-def v64i8   : VTVec<64,   i8, 41>;  //   64 x i8 vector value
-def v128i8  : VTVec<128,  i8, 42>;  //  128 x i8 vector value
-def v256i8  : VTVec<256,  i8, 43>;  //  256 x i8 vector value
-def v512i8  : VTVec<512,  i8, 44>;  //  512 x i8 vector value
-def v1024i8 : VTVec<1024, i8, 45>;  // 1024 x i8 vector value
-
-def v1i16   : VTVec<1,   i16, 46>;  //   1 x i16 vector value
-def v2i16   : VTVec<2,   i16, 47>;  //   2 x i16 vector value
-def v3i16   : VTVec<3,   i16, 48>;  //   3 x i16 vector value
-def v4i16   : VTVec<4,   i16, 49>;  //   4 x i16 vector value
-def v8i16   : VTVec<8,   i16, 50>;  //   8 x i16 vector value
-def v16i16  : VTVec<16,  i16, 51>;  //  16 x i16 vector value
-def v32i16  : VTVec<32,  i16, 52>;  //  32 x i16 vector value
-def v64i16  : VTVec<64,  i16, 53>;  //  64 x i16 vector value
-def v128i16 : VTVec<128, i16, 54>;  // 128 x i16 vector value
-def v256i16 : VTVec<256, i16, 55>;  // 256 x i16 vector value
-def v512i16 : VTVec<512, i16, 56>;  // 512 x i16 vector value
-
-def v1i32    : VTVec<1,    i32, 57>;  //    1 x i32 vector value
-def v2i32    : VTVec<2,    i32, 58>;  //    2 x i32 vector value
-def v3i32    : VTVec<3,    i32, 59>;  //    3 x i32 vector value
-def v4i32    : VTVec<4,    i32, 60>;  //    4 x i32 vector value
-def v5i32    : VTVec<5,    i32, 61>;  //    5 x i32 vector value
-def v6i32    : VTVec<6,    i32, 62>;  //    6 x f32 vector value
-def v7i32    : VTVec<7,    i32, 63>;  //    7 x f32 vector value
-def v8i32    : VTVec<8,    i32, 64>;  //    8 x i32 vector value
-def v9i32    : VTVec<9,    i32, 65>;  //    9 x i32 vector value
-def v10i32   : VTVec<10,   i32, 66>;  //   10 x i32 vector value
-def v11i32   : VTVec<11,   i32, 67>;  //   11 x i32 vector value
-def v12i32   : VTVec<12,   i32, 68>;  //   12 x i32 vector value
-def v16i32   : VTVec<16,   i32, 69>;  //   16 x i32 vector value
-def v32i32   : VTVec<32,   i32, 70>;  //   32 x i32 vector value
-def v64i32   : VTVec<64,   i32, 71>;  //   64 x i32 vector value
-def v128i32  : VTVec<128,  i32, 72>;  //  128 x i32 vector value
-def v256i32  : VTVec<256,  i32, 73>;  //  256 x i32 vector value
-def v512i32  : VTVec<512,  i32, 74>;  //  512 x i32 vector value
-def v1024i32 : VTVec<1024, i32, 75>;  // 1024 x i32 vector value
-def v2048i32 : VTVec<2048, i32, 76>;  // 2048 x i32 vector value
-
-def v1i64   : VTVec<1,   i64, 77>;  //   1 x i64 vector value
-def v2i64   : VTVec<2,   i64, 78>;  //   2 x i64 vector value
-def v3i64   : VTVec<3,   i64, 79>;  //   3 x i64 vector value
-def v4i64   : VTVec<4,   i64, 80>;  //   4 x i64 vector value
-def v8i64   : VTVec<8,   i64, 81>;  //   8 x i64 vector value
-def v16i64  : VTVec<16,  i64, 82>;  //  16 x i64 vector value
-def v32i64  : VTVec<32,  i64, 83>;  //  32 x i64 vector value
-def v64i64  : VTVec<64,  i64, 84>;  //  64 x i64 vector value
-def v128i64 : VTVec<128, i64, 85>;  // 128 x i64 vector value
-def v256i64 : VTVec<256, i64, 86>;  // 256 x i64 vector value
-
-def v1i128  : VTVec<1,  i128, 87>;  //  1 x i128 vector value
-
-def v1f16    : VTVec<1,    f16,  88>;  //    1 x f16 vector value
-def v2f16    : VTVec<2,    f16,  89>;  //    2 x f16 vector value
-def v3f16    : VTVec<3,    f16,  90>;  //    3 x f16 vector value
-def v4f16    : VTVec<4,    f16,  91>;  //    4 x f16 vector value
-def v8f16    : VTVec<8,    f16,  92>;  //    8 x f16 vector value
-def v16f16   : VTVec<16,   f16,  93>;  //   16 x f16 vector value
-def v32f16   : VTVec<32,   f16,  94>;  //   32 x f16 vector value
-def v64f16   : VTVec<64,   f16,  95>;  //   64 x f16 vector value
-def v128f16  : VTVec<128,  f16,  96>;  //  128 x f16 vector value
-def v256f16  : VTVec<256,  f16,  97>;  //  256 x f16 vector value
-def v512f16  : VTVec<512,  f16,  98>;  //  512 x f16 vector value
-
-def v2bf16   : VTVec<2,   bf16,  99>;  //    2 x bf16 vector value
-def v3bf16   : VTVec<3,   bf16, 100>;  //    3 x bf16 vector value
-def v4bf16   : VTVec<4,   bf16, 101>;  //    4 x bf16 vector value
-def v8bf16   : VTVec<8,   bf16, 102>;  //    8 x bf16 vector value
-def v16bf16  : VTVec<16,  bf16, 103>;  //   16 x bf16 vector value
-def v32bf16  : VTVec<32,  bf16, 104>;  //   32 x bf16 vector value
-def v64bf16  : VTVec<64,  bf16, 105>;  //   64 x bf16 vector value
-def v128bf16 : VTVec<128, bf16, 106>;  //  128 x bf16 vector value
-
-def v1f32    : VTVec<1,    f32, 107>;  //    1 x f32 vector value
-def v2f32    : VTVec<2,    f32, 108>;  //    2 x f32 vector value
-def v3f32    : VTVec<3,    f32, 109>;  //    3 x f32 vector value
-def v4f32    : VTVec<4,    f32, 110>;  //    4 x f32 vector value
-def v5f32    : VTVec<5,    f32, 111>;  //    5 x f32 vector value
-def v6f32    : VTVec<6,    f32, 112>;  //    6 x f32 vector value
-def v7f32    : VTVec<7,    f32, 113>;  //    7 x f32 vector value
-def v8f32    : VTVec<8,    f32, 114>;  //    8 x f32 vector value
-def v9f32    : VTVec<9,    f32, 115>;  //    9 x f32 vector value
-def v10f32   : VTVec<10,   f32, 116>;  //   10 x f32 vector value
-def v11f32   : VTVec<11,   f32, 117>;  //   11 x f32 vector value
-def v12f32   : VTVec<12,   f32, 118>;  //   12 x f32 vector value
-def v16f32   : VTVec<16,   f32, 119>;  //   16 x f32 vector value
-def v32f32   : VTVec<32,   f32, 120>;  //   32 x f32 vector value
-def v64f32   : VTVec<64,   f32, 121>;  //   64 x f32 vector value
-def v128f32  : VTVec<128,  f32, 122>;  //  128 x f32 vector value
-def v256f32  : VTVec<256,  f32, 123>;  //  256 x f32 vector value
-def v512f32  : VTVec<512,  f32, 124>;  //  512 x f32 vector value
-def v1024f32 : VTVec<1024, f32, 125>;  // 1024 x f32 vector value
-def v2048f32 : VTVec<2048, f32, 126>;  // 2048 x f32 vector value
-
-def v1f64    : VTVec<1,    f64, 127>;  //    1 x f64 vector value
-def v2f64    : VTVec<2,    f64, 128>;  //    2 x f64 vector value
-def v3f64    : VTVec<3,    f64, 129>;  //    3 x f64 vector value
-def v4f64    : VTVec<4,    f64, 130>;  //    4 x f64 vector value
-def v8f64    : VTVec<8,    f64, 131>;  //    8 x f64 vector value
-def v16f64   : VTVec<16,   f64, 132>;  //   16 x f64 vector value
-def v32f64   : VTVec<32,   f64, 133>;  //   32 x f64 vector value
-def v64f64   : VTVec<64,   f64, 134>;  //   64 x f64 vector value
-def v128f64  : VTVec<128,  f64, 135>;  //  128 x f64 vector value
-def v256f64  : VTVec<256,  f64, 136>;  //  256 x f64 vector value
-
-def nxv1i1  : VTScalableVec<1,  i1, 137>;  // n x  1 x i1  vector value
-def nxv2i1  : VTScalableVec<2,  i1, 138>;  // n x  2 x i1  vector value
-def nxv4i1  : VTScalableVec<4,  i1, 139>;  // n x  4 x i1  vector value
-def nxv8i1  : VTScalableVec<8,  i1, 140>;  // n x  8 x i1  vector value
-def nxv16i1 : VTScalableVec<16, i1, 141>;  // n x 16 x i1  vector value
-def nxv32i1 : VTScalableVec<32, i1, 142>;  // n x 32 x i1  vector value
-def nxv64i1 : VTScalableVec<64, i1, 143>;  // n x 64 x i1  vector value
-
-def nxv1i8  : VTScalableVec<1,  i8, 144>;  // n x  1 x i8  vector value
-def nxv2i8  : VTScalableVec<2,  i8, 145>;  // n x  2 x i8  vector value
-def nxv4i8  : VTScalableVec<4,  i8, 146>;  // n x  4 x i8  vector value
-def nxv8i8  : VTScalableVec<8,  i8, 147>;  // n x  8 x i8  vector value
-def nxv16i8 : VTScalableVec<16, i8, 148>;  // n x 16 x i8  vector value
-def nxv32i8 : VTScalableVec<32, i8, 149>;  // n x 32 x i8  vector value
-def nxv64i8 : VTScalableVec<64, i8, 150>;  // n x 64 x i8  vector value
-
-def nxv1i16  : VTScalableVec<1,  i16, 151>;  // n x  1 x i16 vector value
-def nxv2i16  : VTScalableVec<2,  i16, 152>;  // n x  2 x i16 vector value
-def nxv4i16  : VTScalableVec<4,  i16, 153>;  // n x  4 x i16 vector value
-def nxv8i16  : VTScalableVec<8,  i16, 154>;  // n x  8 x i16 vector value
-def nxv16i16 : VTScalableVec<16, i16, 155>;  // n x 16 x i16 vector value
-def nxv32i16 : VTScalableVec<32, i16, 156>;  // n x 32 x i16 vector value
-
-def nxv1i32  : VTScalableVec<1,  i32, 157>;  // n x  1 x i32 vector value
-def nxv2i32  : VTScalableVec<2,  i32, 158>;  // n x  2 x i32 vector value
-def nxv4i32  : VTScalableVec<4,  i32, 159>;  // n x  4 x i32 vector value
-def nxv8i32  : VTScalableVec<8,  i32, 160>;  // n x  8 x i32 vector value
-def nxv16i32 : VTScalableVec<16, i32, 161>;  // n x 16 x i32 vector value
-def nxv32i32 : VTScalableVec<32, i32, 162>;  // n x 32 x i32 vector value
-
-def nxv1i64  : VTScalableVec<1,  i64, 163>;  // n x  1 x i64 vector value
-def nxv2i64  : VTScalableVec<2,  i64, 164>;  // n x  2 x i64 vector value
-def nxv4i64  : VTScalableVec<4,  i64, 165>;  // n x  4 x i64 vector value
-def nxv8i64  : VTScalableVec<8,  i64, 166>;  // n x  8 x i64 vector value
-def nxv16i64 : VTScalableVec<16, i64, 167>;  // n x 16 x i64 vector value
-def nxv32i64 : VTScalableVec<32, i64, 168>;  // n x 32 x i64 vector value
-
-def nxv1f16  : VTScalableVec<1,  f16, 169>;  // n x  1 x  f16 vector value
-def nxv2f16  : VTScalableVec<2,  f16, 170>;  // n x  2 x  f16 vector value
-def nxv4f16  : VTScalableVec<4,  f16, 171>;  // n x  4 x  f16 vector value
-def nxv8f16  : VTScalableVec<8,  f16, 172>;  // n x  8 x  f16 vector value
-def nxv16f16 : VTScalableVec<16, f16, 173>;  // n x 16 x  f16 vector value
-def nxv32f16 : VTScalableVec<32, f16, 174>;  // n x 32 x  f16 vector value
-
-def nxv1bf16  : VTScalableVec<1,  bf16, 175>;  // n x  1 x bf16 vector value
-def nxv2bf16  : VTScalableVec<2,  bf16, 176>;  // n x  2 x bf16 vector value
-def nxv4bf16  : VTScalableVec<4,  bf16, 177>;  // n x  4 x bf16 vector value
-def nxv8bf16  : VTScalableVec<8,  bf16, 178>;  // n x  8 x bf16 vector value
-def nxv16bf16 : VTScalableVec<16, bf16, 179>;  // n x 16 x bf16 vector value
-def nxv32bf16 : VTScalableVec<32, bf16, 180>;  // n x 32 x bf16 vector value
-
-def nxv1f32  : VTScalableVec<1,  f32, 181>;  // n x  1 x  f32 vector value
-def nxv2f32  : VTScalableVec<2,  f32, 182>;  // n x  2 x  f32 vector value
-def nxv4f32  : VTScalableVec<4,  f32, 183>;  // n x  4 x  f32 vector value
-def nxv8f32  : VTScalableVec<8,  f32, 184>;  // n x  8 x  f32 vector value
-def nxv16f32 : VTScalableVec<16, f32, 185>;  // n x 16 x  f32 vector value
-
-def nxv1f64  : VTScalableVec<1,  f64, 186>;  // n x  1 x  f64 vector value
-def nxv2f64  : VTScalableVec<2,  f64, 187>;  // n x  2 x  f64 vector value
-def nxv4f64  : VTScalableVec<4,  f64, 188>;  // n x  4 x  f64 vector value
-def nxv8f64  : VTScalableVec<8,  f64, 189>;  // n x  8 x  f64 vector value
-
-def x86mmx    : ValueType<64,   190>;  // X86 MMX value
-def Glue      : ValueType<0,    191>;  // Pre-RA sched glue
-def isVoid    : ValueType<0,    192>;  // Produces no value
-def untyped   : ValueType<8,    193> { // Produces an untyped value
+def v5i1    : VTVec<5,    i1, 21>;  //    4 x i1 vector value
+def v6i1    : VTVec<6,    i1, 22>;  //    4 x i1 vector value
+def v7i1    : VTVec<7,    i1, 23>;  //    4 x i1 vector value
+def v8i1    : VTVec<8,    i1, 24>;  //    8 x i1 vector value
+def v9i1    : VTVec<9,    i1, 25>;  //    4 x i1 vector value
+def v10i1   : VTVec<10,   i1, 26>;  //    4 x i1 vector value
+def v11i1   : VTVec<11,   i1, 27>;  //    4 x i1 vector value
+def v12i1   : VTVec<12,   i1, 28>;  //    4 x i1 vector value
+def v16i1   : VTVec<16,   i1, 29>;  //   16 x i1 vector value
+def v32i1   : VTVec<32,   i1, 30>;  //   32 x i1 vector value
+def v64i1   : VTVec<64,   i1, 31>;  //   64 x i1 vector value
+def v128i1  : VTVec<128,  i1, 32>;  //  128 x i1 vector value
+def v256i1  : VTVec<256,  i1, 33>;  //  256 x i1 vector value
+def v512i1  : VTVec<512,  i1, 34>;  //  512 x i1 vector value
+def v1024i1 : VTVec<1024, i1, 35>;  // 1024 x i1 vector value
+def v2048i1 : VTVec<2048, i1, 36>;  // 2048 x i1 vector value
+
+def v128i2  : VTVec<128,  i2, 37>;   //  128 x i2 vector value
+def v256i2  : VTVec<256,  i2, 38>;   //  256 x i2 vector value
+
+def v64i4   : VTVec<64,   i4, 39>;   //   64 x i4 vector value
+def v128i4  : VTVec<128,  i4, 40>;   //  128 x i4 vector value
+
+def v1i8    : VTVec<1,    i8, 41>;  //    1 x i8 vector value
+def v2i8    : VTVec<2,    i8, 42>;  //    2 x i8 vector value
+def v3i8    : VTVec<3,    i8, 43>;  //    3 x i8 vector value
+def v4i8    : VTVec<4,    i8, 44>;  //    4 x i8 vector value
+def v5i8    : VTVec<5,    i8, 45>;  //    5 x i8 vector value
+def v6i8    : VTVec<6,    i8, 46>;  //    6 x i8 vector value
+def v7i8    : VTVec<7,    i8, 47>;  //    7 x i8 vector value
+def v8i8    : VTVec<8,    i8, 48>;  //    8 x i8 vector value
+def v9i8    : VTVec<9,    i8, 49>;  //    9 x i8 vector value
+def v10i8   : VTVec<10,   i8, 50>;  //   10 x i8 vector value
+def v11i8   : VTVec<11,   i8, 51>;  //   11 x i8 vector value
+def v12i8   : VTVec<12,   i8, 52>;  //   12 x i8 vector value
+def v16i8   : VTVec<16,   i8, 53>;  //   16 x i8 vector value
+def v32i8   : VTVec<32,   i8, 54>;  //   32 x i8 vector value
+def v64i8   : VTVec<64,   i8, 55>;  //   64 x i8 vector value
+def v128i8  : VTVec<128,  i8, 56>;  //  128 x i8 vector value
+def v256i8  : VTVec<256,  i8, 57>;  //  256 x i8 vector value
+def v512i8  : VTVec<512,  i8, 58>;  //  512 x i8 vector value
+def v1024i8 : VTVec<1024, i8, 59>;  // 1024 x i8 vector value
+
+def v1i16   : VTVec<1,   i16, 60>;  //   1 x i16 vector value
+def v2i16   : VTVec<2,   i16, 61>;  //   2 x i16 vector value
+def v3i16   : VTVec<3,   i16, 62>;  //   3 x i16 vector value
+def v4i16   : VTVec<4,   i16, 63>;  //   4 x i16 vector value
+def v5i16   : VTVec<5,   i16, 64>;  //   5 x i16 vector value
+def v6i16   : VTVec<6,   i16, 65>;  //   6 x i16 vector value
+def v7i16   : VTVec<7,   i16, 66>;  //   7 x i16 vector value
+def v8i16   : VTVec<8,   i16, 67>;  //   8 x i16 vector value
+def v9i16   : VTVec<9,   i16, 68>;  //   9 x i16 vector value
+def v10i16  : VTVec<10,  i16, 69>;  //  10 x i16 vector value
+def v11i16  : VTVec<11,  i16, 70>;  //  11 x i16 vector value
+def v12i16  : VTVec<12,  i16, 71>;  //  12 x i16 vector value
+def v16i16  : VTVec<16,  i16, 72>;  //  16 x i16 vector value
+def v32i16  : VTVec<32,  i16, 73>;  //  32 x i16 vector value
+def v64i16  : VTVec<64,  i16, 74>;  //  64 x i16 vector value
+def v128i16 : VTVec<128, i16, 75>;  // 128 x i16 vector value
+def v256i16 : VTVec<256, i16, 76>;  // 256 x i16 vector value
+def v512i16 : VTVec<512, i16, 77>;  // 512 x i16 vector value
+
+def v1i32    : VTVec<1,    i32, 78>;  //    1 x i32 vector value
+def v2i32    : VTVec<2,    i32, 79>;  //    2 x i32 vector value
+def v3i32    : VTVec<3,    i32, 80>;  //    3 x i32 vector value
+def v4i32    : VTVec<4,    i32, 81>;  //    4 x i32 vector value
+def v5i32    : VTVec<5,    i32, 82>;  //    5 x i32 vector value
+def v6i32    : VTVec<6,    i32, 83>;  //    6 x i32 vector value
+def v7i32    : VTVec<7,    i32, 84>;  //    7 x i32 vector value
+def v8i32    : VTVec<8,    i32, 85>;  //    8 x i32 vector value
+def v9i32    : VTVec<9,    i32, 86>;  //    9 x i32 vector value
+def v10i32   : VTVec<10,   i32, 87>;  //   10 x i32 vector value
+def v11i32   : VTVec<11,   i32, 88>;  //   11 x i32 vector value
+def v12i32   : VTVec<12,   i32, 89>;  //   12 x i32 vector value
+def v16i32   : VTVec<16,   i32, 90>;  //   16 x i32 vector value
+def v32i32   : VTVec<32,   i32, 91>;  //   32 x i32 vector value
+def v64i32   : VTVec<64,   i32, 92>;  //   64 x i32 vector value
+def v128i32  : VTVec<128,  i32, 93>;  //  128 x i32 vector value
+def v256i32  : VTVec<256,  i32, 94>;  //  256 x i32 vector value
+def v512i32  : VTVec<512,  i32, 95>;  //  512 x i32 vector value
+def v1024i32 : VTVec<1024, i32, 96>;  // 1024 x i32 vector value
+def v2048i32 : VTVec<2048, i32, 97>;  // 2048 x i32 vector value
+
+def v1i64   : VTVec<1,   i64, 98>;  //   1 x i64 vector value
+def v2i64   : VTVec<2,   i64, 99>;  //   2 x i64 vector value
+def v3i64   : VTVec<3,   i64, 100>;  //   3 x i64 vector value
+def v4i64   : VTVec<4,   i64, 101>;  //   4 x i64 vector value
+def v5i64   : VTVec<5,   i64, 102>;  //   5 x i64 vector value
+def v6i64   : VTVec<6,   i64, 103>;  //   6 x i64 vector value
+def v7i64   : VTVec<7,   i64, 104>;  //   7 x i64 vector value
+def v8i64   : VTVec<8,   i64, 105>;  //   8 x i64 vector value
+def v9i64   : VTVec<9,   i64, 106>;  //   9 x i64 vector value
+def v10i64  : VTVec<10,  i64, 107>;  //  10 x i64 vector value
+def v11i64  : VTVec<11,  i64, 108>;  //  11 x i64 vector value
+def v12i64  : VTVec<12,  i64, 109>;  //  12 x i64 vector value
+def v16i64  : VTVec<16,  i64, 110>;  //  16 x i64 vector value
+def v32i64  : VTVec<32,  i64, 111>;  //  32 x i64 vector value
+def v64i64  : VTVec<64,  i64, 112>;  //  64 x i64 vector value
+def v128i64 : VTVec<128, i64, 113>;  // 128 x i64 vector value
+def v256i64 : VTVec<256, i64, 114>;  // 256 x i64 vector value
+
+def v1i128  : VTVec<1,  i128, 115>;  //  1 x i128 vector value
+
+def v1f16    : VTVec<1,    f16,  116>;  //    1 x f16 vector value
+def v2f16    : VTVec<2,    f16,  117>;  //    2 x f16 vector value
+def v3f16    : VTVec<3,    f16,  118>;  //    3 x f16 vector value
+def v4f16    : VTVec<4,    f16,  119>;  //    4 x f16 vector value
+def v5f16    : VTVec<5,    f16,  120>;  //    5 x f16 vector value
+def v6f16    : VTVec<6,    f16,  121>;  //    6 x f16 vector value
+def v7f16    : VTVec<7,    f16,  122>;  //    7 x f16 vector value
+def v8f16    : VTVec<8,    f16,  123>;  //    8 x f16 vector value
+def v9f16    : VTVec<9,    f16,  124>;  //    9 x f16 vector value
+def v10f16   : VTVec<10,   f16,  125>;  //   10 x f16 vector value
+def v11f16   : VTVec<11,   f16,  126>;  //   11 x f16 vector value
+def v12f16   : VTVec<12,   f16,  127>;  //   12 x f16 vector value
+def v16f16   : VTVec<16,   f16, 128>;  //   16 x f16 vector value
+def v32f16   : VTVec<32,   f16, 129>;  //   32 x f16 vector value
+def v64f16   : VTVec<64,   f16, 130>;  //   64 x f16 vector value
+def v128f16  : VTVec<128,  f16, 131>;  //  128 x f16 vector value
+def v256f16  : VTVec<256,  f16, 132>;  //  256 x f16 vector value
+def v512f16  : VTVec<512,  f16, 133>;  //  512 x f16 vector value
+
+def v2bf16   : VTVec<2,   bf16, 134>;  //    2 x bf16 vector value
+def v3bf16   : VTVec<3,   bf16, 135>;  //    3 x bf16 vector value
+def v4bf16   : VTVec<4,   bf16, 136>;  //    4 x bf16 vector value
+def v8bf16   : VTVec<8,   bf16, 137>;  //    8 x bf16 vector value
+def v16bf16  : VTVec<16,  bf16, 138>;  //   16 x bf16 vector value
+def v32bf16  : VTVec<32,  bf16, 139>;  //   32 x bf16 vector value
+def v64bf16  : VTVec<64,  bf16, 140>;  //   64 x bf16 vector value
+def v128bf16 : VTVec<128, bf16, 141>;  //  128 x bf16 vector value
+
+def v1f32    : VTVec<1,    f32, 142>;  //    1 x f32 vector value
+def v2f32    : VTVec<2,    f32, 143>;  //    2 x f32 vector value
+def v3f32    : VTVec<3,    f32, 144>;  //    3 x f32 vector value
+def v4f32    : VTVec<4,    f32, 145>;  //    4 x f32 vector value
+def v5f32    : V...
[truncated]

@topperc
Copy link
Collaborator

topperc commented Jun 25, 2024

Isn't the current non-power of 2 support in SLP limited to types 1 less than a power of 2? i.e. 3, 7, 15? Why do we need 1-12?

: ValueType<16, 199>; // AArch64 predicate-as-counter
def spirvbuiltin : ValueType<0, 200>; // SPIR-V's builtin type
: ValueType<16, 242>; // AArch64 predicate-as-counter
def spirvbuiltin : ValueType<0, 243>; // SPIR-V's builtin type
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm very concerned that there are only 4 types left.

@kito-cheng
Copy link
Member Author

Isn't the current non-power of 2 support in SLP limited to types 1 less than a power of 2? i.e. 3, 7, 15? Why do we need 1-12?

I tried to add minimal MVT for non-power-of 2 support when enable that on RISC-V, and I got crash due to lack some of MVT, and then it got stable (no crash!) until almost full set of v1 to v12 supports, give some practical example is: during the selection dag it may use v7i8/v7i1 when selecting v7i32 instruction , and it will got assertion failure due to lack of v7i8 and/or v7i1.

…i64, f64

This patch is a preliminary step to prepare RISC-V for supporting more VLS type
code generation. The currently affected targets are x86, AArch64, and AMDGPU:

- x86: The code generation order and register usage are different, but the
       generated instructions remain the same.

- AArch64: There is a slight change in a GlobalISel dump.

- AMDGPU: TruncStore from MVT::v5i32 to MVT::v5i8 was previously illegal
          because MVT::v5i8 did not exist. Now, it must be explicitly declared
          as Expand. Additionally, the calling convention need to correctly
          handle the newly added non-power-of-2 vector types.
@kito-cheng kito-cheng force-pushed the kitoc/non-pow-2-types-mvt branch from a31701a to 2e7567b Compare June 28, 2024 02:23
@kito-cheng
Copy link
Member Author

Changes:

  • Rebase
  • Only add v3, v5, v7 and v15
    • Add v5 since v5 are frequently used in LLVM test, so I assume that means that's relative useful than other length (6, 9, 10, 11, 12)

@kito-cheng kito-cheng changed the title [ValueTypes] Add v1 to v12 vector type support for i1, i8, i16, f16, … [ValueTypes] Add v3, v5, v7 and v15 vector type support for i1, i8, i16, f16, … Jun 28, 2024
@kito-cheng
Copy link
Member Author

I found that my chatgpt didn't add v7 and v15...let me update again later

@kito-cheng
Copy link
Member Author

Changes:

  • Add v7 and v15.
  • AArch64 and X86 testcase change are gone since we removed some length now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants