中间表示- 活性分析

news2024/9/21 18:30:42

进行活性分析的动机

(1)在代码生成的讨论中,我们曾假设目标机器有无限多个(虚拟)寄存器可用,这简化了代码生成的算法,但对物理机器是个坏消息,因为机器只有有限多个寄存器,必须把无限多个虚拟寄存器分配到有限个寄存器中。

(2)这是寄存器分配优化的任务,需要进行活性分析。

引入示例

考虑这段三地址码:

a = 1
b = a + 2
c = b + 3
return c

有三个变量a,b,c,假设目标机器上只有一个物理寄存器 r,那么是否可能把这三个变量同时放到寄存器 r 中?答案是肯定的,因为这三个变量可以分阶段的交替占用这个寄存器r。

计算在给定的程序点,哪些变量是“活跃”的(对应下图花括号中的变量),活跃信息给出了活跃区间的概念,活跃区间互不相交,所以三个变量可交替使用同一个寄存器。(把左侧的表达式竖着写(如下图),就可以清晰地体会区间交替、互不相交的含义了)

针对给定的这段三地址码,再结合上面分析的a、b、c三个变量的活跃区间情况,我们给出寄存器分配的映射表(寄存器分配优化中核心的数据结构,本质是哈希表),这样的寄存器分配的映射表指出a、b、c三个变量分别映射到哪个寄存器,就本例来说,三个变量映射到了同一个寄存器r。

有了这样的信息之后,我们可以根据这个分析,对三地址码进行重写(如下所示)

r = 1
r = r + 2
r = r + 3
return r

由无限多个变量映射到有限个寄存器中的这个过程,叫做寄存器优化。

数据流方程

对任何一条语句:[ d : s ],给出两个集合

gen[ d : s ] = {x | 变量x在语句中被使用}

kill[ d : s ] = {x | 变量x在语句中被定义}

举个栗子:

x = y + z
z = z + x

gen[1] = { y, z },kill[1] = { x }

gen[2] = {x, z},kill[2] = { z }

基本块内的后向数据流方程:

 (注意与到达定义分析的区别,到达定义分析中的数据流是前向的)

由于是后向的,也就意味着先计算out再计算in,以下图为例,是从return c开始往上计算基本块内的后向数据流方程。注:下图中右侧计算的是每个数据块的in集合,彩色柱形代表三个变量对应的活跃区间。

 

再来看一个例子, 

 

我们通过观察可以得出,例2至少需要两个寄存器(a需要一个寄存器,b和c可以交替地使用同一个寄存器但要与a互斥)

下面由基本块内的数据流方程推广到一般的控制流图结构上来,即引出一般的数据流方程。

一般的数据流方程

方程(同样为后向的计算):

同样可以给出不动点算法:从初始的空集{}出发,循环到没有集合发生变化为止。

 同样的举一个栗子,以下为一个一般的控制流图,一共有6条语句存在。

老师在PPT上演示的语句的遍历顺序是1,2,3,4,5,6,但是我感觉用逆拓扑序计算(即按6,5,4,3,2,1的顺序来计算in和out)更好理解,因为根据上面的公式,逆拓扑序计算out会把所有后继的in并起来算为自己

 

这是最终得到的live_out,比如在下面标红的边上,live_out就是{a, c},有了最终的live_out就能画出活跃区间图(如下所示)。

红色代表a的活跃区间,黄色代表b的活跃区间,绿色代表c的活跃区间

由此看出,a和b活跃区间不重叠,c与b和a都冲突(冲突的意思是,两个变量在同一点上都活着)

干扰图

干扰图是一个无向图G = (V, E):

1、对每个变量构造无向图G中一个节点

2、若变量x,y同时活跃,在x、y之间连一条无向边

注:这是由上图得出的干扰图

干扰图清晰地描述了哪些变量是不能占用同一个寄存器的。比如a和c,在某个程序点处可能同时活着,他们两个的值是不同的,而且同时需要,所以a和c就需要两个寄存器进行存储(意味着a和c是相互冲突/干扰的)

