向量谓词化路线图

动机

本提案定义了在 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 中并带有 builtins。

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 Builder 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