向量谓词化路线图

动机

本提案定义了 LLVM 中实现原生向量谓词化的路线图,特别是针对带有掩码和/或显式向量长度的向量指令。LLVM 目前没有目标无关的方式来建模现代 SIMD ISA(如 AVX512、ARM SVE、RISC-V V 扩展和 NEC SX-Aurora)的谓词化向量指令。仅有一些谓词化向量操作,例如掩码加载和存储,可以通过内联函数 [MaskedIR] 使用。

向量谓词化 (VP) 扩展是一个具体的 RFC 和原型实现,用于在 LLVM 中实现原生向量谓词化。VP 原型和所有相关讨论都可以在 Phabricator 上的 VP 修补程序中找到 [VPRFC]

路线图

1. IR 级 VP 内联函数

  • 关于 VP 的语义/指令集已达成共识。

  • VP 内联函数和属性在 IR 级别可用。

  • TTI 具有 VP 的功能标志(supportsVP()?,haveActiveVectorLength()?)。

结果:VP 可用于 IR 级向量化器(LV、VPlan、RegionVectorizer),并可能与 Clang 的内置函数集成。

2. 代码生成支持

  • VP 内联函数转换为第一类 SDNodes(例如 llvm.vp.fdiv.* -> vp_fdiv)。

  • VP 合法化(将显式向量长度合法化为掩码 (AVX512),将 VP SDNodes 合法化为预先存在的 SDNodes (SSE, NEON))。

结果:基于 VP SDNodes 的后端开发。

3. 将 InstSimplify/InstCombine/DAGCombiner 提升到 VP

  • 引入 PredicatedInstruction、PredicatedBinaryOperator 等辅助类,这些类与标准向量 IR 和 VP 内联函数匹配。

  • 向 PatternMatch 添加匹配器上下文,以及上下文感知的 IR 生成器 API。

  • 逐步提升 DAGCombiner 以同时处理 VP SDNodes 和常规向量指令。

  • 逐步提升 InstCombine/InstSimplify 以同时处理 VP 和常规 IR 指令。

结果:VP 内联函数的优化与标准向量指令相当。

4. 弃用 llvm.masked.* / llvm.experimental.reduce.*

  • 通过转换为 VP 来现代化 llvm.masked.* / llvm.experimental.reduce*。

  • DCE 过渡 API。

结果:VP 已取代早期的向量内联函数。

5. 谓词化 IR 指令

  • 向量指令具有可选的掩码和向量长度参数。这些参数降低到 VP SDNodes(来自阶段 2)。

  • 逐步淘汰 VP 内联函数,只保留那些与向量化标量指令不等价的内联函数(reduce、shuffles 等)。

  • InstCombine/InstSimplify 期望在常规指令中进行谓词化(阶段 (3) 已奠定了基础)。

结果:IR 中的原生向量谓词化。

参考文献

[VPRFC]

RFC:LLVM 中向量谓词化的原型和路线图,https://reviews.llvm.org/D57504