SLP解析器如何确定应由其成本模型评估的内容?

时间:2019-05-04 21:39:44

标签: llvm llvm-ir

我正在为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基础结构如何工作的人提供帮助。

谢谢

0 个答案:

没有答案