一种基于代数系统的跨文件过程间优化方法

文档序号:6519653阅读:222来源:国知局
一种基于代数系统的跨文件过程间优化方法
【专利摘要】本发明公开了一种基于代数系统的跨文件过程间优化方法,该方法包括以下步骤:针对目标机特征,选择出涉及栈操作、逻辑运算类指令,构建代数系统,并为这些指令与代数系统建立映射关系;从程序入口处开始遍历程序调用图PCG,判断存在边相连的节点是否分属不同的源文件,如果是,继续下一步操作,否则继续遍历PCG;从函数调用指令开始逆向沿着当前函数内的控制流图CFG开始遍历数据依赖图DDG,生成指令压栈操作的代数表达式,并进行表达式归约;分析后继节点函数的出栈操作,从中读出常量值,并依次传递,优化并计算,最终删除冗余指令片段。本发明有效地合并、释放了函数栈框架中可优化部分。除此之外,本发明在跨文件过程间优化、常量传播以及常量计算中也取得了较佳效果。
【专利说明】一种基于代数系统的跨文件过程间优化方法
【技术领域】
[0001]本发明涉及编译器技术,尤其涉及一种基于代数系统的跨文件过程间优化方法。【背景技术】
[0002]函数栈框架在传统编译框架中是一种通用协议,并交由用户在二进制接口(Application Binary Interface, ABI)进行定义。函数栈框架在处理函数调用时,它根据目标机的硬件资源约束,尽可能的将临时变量保存在临时寄存器内,而溢出部分则在函数体前被执行前压入栈内,并通过存储访问指令进行栈操作,待函数体被执行完后再逐一释放函数栈内的数据。
[0003]在这种模式下,由于目标机器支持的最大寄存器数有限,而局部临时变量由于生命周期而分布于多个基本块内,频繁的入栈、出栈以及局部临时寄存器复用将直接导致函数栈操作存在冗余。
[0004]现有技术主要是基于编译框架下的中间语言进行优化,它主要面临以下几个主要问题:1、函数栈框架协议的制定与目标机器直接相关,修改时涉及的代码量十分庞大,这将导致工作量急增;2、制定一种适合各种应用场景的函数栈框架十分复杂,它牵涉到寄存器分配等多个阶段,而且中间语言只是一种抽象语言,它并不能直接、有效的描述栈操作,因此,从中间语言入手进行优化的设计复杂度很高。

【发明内容】

[0005]本发明的目的是为了解决上述现有技术存在的不足之处,提出一种基于代数系统的跨文件过程间优化方法,它通过定义代数系统来对函数栈操作进行针对性的优化,并取得了更好的效果。
[0006]为实现上述目的,本发明提供了一种基于代数系统的跨文件过程间优化方法,该方法包括以下步骤:
[0007]针对目标机特征,选择出涉及栈操作、逻辑运算类等指令,构建代数系统,并为这些指令与代数系统建立映射关系;
[0008]从程序入口处开始遍历函数调用图(Procedure Call Graph, PCG),判断存在边相连的节点是否分属不同的源文件,如果是,继续下一步操作,否则继续遍历PCG ;
[0009]从函数调用指令开始逆向沿着当前函数内的控制流图(Control Flow Graph,CFG)开始遍历数据依赖图(Data Dependence Graph, DDG),生成指令压栈操作的代数表达式,并进行代数表达式归约;
[0010]分析后继节点函数的出栈操作从中读出常量值,并依次传递,优化并计算,最终删除几余指令片段。
[0011]本发明定义一套粗糙的代数系统,通过栈操作生命周期分析将栈相关指令转义为代数表达式,并最终形成λ表达式,通过迭代归约λ表达式,有效地合并、释放了函数栈框架中可优化部分。除此之外,本发明在跨文件过程间优化、常量传播以及常量计算中也取得了较佳效果。
【专利附图】

