汇编级跨文件调度框架的构建方法

文档序号:6524317阅读:210来源:国知局
汇编级跨文件调度框架的构建方法
【专利摘要】本发明涉及一种汇编级跨文件调度框架的构建方法,其步骤包括:判断、分析并描述汇编级寄存器内指令之间的数据依赖关系,构建汇编级数据依赖图ADDG,并且利用伪相关检测算法进行寄存器重新分配;分析汇编级基本块之间的调用关系,构建汇编级控制流图ACFG,并选择性添加控制依赖图CDG中删除冗余信息的特性来辅助后续调度;构建汇编级程序调用图APCG,组织管理全局源文件内函数调用关系。本发明提供了一种汇编级跨文件调度框架的构建方法,该方法从汇编级着手构建更高效的结构来完成更深层次的优化,其存储资源占用代价低、构建方法简单,并且支持全文件级的指令再调度与优化。
【专利说明】汇编级跨文件调度框架的构建方法
【技术领域】
[0001]本发明涉及计算机领域,尤其涉及一种汇编级跨文件调度框架的构建方法。
【背景技术】
[0002]编译优化的效果与编译器可见的视野息息相关,更宽的视野能给编译器更大的发挥空间,从而获得更好的优化效果。采用跨文件调度框架能使编译器的视野扩大至整个程序是未来编译领域的发展方向。然而,跨文件调度框架下进行的过程间分析、优化等均占用了过多的编译时间和较大的存储空间,这就导致绝大多数编译器并不支持跨文件调度框架。
[0003]现有技术方案一般是针对编译框架的中间语言提出,其中特征较为明显的实现方法包括Vortex编译器、SYZYGY编译系统、LLVM编译系统。其中:
[0004]VorteX是华盛顿大学实现的支持跨文件优化的编译器。Vortex编译器前端正常的处理整个应用程序,然后利用它的专用中间语言Vortex IL中间代码表示把所有的编译结果保存下来,一旦得到全部的过程的VIL表示,也就形成了跨文件调度框架。
[0005]SYZYGY是HP公司的Sungdo Moon等人于2004年实现的基于HP-UX的Itanium处理器的编译器的连接时跨文件过程间优化框架。它将传统编译流程划分为四个阶段,包括:前端、连接时、过程间分析和后端,它选择来连接时来可见全部的过程信息,所以在连接前保存目标代码的编译结果。
[0006]LLVM是伊利诺斯大学2004年提出的连接时全程序优化框架。为了支持全程序优化,LLVM选择的是通过一个伪连接器来保存编译的中间结果,这个中间结果以目标文件的面貌出现。但不同于SYZYGY的目标代码。LLVM扩展了 GCC原编译器的Link阶段。在LLVM系统中提供了一个用于进行跨文件过程间分析和优化的伪连接器,这个连接器主要用来处理LLVM系统自身生成的目标代码和LLVM汇编代码。LLVM修改了 GCC前端,这个前端完成对源程序的处理生成树表示后将树表示转换成LLVM的中间代码表示形式,中级优化器对这个中间代码表示进行一系列优化后生成LLVM的.ο文件。全部程序都被修改后的前端转换为LLVM的.ο文件后,再调用LLVM的优化连接器将它们Link为一个单独的文件。这样编译器就可见到全部的过程并基于这个文件进行跨文件的过程间分析和优化变形。完成优化变形后,这个LLVM中间代码表示被转换成GCC自身所使用的RTL表示。GCC编译器处理RTL表示,生成真正的目标代码,然后调用真正的Nati ve Li nker生成最终的可执行文件。
[0007]现有技术主要是通过保存编译器的中间结果实现跨文件调度框架,而保存中间结果是为了辅助跨文件间过程调度,但这并不能提供合适的结构去实现指令级再调度。

【发明内容】

