编译器后端LLVM(一) RVV

mask寄存器

  • 针对mask寄存器,vmv0的消除,由于带掩码的指令必须使用掩码寄存器v0,它属于特殊寄存器类vmv0(它只有一个寄存器v0)
    • 为了解决寄存器合并(coalescing)时多个数据使用vmv0,使得寄存器分配器无法分配。会采用一个额外的pass,"RISCVVMV0Elimination" 将对vmv0的操作数替换为对物理寄存器v0的显示拷贝(copy)

寄存器分配器(Register allocation)

复制代码
寄存器分配被分为向量寄存器与标量寄存器。首先分配向量寄存器,其次分配标量寄存器
主要有三方面的原因:
1. 向量寄存器需要创建新的虚拟寄存器将AVL设置为VLMAX(最大向量长度),而这些寄存器属于标量寄存器;
2. 如果标量分配后执行,可能导致比啊来那个寄存器冲突或者调度器无法争取处理vsetvl
3. 向量分配后执行标量,可以最大限度减少对机器调度器的约束。因为vsetvl会阻断指令跨过它重排序,提前插入可以让调度器更自由地安排后续向量指令
RVV定义了4类向量寄存器:
4. VR,通用向量寄存器(v0-v31),用于普通向量和掩码操作,其中掩码必须使用v0
5. VRM2:每组2个连续寄存器(v0m2,v2m2,...,v30m2),用于128位向量宽度
6. VRM4:每组4个连续寄存器(v0m4,v4m4,...,v28m4),用于256位宽
7. VRM8:每组8个连续寄存器(v0m8,v8m8,...,v24m8),用于512位宽度