中间表示- 到达定义分析

news2024/10/6 1:44:39

基本概念 

定义(def):对变量的赋值

使用(use):对变量值的读取

问题:能把上图中的y替换为3吗?如果能,这称之为“常量传播”优化。

该问题等价于,有哪些对变量y的定义能够到达语句a = y?

到达定义:对每个变量的使用点,有哪些定义可以到达?(即:该变量的值是在哪儿赋值的?)

如果赋值点有且只有一个,并且那个赋值点是一个常数的话,那么就可以做常量传播了。

所以,到达定义是一种程序分析,这种程序分析的结果就可以用来指导接下来我们做常量传播这种优化。再次印证了下面这张图。

接下来的问题是,如何用算法来做到达定义分析?

在此,我们引出数据流分析中非常重要的数学工具——数据流方程

数据流方程

注:d是这条定义的编号,x的变量(比如,右侧第一条定义[1: y = 3])

  • gen(产生集)这个集合中存放的是语句的编号,因为语句编号和语句是一一对应的(双射关系),所以可以理解为语句本身。例如,gen[1: y = 3] = {1},可将gen集合理解为当前的这条语句给出了一条什么定义,显然,如果它是一条定义的话,就生成自身。从4向下走就可以见到4处定义了y(可在此直观的体会一下生成的含义)。
  • kill集合,例如kill[4: y = 6] = defs[y] - {4} = {1, 5},可以理解为,这些集合都被当前的定义点杀死,只能看到此处(定义点)的4,其他的y所在的序号都被屏蔽了。
  • defs[x]是x的所有定义点,例如defs[y] = {1, 4, 5}。

下面再解释一下数据流方程

给每条语句定义两个集合in[S]和out[S],in集合表示在进入语句S之前,有哪些定义是可以见到的(有多少语句是可达的,可到达这儿的),out集合表示经过S之后有哪些语句是可以出去,继续到达下一条的。

结合下面这个例子,看看每个定义点处的in和out集合都是什么 

in[1] = {∅},out[1] = {1}

in[2] = {1},out[2] = {2,1}

in[3] = {2, 1},out[3] = {3,2,1}

in[4] = {3,2,1},out[4] = {4,3,2}

注意,在此处到达5的定义是{4,3,2}没有1,意味着y在1处的定义是不可能到达5的,因为它总是会被4覆盖掉。

结合前面的内容,如果要做常数传播优化的话,结合到达定义分析就比较容易做了,而且这个到达定义分析是足够精确的,它会忽略掉那些不会到达的定义,只会算静态看可以到达的。

可以这么理解数据流方程:数据在程序中流动的过程中,每一点都标注了若干数据。

从数据流方程到算法

算法:对一个基本块的到达定义算法

  • 输入:基本块中所有的语句
  • 输出:对每个语句计算in和out两个集合
List_t stms;    // 一个基本块中的所有语句
set = {};       // 临时变量,记录当前语句s的in集合
reaching_definition()
{
    foreach (s ∈ stms)
    {
        in[s] = set;
        out[s] = gen[s] ∪ (in[s] - kill[s]);
        set = out[s];
    }
}

对于一般的控制流图

以上讨论的都是基本块内的,那么对于一般的控制流图呢?我们可以写以下两条前向数据流方程,注意,我们只是对刚才基本块内的方程做了推广。

前向数据流方程

从数据流方程到不动点算法

算法:对所有基本块的到达定义算法

  • 输入:基本块中所有的语句
  • 输出:对每个语句计算in和out两个集合
List_t stms;    // 所有基本块中的所有语句
set = {};       // 临时变量,记录当前语句s的in集合
reaching_definition()
{
    while (some set in[] or out[] is still changing)
    {
        foreach (s ∈ stms)
        {
            foreach (predecessor p of s)
                set ∪= out[p];
            in[s] = set;
            out[s] = gen[s] ∪ (in[s] - kill[s]);
        }
    }
}

