一种基于指令代价的编译器优化代码生成方法

文档序号:6573493阅读:946来源:国知局
专利名称:一种基于指令代价的编译器优化代码生成方法
技术领域
本发明涉及嵌入式系统编译器的代码生成技术,更具体的说,是涉及一种基于指令代价的编译器优化代码生成方法。
背景技术
编译器是将用高级语言编写的程序转换成能在一台计算机上执行的等价目标代码或机器语言的软件系统。一个编译器由一系列过程组成如图1所示,一般分为(1)词法分析(lexical analysis),将输入的文本文件转化成一组符合编译词法规范的单词流;(2)语法分析(syntactic analysis),将单词流转换为语法分析树或者其它中间表示,以及完成符号表的构建;(3)语义分析(semantic checking),以符号表和语法树或其它中间表示为基础,根据文法,进行高级语言语义的检查工作,如果语义不符合要求,将会报错;(4)代码生成(code generation),通过对中间代码的优化后转换成目标代码。
从目前编译器技术的发展来看,主要重心在第四阶段,即如何生成高质量的代码。而指令选择是编译器优化代码生成的一个重要组成部分,从某种程度上来说,指令选择算法的好坏直接影响到所生成的目标代码质量。
生成代码的质量主要有三个方面进行衡量即代码空间、代码执行时间和代码功耗。代码空间和代码执行时间是两个常规的要素,而代码功耗对于嵌入式系统应用来说十分重要,因为嵌入式系统是资源受限而且对成本敏感的系统。
不同的应用对于优化目标各个方面的选择的权重是不一样的,如果系统的主存和高速缓存较小,那么使代码空间尽量小就十分重要了。因此,根据用户所需要的优化目标不同,相同的优化在不同的应用场景其重要性也会不同。这需要编译器能提供一定的机制供用户配置各类目标的权重。而目前主流的嵌入式编译器如Codewarrior、GNU GCC等都主要集中于时间性能的优化上,而没有提供对能耗优化的支持,也没有提供明显的选项来适合对特定应用进行配置。
对于众多的嵌入式处理器平台,其中有一类非常特别,它们仅仅提供少量的通用寄存器,但是同时提供了众多指令直接访问内存的能力,比如Freescale的hc11、hc12和hcs12系列芯片就有这种特点。而很多流行的RISC处理器都提供大量的通用寄存器,并且需要将操作数放入寄存器再进行操作。这类特殊的体系结构给编译器的优化代码生成带来了挑战,因为很多适合于原来处理器的代码生成方法不再适用或者效果变得不理想,尤其是在指令选择和寄存器分配策略方面。

发明内容
本发明的主要目的在于克服现有技术中的不足,提供了可以通过用户配置各个优化标准的比重、生成特定应用的高效代码的一种基于指令代价的编译器优化代码生成方法。
为了解决上述技术问题,本发明是通过以下技术方案实现的。
一种基于指令代价的编译器优化代码生成方法,包括以下步骤(1)通过词法分析、文法分析和语义分析形成中间语言表示,中间语言表示以树形结构表示为基础,即中间表示树;(2)生成所有中间表示树到目标表示的映射关系即规则,并对指令代价的权重进行配置;(3)对中间表示树进行至少两次的遍历,第一次遍历自底向上进行标记,记录与子树匹配的规则,记录所有的本结点对应的非终结符并记录其最佳匹配;另外,当匹配子树时,为每一个非终结符记录其最佳匹配;第二次遍历自顶向下进行标记,从第一次遍历的结果中集中选取代价最小的树覆盖,得到整棵中间表示树代价最小的匹配,最优选择后生成目标汇编代码。
作为一种改进,所述指令代价包括功耗代价、时间代价或空间代价其中至少一种。
作为一种改进,对提供少量的通用寄存器,并且指令有直接内存访问能力的目标体系,在步骤“(1)”后,有对虚拟寄存器和物理寄存器进行划分的步骤,以此增加中间表示树匹配的选择。
作为一种改进,所述的指令模块,是可划分为虚拟寄存器和物理寄存器的指令模块。
作为一种改进,所述的规则是动态规划算法。
作为一种改进,所述的对指令代价的权重进行配置,首先获取子树的代价,然后根据以下公式获得本结点对应的非终结符或者终结符的代价Cost=EnergyCost×W1+TimeCost×W2+SpaceCost×W3;其中,EnergyCost代表能耗代价,TimeCost代表时间代价,SpaceCost代表空间代价,Wi(i=1、2、3)代表了相应的权重,由用户通过XML文件指定。
与现有技术相比,本发名的有益效果是(1)本发明有效提高了代码生成的质量,尤其是针对于具有极少通用寄存器又提供直接访问内存指令的处理器,带来了较好的效果;(2)本发明提供的是一种快速的代码生成方法,通过两次遍历中间表示树,实现所需要的时间复杂度较低;(3)本发明将能耗优化纳入代码生成质量的考量因素中,为嵌入式应用生成低功耗的代码提供了保障,能有效降低嵌入式系统的成本。