此时笔者内心os:根据这个图,我怎么隐约感觉到在后续的寄存器分配中,会用到图染色算法呢,就是把寄存器当做不同的颜色来给这张图染色,且相邻点不同色。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/440724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot 应用的打包和发布

1. 创建项目(example-fast) 基于 Spring Boot 创建一个 WEB 项目 example-fast。 2. 编译打包 2.1 采用 IDEA 集成的 Maven 环境来对 Spring Boot 项目编译打包,可谓是超级 easy 2.2 mvn 命令打包 # mvn clean 清理编译 # install 打包 #…

牛顿法、梯度下降法与拟牛顿法

牛顿法、梯度下降法与拟牛顿法 0 引言1 关于泰勒展开式1.1 原理1.2 例子 2 牛顿法2.1 x 为一维2.2 x 为多维 3 梯度下降法4 拟牛顿法4.1 拟牛顿条件4.2 DFP 算法4.3 BFGS 算法4.4 L-BFGS 算法 0 引言 机器学习中在求解非线性优化问题时,常用的是梯度下降法和拟牛顿…

数据结构入门(C语言版)二叉树概念及结构(入门)

二叉树概念及结构(入门) 树的概念及结构1.树的概念及结构1.1 树的概念1.2 树的相关知识1.3 树的结构体表示1.4 树的实际运用 2.二叉树概念及结构2.1 二叉树的概念2.2 现实中的二叉树2.3 特殊的二叉树2.4 二叉树的性质2.5 二叉树的存储结构 结语 树的概念…

【SpringCloud】3、使用Nacos作为服务配置中心

1、增加 maven 依赖 <!-- SpringCloud Alibaba Nacos Config --> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>2、添加配置中心配置 spr…

(数字图像处理MATLAB+Python)第四章图像正交变换-第四、五节:Radon变换和小波变换

文章目录 一&#xff1a;Radon变换&#xff08;1&#xff09;Radon变换原理&#xff08;2&#xff09;Radon变换实现&#xff08;3&#xff09;Radon变换性质&#xff08;4&#xff09;Radon变换应用 二&#xff1a;小波变换&#xff08;1&#xff09;小波A&#xff1a;定义B&a…

【PyQt】PyQt5进阶——串口上位机及实时数据显示

文章目录 0 前期教程1 前言2 串口部分——QtSerialPort3 绘图部分3.1 QCustomPlot3.2 QtChart3.3 QWT3.4 Qt Designer中如何使用 参考链接 0 前期教程 【Python】PyQt5入门 1 前言 最近在用PyQt做一个串口上位机&#xff0c;需要串口通信和实时显示曲线。这里简单记录一些关键…

【已解决】最简单便捷的方法将多html合并为pdf

一、单页面转pdf 可以使用pdf24&#xff0c;https://tools.pdf24.org/zh/webpage-to-pdf。 也可以直接打印 二、多页面转pdf&#xff08;wkhtmltopdf方案&#xff09; 1、安装配置pdfkit&#xff1a;[https://blog.csdn.net/xc_zhou/article/details/80952168(https://blog.…

Charles安装及使用教程

一. 简介及安装 一、charles的使用 1.1 charles的说明 Charles其实是一款代理服务器&#xff0c;通过过将自己设置成系统&#xff08;电脑或者浏览器&#xff09;的网络访问代理服务器&#xff0c;然后截取请求和请求结果达到分析抓包的目的。该软件是用Java写的&#xff0…

Nestjs全网最佳翻译-概况-管道-Pipes

管道 带上装饰器 Injectable() 并实现了 PipeTransform 接口的类&#xff0c;就是管道。 管道有 2 个典型的应用场景&#xff1a; 数值转换&#xff1a;将输入的参数转换成目标类型&#xff0c;例如&#xff0c;string to number。 数值校验&#xff1a;对输入的参数进行校验…

cocos creator v3.6版本使用Intersection2D模块的circleCircle方法

在cocos creator v3版本中Intersection2D模块的circleCircle方法可以用来检测两个圆形是否相交 该方法可以实现的功能有&#xff1a; cocos creator吸铁石实现、cocos creator物体在固定位置吸附、cocos creator物体吸附效果、cocos creator吸铁石实现、cocos creator两个物体时…