【附图说明】
[0012]图1为栈操作生命周期分析流程示意图;
[0013]图2为函数栈框架优化流程示意图;
[0014]图3为图2所示函数栈框架优化实例;
[0015]图4为本发明实施例提供的一种基于代数系统的跨文件过程间优化方法流程图。【具体实施方式】
[0016]下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
[0017]线性空间中的代数系统由非空集合S及定义于集合S上的代数符集,关系集组成,代数系统中用于推理计算的代数表达式则是由常数、变量、有限个相关代数操作(加法、减法、乘法等)构成。汇编函数内的执行路径可看作是由多个汇编级基本块组成有序多元组,假设存在一条执行路径L=〈xl, x2, x3,.., xn>,其中L[i]=xi {i=l,…,n为执行节点或沿路上的汇编级基本块},针对L的特征可定义函数:
[0018]
【权利要求】
1.一种基于代数系统的跨文件过程间优化方法,其特征在于: 针对目标机特征,选择出涉及栈操作、逻辑运算类指令,构建代数系统,并为这些指令与代数系统建立映射关系; 从程序入口处开始遍历调用图PCG,判断存在边相连的节点是否分属不同的源文件,如果是,继续下一步操作,否则继续遍历PCG ; 从函数调用指令开始逆向沿着当前函数内的控制流图CFG开始遍历数据依赖图DDG,生成指令压栈操作的代数表达式,并进行表达式归约; 分析后继节点函数的出栈操作从中读出常量值,并依次传递,优化并计算,最终删除冗余指令片段。
2.根据权利要求1所述的方法,其特征在于,所述代数系统的构建流程为: 分析编译器端的栈框架结构,选择出其中与栈操作相关的指令; 根据这些指令的运算特征,定义代数符以及表达式规范; 为这些指令与代数系统建立映射关系。
3.根据权利要求1所述的方法,其特征在于,在所述遍历调用图PCG步骤之前还包括步骤:
构建全局函数调用图PCG,所述全局函数调用图PCG用于描述全部函数之间的调用关系O
4.根据权利要求3所述的方法,其特征在于,当所述函数调用图PCG中存在前驱节点i以及它的一个后继节点j,i调用j时的参数列表Params为{PI, P2,…,Pn}时, 当i是j的唯一前驱节点,如果Params中存在常量Pk,则将Pk传递入j中利用代数表达式进行计算,删除i中对Params中各参数的压栈以及j中对Params中各参数的出栈操作并将j的代码移动至i中进行函数调用的部分。
5.根据权利要求3所述的方法,其特征在于,当所述函数调用图PCG中存在前驱节点i以及它的一个后继节点j,i调用j时的参数列表Params为{PI, P2,...,Pn}时, 当i不是j的唯一前驱时,如果Params中存在常量Pk,则重新一个段函数j-rename, i对j的调用被修改为j-rename, i成为j-rename的唯一前驱,则将Pk传递入j-rename中利用代数表达式进行计算,删除i中对Params中各参数的压栈以及j-rename中对Params中各参数的出栈操作。
6.根据权利要求4所述的方法,其特征在于,当所述函数调用图PCG中的前驱节点i中调用j的指令insn的推断寄存器不为prO,那么需将指令insn修改为分支跳转指令来维护控制流,否则直接移动。
7.根据权利要求1所述的方法,其特征在于,通过广度优先算法从程序的入口处开始遍历函数调用图PCG。
8.根据权利要求1所述的方法,其特征在于,所述生成指令压栈操作的代数表达式步骤包括: 根据栈寄存器遍历函数体内的控制流图CFG与数据依赖图DDG ; 获取全部与栈相关的指令集合; 通过分析指令间的关系,静态分析栈操作的生命周期,并从所述与栈相关指令集合中删除冗余部分。
【文档编号】G06F9/45GK103559069SQ201310579365
【公开日】2014年2月5日 申请日期:2013年11月18日 优先权日:2013年11月18日
【发明者】朱浩, 王东辉, 洪缨 申请人:中国科学院声学研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1