0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SCEV如何对变量进行分析优化

openEuler 来源:openEuler 作者:openEuler 2022-07-07 11:16 次阅读

0. 基础知识盘点

0.1 循环(loop)

定义
loop(llvm里理解为natural loop)是定义在CFG中的一个结点集合L,并具有以下属性[1][2]:

有单一的入口结点(称为header),该结点支配loop中的所有结点;

存在一条进入循环头的回边;

相关术语

entering block:一个非loop内的结点有一条边连接到loop。当只有一个entering block且其只有一条边连接到header,称之为preheader;作为非loop结点的peheader支配整个loop;

latch:有一条边连接到header;

backedge:称为回边,一条从latch到header的边;

exiting edge:一条边从loop内到loop外,边的出发结点称之为exiting block,目标结点称之为exit block;

10e78e90-fd25-11ec-ba43-dac502259ad0.jpg

上面右图中,黄色区域是一个loop,而红色区域不是,为什么呢?
因为红色区域a和c都是入口结点,不满足单一入口结点的性质。

0.2 Scalar Evolution(SCEV)

定义

SCEV是编译器对变量进行分析的优化(往往只针对整数类型),且主要用于分析循环中变量是如何被更新的,然后根据这个信息来进行优化。

循环链

如图所示,循环中归纳变量var的起始值为start,迭代的方式为ϕ,步长为step;

10f6beec-fd25-11ec-ba43-dac502259ad0.jpg

它的循环链(chrec,Chains of Recurrences)如下:

var = {start, ϕ , step}
// ϕ∈{+,∗}
// start: starting value
// step: step in each iteration

举个例子:

intm=0;
for(inti=0;i< n; i++) {
  m = m + n;
  *res = m;
}

那么m的循环链为:m = {0,+,n}。

1. Induction Variable(归纳变量)

1.1 定义

循环的每次迭代中增加或减少固定量的变量,或者是另一个归纳变量的线性函数。

举个例子[3],下面循环中的i和j都是归纳变量:

for(i=0;i< 10; ++i) {
    j = 17 * i;
}

1.2 益处

归纳变量优化的好处,有但不局限于以下几点:

用更简单的指令替换原来的计算方式。
比如,上面的例子中识别到归纳变量,将对应的乘法替换为代价更小的加法。

j=-17;
for(i=0;i< 10; ++i) {
    j = j + 17;
}

减少归纳变量的数目,降低寄存器压力。

externintsum;
intfoo(intn){
inti,j;
j=5;
for(i=0;i< n; ++i) {
        j += 2;
        sum += j;
    }
    return sum;
}

当前的loop有两个归纳变量:i、j,用其中一个变量表达另外一个后,如下:

externintsum;
intfoo(intn){
inti;
for(i=0;i< n; ++i) {
        sum += 5 + 2 * (i + 1);
    }
    return sum;
}

归纳变量替换,使变量和循环索引之间的关系变得明确,便于其他优化分析(如依赖性分析)。举例如下,将c表示为循环索引相关的函数:

intc,i;
c=10;
for(i=0;i< 10; i++) {
    c = c + 5; // c is incremented by 5 for each loop iteration
}

转换为:

intc,i;
c=10;
for(i=0;i< 10; i++) {
    c = 10 + 5 * (i + 1);  // c is explicitly expressed as a function of loop index
}

2. 实践

2.1 相关编译选项

compiler option
gcc -fivopt
毕昇 -indvars

2.2 优化用例

归纳变量的优化(ivs)在llvm中的位置是:llvmlibTransformsScalarIndVarSimplify.cpp
让我们通过一个用例,看看毕昇编译器的优化过程。
如下图,假设上面func里面的部分就是要优化的代码,下面func里面就是预期生成的结果:

11136ae2-fd25-11ec-ba43-dac502259ad0.jpg

它的IR用例test.ll是:

11261e44-fd25-11ec-ba43-dac502259ad0.jpg

编译命令是:

opt test.ll -indvars -S

当前的例子中,header、latch和exiting block都是同一个BB,即bb5。

11418b5c-fd25-11ec-ba43-dac502259ad0.jpg

步骤一:依据 def-use 关系,遍历loop的 ExitBlock 中phi结点的操作数的来源,计算出最终值同时替换它,继而替换该phi结点的使用。
例子中,计算 %tmp2.lcssa ,其唯一的操作数是 %tmp2 = add nuw nsw i32 %i.01.0, 3 ,该表达式所在的loop是bb5,此时 %tmp2 的循环链为

%tmp2={3,+,3}<%bb5>

获取当前loop的不退出循环的最大值是199999,那当前 %tmp2=add(3, mul(3,199999))=600000;接下来会看当前的替换不是高代价(代价的计算会依据不同架构有所不同),同时在phi结点的 user 中替换该值。优化结果如下:

1154e684-fd25-11ec-ba43-dac502259ad0.jpg

步骤二:遍历 ExitingBlock ,对其跳转条件进行计算,依据 def-use 的关系,删除相应的指令。
例子中,计算出 br i1 %0, label %bb5, label %bb7 的 %0 是 false,跳转指令替换后,%0 = icmp ult i32 %tmp4,200000 不存在 user,将其加入到“死指令”中。优化结果如下:

11690db2-fd25-11ec-ba43-dac502259ad0.jpg

步骤三:删除所有“死指令”,并看看他的操作数是否要一并删除。
例子中,作为 %0 的操作数的 %tmp4 还有其他的 user %x.03.0,因此不能被视为“死指令”被删除。优化结果如下:

118b3f04-fd25-11ec-ba43-dac502259ad0.jpg

