向量述詞路徑圖¶
動機¶
此提案定義了在 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 中的原生向量述詞。
參考文獻¶
llvm.masked.* 內建函數,https://llvm.dev.org.tw/docs/LangRef.html#masked-vector-load-and-store-intrinsics
RFC:LLVM 中向量述詞的原型與路徑圖,https://reviews.llvm.org/D57504