我正在为LLVM IR进行新的通道优化,这取决于SLP矢量化器的工作方式。
https://github.com/llvm/llvm-project/blob/master/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp。
我知道SLP在对自身代码进行矢量化之前需要执行一些步骤。它收集候选种子(存储指令),并用存储指令中的这些候选构建一个超级节点,直到达到加载指令或const值。之后,它使用costModel函数遍历树,从而累积每个超级节点的向量化成本。最后,如果成本为负,则将代码矢量化。
所以我有两个玩具示例:
拳头很容易矢量化:
a[i] = b[i] *c[i] + a[i];
a[i+1] = b[i+1]*c[i+1] + a[i+1];
a[i+2] = b[i+2]*c[i+2] + a[i+2];
a[i+3] = b[i+3]*c[i+3] + a[i+3];
第二个不是:
a[i] = b[i] *c[i] + a[i-1];
a[i+1] = b[i+1]*c[i+1] + a[i];
a[i+2] = b[i+2]*c[i+2] + a[i+1];
a[i+3] = b[i+3]*c[i+3] + a[i+2];
我理解为什么第二个代码不可向量化,但我不明白SLP如何对其进行检查。我进行了一些调试,这不是成本模型。这些说明不要去树上。
不幸的是,对这种代码的理解仍然超出了我的能力范围,并且文档记录薄弱,因此我需要一些了解LLVM的IR基础结构如何工作的人提供帮助。
谢谢