步骤四:删除 HeaderBlock 中的“死”phi结点。
例子中, %tmp4 和phi结点 %x.03.0 构成了一个不会有成果的循环,就会删除它们,同理删除 %tmp2 和 %i.01.0 。优化结果如下:

11c0930c-fd25-11ec-ba43-dac502259ad0.jpg

原文标题:编译器优化那些事儿(4):归纳变量

文章出处:【微信公众号:openEuler】欢迎添加关注!文章转载请注明出处。

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5357

    浏览量

    120681
  • 编译器
    +关注

    关注

    1

    文章

    1636

    浏览量

    49173
  • CFG
    CFG
    +关注

    关注

    0

    文章

    10

    浏览量

    9825

原文标题:编译器优化那些事儿(4):归纳变量

文章出处:【微信号:openEulercommunity,微信公众号:openEuler】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FRED应用:LED发光颜色优化

    ” 色度值优化函数定义 X和y色度坐标优化函数需要彩色图像计算他们的值。输入变量g_ana 是分析面“屏幕”的节点数。这里,只有中心像素点的值用于决定X和y的色度值,只在光束重叠区域
    发表于 01-07 08:51

    具有连续调制光栅区域的光波导优化

    程 基本光学光波导设置的配置(不属于此用例的一部分) 足迹和光栅分析工具的应用,包括生成满足参数调制所有要求的光学设置 光栅参数所需调制的定义 选择变量并定义评价函数以优化调制光栅参数。 起点是一个现有
    发表于 12-16 08:56

    图纸模板中的文本变量

    进行定义。无论是系统内置的变量,还是用户自定义的变量,都以这种方式表述。 系统内置文本变量 以下表格展示系统内置的文本变量,无需定义,可以直
    的头像 发表于 11-13 18:21 191次阅读
    图纸模板中的文本<b class='flag-5'>变量</b>

    如何进行有效的eda分析

    基础。 一、数据收集和加载 获取数据集 :从数据库、文件、API等数据源获取数据集。 了解数据 :确保了解数据的来源、格式以及数据集中包含的变量。 加载数据 :使用适当的数据加载工具(如Pandas库)将数据加载到分析环境中。 二、数据初步观察 查看数据 :对数据集
    的头像 发表于 11-13 10:48 316次阅读

    使用Arthas火焰图工具的Java应用性能分析优化经验

    分享作者在使用Arthas火焰图工具进行Java应用性能分析优化的经验。
    的头像 发表于 10-28 09:27 309次阅读
    使用Arthas火焰图工具的Java应用性能<b class='flag-5'>分析</b>和<b class='flag-5'>优化</b>经验

    Linux环境变量配置方法

    过程并不复杂,但是一些细节没有注意就可能导致配置的变量不生效。本文针对Linux环境变量主要场景进行描述。
    的头像 发表于 10-23 13:39 187次阅读

    IP 地址大数据分析如何进行网络优化?

    一、大数据分析在网络优化中的作用 1.流量分析 大数据分析可以对网络中的流量进行实时监测和分析
    的头像 发表于 10-09 15:32 257次阅读
    IP 地址大数据<b class='flag-5'>分析</b>如何<b class='flag-5'>进行</b>网络<b class='flag-5'>优化</b>?

    OpenHarmony之开机优化

    PNG或PDF)的图形报表,以便用户进行深入分析。 功能与用途 分析系统启动时间和启动过程中资源的使用情况。 发现可能影响系统启动速度的因素,如某些进程启动缓慢或占用过多资源等。 对系统进行
    发表于 07-01 16:39

    3PCS01G输入电流波形在顶部和底部有变量的情况,请问COMP脚本如何进行优化

    3PCS01G 现在输入电流波形在顶部和底部有变量的情况,请问COMP脚本如何进行优化。 现在情况是这样,就是PFC母线的输出是 390V 2000W。 由于我们输出的是 35-68V,再加上效率
    发表于 05-20 07:19

    请问stm32程序中如何优化大量的编译开关和全局变量

    刚接手一个程序,发现里面存在大量的编译开关和定义了大量的全局变量,感觉这些显得很是臃肿,有什么方法可以优化一下这些编译开关和全局变量? 全局变量是一个个的标志位,有时候还会有条件嵌套。
    发表于 05-06 06:35

    C语言变量应用详解

    变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。
    发表于 03-18 11:18 430次阅读
    C语言<b class='flag-5'>变量</b>应用详解

    变量位置不同会死机?郭天祥老师视频的遗留问题分析答案

    在郭天祥老师视频里有一个问题分享,是EXMC初始化里的一个变量定义和初始化位置不同会导致程序死机,最终定位到程序是进入hardfault死机,但暂时没有后续分析了,这里我们来继续分析一下。
    的头像 发表于 02-26 09:12 375次阅读
    <b class='flag-5'>变量</b>位置不同会死机?郭天祥老师视频的遗留问题<b class='flag-5'>分析</b>答案

    请问如何防止tasking将const变量合并?

    编译中发现tasking将const变量值相同的变量合并了,先去掉一些优化选项还是不起作用,只能改变const变量的值,是不是有什么编译选项可以去掉这个
    发表于 02-02 08:07

    请问GTM的MCS和主CPU如何进行变量传递?

    请问GTM的MCS和主CPU如何进行变量传递?谢谢!
    发表于 01-23 07:44

    自动控制系统中的操纵变量指什么

    自动控制系统中的操纵变量指的是在系统中由控制器控制的可调节参数,用于调节或改变被控对象的输出或状态。操纵变量是自动控制中非常重要的概念,它是控制系统实现自动调节和优化的核心要素之一。本文将详细介绍
    的头像 发表于 01-15 11:29 5416次阅读