理解Herbrand Equivalence

笔者最近在看GVN的一系列论文,总会看到一个概念叫Herbran Equivalence,依靠这种定义,能够判断一个GVN算法是否是complete的,也即检测一个算法是否是precise的,只有找到所有Herbrand Equivalence关系的算法才能称得上是完全的。

目录

  • 理解:程序表达式之间的等值关系是不可判定的
  • phi结点和普通表达式之间的相等性
  • 《一种高效的完全值编号算法》定义的值编号
    • 定义Herbrand等值关系
    • 定义值编号
  • 算法执行

理解:程序表达式之间的等值关系是不可判定的

由于检测程序表达式间一般的等值关系是不可判定的,大部分 GVN 算法都将问题做了简化,通常假设条件语句的结果在编译期间是不确定的,并且对所有的运算符都不考虑其特殊语义,即忽略它们可能满足的特殊运算法则,将不同结构的表达式看作不同的表达式. 满足这些限制条件的表达式间的等值关系被称作 Herbrand 等值关系.能够检测到程序中全部 Herbrand 等值关系的 GVN 算法被称为完全 GVN 算法.
以上内容摘自《一种高效的完全值编号算法》。
两个程序表达式是否是等值的,这个问题在编译是无法判定,例如表达式a + b 和 a * b,表面看起来二者不是相等的,但是当运行时赋值a = 2, b = 2,此时两个表达式就是相等的。假定条件表达式在编译期不确定,前提是条件表达式的值不能通过静态分析得到,也即phi结点的两个分支执行哪个是不确定的。所有的运算符不考虑特殊语义,结合下文是说不考虑两个不同运算结构之间的等价性。

phi结点和普通表达式之间的相等性

这篇论文中还举了一些算法之所以是不完全的例子——也即他们无法发现phi结点和普通表达式之间的相等性。
以下几个例子实现了论文中的几个例子。
在这里插入图片描述

例子1:在input例子中发现两个表达式x和y的相等性,在LLVM 中可以识别到此两个表达式之间的相似性并删除之。贴一个Compiler Explorer的链接。

#include <stdio.h>int input(int a, int b) {int c, d, e, x, y, z;scanf("%d", &d);if(d) {x = a + 1;c = a;} else {x = b + 1;c = b;}y = c + 1;scanf("%d", &e);if(e) {return x;} else {return y;}
}int main()
{int a, b;scanf("%d %d", &a, &b);input(a, b);
}

生成的IR主要部分如下:

  %0 = load i32, ptr %d, align 4%tobool.not = icmp eq i32 %0, 0%b.a = select i1 %tobool.not, i32 %b, i32 %a%retval.0 = add nsw i32 %b.a, 1ret i32 %retval.0

突然发现,论文给出了例子2是有问题的。
在这里插入图片描述
这里使用的标记方法是先将 ϕ \phi ϕ结点的所有分支标记完再标记 ϕ \phi ϕ结点,这本身并没有问题,问题在于 n 4 n_4 n4中的表达式应该为 x 1 = x 2 + 1 x_1 = x_2 + 1 x1=x2+1
在修改之后的情况下,当 n 4 n_4 n4基本块的结尾到 n 5 n_5 n5基本块或是 n 4 n_4 n4基本块的结尾到 n 3 n_3 n3基本块的开始都是满足 x 1 = y 2 x_1=y_2 x1=y2的情况的,但是在 n 3 n_3 n3 n 4 n_4 n4结尾这部分是不满足上述等值关系的。因此此种情况可以将两者标记为等值表达式但需要注意范围,不能贸然消除。
例子2对应的Compiler Explorer链接。
例子2:

