优化器.pdf

上传人:00062****4422 文档编号:712451 上传时间:2018-03-07 格式:PDF 页数:51 大小:2.10MB
返回 下载 相关 举报
摘要
申请专利号:

CN96108810.9

申请日:

1996.06.17

公开号:

CN1143774A

公开日:

1997.02.26

当前法律状态:

终止

有效性:

无权

法律详情:

未缴年费专利权终止IPC(主分类):G06F 9/45申请日:19960617授权公告日:20030924终止日期:20120617|||授权|||公开|||

IPC分类号:

G06F9/45

主分类号:

G06F9/45

申请人:

松下电器产业株式会社;

发明人:

小谷谦介; 佐山旬子; 田中旭

地址:

日本国大阪府门真市

优先权:

1995.06.16 JP 150261/95

专利代理机构:

上海专利商标事务所

代理人:

傅远

PDF下载: PDF下载
内容摘要

常量保持变量定义检测单元7和使用表达式检测单元8将常量保持变量的定义和使用信息存入常量保持变量信息存储单元6,部分常量表达式重写单元9将常量保持变量重写常量。开销判断和重写单元10根据开销比较判断变量是否应装入寄存器来使用,或是否应进行常量传送。资源分配单元11对变量分配资源。储存器变量重写单元12把分配给存储器的常量保持变量重写为常量值。常量保持变量定义删除单元13删去成为不必要的常量保持变量的定义。

权利要求书

1: 一种优化器,它嵌入用于将编程语言编写的程序编译成机器 语言程序或汇编程序的编译器中,且优化用编程语言编写的程序,并 输出优化后的程序,其特征在于,包括: 管理装置,将一个程序中某个常量替换的常量保持变量作为该 常数保持变量的相关表达式值进行管理,该相关表达式组将用常量 替换常量保持变量的表达式与常量保持变量为一操作数的表达式相 联系; 第一重写装置,在相关表达式组的常量保持变量为一操作数的 表达式中,将另一操作数为常量的表达式和该常量保持变量一个操 作数的一元操作表达式,重写为以该常量保持变量保持的常量作为 操作数的表达式; 第一估计装置,在所述第一重写装置重写后,当还未被重写为常 量的常量保持变量被常量保持变量保持的常量立即数取代并设置为 机器语言操作的操作数时,根据常量的字节长度,估计该常量保持变 量的相关表达式组中,由该常量保持变量为一个操作数的表达式产 生的机器语言指令的执行周期和/或编码大小; 第二估计装置,在所述第一重写装置重写后,当一存储由还未被 重写为常量的常量保持变量保持的常量的寄存器被设置为机器语言 操作的操作数时,估计该常量保持变量的相关表达式组中,由用常量 替换常量保持变量的表达式和该常量保持变量为一操作数的表达式 产生的机器语言指令的执行周期和/或编码大小; 比较装置,对每一相关表达式组,比较所述第一估计装置的估计 结果与所述第二估计装置的估计结果; 第2重写装置,在相关表达式中,如果所述比较装置的比较的结 果为所述第一估计装置的估计结果不大于所述第二估计装置的估计 结果,则将任何用作一个操作数的常量保持变量重写为该常量保持 变量保持的常量;以及, 第三重写装置,当任何其常量保持变量被用作一个操作数的表 达式被重写为常量保持变量保持的常量被用作操作数的表达式时, 删除用常量替换常量保持变量的表达式。
2: 如权利要求1的优化器,其特征在于,进一步包括: 第四重写装置,将其任何操作数由于所述第一和第二重写装置 的重写而成为常数的表达式重写成常量表达式运算结果的一个常 量; 控制装置,使所述第四重写装置的重写产生的表达式中运算结 果所要替换的新的常量保持变量、用常量替换该常量保持变量的表 达式和该常量保持变量被用作一操作数的任何表达式等三个对象由 所述管理装置作为该常量保持变量的相关表达式组来管理;以及 激活装置,对所述管理装置新近管理的相关表达式组,激活所述 第一重写装置。
3: 如权利要求1的优化器,其特征在于,进一步包括: 资源分配装置,在所述第二重写装置重写后,根据变量工作区的 状况和每一变量的使用频率,把程序中变量分配给寄存器或存储器; 以及, 第五重写装置,对由所述资源分配装置分配给存储器的变量进 行常量保持变量的判断,并将判断为常量保持变量的相关表达式组 中为模拟数的任何常量保持变量重写成常量。
4: 如权利要求2的优化器,其特征在于,进一步包括: 资源分配装置,在所述第二重写装置重写后,根据各变量工作区 的重叠状况和每一变量的使用频率,将程序中的变量分配给寄存器 或存储器;以及, 第五重写装置,对所述资源分配装置分配给存储器的变量进行 常量保持变量的判断,并将被判断为常量保持变量的相关表达式组 中为操作数的任何常量保持变量重写为常量。
5: 如权利要求1的优化器,其特征在于,所述优化器进一步包 括: 开销存储装置,存储一组机器语言指令并指出每一机器语言指 令的开销,即执行周期和/或编码大小,使指令与开销关联; 所述第一估计装置包括: 第一取代装置,在所述第一重写装置重写后,用表达式的常量保 持变量是该常量保持变量所保持常量的立即数的操作数的机器语言 指令,来取代相关表达式中常量保持变量为一个操作数的每一表达 式;以及, 第一累加装置,从所述开销存储装置中读出与每一取代后的机 器语言指令相关联的开销,累加读出的开销,将累加结果设定为估计 结果;以及 所述第二估计装置包括: 第二取代装置,在所述第一重写装置重写后,在相关表达式组 中,用其中存储常量的寄存器被设定为一个操作数的机器语言指令 取代常量保持变量被替换成常量的每一表达式和常量保持变量为一 个操作数的每一表达式;以及, 第二累加装置,从所述开销存储装置中读出与每一取代后的机 器语言指令关联的开销,累加读出的开销,将累加结果设定为估计 值。
6: 如权利要求2的优化器,其特征在于,进一步包括: 开销存储装置,存储一组机器语言指令和指出每一机器语言指 令的开销,即执行周期和/或编码大小,使指令与开销关联, 所述第一估计装置包括: 第一取代装置,在所述第一重写装置重写后,用其中常量保持变 量的机器语言指令取代相关表达式组中常量保持变量为一个操作数 的每一表达式;以及, 第一累加装置,从所述开销存储装置中读出与每一取代后的机 器语言指令相关联的开销,累加读出的开销,将累加结果设定为估计 结果;以及 所述第二估计装置包括: 第二取代装置,在所述第一重写装置重写后,在相关表达式组 中,用存储常量的寄存器被设置为一操作数的机器语言指令取代常 量保持变量被替换为常量的每一表达式和常量保持变量为一个操作 数的每一表达式;以及 第二累加装置,从所述开销存储装置中读出与每一取代后的机 器语言指令相关联的开销,累加读出的开销,将累加结果设定为估计 结果。
7: 如权利要求3的优化器,其特征在于,所述优化器进一步包 括: 开销存储装置,存储一组机器语言指令并指出每一机器语言指 令的开销,即执行周期和/或编码大小,使指令与开销关联, 所述第一估计装置包括: 第一取代装置,在所述第一重写装置重写后,将相关表达式组中 的常量保持变量是一操作数的每一表达式取代为该常量保持变量保 持的常量的立即数; 第一累加装置,从所述开销存储装置中读出与每一取代后的机 器语言指令相关联的开销,累加读出的开销,将累加结果设定为估计 结果,以及, 所述第二估计装置包括: 第二取代装置,在所述第一重写装置重写之后,在相关表达式组 中,用存储常量的寄存器被设定为一操作数的机器语言取代常量保 持变量被替换成常量的每一表达式和常量保持变量为一操作数的每 一表达式;以及, 第二累加装置,从所述开销存储装置中读出与每一取代后的机 器语言指令相关联的开销,累加读出的开销,将累加结果设定为估计 结果。
8: 如权利要求4的优化器,其特征在于,进一步包括: 开销存储装置,存储一组机器语言指令并指出每一机器语言指 令的开销,即执行周期和/或编码大小使指令与开销关联,所述第一 估计装置包括: 第一取代装置,在所述第一重写装置重写之一,将相关表达式组 中表达式的常量保持变量是一操作数的每一表达式取代为该常量保 持变量保持的常量的立即数,以及 第一累加装置,从所述开销存储装置读出与每一取代后的机器 语言指令相关联的开销,累加读出的开销,将累加结果设定为估计结 果,以及 所述第二估计装置包括: 第二取代装置,在所述第一重写装置重写后,在相关表达式组 中,用存储常量的寄存器被设置为一个操作数的机器语言指令取代 常量保持变量被替换为常量的每一表达式和常量保持变量一操作数 的每一表达式;以及, 第二累加装置,从所述开销存储装置中读出与每一取代后的机 器语言指令相关联的开销,累加读出的开销,将累加结果设定为估计 结果。

