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