[llvm] [RISC-V][GISEL] Select G_BITCAST for scalable vectors (PR #101486)
Jiahan Xie via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 16 13:21:13 PDT 2024
jiahanxie353 wrote:
Currently, we need to support `load/store` of a vector of pointers. For GISEL, we need to define some new patterns in`RISCVInstrInfoVPseudos.td`.
If I were to do it in a brute-force way, should we get something like the following (largely copied from [`AllIntegerVectors`](https://github.com/llvm/llvm-project/blob/4eb978026152772bcdd139899e8d0192f7ddbc11/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td#L285):
```c
def nxv1i32p0 = VTScalableVec<1, i32, 0>;
def nxv2i32p0 = VTScalableVec<2, i32, 0>;
def nxv4i32p0 = VTScalableVec<4, i32, 0>;
def nxv8i32p0 = VTScalableVec<8, i32, 0>;
def nxv1i64p0 = VTScalableVec<1, i64, 0>;
def nxv2i64p0 = VTScalableVec<2, i64, 0>;
def nxv4i64p0 = VTScalableVec<4, i64, 0>;
def nxv8i64p0 = VTScalableVec<8, i64, 0>;
defvar vptr32mf2_t = nxv1i32p0;
defvar vptr32m1_t = nxv2i32p0;
defvar vptr32m2_t = nxv4i32p0;
defvar vptr32m4_t = nxv8i32p0;
defvar vptr64m1_t = nxv1i64p0;
defvar vptr64m2_t = nxv2i64p0;
defvar vptr64m4_t = nxv4i64p0;
defvar vptr64m8_t = nxv8i64p0;
defset list<VTypeInfo> PtrVectors = {
def VPTR32MF2: VTypeInfo<vptr32mf2_t, vbool64_t, 32, V_MF2>;
def VPTR32M1: VTypeInfo<vptr32m1_t, vbool32_t, 32, V_M1>;
def VPTR32M2: GroupVTypeInfo<vptr32m2_t, vptr32m1_t, vbool16_t, 32, V_M2>;
def VPTR32M4: GroupVTypeInfo<vptr32m4_t, vptr32m1_t, vbool8_t, 32, V_M4>;
def VPTR64M1: VTypeInfo<vptr64m1_t, vbool64_t, 64, V_M1>;
def VPTR64M2: GroupVTypeInfo<vptr64m2_t, vptr64m1_t, vbool32_t, 64, V_M2>;
def VPTR64M4: GroupVTypeInfo<vptr64m4_t, vptr64m1_t, vbool16_t, 64, V_M4>;
def VPTR64M8: GroupVTypeInfo<vptr64m8_t, vptr64m1_t, vbool8_t, 64, V_M8>;
}
}
```
did I write the patterns correctly?
And then in `RISCVGISEL.td`:
```c
let Predicates = [IsRV32] in {
foreach vti = PtrVectors in
def VPatUSLoadStoreSDNode<vti.Vector, vti.Log2SEW, vti.LMul, vti.AVL, vti.RegClass>;
}
let Predicates = [IsRV64] in ...
```
What we should really have is supposed to be:
```c
def p0XLen : PtrValueType<XLenVT, 0>;
def nxv1p0 = VTScalableVec<1, p0XLen, 0>;
def nxv2p0 = VTScalableVec<2, p0XLen, 0>;
def nxv4p0 = VTScalableVec<4, p0XLen, 0>;
def nxv8p0 = VTScalableVec<8, p0XLen, 0>;
```
And how should we use `XLen` uniformly instead of brute-force 32-bit and 64-bit machine separately?
https://github.com/llvm/llvm-project/pull/101486
More information about the llvm-commits
mailing list