#include <stdio.h>
int z;
int input(int x, int e, int f) {int y;y = x + 1;do {// if (x == y) {//     z = 1;// } else {//     z = 0;// }x++;// if (x == y) {//     z = 1;// } else {//     z = 0;// }if (e++ > 0) {break;} else {y++;}} while (1);return 0;
}int main() {int x, e, f;scanf("%d %d %d", &x, &e, &f);return input(x, e, f);
}

为了尽量凸显对该GVN能否正确识别,我修改了原文的例子以更好的阐述笔者的思想,读者可以自己尝试,当第一处注释打开时,编译器会判定两个表达式不相等,因此将全局变量z设置为0,第二处注释打开时,编译器会判定两个表达式相等,将全局变量设置为1.对应上图中x1和y1不相等,但x1和y2相等。

第三个例子不能用LLVM实现,因为LLVM不存在两个phi结点的依赖关系。也即图中 a 1 a_1 a1 b 1 b_1 b1之间存在着矛盾关系。
根据论文后续的描述也说明了上述例子在SSA中不成立。相关描述如下:

本文中的模型和算法都基于静态单赋值形式的程序. 在一个静态单赋值形式的程序中,所有变量都有唯一的定值语句,并且所有对变量的使用都被该变量的定值语句所支配,即从程序的入口到达对该变量的使用的所有执行路径都一定经过该变量的定值语句.

可以看到,在上述例子中b1的第一次使用并没有经过其定值。

《一种高效的完全值编号算法》定义的值编号

论文的第二和第三部分分别给出了Herbrand等值关系和值编号的定义。

定义Herbrand等值关系

首先来看第二部分。
在这里插入图片描述
此公式首先定义了某个值到一个表达式的定义,作者的思路是将所有的值都上溯到定义他们的表达式的形式,这样可以比较不同值之间的相等性,带着这样的想法再来看上述公式,第一种情况是t=x的形式(根据后文的描述称为变量表达式),直接将x的表达式传递给t,第二种是t = t1 o t2的二元表达式形式(根据后文的描述称为包含运算符的表达式),将两个二元表达式的操作数的定义进行二元计算。
在这里插入图片描述
其后作者又定义了一个转换函数,也即经过一个程序节点(语句)之后表达式集合的变化,第一种可能是赋值语句,直接将表达式中的t换成x。如果是phi结点,将每条分支上的都进行转换。
在这里插入图片描述
有了单个节点的处理方式,就能够得到一条路径的处理方式,无外乎将不同节点之间的转换函数连接,当遇到phi节点时,当路径明确的情况下也就能选择出某个分支。
在这里插入图片描述
基于上述公式给出了一个P-Herbrand关系,这里的P是Partial的简写,突出了当前路径只是一种可能的运行情况。这个公式定义的不清晰,根据下文的描述应该是检测了某个路径下的Herbrand等值关系。
最后一句话是说当P是所有路径的集合时,得到的Herbrand等值关系不再是部分的,所以可以省略前缀P-。

定义值编号

值编号定义前,作者先定义了两个值编号之间的比较,有如下公式。
在这里插入图片描述
集合原文的描述更容易理解,这里我只说一个问题,第三行两个表达式写反了,应该是第二行最后一部分的否定,否则第二行和第三行不能构成一个分支上的完备集。
在这里插入图片描述
上述定义很明显,如果有变量表达式,那么从其等值集合中取一个最小的表达式作为当前变量的值编号,如果一个表达式是运算符表达式,取最小两个表达式的运算结果作为值编号。

算法执行

这一部分可以结合原文的例子来看,更好理解。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SD-WAN如何实现广域网加速

随着企业的全球化和数字化转型&#xff0c;广域网&#xff08;WAN&#xff09;的性能和可靠性成为业务成功的关键因素。在这一背景下&#xff0c;软件定义广域网SD-WAN作为一种先进的网络技术&#xff0c;被广泛应用于提升广域网的加速效果。本文将深入探讨SD-WAN是如何实现广域…

CSCD期刊目录中,审稿及出版效率均较好的10本医药期刊推荐!

常笑医学整理了适合医、药、护、技及医学工程等人员进行论文投稿的中国科学引文数据库&#xff08;CSCD&#xff09;中的10本医药期刊&#xff0c; 以及期刊详细参数&#xff0c;供大家参考。 1.《中国实用内科杂志》 &#xff08;详细投稿信息请点击刊物名称查看&#xff09; …

本地远程实时获取无人机采集视频图像(天空端 + jetson nano + 检测分割 + 回传地面端显示)

无线图传设备介绍 2、jetson nano天空端数据采集检测保存 3、本地回传显示 1、无线图传设备介绍 由于本设计考虑将无人机得到检测结果实时回传给地面站显示&#xff0c;因此需要考虑一个远程无线通信设备进行传输。本设计采用思翼HM30图传设备。通过无线图传的wifi将天空端的桌…

HMM算法(Hidden Markov Models)揭秘

序列数据 机器学习的数据通常有两类&#xff0c;最常见的是独立同分布数据&#xff0c;其次就是序列数据。对于前者&#xff0c;一般出现在各种分类/回归问题中&#xff0c;其最大似然估计是所有数据点的概率分布乘积。对于后者&#xff0c;一般出现在各种时间序列问题中&…

基于Java SSM框架实现高校校园点餐系统项目【项目源码+论文说明】

基于java的SSM框架实现高校校园点餐系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&a…

SSL证书链是什么?SSL证书链如何工作?

SSL证书链作为公钥基础设施&#xff08;PKI&#xff09;的一项关键功能&#xff0c;它支持许多与安全相关的服务&#xff0c;包括数据机密性、数据完整性和最终实体身份验证&#xff0c;它使得互联网上的安全在线通信成为可能。那么SSL证书链是什么&#xff1f;SSL证书链如何工…

应用GIS进行生态敏感性评价

生态环境敏感性是指生态系统对区域内自然和人类活动干扰的敏感程度&#xff0c;它反映区域生态系统在遇到干扰时&#xff0c;发生生态环境问题的难易程度和可能性的大小&#xff0c;并用来表征外界干扰可能造成的后果。即在同样干扰强度或外力作用下&#xff0c;各类生态系统出…

盲盒小程序能够为企业商家带来哪些优势?

近几年&#xff0c;盲盒深受大家关注&#xff0c;现在在各大商场中&#xff0c;盲盒的身影也处处可见&#xff0c;商家也因此获得了一定的利润。 随着人们生活消费水平的提高&#xff0c;消费者在消费中也逐渐追求新颖的消费模式&#xff0c;而盲盒的未知性特点&#xff0c;恰…

力扣 | 139. 单词拆分

主要是要注意组合的顺序是任意的&#xff01;所以就要先选择目标字串&#xff0c;再选择wordDict public boolean wordBreak(String s, List<String> wordDict) {// dp[i]: 表示前 i 个字符组成的子串是否可以被 wordDict 中的字符串组合而成boolean[] dp new boolean[s…

了解开源协议吗,简单介绍下开源协议

简单图解 开源协议的简单图解 列表图解

乐游白马,解锁南京周边游新玩法

人气景点、农旅采摘、度假民宿、节庆活动、田园美食……位于南京国家农高区的溧水区白马镇,近年来不断解锁南京周边游新玩法,将吃、住、玩、乐、购等融为一体,推出了一批“重休闲、享生态、深体验、慢生活”的旅游精品线路,让流量变“留量”。全域有看点、全年有惊喜的白马,正逐…

国科大计算机体系结构期末考试——停更,手写更快

题型一、第二章的画图 给一个逻辑表达式&#xff0c;画出晶体管级别的电路图 cmos电路的基本电路&#xff1a; 与非门的功能是对多个输入信号进行逻辑与操作&#xff0c;然后对结果进行取反。 或非门的功能是对多个输入信号进行逻辑或操作&#xff0c;然后对结果进行取反。 …