向量述詞路徑圖

動機

此提案定義了在 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 內建函數轉換為 first-class 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 和 context-aware IR Builder API 中新增一個 matcher context。

  • 逐步提升 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