向量谓词化路线图¶
动机¶
本提案定义了在 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 中的原生向量谓词化。
参考¶
llvm.masked.* 内联函数, https://llvm.net.cn/docs/LangRef.html#masked-vector-load-and-store-intrinsics
RFC:LLVM 中向量谓词化的原型和路线图, https://reviews.llvm.org/D57504