图1为编译器的主要处理过程图。
图2为指令模块示例图。
图3为本发明的代码生成图。
图4为HCS12目标体系的寄存器组织。
图5为体系结构描述文件中的指令模块以及用户权重设置程序。
图6为对体系结构描述文件的处理图。
图中1非终结符、2终结符、3指令模块的实体、4指令模块的代价。
具体实施例方式
结合附图,下面对本发明进行具体描述。
本具体实施例中的一种基于指令代价的编译器优化代码生成方法,包括以下步骤(1)通过词法分析、文法分析和语义分析形成中间语言表示,中间语言表示以树形结构表示为基础,即中间表示树;(2)生成所有中间表示树到目标表示的映射关系即规则,并对指令代价的权重进行配置;所述指令代价包括功耗代价、时间代价或空间代价其中至少一种;所述的规则是动态规划算法;所述的对指令代价的权重进行配置,首先获取子树的代价,然后根据以下公式获得本结点对应的非终结符或者终结符的代价Cost=EnergyCost×W1+TimeCost×W2+SpaceCost×W3;其中,EnergyCost代表能耗代价,TimeCost代表时间代价,SpaceCost代表空间代价,Wi(i=1、2、3)代表了相应的权重,由用户通过XML文件指定;(3)对中间表示树进行至少两次的遍历,第一次遍历自底向上进行标记,记录与子树匹配的规则,记录所有的本结点对应的非终结符并记录其最佳匹配;另外,当匹配子树时,为每一个非终结符记录其最佳匹配;第二次遍历自顶向下进行标记,从第一次遍历的结果中集中选取代价最小的树覆盖,得到整棵中间表示树代价最小的匹配,最优选择后生成目标汇编代码。
对提供少量的通用寄存器,并且指令有直接内存访问能力的,通过在指令模板中对虚拟寄存器和物理寄存器进行划分,以此增加中间表示树匹配的选择,提高了代码生成的质量。
下面对本发明进行详细的说明本发明采用树模式匹配和动态规划算法,引入对实际物理寄存器和虚拟寄存器的划分,由于两者在产生的代码空间,执行时间代价,能耗需要方面都有不同的代价,最终以此为基础来选择不同的指令模板进行实际代码的映射生成。
指令的选择过程是从编译器的中间语言表示到目标机器汇编代码的映射过程,本发明将这些映射看作是一条条的规则,规则中有非终结符和终结符,非终结符由用户根据目标体系结构特点自己设定,而终结符一般是中间语言中代表的某种操作符。如图2是一个指令模板,soft_reg2就是一个用户定义的非终结符,而ADDI2是一个终结符,代表16位有符号数加法运算操作,CNSTI2也是一个终结符,代表一个16位的整型常量。中间“”部分就是这个模板对应的目标体系汇编指令,而最后三项数字是本发明前面提及的代表指令代价的数值。
实施过程如下(1)通过词法分析和文法分析以及语义分析形成中间语言表示,中间语言表示以中间表示树的结构表示为基础;(2)撰写所有中间语言表示到目标表示的映射关系,即规则,并设定其执行时间代价,空间代价以及能耗代价,可以是常量值,也可以是函数的形式来得到代价;(3)对中间表示树进行第一次遍历,自底向上进行标记,记录子树和哪些规则匹配,并且记录所有的本结点对应的非终结符,以便上一层子树能够选择任意一个非终结进行更高层的匹配。另外,当匹配子树时,为每一个非终结符记录其最佳匹配,这样第二次遍历完后就能很快将最佳匹配找出来;对中间表示树进行第二次遍历,自顶向下的方式来标记程序,它从第一遍标记程序记录的模式集中选取代价最小的树覆盖,这样就得到了整棵树代价最小的匹配。
从所有的候选匹配中选择最佳的匹配如图3就是采用了动态规划的算法,而第三步的树模式匹配是通过递归来快速完成的。由于描述指令映射的树文法有歧义,比如将一个内存中的变量加1可以先放到寄存器中加1,也可以直接加1。这样一棵子树很可能有多种覆盖,因此需要记录多种匹配供上层选择。
由于目标体系寄存器缺乏,当没有实际物理寄存器进行分配时,就引入虚拟寄存器。如图4所示,HCS12体系通用寄存器只有X、D、Y和SP等4个,而一般能拿来参与计算的只有D、X和Y寄存器。所以引入虚拟寄存器和物理寄存器的划分,可以将虚拟寄存器分配在堆栈上,也可以将虚拟寄存器分配在全局的空间上,这取决于编译器的设计策略。在堆栈或者全局的空间上的寄存器,一般分配给临时变量,操作虚拟寄存器就相当与是操作内存,它们与操作实际物理寄存器带来的代价是不一样的。因此在对子树进行匹配的时候,可以选择是虚拟寄存器的指令模板,也可以是物理寄存器的模板,由于寄存器的欠缺,可能左右子树只能有一个选择操作物理寄存器的模板,这样就能通过代价的计算来选择最优的匹配,从而将物理寄存器分配给最能带来代价降低的地方去。
匹配时的代价计算,首先要获取子树的代价,然后通过如下公式来计算本结点对应的非终结符或者终结符的代价Cost=EnergyCost×W1+TimeCost×W2+SpaceCost×W3,其中,EnergyCost代表能耗代价,TimeCost代表时间代价,SpaceCost代表空间代价,Wi(i=1,2,3)代表了相应的权重,由用户指定,一般来说对每一条规则都采用同样的权重。每一个规则的各个代价由编译器的开发者进行评估。
如图5所示,这是目标体系描述文件的一部分,用xml文件描述,涉及本发明相关的有两项。一是用户权重设置user-config,二是指令模板。权重设置有三个代价相关的权重组成。指令模板主要有如下几个项(1)rule_nonterm表示规则归约的非终结符名字;(2)node表示本结点的终结符或者非终结符,left代表左操作数,right代表右操作数;(3)pattern是指令模板的主体部分,用目标体系的汇编组成;(4)EnergyCost,TimeCost,SpaceCost分别对应了三个代价。
如图6所示代表了整个处理流程,通过用户配置信息加上编译器开发者所设计的体系结构描述文件,传递给编译器后端,编译器后端通过xml的解析器来读取该文件,得到配置参数。然后,编译器后端对前端的树形表示进行两次遍历,通过指令各个代价的综合计算,最优选择后生成目标汇编代码。
最后,还需要注意的是,以上列举的仅是本发明的一个具体实施例。显然,本发明不限于以上实施例,还可以有许多变形。本领域的普通技术人员能从本发明公开的内容直接导出或联想到的所有变形,均应认为是本发明的保护范围。
权利要求
1.一种基于指令代价的编译器优化代码生成方法,其特征在于,包括以下步骤(1)通过词法分析、文法分析和语义分析形成中间语言表示,中间语言表示以树形结构表示为基础,即中间表示树;(2)生成所有中间表示树到目标表示的映射关系即规则,并对指令代价的权重进行配置;(3)对中间表示树进行至少两次的遍历,第一次遍历自底向上进行标记,记录与子树匹配的规则,记录所有的本结点对应的非终结符并记录其最佳匹配;另外,当匹配子树时,为每一个非终结符记录其最佳匹配;第二次遍历自顶向下进行标记,从第一次遍历的结果中集中选取代价最小的树覆盖,得到整棵中间表示树代价最小的匹配,最优选择后生成目标汇编代码。
2.根据权利要求1所述的一种基于指令代价的编译器优化代码生成方法,其特征在于,所述指令代价包括功耗代价、时间代价或空间代价其中至少一种。
3.根据权利要求1所述的一种基于指令代价的编译器优化代码生成方法,其特征在于,对提供少量的通用寄存器,并且指令有直接内存访问能力的目标体系,在步骤“(1)”后,有对虚拟寄存器和物理寄存器进行划分的步骤,以此增加中间表示树匹配的选择。
4.根据权利要求1所述的一种基于指令代价的编译器优化代码生成方法,其特征在于,所述的指令模块,是可划分为虚拟寄存器和物理寄存器的指令模块。
5.根据权利要求1所述的一种基于指令代价的编译器优化代码生成方法,其特征在于,所述的规则是动态规划算法。
6.根据权利要求1所述的一种基于指令代价的编译器优化代码生成方法,其特征在于,所述的对指令代价的权重进行配置,首先获取子树的代价,然后根据以下公式获得本结点对应的非终结符或者终结符的代价Cost=EnergyCost×W1+TimeCost×W2+SpaceCost×W3;其中,EnergyCost代表能耗代价,TimeCost代表时间代价,SpaceCost代表空间代价,Wi(i=1、2、3)代表了相应的权重,由用户通过XML文件指定。
全文摘要
本发明涉及一种嵌入式系统开发工具,旨在提供一种基于指令代价的编译器优化代码生成方法。该方法包括以下步骤(1)启动调试服务器用于调用配置文件的加载器;(2)加载配置文件由配置文件的加载器完成;通过该配置文件,加载器动态生成一个嵌入式模拟系统;(3)启动调试服务和调试代理完成加载配置文件后,调试服务器启动调试服务和调试代理,接收外部系统的调试请求,运行完成模拟器的自动生成。本发明的有益效果是根据一个描述文件来生成仿真器部件不易出错;修改方便,对指令集的修改只需修改描述文件即可;采用此种方法可以大大减少仿真器的开发时间。
文档编号G06F9/45GK101034361SQ200710066760
公开日2007年9月12日 申请日期2007年1月18日 优先权日2007年1月18日
发明者吴朝晖, 杨国青, 李红, 吕攀, 潘杭平, 赵民德 申请人:浙江大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1