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,然后加入列表挨个进行操作。