一开始6条语句上的每个in和out集合都初始化为空集,先来看第一遍运算,从第一号语句开始,它的in集合为初始的空集,out集合通过计算为{1},这样的计算前后对比,out集合发生了变化。同理,我们继续计算2号语句,它的in等于前驱元素out的并,我们可以看到有两条边进入2号,所以它有两个前驱元素(1号和5号),1号的out集合为{1},5号的out集合为{},所以2号语句的in集合为{1},2号语句的out通过计算为{1, 2},同理可以依次计算3-6。

为什么叫不动点呢?因为这其中包含一个循环,从5号语句出发又重新回到了2号语句这边,这样的循环导致对这里面到达定义的分析不可能一遍完成,正如我们在上图第一个表格中看到的,第一遍初始值与第二遍计算结束后,有些集合(确切的来说是2n - 1个集合)都发生了变化,只有第一个集合没有变,所以只要有集合还在发生变化,那么我们就要进行下一轮,如果还有变化的话,就继续进行下一轮,直到到达一个不动点为止。

该不动点算法为什么可以终止?因为对于一个确定的程序而言,每个基本语句的in,out集是固定且有限的。

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

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

相关文章

R730服务器热插拔换磁盘(raid阵列)

r730服务器发现磁盘闪橙等,说明磁盘报警了,这时候我们就要换磁盘了。 由于本服务器磁盘是raid5的阵列磁盘,所以要采用热插拔的方式换磁盘。 这边要注意的是,不能关机的时候,直接来换磁盘。 因为关机换磁盘&#xff0c…

golang指针相关

指针相关的部分实在是没有搞太明白,抽时间来总结下。 1.指针相关基础知识 比如现在有一句话:『谜底666』,这句话在程序中一启动,就要加载到内存中,假如内存地址0x123456,然后我们可以将这句话复制给变量A&…

什么是服务架构?微服务架构的优势又是什么?

文章目录1.1 单体架构1.2 分布式架构1.3 微服务架构1.4 单体架构和分布式架构的区分1.4 服务架构的优劣点1.4.1 单体架构1.4.2 分布式架构1.4.3 微服务架构1.5 总结1.1 单体架构 单体架构(Monolithic Architecture)是一种传统的软件架构,它将…

算法学习day56

算法学习day561.力扣583. 两个字符串的删除操作1.1 题目描述1.2分析1.3 代码2.力扣72. 编辑距离2.1 题目描述2.2 分析2.3 代码3.参考资料1.力扣583. 两个字符串的删除操作 1.1 题目描述 题目描述: 给定两个单词word1和word2,找到使得word1和word2相同…

探索数据结构之精髓:单链表解密

文章目录1. 前言2. 单链表的特点3. 单链表的基础操作🍑 接口总览🍑 初始化操作🍑 插入操作🍅 优化操作🍑 删除操作🍅 优化操作🍑 获取元素🍅 按置查找🍅 按值查找&#x…

从C出发 20 --- 函数参数深度剖析

我们在编写这个函数的时候参数 n 的值具体是多少? 在编写一个函数的时候参数值是没法确定的,所以将 (int n) 这个参数命名为形参 那么这个参数的值什么时候指定,具体函数调用的时候指定 比如 在main 里面调用 实参用来初始化形参 初始化之…

安装多个版本的Node.js的方法

要在同一台计算机上安装多个版本的Node.js,可以使用以下几种方法: 使用nvm(Node Version Manager):nvm是一个用于管理多个Active Node.js版本的工具。您可以使用nvm轻松地在系统中安装、卸载和切换不同版本的Node.js。…

Leetcode每日一题——“消失的数字”

各位CSDN的uu们你们好呀,今天,小雅兰又开新专栏了,以后会在Leetcode上面进行刷题,尽量每天写一道,请大家监督我!!!好啦,让我们进入Leetcode的世界吧 力扣 对于这道题目&a…

南卡OE Pro上线!开放式耳机新里程碑!前所未有的音质舒适双冠