说明书


优化器

    本发明涉及一种用于编译器中的优化器,编译器将用高级语言写成的程序编译成机器语言程序,优化器对源程或中间语言程序进行优化以产生高效的机器语言程序。

    最近,很多源程序是用高级语言写成的。这样提高了发展机器语言程序或汇编程序的效率。下面叙述中的机器语言程序包括汇编程序。用高级语言写成的源程序由编译器编译成机器语言程序。这种编译器具有优化器。用编程语言写的程序由优化器重写,以便有效地在机器的微处理器内执行。

    另一方面,要求机器语言程序的效率尽可能地高,所以,优化器以各种方式重写程序,欲使最终产生的机器语言程序总的运行时间和程序大小为最小(最终形成的机器语言程序总的运行时间,或这一机器语言程序的存储容量通常称为“开销”)。

    优化器所进行的过程包括常量传送和常量合并过程。使用这些过程重写程序以减小机器语言程序总的运行时间和存储容量。交替重复这些过程,优化器能大大减少程序中表达式的数量,这可参照图13A至13F的叙述。

    图13A表示在中间语言状态下的程序,图中,左侧的符号S1、S2、S3……指示程序中的位置,由常量或变量操作数和运算符组成的程序代码(如图中的“a+x”,或“20000+a”)称为运算表达式”。在说明书中,只有一个常量式变量的表达式,如“a”或“20000”,也称为运算表达式。

    等号左侧为变量,右侧存为运算表达式的程序代码(如图13B中“a1=a+x)或右侧为变量或常量的一连串程序代码,如“a=b”,被称为“替换表达式”。而且,图13B中位置S4处地替换表达式“b=2000+10000”,其中所有操作数都是常量,则被专门称为“常量表达式”。

    按照替换表达式,用等号右侧的值代替左侧变量的过程被称为“变量定义”。将变量用作运算表达式的操作数称为“变量的使用”。如“a=b”的情况,变量出现在替换表达式右侧的形式被称为“使用”。

    参见图13A,在位置S1处的替换表达式中常量“10000”取代变量“a”,这种被常量取代的变量被称为“常量保持变量”。四个箭头从变量“a”开始,分别终止在其它的变量“a”处。箭头指向变量“a”被用作操作数的运算表达式。优化器检测所有常量保持变量,并进一步检测常量保持变量被用作操作数的运算表达式。在检测后,优化器把用作运算表达式中操作数的常量保持变量重写为其所保持的值。这一重写的结果是,将图13A程序中由常量保持变量“a”作为操作数的运算表达式重写为以保持值“10000”作为操作数的运算表达式。

    图13B表示重写的结果。在图中,变量x和y保持不变,因为它们是变量,而不是常量保持变量,如保存函数返回值的变量。

    而且,可以看到这一重写使在S1位置处的替换表达式“a=10000”变为多余。优化器判断出成为多余的替换表达式,并将其删去,这样减少了表达式的代码量。上述重写操作数和删去由于重写而变为多余的替换表达式的过程被称为“常量传送”(Constant propa-gation)。

    可以看到,这一重写使位于S4的替换表达式变为b=20000+10000”,相当于替换表达式“b=30000”。当例如“b=20000+10000”的常量表达式出现在程序中时,优化器将常量表达式写为等价于该常量表达式“b=30000”。将常量表达式重写为一等价的常量的过程称为常量合并(Constant folding)。在优化器进行常量合并时,替换表达式“b=30000”出现在程序中,位置S4处的变量“b”变为新的常量保持变量。

    当作为“传送”和合并的结果出现新的常量保持变量时,按照与常量保持变量“a”情形同样的方式,优化器检索操作数为常量保持变量“b”的运算表达式。三个箭头从变量“b”开始,分别终止在另三个变量“b”处。箭头指向操作数为变量“b”的运算表达式。优化器检索位置S9、S10和S11处的表达式,并把在运算表达式在用作操作数的常量保持变量“b”重写为其保持值“30000”。作为重写的结果,在位置S9、S19和S11处的表达式分别重写为“u=10000+30000”、“z=30000+45000”和“v=30000+z”,如图3D所示。重写以后,优化器进行常量合并。这样,在位置S9和S10的替换表达式分别重写为“u=40000”和“z=75000。这一重写过程使变量“u”和“z”变为常量保持变量,所以,优化器进一步重复对变量的“传送”和常量合并,在以这一方式重复“传送”和“常量”合并时,常量保持变量“u”的值的传送过程如图13E所示,并删去位于S4、S9和S10的替换表达式。这样,程序就变得非常简单,如图13F所示。

    在进行上述的常量传送和常量合并后,优化器进行资源分配过程。这样,程序中留下的变量被分配给寄存器或存储器。由于下述理由,在资源分配中,优化器把工作区彼此覆盖的变量分配到不同的寄存器。工作区是程序中从变量的替换延伸到该变量的最后使用的区域,当工作区彼此覆盖的变量被分配给同一寄存器时,而机器语言程序中需要对保持在寄存器中的数值进行一系列的存取过程。因此,在目的机器寄存器较少而工作彼此覆盖的变量很多时,优化器把一些变量分配给存储器。在如上所述分配过程之后,编译器根据分配结果产生编码和图14所示的机器语言程序。

    如上所述,在常量传送、常量合并过程及删除常量保持变量之后进行资源分配过程时,工作区的覆盖部分减少的数量相应于删除的数量。所以,有可能有效地使用寄存器。结果,减小了所产生的机器语言的编码量和执行周期数。

    但是,在上述技术中,用常量传送和常量合并将运算表达式和操作数重写成其保持值,此时,产生一机器语言代码,其中用一更长字节长度的中间数据作为操作数。结果,会出现延长机器语言程序运行时间和增加存储量的问题。

    假定,由常量传送和常量分并,如图13D所示,重写的程序中变量“a1”和“a2”分别被分配给寄存器D1和D2,结果,产生图14所示机器语言代码。

    图14机器语言编码“add#10000,D1”和“add#10000,D2”中的值“#10000”有一符号#,该值是一个2字节长的立即数。这些机器语言编码包括一个2字节长的立即数。所以,将会看到,与寄存器作为操作数的图12中机器语言指令的情形相比,该机器语言程序的运行时间较长,存储量较大。

    为避免包含立即数,可以考虑不进行变量“a”的“传送”。但是,这样“b=20000+a”就不能合并为“b=30000”,变量“b”的保持值“30000”不能传送到替换表达式“z=b+45000”和“v=b+z”中。若变量“b”不能被传达,就不可从程序中删除变量“z”和“u”,因而也无法简化程序。

    由于以上问题,本发明的目的是提供一种优化器,它可以有效地进行常量传送和常量合并,并防止出现由于常量传送带来的开销增加。

    为达此目的,本发明的优化器用于将编程语言写成的程序编译成机器语言程序的编译器中,优化编程语言写成的程序,并输出一优化的程序,包括:

    管理装置,将一被常量替换的常量保持变量,处理成与该常量保持变量相关联的表达式组,其方法是将用常数代换常数保持变量的表达式与常数保持变量作为操作数的表达式相联系;

    第一重写装置,在相关表达组内常量保持变量为一个操作数的表达式中,将一任何其它操作数为常量的表达式和一个操作数为该常数保持变量的一元操作表达式重写为常量保持变量保持的常量是操作数的表达式;

    第一估计装置,在第一重写装置重写以后,当一个还未重写为常量的常量保持变量被一个该常量保持变量保持的常量立即数据所替换并设置为机器语言操作的操作数时,根据常量的字节长度,在该常量保持变量的相关表达式组中估计常量保持变量为操作数的表达式所产生的机器语言指令的执行周期和或编码长度;

    第二估计装置,在第一重写装置重写之后,当一存储未被重写为常量的常量保持变量所保持的常量的寄存器被设置为机器语言操作的操作数时,在该常量保持变量的相关表达式组中,估计用常量替换常量保持变量的表达式和常量保持变量是操作数的表达式所产生的机器语言指令的执行周期和/或编码长度;

    比较装置,对第一相关表达式组比较第一估计装置和第二估计装置的估计结果;

    第二重写装置,在相关的表达式组中,若比较装置的比较结果表明,第一估计装置的估计结果不大于第二估计装置的估计结果,则将任何用作操作数的常量保持变量重写为该常量保持变量的常量;以及

    第三重写装置,当任何常量保持变量被用作操作数的表达式被重写为常量保持变量保持的常量作为操作数的表达式作,删除用常量替换常量保持变量的表达式。

    本发明的优化器可进一步包括:

    第四重写装置,将任何其操作数被第一和第二重写装置重写为常量的表达式重写为常量表达式操作结果的常量。

    控制装置,形成由第四重写装置重写产生的表达式中操作结果被替代后的新的常量保持变量,常量保持变量被常量替代的表达式和常量保持变量作为操作数的表达式,且由管理装置将它们作为该常量保持变量的相关表达式组进行管理;以及

    激活装置,激活由管理装置最新管理的相关表达式组的第一重写装置。

    本发明的优化器可进一步包括:

    资源分配装置,在第二重写装置的重写和删除后,根据变量工作区的覆盖状态和每一变量的使用频率,为程序中的变量分配寄存器或存储器;以及,

    第五重写装置,对资源分配装置分配给存储器的变量进行常量保持变量的判别,并把在被判别的常量保持变量的相关表达式中作为操作数的任何常量保持变量重写为常量。

    本发明的优化器可进一步包括:

    开销存储装置,存储一组机器语言指令和表明每一机器语言指令的执行周期和/或编码长度,使指令与开销关联,

    第一估计装置包括:

    第一取代装置,在第一重写装置重写以后,将常量保持变量是操作数的相关表达式组中每一表达式用机器语言指令来取代,机器语言指令中该常数保持变量用它所保持的值作为指令的立即数操作数。

    第一累加装置,从开销存储装置中读出与每一取代后的机器语言指令相关联的开销,累加读出的开销,并将累加结果设定为估计结果;以及

    第二估计装置包括:

    第二取代装置,在第一重写装置重写以后,将相关表达式组中,每一用常量替换常量保持变量的表达式和每一常量保持变量为操作数的表达式,取代成存储该常数的寄存器设定为操作数的机器语言指令;以及,

    第二累加装置,从开销存储装置中读出与每一被取代的机器语言指令相关联的开销,累加读出的开销,并将累加结果设定为估计结果。

    按照本发明的优化器,管理装置处理将被一常量所替换的常量保持变量,通过使一个用常量替换该常量保持变量的表达式和一个该常量保持变量为操作数的表达式相关联,作为该常量保持变量的相关表达式组。在相关表达式组内常量保持变量是操作数的表达式中,由第一重写装置将一个任何其它操作数为常量的表达式和一个该常量保持变量为一个操作数一元表达式重写成该常量保持变量保持的常量为一个操作数的表达式。

    在第一重写装置进行重写之后,第一估计装置估计某个表达式产生的机器语言指令执行周期和/或编码长度,该表达式的该常量保持变量是一个操作数,并且,该表达式在一个还未被重写为常量的常量保持变量的相关表达式组中。

    在机器语言指令中,一个指示该常量保持变量所保持的常量的立即数据被设定为机器语言操作的一个操作数,例如相关表达式组内,由常量保持变量为操作数的表达式产生的机器语言指令,其中一个操作数是寄存器或存储器,另一操作数是立即数。第一估计装置根据该常量的字节长度,以相关表达式组为单元估计机器语言指令的执行周期和/或编码长度。

    另一方面,在第一重写装置进行重写操作后,在一还未被重写为常量的常量保持变量的相关表达式组中,第二估计装置估计一个用常量替换常量保持变量的表达式和该常量保持变量是操作数的表达式所产生机器语言程序的执行周期和/或编码长度。在机器语言指令中,一个存储该常量保持变量保持的常量的寄存器被设置为机器语言的操作数。由相关表达式组中用常量替换常量保持变量的表达式,产生例如用常量立即数替换成一寄存器或存储器的机器语言指令。由相关表达式组中一个常量保持变量为操作数的表达式,产生机器语言指令,其中一个操作数是寄存器或存储器,另一操作数是存储一常量的寄存器。第二估计装置根据该常量的字节长度以周期相关表达式组为单元估计机器语言指令的执行周期和/或编码长度。

    对每一相关表达式组,比较装置比较第一估计装置的估计结果和第二估计装置的估计结果。若在相关表达式中比较装置的比较结果表明第一估计装置的估计结果不大于第二估计装置的估计结果,第二重写装置把任何用作一个操作数的任何常量保持变量重写为该常量保持变量保持的常量。当以这种方式把用作一个操作数的任何常量保持变量重写为常量时,一个用所有常量替换了常量保持变量的表达式成为多余的。所以,第三重写装置从程序中删除用常量替换常量保持变量的表达式。

    如上所述,对于一个操作数为常量保持变量的运算表达式的常量传送仅在第一估计装置的估计结果不大于第二估计装置的估计结果时才进行。结果,可防止出现由于常量传送带来的开销增加。

    而且,按照本发明的优化器,一个表达式,若其任何操作数由于第一和第二重写装置的重写而成为常量,则由第四重写装置重写成操作结果被替换的表达式,一个其中任何变量都成为常量的表达式是在等号右面不存在变量的表达式,例如“d=100+200”,或“s=30+10×4”,操作结果是一等价于常量表达式的常量(立即数据),例如,“100+200”情况下的“300”和“30+10×4”例子中的“70”。作为第一重写装置重写的结果,在相关表达式组的表达式中,一个任何其它操作数是常量的表达式和一个常量保持变量是操作数的一元运算表达式处于允许合并的状态。当这样一个表达式被精简掉时,表达式中被替换的变量成为常量保持变量。当常量保持变量进行常量传送时,可与以前的方法同样的程度进行程序简化。

    在第四重写装置重写以后,控制装置形成操作结果被替代到重写产生的表达式后的新的常量保持变量;常量保持变量被常量替代的表达式;和常量保持变量作为操作数的表达式。且由管理作为常量保持变量的相关表达式组进行管理。第一重写装置激活刚由管理装置管理的相关表达式组,在第一重写装置激活后,随后第一和第二估计装置也相继激活。所以,对新的常量保持变量的相关表达式组也估计执行周期和/或编码长度,并根据估计结果重写相关表达式组中的表达式。

    而且,按照本发明的优化器,在第二重写装置的重写以后,资源分配装置根据变量的工作区的覆盖状况和第一变量的使用频率,为程序中的变量分配寄存器或存储器。在由资源分配装置分配给存储器的变量中,判别出是常量保持变量的变量。第五重写装置把在被判别的常量保持变量的相关表达式组中是操作数的任何常量保持变量重写为该常数保持变量保持的常量。当任何其常量保持变量被用作一个操作数的表达式被重写成由常量保持变量保持的常量作为操作数的表达式时,第三重写装置删除用常量替换常量保持变量的表达式。

    而且,按照本发明的优化器,一组机器语言指令和每一机器语言的开销,即执行周期和/或编码长度被存入开销存储装置,使指令与开销关联。

    在第一重写装置重写以后,在相关表达式组中,常量保持变量是一个操作数的每一表达式被第一取代装置取代成机器语言指令,其中常量保持变量被取代成常量保持变量保持的立即数,然后用作操作数。从开销存储装置中读出与每一取代后的机器语言指令关联的开销,第一累加装置累加读出的开销并将累加结果设定为估计结果。

    在第一重写装置重写以后,在相关表达式组中,每一个用常量替换常量保持变量的表达式和每一个常量保持变量为操作数的表达式被第二取代装置代换成一个存储该常量的寄存器被设定为指令的操作数的机器语言指令。从开销存储装置中读出与每一被代换的机器语言指令相关的开销。第二累加装置累加读出的开销并将累加结果设定为估计结果。

    图1A是编译器的组成结构图。

    图1B是图1A编译器组成结构图中的优化器200的结构图。

    图2是本发明实施中常量优化器60的内部结构图。

    图3是表示一部分常量表达式重写单元9的流程的流程图。

    图4A是开销判断和重写单元10的结构图。

    图4B是存储变量重写单元器12的结构图。

    图5是表示保持在开销存储单元15中的内容的例子的图。

    图6A是表示在常量优化器60的内部结构中开销判断和重写单元10的流程的流程图。

    图6B是表示在常量优化器60的内部结构中存储器变量重写单元12的流程的流程图。

    图7A至图7F表示一源程序和中间语言程序的例子,以及重写该例的方法。

    图7A表示一源程序的例子。

    图7B表示一已通过部分常量表达式重写单元的中间语言程序的例子。

    图7C表示一已通过开销判断和重写单元的中间语言程序的例子。

    图7D表示一已通过存储器变量重写单元的中间语言程度的例子。图7E表示一已通过常量保持变量定义删除单元的中间语言程序例子。

    图7F表示一已通过该常量保持变量定义删除单元的中间语言程序例子。

    图8A至图8E表示常量变量信息内容的传递方式。

    图8A是一已经过使用表达式检测单元8处理的常量变量信息的例子。

    图8B表示已经过部分常量表达式重写单元9处理的常量变量信息的例子。

    图8C表示已经过开销判断和重写单元10处理的常量变量信息的例子。

    图8D表示已经过存储器变量重写单元12处理的常量变量信息的例子。

    图8E表示已经过存储器变量重写单元12处理的常量变量信息的例子。

    图9表示微处理器指令集的一个例子。

    图10表示寄存在开销保持单元15内的信息的例子。

    图11A表示源程序和中间语言程序的例子,以及重写该例子的方法。

    图11B表示已经过部分常量表达式重写单元的中间语言程序的例子。

    图11C表示已经过常量传送和常量合并处理的中间语言程序的例子。

    图11D表示已经过常量传送和常量合并处理的中间语言程序的例子。

    图11E表示已经过常量传送和常量合并处理的中间语言程序的例子。

    图11F表示已经过常量传送和常量合并处理的中间语言程序的例子。

    图12表示已通过本发明优化器的机器语言程序的例子。

    图13A表示源程序和中间语言程序的例子,以及用以前的方法的优化器重写该例子的方式。

    图13B表示用以前的方法经过常量传送和常量合并处理的中间语言程序的例子。

    图13C表示用以前的方法经过常量传送和常量合并处理的中间语言程序的例子。

    图13D表示用以前的方法经过常量传送和常量合并处理的中间语言程序的例子。

    图13E表示用以前的方法经过常量传送和常量合并处理的中间语言程序的例子。

    图13F表示用以前的方法经过常量传送和常量合并处理的中间语言程序的例子。

    图14表示用以前的方法的优化器进行常量传送和常量合并处理后产生的机器语言程序。

    下面参照附图叙述本发明的优化器的一个实施例。优化器用于高级语言,如C语言,编译器中,并在编译器对源程序进行词法分析、语法分析和语义分析之后激活。所要处理的程序是中间语言程序,它是在编译器进行词法分析、语法分析和语义分析之后作为分析结果输出的。

    编译器的结构

    图1A是本发明实施例中编译器的结构,该编译器包括一个语法分析器100、一个优化器200和一个编码发生器300。

    语法分析器100对作为文件存储的源程度进行词法分析、语法分析和语义分析。分析结果以中间语言程序的形式输出。

    优化器200优化中间语言程序,使最终形成的机器语言程序的程序大小被减小,并缩短运行时间。

    编码发生器300把优化后的中间语言程序转换成目标机器的机器语言指令,并以机器语言程序的形式输出这些指令。

    优化器200的结构

    图1B是图1A中优化器200的结构图,优化器包括一个优化信息检测器40、一个通用码优化器50和一个常量优化器60。

    优化信息检测器40进行数据流分析和控制流分析,并检测优化过程所需的信息。数据流分析是分析例如变量被定义和引用的位置。控制流分析分析程序中的控制流。

    通用码优化器50进行除常量优化以外的优化操作,例如无效码消除,行式扩展和循环不变量表达式的编码移动。这些优化操作如无效码消除、行式扩展和循环不变量表达式的编码移动,不在本发明的范围内,所以略去对它的叙述。

    常量优化器60的内部结构

    图2是常量优化器60的结构图。常量优化器60包括一常量保持变量信息存储单元6,一个常量保持变量定义检测单元7,一个使用表达式检测单元8,一个部分常量表达式重写单元9,一个开销判断和重写单元10,一个资源分配单元11,一个存储器变量重写单元12,和一个常量保持变量定义删除单元13。

    在常量保持变量信息存储单元6中,建立一个常量保持变量信息数据库,它存有程序中定义的一组常量保持变量。在代表常量保持变量信息存储单元6的图中方框内显示了常量保持变量信息的一个例子。每一常量保持变量信息具有:常量保持变量的名字;该常量保持变量定义的位置,该位置由程序中的位置信息给出;由该常量保持变量保持的值;指出分配给该常量保持变量的资源的资源栏,使用该常量保持变量的位置,由程序中的位置信息给出;以及,使用位置的使用属性,指出保持值是否要被传送到对应的使用位置。图中,由变量“a”横向看去,依次是“S1”、“200”、“寄存器”、“S2”和“传送”。这表示变量“a”的定义位置是“S1”,该变量“a”的保持值是“200”。还表示该变量“a”被分配给一寄存器和在位置“S2”处被使用,以及,使用属性为“传送”。

    从“b”,“S3”横向看去,依次是“10200”、“存储器”、“S4”和“不传送”。在其下的一行中,设置了“S5”和“不传送”这表示变量“b”的定义位置是“S3”,该变量“b”的保持值是“10200”,还表示变量“b”被分配给一存储器,在位置S4处的使用属性是“不传送”。在下一行中的“S5”和“不传送”表示该变量“b”除位置S4外还在位置S5使用,且在S5处是“不传送”。

    上述位置信息是对每一运算表达式提供的信息,例如图13A至13F例子中的S1、S2、S3、S4……等。

    常量保持变量定义检测单元7在程序中检测用常量或常量表达式替换变量的一个替换表达式,并核实在检测到的替换表达式中被定义的常量保持变量的名字、该常量保持变量的定义位置和由常量保持变量保持的值。然后,常量保持变量定义检测单元7把这些信息组合成一组常量保持变量信息,并把信息存入常量保持变量信息存储单元6的数据库中。上面已叙述了常量保持变量。对于不是常量保持变量的变量,其值不是由替换表达式唯一地确定。例如,该值对应于一个存储函数的返回值的变量,一个其值在程序执行期间改变的变量,等等,如在以前的方法的例子中叙述的那样。

    在使用表达式检测单元8中,对于常量保持变量信息存储单元6保存的所有常量保持变量,从程序中检测出该常量保持变量在操作数位置上的所有运算表达式。检测到的运算表达式的位置寄存在常量保持变量信息存储单元6的数据库中,该使用位置上的使用属性设置成“不传送”。

    在部分常量表达式重写单元9中可以预测,当用作程序中的操作数的常量保持变量被取代为其保持值时,含有该操作数的运算表达式是否成为一常量或常量表达式。从数据流分析的结果来看,可以验证即使进行取代时,是否能保证变量之间的依赖关系。若由这一系列过程的结果预测对保持值的取代使运算表达式成为一常量或常量表达式,并证实能够保持变量之间的依赖关系,则随之进行取代。在取代执行之后,常量保持变量信息存储单元6保存存的常量保持变量信息的使用属性被替换成“传送”,由此留下取代的轨迹。

    在开销判断和重写单元10中,对于定义位置保持在常量保持变量信息存储单元6中的变量,可以预测在使用变量被使用常量代替的情况下,和该变量被用作一寄存器变量(它是分配给一寄存器的变量)的情形下哪一个开销较低。而且,数据流分析结果可以证实,即使在进行置换时,变量之间的依赖关系是否能被保持。结果,作为这一系列的过程的结果可以预测,取代成常量开销较低,并证实能保证变量之间的依赖关系,即可执行此取代操作。常量保持变量信息存储单元6中保存的常量保持变量信息中的使用属性被替换成“传送”,由此留下取代的轨迹。

    在资源分配单元11中,程序中的变量被分配给存储器或目标机器的微处理器内部的寄存器。在资源分配之前,资源分配单元11检查已进行常量传送和合并的程序中各变量工作区的覆盖情况。彼此覆盖的变量被分配给不同的寄存器。资源分配单元11进一步检查每一变量的使用频率和嵌套级别。根据检查结果对每一变量设置优先权。按优先权递减次序,将变量分配给寄存器。若有些变量不能分配给寄存器,则分配给存储器。在进行那样的资源分配之间,尤其是对于常量保持变量,资源分配单元11反映出分配给其寄存器或存储器的信息,送到常量保持变量信息存储单元6的常量保持变量数据库。

    若一个常量保持变量已预测到分配给寄存器的开销较低,并已被证实即使在该变量被重写为其保持值时仍能确保各变量之间依赖关系,并且,它也还未由资源分配单元11分配给一寄存器则在存储器变量重写单元12中,将该常量保持变量重写为其保持值的常数。常量保持变量信息存储单元6中保存的该常量保持变量信息中的使用属性被替换成“传送”,由此留下重写的轨迹。

    在常量保持变量定义删除单元13中,检查存在常量保持变量信息存储单元6中的常量保持变量。若一常量保持变量的所有使用属性全部设置成“传送”,则删除定义该常量保持变量的替换表达式。

    图3是表示图2中所示的部分常量表达式重写单元9的处理过程的流程图。

    步骤a1与步骤a10相配合,使得常量保持变量信息存储单元6中保存的所有常量保持变量被逐个地用作处理对象,并重复其后的处理过程(步骤a2至a9)。

    步骤a2与步骤a9相配合,使得对于操作数为步骤a1中当前正在处理的常量保持变量的所有运算表达式,重复其后的处理过程(步骤a3至a8)。

    在步骤a3中,检查若当前被处理的常量保持变量被取代为其保持值,含有该常量保持变量的运算表达式是否成为一常量表达式。特别是,在步骤3中,检查常量保持变量是否为一个运算符的操作数,否则,是否为一个二进制运算操作数,以及其它操作数是否为常量或常量保持变量。一元运算符是指例如“a=-b的替换表达式,其中只有一个算符和一个操作数。

    步骤a4中,在程序中操作数位置的一个常量保持变量被替换成其保持值(执行常量传送)。在常量保持变量信息存储单元6中保存的常量保持变量信息的使用位置的使用属性被设置为“传送”。

    在步骤a5中,检查在步骤a4中置换后是否在程度中出现一个新的常量表达式。程序中新的常量表达式被合并到一个常数中。

    在步骤a6中,判断步骤a4和a5中重写的表达式(替换表达式)是否成为定义常量保持变量的替换表达式。

    步骤a7中,对在步骤a6中判断为相符合的定义常量保持变量的替换表达式,将其常量保持变量的名字、定义位置和保持值组成在一起存入常量保持变量信息存储单元6的数据库中。

    在步骤a8中,对步骤a7存入常量保持变量信息存储单元6的数据库中的常量保持变量,检测程序中操作数位置上是该常量保持变量的所有运算表达式。将检测到的运算表达式的位置存入常量保持变量信息存储单元6,常量保持变量信息的使用属性被设置为“不传送”。

    步骤a1至a10的处理结果是,得到了这样一种状况,即程序中作为操作数的常量保持变量被重写为其保持值,随后该变量在程序中被除去。

    图2中开销判断和重写单元10的内部结构

    图4A是开销判断和重写单元10的内部结构图。

    如图4A所示,开销判断和重写单元10包括一个控制单元14,一个开销保持单元15,它保存作为计算开销的依据的信息,一个寄存器变量定义开销计算单元16,一个寄存器变量使用开销计算单元17,以及一个常量使用开销计算单元18。开销判断和重写单元10还包括一个重写判断单元19(它根据这三个计算单元的计算结果判断常量保持变量是否要被重写)以及一个重写单元20,后者按照判断单元的判断结果进行重写。

    控制单元14按图6A流程进行处理。

    图6A是表示控制单元14的流程的流程图。

    步骤b1与步骤b7相配合,使寄存在常量保持变量信息存储单元6中的常量保持变量被逐个地作为处理对象来处理,并重复步骤b2至b6的过程。

    步骤b2中,对当前处理的常量保持变量,从常量保持变量信息存储单元6中取出该常量保持变量的定义位置数据。估计为了取出替换表达式和将常量保持变量定义为寄存器变量,花费的开销(下面称为“寄存器变量定义开销”)。

    步骤b3,在当前处理的常量保持变量的使用位置中,从常量保持变量信息存储单元6中取出使用属性不是传送的所有使用位置。

    估计在取出使用位置上常数保持变量作为操作数的运算表达式时,花费在取出运算表达式和将常数保持变量用作寄存器变量的开销。(以下称“寄存器变量使用开销”)。

    在步骤b4中,在当前处理的常量保持变量的使用位置中,从常量保持变量信息存储单元6中取出使用属性为“不传送”的所有使用位置。估计在使用位置上,常数保持变量为一个操作数的运算表达式中花费在取出运算表达式和使用常量保持变量并将其替代成常量的开销(以下称为“常量使用开销”)。

    在步骤b5中,根据步骤b2至b4算出的开销,计算寄存器变量定义开销与寄存器变量使用开销之和,并与常量使用开销相比较。

    若常量使用开销低于或等于步骤b5中的和,则进行步骤b6的操作。同时,用常量替代常量保持变量的开销总体上较低,因而从常量保持变量信息存储单元6中取出当前处理的常量保持变量的使用位置。而且,取出这样的运算表达式,它在每一常量保持变量使用位置上有一常量保持变量作为一个操作数。在运算表达式中作为操作数的常量保持变量由其保持值的常量取代。该使用位置的使用属性设置为“传送”。

    由步骤b1至b7处理过程,结果得到一种状态,即在程序内的常量保持变量中,用作寄存器开销较低的那些被寄存器变量取代,而其它则被一个常量,即常量保持变量的值,所取代。

    在图A所示开销保持单元15保存一个典型的机器语言之例的所有内容,包括完成定义、使用和完成这些工作所需的开销,并将这些定义使用与开销相联系。图5表示开销保持单元15中的一系列内容。图5中,“指令”、“大小”和“周期”在指示开销保持单元15的方框中横向排列。从“指令”向下是“常量保持变量定义”、“8位常量”、“16位常量”和“24位常量”。在“8位常量”左边是“2”和“1”。这表示,当定义一个8位长度的常量保持变量时,在包括该常量保持变量的运算表达式中使用存储器大小是“2”的存储器,需要“1”个执行周期。在“24位常量”右边是“5”和“3”,这表示,当定义一个24位长度的常量保持变量时,在包括该常量保持变量的运算表达式中使用大小是“5”的存储器,需要“3”个执行周期。

    在“寄存器变量相加……8位常量”右边是“2”和“1”。这表示当一拥有8位长度常量的常量保持变量在加法中被用作常量时,运算表达式中占用的存储大小是“2”,需要“1”个执行周期来实现使用。在“寄存器变量相加……16位常量”右边是“4”和“2”,这表示当一拥有16位长度的常量保持变量在加法中用作常量时,在运算表达式中占用大小为“4”的存储器,需经“2”个执行周期来实现使用。

    除了“常量保持变量定义”和“寄存器变量相……8位常量”,图中还有“寄存器变量相加”、“从存储器取出”、“存入存储器”等。开销保持单元15也保存这些指令用去的开销,这样可对程序中包含的所有表达式计算开销。开销保持单元15的内容由作为编译器对象的处理器的指令集来决定。图5下半部分表示这种指令集的一部分的例子。图5中半部分所示开销保持单元15的内容是根据该指令集决定的。参见图5,表达式“#imm8”代表可用8位表示的常数。表达式“Dn”和“reg”代表寄存器。表达式“@mem”代表存储器。

    寄存器变量定义开销计算单元16在步骤b2进行推算。具体说来,开销保存单元15由定义常量保持变量的替换表达式检索,读出与替换表达式匹配的开销,此开销变作为推算结果。

    寄存器变量使用开销计算单元17在步骤b3进行推算。具体说来,取出使用属性为“不传送”的常量保持变量使用位置,用在使用位置有一常量保持变量作为一个操作数的运算表达式作为检索项,对开销保持单元15进行检索。取出与检索项匹配的开销,累加取出的开销,用累加结果作为推算结果。

    在步骤b4中,激活常量使用开销计算单元18,并用常量保持变量被取代为该变量保持的常量的一个运算表达式作为检索项,关于一个运算表达式在开销保持单元15中进行检索,该运算表达式在使用属性为“不传送”的常量保持变量使用位置上包含一个作为操作数的常量保持变量。取出与检索项匹配的开销,累加取出的开销,该累加结果被用作推算结果。

    在步骤b5,激活重写判断单元19,从寄存器变量定义开销计算单元16接收寄存器变量定义开销,以寄存器变量使用开销计算单元17接收寄存器变量使用开销。重写判断单元19进行进一步从常量使用开销计算单元18接收常量使用开销,并计算寄存器变量定义开销与寄存器变量使用开销之和。然后,将该和与常量使用开销相比。若常量使用开销小于或等于该和,则用保持值重写常量保持变量从总体上来说开销较小。所以,调用重写单元20,将常量保持变量重写为常量。若常量使用开销较大,将常量保持变量变量寄存器从总体上来说开销较小,这样就不进行重写。

    重写单元20从常量保持变量信息存储单元6中以及在常量保持变量使用位置包含作为一个操作数的常量保持变量的运算表达式中,取出当前处理的常量保持变量的使用位置。程序中常量保持变量的使用被保持值的使用取代,每一使用位置的使用属性被设置成“传送”。

    图2中存储器变量重写单元12的内部结构

    图4B是存储器变量重写单元12的内部结构图。

    存储器变量重写单元12包括一控制单元22,一寄存器变量判断单元23,和一重写单元24。

    对保存常量保持变量信息存储单元6中的每一常量保持变量,控制单元22调用寄存器变量判断单元23。

    图6B是表示图4B中控制单元22进程的流程图。

    步骤c1与步骤c7配合,使后续过程(步骤c2至c6)对寄存在常量保持变量信息存储单元6中的所有常量保持变量重复进行。

    步骤c2,对于当前处理的常量保持变量,从常量保持变量信息存储单元6中取出分配给该变量的资源,判断该变量是否被分配给存储器。

    步骤3与步骤6相配合,使得对在步骤c2中判断为被分配给存储器的常量保持变量,从常量保持变量信息存储单元中取出常量保持变量的使用。随后,对该常量保持变量的所有使用重复其后的处理过程(步骤c4和c5)。

    在步骤c4中,对于当前处理的常量保持变量的使用,从常量保持变量信息存储单元6中取出变量的使用属性,判断使用属性是否为“不传送”。

    在步骤c5中,对于在步骤c2中判断为分配给存储器的,并且其使用属性在步骤c4中判断“不传送”的常量保持变量的使用,从常量保持变量信息存储单元6中取出使用位置。在使用位置处用作操作数的常量保持变量被取代为其保持值的常量,且使用属性被设置为“传送”。

    步骤c1至c7处理过程的结果是,得到这样一种状态,即程序内的常量保持变量中,因资源分配而分配给存储器的那些变量被其保持值所取代。

    寄存器变量判断单元23从常量保持变量信息存储单元6中取出当前处理的常量保持变量的使用属性。根据常量保持变量信息存储单元6的资源栏,判断该变量是分配给寄存器还是存储器。若判断该变量被分配给存储器,则进一步判断其使用属性是否“不传送”。若使用属性是“不传送”,则激活重写单元24。

    重写单元24由寄存器变量判断单元24激活,并且从常量保持变量信息存储单元6中取出当前处理的常量保持变量的所有使用位置。在每一取出的位置处于操作数位置的常量保持变量被重写为其保持值,常量保持变量使用位置的使用属性被设置为“传送”。

    图7A至7F的中间语言程序被用作处理对象的操作例子

    下面,作为一个操作的例子,叙述当图7A的程序被作为优化器输入时进行的操作。

    1.常量保持变量定义检测单元7在图7A,程序中S1位置检测到一个定义表达式(一个将常量赋给常量保持变量的替换表达式)。然后,常量保持变量定义检测单元7把检测到的常量保持变量的名定、定义位置S1和常量保持变量值200集成为一组常量保持变量信息,并将其存入常量保持变量信息存储单元6的数据库。

    2.使用表达式检测单元8在程序中检索寄存在常量保持变量信息存储单元6中常量保持变量“a”的使用表达式,以及检测到在位置S2的常量保持变量“a”的使用表达式。使用表达式检测单元8把检测到的使用位置S2和使用属性“不传送”集合成一组常量保持变量信息,存入常量保持变量信息存储单元6的数据库。类似地,使用表达式检测单元8检测常量保持变量“a”的使用,并检测到在位置S3的运算表达式。使用表达式检测单元8把“不传送”作为使用属性写入常量保持变量信息存储单元6的常量保持变量“a”一栏。此时,保存在常量保持变量信息存储单元6中的信息如图8A所示。

    (3)在部分常量表达式重写单元9中,对常量保持变量信息存储单元6的每一常量保持变量重复步骤a1至a10的循环。此外,该单元仅拥有常量保持变量“a”,所以,只对常量保持变量“a”执行步骤a1至a10的循环。

    对常量保持变量信息存储单元6的常量保持变量“a”的每一使用表达式(该常量保持变量为一个操作数的替换表达式)重复执行步骤a2至a9的循环。在本例中,由于在常量保持变量“a”的常量保持变量信息中存储两组位置信息,即位置S2和S3,所以循环执行两次。

    步骤a3中,判断保持在常量保持变量信息存储单元6中常量保持变量的使用是否能被保持为一常量。在常量保持变量“a”的使用表达式被常量200取代后的表达式是位置S2“a1={200}+x”和在位置S3“b+10000+{200}”(括号{}中的值表示由重写产生的常量)。即,仅在位置S3的运算表达式中,结果可能被维持为常量。所以,下面只对位置S3的常量保持变量的运算表达式执行步骤a4至a8的过程。

    步骤a4中,程序中的位置S3被重写为“b=10000+{200}”(常量传送),常量保持变量信息存储单元6中包括常量保持变量“a”的位置S3的一栏的使用属性被设置为“传送”。

    步骤a5中,程序中位置S3进一步被简缩成“b={10200}。

    步骤a6中判断一个常数保持变量的定义表达式是否作为步骤5重写的结果而新产生的。本例中,由替换表达式“b={10200}”产生一新的常量保持变量“b”,因而接下去执行步骤a7至a8。

    步骤a7中,作为关于步骤a6中判断为新产生的定义表达式的常量保持变量信息,常量保持变量名定“b”和常量保持变量定义位置S3被集合为一组。作为一组常量保持变量信息,常量保持变量值10200寄存在常量保持变量信息存储单元6的数据库中。

    在步骤a8中,对于步骤a7中新存入的常量保持变量“b”,在程序中检索其使用位置。按上面2中同样方法进行处理,因而,略去对其叙述。

    步骤a9与步骤a2配合,进行循环处理过程。

    步骤a10与步骤a1配合,进行循环处理过程。此时,常量保持变量“b”的定义表达式地寄存在常量保持变量信息存储单元6中。所以,过程返回步骤a1,进行循环处理。换句话说,对常量保持变量“b”的所有定义表达式,包括那些按此方式加入的,重复步骤a1至a10的处理过程。

    作为部分常量表达式重写单元9的重写结果,中间语言程序变为如图7B所示,保存在常量保持变量信息存储单元6中的常量保持变量信息变为如图8B所示。

    4.开销判断和重写单元10对常量保持变量信息存储单元6中保存的常量保持变量“a”和“b”执行下列处理过程。假定图9中的指令集被用作为微处理器的指令集,此时,存储在开销保持单元15中的信息成为如图10所示。

    常量保持变量“a”的开销比较和使用的重写

    寄存器变量定义开销计算单元16从常量保持变量信息存储单元6中取出常量保持变量“a”的定义位置,并从程序中取出常量保持变量“a”的定义表达式。单元16检索位置和表达式与开销保持单元15中存储的内容的匹配,并取出常量保持变量“a”的定义开销。本例中,由于200是不大于8位的常量,大小2和周期1被取出作为开销(步骤b2和图10中箭头c1)。

    寄存器变量使用开销计算单元17,在常量保持变量“a”的使用中,从常量保持变量信息保持单元6取出使用属性为“不传送”的使用的使用位置,以及在该使用位置上常量保持变量“a”的使用表达式。单元17检查位置和表达式与开销保持单元15中存储的内容的匹配,并取出常量保持变量“a”的使用开销数据。本例中,与一个寄存器变量加法匹配,大小1和周期1被取出作为开销(步骤b3和图10中箭头c2)。

    常量使用开销计算单元18,在常量保持变量“a”的使用中,从常量保持变量信息存储单元6取出使用属性为“不传送”的使用的使用位置,以及,从程序中取出使用表达式。单元18检查常量保持变量在使用表达式中被其保持值取代的常量表达式与开销保持单元15中存储的内容的匹配,并取出在常量保持变量“a”被一常量取代时的使用开销。本例中,表达式与一寄存器变量……8位常量加法匹配。大小2和周期1被取出作为开销(步骤4和图10中箭头c3)。

    重写判断单元19将寄存器变量定义开销计算单元16中算出的开销与寄存器变量使用开销计算单元17中算出的开销相加。该和与常量使用开销计算单元18中算出的开销比较(步骤b5)。在常量保持变量“a”的例子中,当用作寄存器变量时,

    大小=2+1=3

    周期=1+1=2

    当用常量取代时,

    大小=2

    周期=1

    即,常用使用开销较小。所以,激活重写单元20,这样,在位置S2被用作运算表达式的一操作数的常量保持变量的使用表达式被常量保持变量值200重写(步骤b5)。结果,在使用位置S2的替换表达式成为“a1=200+x。

    常量保持变量“b”的开销比较和重写

    这一过程按在常量保持变量“a”的情形下类似方法进行,但是,在常量保持变量“b”的情形下,常量使用开销较高,所以,不激活重写单元20。

    开销判断和重写单元10的处理结果是,程序变为如图7c所示,常量保持变量信息存储单元6中保存的信息变为如图8c所示。

    5.资源分配单元把变量“a”、“a1”、“x”、“b”、“b1”、“b2”和“y”分配给寄存器或存储器。对于常量保持变量“a”和“b”,设定分配在常量保持变量信息存储单元6中的资源(寄存器或存储器)。

    6.存储器变量重写单元12检查常量保持变量信息存储单元6中保存的常量保持变量,看一下常量保持变量是否分配给寄存器(步骤c2)。

    〔常量保持变量“b”分配给寄存器的情况〕

    在常量保持变量被分配给寄存器的情形下,该过程结束。在本例中,由于常量保持变量被分配给寄存器,程序变为如图7C所示。

    8.根据寄存在常量保持变量信息存储单元6中常量保持变量定义位置的内容,若保持在常量保持变量信息存储单元6中一个常量保持变量的所有使用属性都是“传送”,则常量保持变量定义单元7从程序中删除该常量保持变量的定义表达式。

    本例中,若常量保持变量“b”被分配给寄存器,常量保持变量信息保持单元中的信息如图8D所示,只有常量保持变量“a”可删除定义表达式。所以,此时删除常量保持变量“a”的定义表达式(程序中位置S1),结果程序最终重写如图7E所示。

    〔常量保持变量“b”不分配给寄存器的情况〕

    在常量保持变量“b”不是分配给寄存器的情形下,进一步检查常量保持变量信息的属性段,确定使用属性是否为“不传送”(步骤C4)。在本例中,如图8C所示,在使用位置S4和S5的使用属性是“不传送”。所以,重写单元24被激活,使用常量保持变量被重写为使用其保持值(步骤C5)。本例中,由于常量保持变量未分配给寄存器,程序重写为如图7D所示。在常量保持变量“b”不分配给寄存器的情形下,常量保持变量信息保存单元中的信息如图8E所示,可删去定义表达式的常量保持变量是a和b。所以,此时删除常量保持变量“a”的定义表达式(程序中位置S1)和常量保持变量“b”的定义表达式(程序中位置S3),该程序最重写成始图7E所示。

    图11A的中间语言程序被用作处理对象的操作例子

    下面,参照图2和3叙述当图11A的程序被作为输入送到优化器时的操作。

    1.常量保持变量定义检测单元7在程序中位置S1处检测到一个常量保持变量的替换表达式,如图31所示,并把常量保持变量的名字a、定义位置S1和常量保持变量值1000存入常量保持变量信息存储单元6的数据库中(步骤a7)。

    2.使用表达式检测单元8在程序中检索常量保持变量信息存储单元6中保存的常量保持变量“a”的使用位置,检测到位置S2的使用表达式。单元8把使用位置S2和使用属性“不传送”存入常量保持变量信息存储单元6的常量保持变量“a”一栏。类似地,在S3和S4处检测到常量保持变量“a”的使用表达式,使用位置S3和S4的使用属性被设置为“不传送”(步骤a8)。

    3.在部分常量表达式重写单元9中,由于常量保持变量“a”的使用S4满足重写条件,使用S4被重写成“b=20000+10000”和“b=30000”,如图11B所示。在常量保持变量信息存储单元6中,常量保持变量“a”在使用位置S3的使用属性被设置为“传送”(步骤a5)。此时,常量保持变量“b”也变为一新的常量保持变量,并被保存起来,但是,本例中略去对变量“b”的使用表达式的叙述,仅讨论变量“a”。

    4.开销判断和重写单元10对常量保持变量信息存储单元6中保存的常量保持变量“a”执行下列处理过程。假定图9中的指令集用作为微处理器的指令集,此时,存储在开销保持单元15中的信息成为如图10所示。

    在寄存器变量定义开销计算单元16中,从常量保持变量信息存储单元6中取出常量保持变量“a”的定义位置,且从程序中取出定义表达式。单元17检查位置和表达式与开销保持单元15中存储的内容的匹配情况,取出常量保持变量“a”的定义开销。本例中,由于10000是一个不大于16位的常量,大小3和周期1被取出作为开销(步骤b2)。

    寄存器变量使用开销计算单元17,从常量保持变量信息存储单元6中取出常量保持变量“a”的使用位置中使用属性为“不传送”的使用位置,并从程序中取出使用表达式,单元17检查位置和表达式与存储在开销保持单元15中的内容的匹配情况,取出常量保持变量“a”的使用开销。本例中,两种情况(S2和S3)均为寄存器变量加法,取出大小1和周期1作为开销(步骤b3)。

    常量使用开销计算单元18从常量保持变量信息存储单元6中取出常量保持8变量“a”的使用位置,并从各使用位置的使用表达式中选出使用属性为“不传送”的表达式。单元18检查常量保持变量在使用表达式中被其保持值取代后的常量表达式与存储在开销保持单元15中的内容的匹配情况,取出在常量保持变量“a”被其保持值取代情形下的使用开销。本例中,两种情况均符合寄存器变量与16位常量的加法,大小4和周期2被取出作为开销(步骤b4)。

    在重写判断单元19中,将寄存器变量定义开销计算单元16算出的开销与寄存器变量使用开销计算单元17算出的开销相加,该和与常量使用开销计算单元18算出的开销相比较。在常量保持变量“a”的例子中,当用作寄存器变量时,

    大小=3+1+1=5

    周期=1+1+1=3

    当被常量取代时,

    大小=4+4=8

    周期=2+2=4即,在变量用作寄存器变量的情形下开销较小。所以,不必激活重写单元20,位置S2和S3保持不变。

    所以,图11A的中间语言程序改变如图11B的形式。图11B中,位置S4处的替换表达式变为“b=30000”,替换表达式“b=30000”出现在程序中,位置S4处的替换表达式的变量“b”变为一新的常量保持变量。

    当“传送”和常量合并的结果出现新的常量保持变量时,按在常量保持变量“a”情形下的同样方法,检索常量保持变量“b”为一操作数的运算表达式。三个箭头从变量“b”开始,分别在另三个变量“b”结束,箭头指出变量“b”被用作为一个操作数的运算表达式。优化器检测到位置S9和S10的运算表达式,把在运算表达式中用作操作数的常量保持变量“b”重写为其保持值“30000”。重写的结果是,位置S9和S10的运算表达式分别被重写为“u=/10000+{30000}”和“z={30000}+45000”,如图中所示。重写之后,优化器进行常量合并,于是,位置S9和S10后的替换表达式分别被重写为“u=40000”和“z=75000”。这一笪写使变量“u”和“z”成为常量保持变量。所以,优化器进一步重复变量的“传送”和合并。当以这样方式重复“传送”和合并时,删去位置S4、S9和S10的替换表达式,使程序变量非常简单。

    如上所述,在重写之后,优化器进行常量传送和常量合并,其后,优化器把程序中留下的变量分配给寄存器或存储器。在资料分配中,优化器把工作区彼此复盖的变量分配给不同的寄存器。

    假定程序由常量传送和常量合并重写为如图11F所示,其中的变量“a”、“x”和“y”分别分配给寄存器D0、D1和D2。由于变量“a”、“x”和“y”被分配给寄存器,图11F程序中的替换表达式被转换成一个指令的操作数为寄存器的机器语言编码。

    图12表示由图11F中位置S1至S3的中间语言程序产生的机器语言编码。图中,“movi#10000,D0”、“add D0,D1”和“add D0,D2”对应于优化后的中间语言程序的替换表达式。在机器语言编码右侧,写出了存储器大小和执行周期。在机器语言编码中,一个操作被设置成一个寄存器,因此,“add D0、D1”的存储器大小为“1”,执行周期为“1”,“add D0,D2/存储器大小为“1”,执行周期为“1”。若机器语言编码含有如以前的方法的例子那样的立即数“#10000”,其存储器大小为“4”,执行周期为“4”,如图14所示。当然,会看到本发明的“传送”能实现重写成较低开销的机器语言程序。

    如上所述,按照本发明,可有效地进行常量传送和常量合并,并可防止出现由于常量传送引起的开销增加。

    在实施例中,指令的大小和运行时间(周期数)同时用作为开销,当需要使产生的编码具有特别小的编码大小或是很短的运行时间时,可设定对各种开销指定优先权。具体来说,当较高的优先权被指定给编码大小时,则编码大小首先用作为开销,在使用同样大小的编码的情形下,再比较各自的周期数。当较高的优先权被指定给运行速度时,周期数首先用作为开销,在使用同样周期数的编码情形下,再比较编码大小。或者,编码大小和周期数可单独使用。通常,对那样的信息完成操作得到的值可用作为开销。

    如上所述,按照本发明的优化器,可由第一重写装置的重写来简化程序,由于其它表达式的重写只在第一估计装置的估计的值不大于第二估计装置的估计值时才进行,可避免出现由于常量传送而增加开销。当以这样方式进行常数传送而不增加开销时,多余部分从程序中被清除,所以,根据该程序产生的机器语言程序效率很高。

    而且,除上述作用以外,本发明的优化器还能获得下列效果。

    由于所有操作数都是常量的表达式被重写成该常量表达式运算结果的常量,以及,重写后的表达式由管理装置管理,由第一和第二重写装置的重写可能产生一个常量保持变量,并且由常量保持变量保持的常量可以传送。当重复这些过程和依次进行“传送”和合并时,许多表达式可从程序中删除,程序变得非常简单。结果,可大大减小最终形成的机器语言程序的运行时间和存储量大小。

    而且,除了上述效果以外,本发明的优化器还能取得下列效果。

    在由第一、第二和第四重写装置删去表达式的程序中对变量进行资源分配,在作为资源分配的结果而分配给存储器的常量保持变量中,一个常量保持变量不被分配给存储器,而重写为常量。所以,对其中常量保持变量为操作数的表达式和常量被替换的表达式,不需要进行存储器存取。结果,运行时用可缩短相应于存储器存取的时间。

    而且,除了上述效果以外,本发明的优化器能得到下列效果。

    由于相关表达式组中的表达式被机器语言指令取代,并且由估计相关表达式组单元中机器语言指令的开销的办法来进行估计,开销估计得更加正确。结果,可更准确地判断操作数是否需要被重写。

    尽管本发明已按目前较好的实施例进行了叙述,应当理解,这种揭示不意味着限制。各种变化和修改对于那些阅读了上面叙述的本领域技术人员来说,无疑是显然的,由此,权利要求书应被理解为覆盖了落入本发明实质和范围内的所有变化和修改。

优化器.pdf_第1页
第1页 / 共51页
优化器.pdf_第2页
第2页 / 共51页
优化器.pdf_第3页
第3页 / 共51页
点击查看更多>>
资源描述

《优化器.pdf》由会员分享,可在线阅读,更多相关《优化器.pdf(51页珍藏版)》请在专利查询网上搜索。

常量保持变量定义检测单元7和使用表达式检测单元8将常量保持变量的定义和使用信息存入常量保持变量信息存储单元6,部分常量表达式重写单元9将常量保持变量重写常量。开销判断和重写单元10根据开销比较判断变量是否应装入寄存器来使用,或是否应进行常量传送。资源分配单元11对变量分配资源。储存器变量重写单元12把分配给存储器的常量保持变量重写为常量值。常量保持变量定义删除单元13删去成为不必要的常量保持变量的。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1