后端Pass简介——InterleavedLoadCombine
InterleavedLoadCombine
该 Pass将同一基本块中访问连续内存的多个 interleaved load(交错加载)合并成一次宽度更大的 load,再通过 shufflevector 提取原始值,提高性能。
其中:
- Interleaved Load(交错加载):多个 load 访问同一 base pointer 的不同偏移(例如 A[i], A[i+2], A[i+4])。
- ShuffleVectorInst:从一个向量中重排元素(或从两个向量选择元素)的指令。
- Polynomial 表示法:将 GEP 等指针偏移表达为多项式形式,以推理它们之间的等价性或相对偏移。
- InterleavedAccessPass:后续的 pass 会识别 load + shufflevector 组合进行向量化。
也就是说,如果一组离散的 load 拥有同一个基址,则把他们 shuffle 合并起来。
例子也很简单,优化前:
%a = load <4 x float>, ptr %p
%b = load <4 x float>, ptr %p+16
%c = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <0,4,1,5>
优化后:
%wide = load <8 x float>, ptr %p ; 合并成一次宽 load
%interleaved = shufflevector <8 x float> %wide, poison, <4 x i32> <0,2,1,3>
虽然这个 Pass 有 1700 行,但是细节其实到此为止。
shufflevector 的代价并不总是很大,但在某些平台/使用方式下确实代价较高。是否值得取决于目标架构和具体上下文。 shufflevector 是 LLVM 中用于在两个向量中按指定方式重新排列元素的指令。它可以实现打散(scatter)、打包(pack)、插入(interleave)、提取(extract)等复杂模式。
该 Pass 运行逻辑也是依次判断每条指令是不是 ShuffleVectorInst
,然后加入列表挨个进行操作。
评论