[0008]本发明的目的是针对上述问题,提供了一种有效的汇编级跨文件调度框架的构建方法。[0009]为实现上述目的,本发明提供了一种汇编级跨文件调度框架的构建方法,其包括以下步骤:
[0010]构建汇编级数据依赖图ADDG,判断、分析并描述汇编级寄存器内指令之间的数据依赖关系,并且利用伪相关检测算法进行寄存器重新分配,避免临时寄存器的复用带来数据间的伪相关;以及
[0011]构建汇编级控制依赖图ACFG,控制数据依赖分析,并添加控制依赖图CDG中删除冗余信息的特性来辅助后续调度,构建基于多叉树结构的谓词分析方法,通过遍历控制流图,跨基本块的分析条件判断相关指令间的数据依赖关系来完成谓词分析;以及
[0012]构建汇编级程序调用图APCG,组织管理全局源文件间的关系;
[0013]所述APCG中每个节点对应一个所述ACFG,所述ACFG中每个节点可映射到一个汇编级基本块,所述ACFG中每个节点对应一个独立的ADDG。
[0014]进一步地,所述ADDG包括数据依赖检测算法、ADDG创建算法以及所述伪相关检测算法,其中,
[0015]所述数据依赖检测算法用于判断两条指令之间为何种所述数据依赖关系;
[0016]所述ADDG创建算法反映了汇编级基本块内全部指令之间为何种所述数据依赖关系,并表现出来;
[0017]所述伪相关检测算法用于寄存器重新分配,避免伪相关带来的数据依赖关系。
[0018]进一步地,所述ADDG是一个有向无环图DAG。
[0019]进一步地,所述ACFG是一个有向有环图DCG。
[0020]进一步地,所述构建基于多叉树结构的谓词分析方法是通过遍历控制流图,跨基本块的分析条件判断相关指令之间的数据依赖关系来完成谓词分析。
[0021]进一步地,所述寄存器重新分配包括以下步骤:
[0022]函数栈框架分析,首先分析程序的栈框架,并统计函数内即将用到的同类寄存器;以及
[0023]路径分析,分析后文将介绍的ACFG统计当前汇编级基本块的全部前驱动点对同类寄存器的使用情况;以及
[0024]判断所述路径分析中同类寄存器是否全部被使用。
[0025]进一步地,所述函数栈框架分析用于保存函数内使用到的临时寄存器。
[0026]进一步地,若所述路径分析中同类寄存器全部被使用,则判断修改栈结构
[0027]时导致的指令带来的影响是否小于对依赖关系的减少。
[0028]进一步地,若所述路径分析中同类寄存器未全部被使用,则任意选择一个
[0029]未使用的寄存器进行重新分配。
[0030]进一步地,若所述修改栈结构时导致的指令带来的影响小于对依赖关系的减少,则重新进行分配,否则放弃分配。
[0031]进一步地,构建所述APCG的步骤包括:
[0032]前端分析过程中收集全部的函数,并创建所述APCG的点集合;以及
[0033]顺序分析点集元素对应的汇编指令片段,分析其中的函数调用指令目标地址,并在点元素之间添加边;以及
[0034]生成未经边冗余删除的APCG ;
[0035]进一步地,所述APCG是一个DCG。[0036]本发明带来的有益效果是:本发明提供了一种汇编级跨文件调度框架的构建方法,该方法从汇编级着手构建更高效的结构来完成更深层次的优化,其存储资源占用代价低、构建方法简单,并且支持全文件级的指令再调度与优化。
【专利附图】

