有用的网站:
http://llvm.org/docs/Passes.html 官网,循环的转换和优化
https://blog.csdn.net/qq_23599965/article/details/88344459#328_licm_205 翻译循环和转换pass的博客
1.循环的转换和优化:
本节内容主要记录自己再llvm cookbook上学习循环转换和优化的一个记录。
本节 将 介绍 对 循环 进行 转换 和 优化 以 得到 更短 的 执行 时间,也就是我们平常说的提高性能。 我们 主要 展示 循环 常量 提升( Loop- Invariant Code Motion一—— LICM,循环不变的代码移动) 技术, 它 如何 运行 及 如何 改变 代码。 同时 也会 展示 一种 相对 简单 的 技术—— 循环 删除, 消除 对 返回 值 没有 副作用 的 普通 循环( 循环 次数 对 循环 返回 值 无 影响、 非 死 循环)。
LICM:英文释义循环不变的代码移动,又叫循环常量提升,它 会把 循环 中 不变 的 代码 提升 到 循环 体外, 或者是 循环 之前 的 pre-header 块, 或者是 循环 之后 的 exit 块。( pre-header 块和exit 块是插入的,)。
循环删除:会 查找 对 函数 返回 值 没有 作用, 并且 迭代 有限 次数 的 非 死 循环,若查找到,则删除整个循环。
LoopPass
所有LoopPass在函数中的每个循环上执行,独立于函数中的所有其他循环。 LoopPass以循环嵌套顺序处理循环,以便最后处理最外面的循环。(函数中的每个循环都执行looppass,互不影响,嵌套顺序处理,先处理内层循环,后处理最外层循环)
允许LoopPass子类使用LPPassManager接口更新循环嵌套。实施loop pass通常很简单。 LoopPasses可能会重载三种虚拟方法来完成其工作。所有这些方法如果对程序进行了修改,都应返回true;否则,则应返回false。
允许looppass子类使用lppassmanager接口更新循环嵌套。实现循环过程通常很简单。looppasses可能会重载三个虚拟方法来完成它们的工作。如果修改了程序,所有这些方法都应该返回true,否则返回false。
多个pass混用,需要保留所有的相同分析,LoopUtils.h提供了getLoopAnalysisUsage函数。可以在子类的getAnalysisUsage重写中调用它,以获取一致且正确的行为。而INITIALIZE_PASS_DEPENDENCY(LoopPass)是初始化这组功能分析。
-loop-simplify:
循环简化
此过程执行几次转换,以将自然循环转换为更简单的形式,从而使后续的分析和转换更简单,更有效。
循环pre-header block插入可以确保从循环外部到循环header有单个非关键的入口边缘。这简化了许多分析和转换,例如LICM。
循环exit-block插入可确保循环中的所有exit-block(在循环外部的块,其中在循环内部具有前身,具体是指:在循环外,但具有在循环内的前导的块)仅在循环内部具有前导(并且由循环header控制)。这简化了LICM中内置的转换,例如存储接收。
LICM:英文释义循环不变的代码移动,又叫循环常量提升,它 会把 循环 中 不变 的 代码 提升 到 循环 体外, 或者是 循环 之前 的 pre-header 块, 或者是 循环 之后 的 exit 块。( pre-header 块和exit 块是插入的,)。