向量遮罩執行路線圖

動機

本提案定義了 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. CodeGen 支援

  • VP 內建函數轉換為第一級 SDNode(例如 llvm.vp.fdiv.* -> vp_fdiv)。

  • VP 合法化(將顯式向量長度合法化為遮罩 (AVX512),將 VP SDNode 合法化為預先存在的 SDNode (SSE、NEON))。

結果:基於 VP SDNode 的後端開發。

3. 將 InstSimplify/InstCombine/DAGCombiner 提升至 VP

  • 引入 PredicatedInstruction、PredicatedBinaryOperator... 等輔助類別,以匹配標準向量 IR 和 VP 內建函數。

  • 將匹配器上下文添加到 PatternMatch 和上下文感知 IR Builder API。

  • 逐步提升 DAGCombiner,使其不僅適用於 VP SDNode,也適用於常規向量指令。

  • 逐步提升 InstCombine/InstSimplify,使其不僅適用於 VP,也適用於常規 IR 指令。

結果:VP 內建函數的優化與標準向量指令不相上下。

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

  • 透過轉換為 VP 來現代化 llvm.masked.* / llvm.experimental.reduce*。

  • DCE 過渡 API。

結果:VP 已取代先前的向量內建函數。

5. 遮罩執行 IR 指令

  • 向量指令具有可選的遮罩和向量長度參數。這些會降低到 VP SDNode(從階段 2 開始)。

  • 逐步淘汰 VP 內建函式,僅保留與向量化純量指令不等效的指令(reduce、shuffles 等)。

  • InstCombine/InstSimplify 預期常規指令中的謂詞(階段 (3) 已奠定基礎)。

結果:IR 中的原生向量謂詞。

參考文獻

[VPRFC]

RFC:LLVM 中向量謂詞的原型和路線圖,https://reviews.llvm.org/D57504