统计软件与数据分析Lesson9----爬虫解析库Beautiful Soup

统计软件与数据分析Lesson9----爬虫解析库Beautiful Soup知识点总结 1.requests 模块1.1 查看requests功能函数1.2 发送请求1.3 传递URL参数1.4 获取响应内容 2.Beautiful Soup模块2.1 解析器2.2 对象类型2.2.1 Beautiful Soup2.2.2 标签Tag2.2.3 可遍历的字符串NavigableStrin…

Java——包含min函数的栈

题目链接 牛客在线oj题——包含min函数的栈 题目描述 定义栈的数据结构&#xff0c;请在该类型中实现一个能够得到栈中所含最小元素的 min 函数&#xff0c;输入操作时保证 pop、top 和 min 函数操作时&#xff0c;栈中一定有元素。 此栈包含的方法有&#xff1a; push(va…

SRv6实践项目(六):控制面完成链路和主机的发现

在本次实验中&#xff0c;我们需要利用ONOS完成对数据面的控制 1.使能packet的IO功能&#xff0c;验证链路发现 main.p4提供了和P4Runtime的通信的消息的定义格式&#xff0c;分别是PacketIn和PacketOut&#xff0c;他们都被加上了一个注解&#xff0c;表示这是一个控制器交互…

c++篇---缺省参数

文章目录 一、缺省参数概念二、缺省参数实例三、缺省参数声明和定义四、全缺省和半缺省 一、缺省参数概念 缺省参数 在调用该函数时&#xff0c;如果实参没有指定传内容&#xff0c;那么在函数中用形参时&#xff0c;就采用为函数参数指定的这个缺省值 但是如果在调用该函数时…

【Qt 实现一个画板,基于QWidget,可以绘制直线和矩形】

【Qt 实现一个画板&#xff0c;基于QWidget,可以绘制直线和矩形】 简介效果展示源码mainwindow.hmainwindow.cpppainterwidget.hpainterwidget.cppshape.h &#xff08;管理&#xff09;line.hline.cpprect.hrect.cpp 结 &#x1f649;&#x1f649;更多内容 点击&#xff1a;Q…

力扣sql中等篇练习(七)

力扣sql中等篇练习(七) 1 查询活跃业务 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below # 先求出所有业务的平均发生次数 SELECT t2.business_id FROM (SELECT e.*,IF(e.occurences>t1.A_NUM,1,0) tota…

【C++】vector的简化模拟实现

文章目录 1. 主要结构2. 默认成员函数3. 迭代器4. 容量相关1. size和capacity2. reserve3. resize 5. 数据访问6. 数据修改1. push_back2.pop_back3. insert4.erase5.swap6.clear 1. 主要结构 参照SGI版本的vector实现&#xff0c;使用三个指针来维护这样一段内存空间 templa…

ACL访问控制列表简介和配置演示

一.ACL功能和特点 1.功能 2.特点 二.ACL种类 1.基础ACL&#xff1a; 2.增强ACL&#xff1a; 三.配置演示 1.基础ACL&#xff1a; 2.增强ACL&#xff1a; 一.ACL功能和特点 1.功能 对感兴趣的路由 (控制层面)进行设置策略 对感兴趣的流量 (数据层面)进行设置策略 2.…

Activity启动模式的生命周期

四种启动模式 1.standard android:launchMode"standard" 默认的标准启动模式&#xff0c;每次启动当前Activity&#xff0c;任务栈中都添加一个当前Activity的实例。按返回键时&#xff0c;表现出退出多个当前Activity的现象。 MainActivityOne和MainActivityTwo都…

DPText-DETR原理及源码解读

一、原理 发展脉络&#xff1a;DETR是FACEBOOK基于transformer做检测开山之作&#xff0c;Deformable DETR加速收敛并对小目标改进&#xff0c;TESTR实现了端到端的文本检测识别&#xff0c;DPText-DETR做了精度更高的文字检测。 DETR 2020 FACEBOOK&#xff1a; 原理 https://…