【附图说明】
[0037]图1为本发明一实施例一种汇编级跨文件调度框架的构建方法流程图;
[0038]图2为本发明一实施例中11-16的ADDG示意图;
[0039]图3为寄存器重新分配后的ADDG示意图;
[0040]图4为本发明进行寄存器重分配时的流程图;
[0041]图5为表8中对应的基本控制流图;
[0042]图6为表8中所示的代码片段的谓词关系示意图;
[0043]图7为本发明一实施例中ACFG示意图;
图8为本发明汇编级跨文件调度框架的构建方法中APCG、ACFG及ADDG间的嵌套关系示意图。
【具体实施方式】
[0044]下面通过附图和 实施例,对本发明的技术方案做进一步地详细描述。
[0045]如图1所示是本发明一实施例一种汇编级跨文件调度框架的构建方法流程图,如图所示,本发明具体包括以下步骤:
[0046]步骤101、构建汇编级数据依赖图(Assembly Data Dependence Graph, ADDG),判断、分析并描述汇编级寄存器内指令之间的数据依赖关系,并且利用伪相关检测算法进行寄存器重新分配,避免临时寄存器的复用带来数据间的伪相关。
[0047]数据依赖是指语句之间存在数据约束关系,如果两个运算操作之间无重复使用的变量,或仅连续读取同一个变量,那么执行结果与它们的执行顺序无关,如果相关则这两个运算操作之间就被认定为存在数据约束关系。数据依赖关系包括:写后写、写后读、读后写以及存储依赖四种。汇编级数据依赖图就是为了描述汇编级基本块内指令之间的这四种数据依赖关系。
[0048]ADDG 是一个有向无环图(Directed Acyclic Graph, DAG)。在 ADDG 中,G (ADDG) = (V (G),E (G),Φ (G)),其中V (G)是节点集合,E (G)是边集合,Φ (G)是关联函数。
[0049]节点集合V (G) = Iv1, V2, Vf vn},其中Vi与汇编级基本块内的指令呈--映射关系
并被其属性刻画,Vi的出度(out-degree)和入度(in-degree)均不超过当前指令使用寄存器的数目。
[0050]边集合E(G) = R1, e2, e^“ej ,若取 efKv」,vk> | Vj, vk e V (G)},则 Oi 是一条以 Vj为初节点,以Vk为终节点的有向边,它描述了 Vk之间存在一种或多种数据依赖关系。同时,E(G)中边元素的有向性说明了初节点,终节点在执行顺序上的唯一性,如果多个边元素以及边的数据依赖关系属性可组成Vm — Vn的一条通路或者路径,则vm,vn可到达任意两节点之间;如果不可到达,则说明它们可以以任意顺序被执行。
[0051]关联函数Φ (G)描述了边与节点之间的关联关系E — VXV,本发明实施例中V(G)内各节点元素之间至多存在一条边,因此,Φ (G)是单映射的,即ADDG任意两节点之间不存在无重复边。
[0052]表1为本发明建立ADDG时所用到的数据结构。其中,结构体VexPos对ADDG中的节点的位置进行了定义,Lidx为遍历语句行的迭代器,Fidx为遍历文件的迭代器;结构体VexNode对节点集合V (G)进行了定义,Firstln_为连接节点的第一条入边,FirstOut_为连接节点的第一条出边;结构体ArcBox定义了边集合E(G), HeadVex与TailVex分别为一条边的初节点和终节点,Id定义了边属性,PathId用于标记边对应的通路,Correlation数组存储对应边描述的全部依赖关系,HLink指针用于指向下一条与当前边共用相同初节点的下一条边,而TLink则指向共用相同终节点的下一条边;结构体Graph定义了 F1DG的结构,vector容器VeXN0de_存储ADDG,BlockNode则存储后续的汇编级控制流图。
[0053]表1
[0054]
【权利要求】
1.一种汇编级跨文件调度框架的构建方法,其特征在于,包括以下步骤: 构建汇编级数据依赖图ADDG,判断、分析并描述汇编级寄存器内指令之间的数据依赖关系,并且利用伪相关检测算法进行寄存器重新分配,避免临时寄存器的复用带来数据间的伪相关;以及 构建汇编级控制依赖图ACFG,控制数据依赖分析,并添加控制依赖图CDG中删除冗余信息的特性来辅助后续调度,构建基于多叉树结构的谓词分析方法,通过遍历控制流图,跨基本块的分析条件判断相关指令间的数据依赖关系来完成谓词分析;以及 构建汇编级程序调用图APCG,组织管理全局源文件间的关系; 所述APCG中每个节点对应一个所述ACFG,所述ACFG中每个节点可映射到一个汇编级基本块,所述ACFG中每个节点对应一个独立的ADDG。
2.如权利要求1所述的汇编级跨文件调度框架的构建方法,其特征在于,所述ADDG包括数据依赖检测算法、ADDG创建算法以及所述伪相关检测算法,其中, 所述数据依赖检测算法用于判断两条指令之间为何种所述数据依赖关系; 所述ADDG创建算法反映了汇编级基本块内全部指令之间为何种所述数据依赖关系,并表现出来; 所述伪相关检测算法用于寄存器重新分配,避免伪相关带来的数据依赖关系。
3.如权利要求1或2所述的汇编级跨文件调度框架的构建方法,其特征在于,所述ADDG是一个有向无环图DAG。
4.如权利要求1所述的汇编级跨文件调度框架的构建方法,其特征在于,所述ACFG是一个有向有环图DCG。
5.如权利要求1所述的如权利要求1所述的汇编级跨文件调度框架的构建方法,其特征在于,所述构建基于多叉树结构的谓词分析方法是通过遍历控制流图,跨基本块的分析条件判断相关指令之间的数据依赖关系来完成谓词分析。
6.如权利要求1或2所述的汇编级跨文件调度框架的构建方法,其特征在于,所述寄存器重新分配包括以下步骤: 函数栈框架分析,首先分析程序的栈框架,并统计函数内即将用到的同类寄存器;以及 路径分析,分析后文将介绍的ACFG统计当前汇编级基本块的全部前驱动点对同类寄存器的使用情况;以及 判断所述路径分析中同类寄存器是否全部被使用。
7.如权利要求6所述的汇编级跨文件调度框架的构建方法,其特征在于,所述函数栈框架分析用于保存函数内使用到的临时寄存器。
8.如权利要求6所述的汇编级跨文件调度框架的构建方法,其特征在于,若所述路径分析中同类寄存器全部被使用,则判断修改栈结构时导致的指令带来的影响是否小于对依赖关系的减少。
9.如权利要求6所述的汇编级跨文件调度框架的构建方法,其特征在于,若所述路径分析中同类寄存器未全部被使用,则任意选择一个未使用的寄存器进行重新分配。
10.如权利要求8所述的汇编级跨文件调度框架的构建方法,其特征在于,若所述修改栈结构时导致的指令带来的影响小于对依赖关系的减少,则重新进行分配,否则放弃分配。
11.如权利要求1所述的汇编级跨文件调度框架的构建方法,其特征在于,构建所述APCG的步骤包括: 前端分析过程中收集全部的函数,并创建所述APCG的点集合;以及顺序分析点集元素对应的汇编指令片段,分析其中的函数调用指令目标地址,并在点元素之间添加边;以及 生成未经边冗余删除的APCG。
12.如权利要求1或11所述的汇编级跨文件调度框架的构建方法,其特征在于,所述APCG 是一个 DCG。
【文档编号】G06F9/45GK103645930SQ201310697997
【公开日】2014年3月19日 申请日期:2013年12月18日 优先权日:2013年12月18日
【发明者】朱浩, 彭楚, 王东辉, 洪缨 申请人:中国科学院声学研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1