当前耳机市场放眼望去几乎都是TWS的天下,但是大多数的蓝牙耳机都存在着以下痛点:长时间佩戴涨耳、出现听诊器效应、耳朵内部发痒以及与外界声音隔开缺乏安全性等等问题。 为此,国内智能声学品牌厂商NANK南卡针对用户的特点,于近日…

中小企业如何实施知识管理策略?

随着信息化建设的深入,IT不仅成为企业运营的基础平台,而且在ERP、CRM、OA等信息系统内沉淀了大量的知识,成为企业创新的源泉,大中企业信息化建设中知识管理越来越重要。 应该如何实现知识管理呢? 知识管理本身就属于企…

Flutter系列(七)ListView 图文列表详解

完整工程: Flutter系列(四)底部导航顶部导航图文列表完整代码_摸金青年v的博客-CSDN博客 详细解读: Flutter系列(五)底部导航详解_摸金青年v的博客-CSDN博客 Flutter系列(六)顶部导航详解_摸金青…

初学SSM时做的-IKUN图书管理系统

项目介绍 项目工具:IntelliJ IDEA 2021.2.2 图书后台管理系统,采用SpringBootMybatiusThymeleaf,页面使用Element框架,使用RESTful API风格编写接口。 数据库使用mysql 已实现功能 基本增删改查,联表查询 拦截器登录验证 项目技术栈 Spr…

4.15--设计模式之创建型之责任链模式(总复习版本)---脚踏实地,一步一个脚印

一、什么是责任链模式: 责任链模式属于行为型模式,是为请求创建了一个接收者对象的链,将链中每一个节点看作是一个对象,每个节点处理的请求均不同,且内部自动维护一个下一节点对象。 当一个请求从链式的首端发出时&a…

C++(Qt)软件调试---qmake编译优化和生成调试信息(9)

C(Qt)软件调试—qmake编译优化和生成调试信息(9) 文章目录C(Qt)软件调试---qmake编译优化和生成调试信息(9)1、前言1.1 编译器优化是什么1.2 调试信息是什么1.3 测试环境2、Qt编译模式说明3、比较Linux下Qt三种编译模式1.1 编译生…

DevOps系列文章 - K8S知识体系

环境搭建部分: 1、安装前的准备工作 # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld# 查看hostname并修改hostname # 查看本机hostname hostnamectl set-hostname k8s-master # 把本机名设置成k8s-master hostnamectl status # 查看修改结…

Linux复习 / 文件系统QA梳理

文章目录前言Q&A文件的基本理解Q:谈谈你是怎么理解文件的?Q:什么是当前工作路径?Q:文件与操作系统有着怎样的关系?Q:为什么语言要封装系统接口?文件描述符Q:系统和进…

基于JSP的网上购物系统的设计与实现(论文+源码)_kaic

摘 要 近些年来,社会的生产力和科技水平在不断提高,互联网技术也在不断更新升级,网络在人们的日常生活中扮演着一个重要角色,它极大地方便了人们的生活。为了让人们实现不用出门就能逛街购物,网络购物逐渐兴起慢慢变得…

ES6(声名、解构)

参考文档: ES6 入门教程https://es6.ruanyifeng.com/ 注意:内容较多:只看引用部分的内容即可(代码一眼过搭配理解) 一、变量声明 1. let let声名的变量只在所处于的块级有效 let a 10; if (true) {let b 20;cons…

人工智能 AI 绘画发展史

到了去年4月, 著名人工智能团队OpenAI 也发布了新模型 DALLE 2代,该名称来源于著名画家达利(Dal)和机器人总动员(Wall-E), 同样支持从文本描述生成效果良好的图像. 而很多读者对AI绘画开始产生特别的关注, 或许是从以下…

有趣的Hack-A-Sat黑掉卫星挑战赛——AES加密通信链路侧信道攻击leaky

国家太空安全是国家安全在空间领域的表现。随着太空技术在政治、经济、军事、文化等各个领域的应用不断增加,太空已经成为国家赖以生存与发展的命脉之一,凝聚着巨大的国家利益,太空安全的重要性日益凸显[1]。而在信息化时代,太空安…