CN1122216C - 优化器 - Google Patents
优化器 Download PDFInfo
- Publication number
- CN1122216C CN1122216C CN96108810A CN96108810A CN1122216C CN 1122216 C CN1122216 C CN 1122216C CN 96108810 A CN96108810 A CN 96108810A CN 96108810 A CN96108810 A CN 96108810A CN 1122216 C CN1122216 C CN 1122216C
- Authority
- CN
- China
- Prior art keywords
- constant
- variable
- expression formula
- keeps
- operand
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
常量保持变量定义检测单元7和使用表达式检测单元8将常量保持变量的定义和使用信息存入常量保持变量信息存储单元6,部分常量表达式重写单元9将常量保持变量重写常量。开销判断和重写单元10根据开销比较判断变量是否应装入寄存器来使用,或是否应进行常量传送。资源分配单元11对变量分配资源。储存器变量重写单元12把分配给存储器的常量保持变量重写为常量值。常量保持变量定义删除单元13删去成为不必要的常量保持变量的定义。
Description
技术领域
本发明涉及一种用于编译器中的优化器,编译器将用高级语言写成的程序编译成机器语言程序,优化器对源程或中间语言程序进行优化以产生高效的机器语言程序。
背景技术
最近,很多源程序是用高级语言写成的。这样提高了发展机器语言程序或汇编程序的效率。下面叙述中的机器语言程序包括汇编程序。用高级语言写成的源程序由编译器编译成机器语言程序。这种编译器具有优化器。用编程语言写的程序由优化器重写,以便有效地在机器的微处理器内执行。
另一方面,要求机器语言程序的效率尽可能地高,所以,优化器以各种方式重写程序,欲使最终产生的机器语言程序总的运行时间和程序大小为最小(最终形成的机器语言程序总的运行时间,或这一机器语言程序的存储容量通常称为“开销”)。
优化器所进行的过程包括常量传送和常量合并过程。使用这些过程重写程序以减小机器语言程序总的运行时间和存储容量。交替重复这些过程,优化器能大大减少程序中表达式的数量,这可参照图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 propagation).
可以看到,这一重写使位于S4的替换表达式变为b=20000+10000”,相当于替换表达式“b=30000”。当例如“b=20000+10000”的常量表达式出现在程序中时,优化器将该常量表达式写为等价于该常量表达式的替换表达式“b=30000”。将常量表达式重写为一等价的常量的过程称为常量合并(Constantfolding)。在优化器进行常量合并时,替换表达式“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处理过程,结果得到一种状态,即在程序内的常量保持变量中,用作寄存器开销较低的那些被寄存器变量取代,而其它则被一个常量,即常量保持变量的值,所取代。
在图4A所示开销保持单元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),该程序最重写成始图7F所示。
图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”和“addD0,D2”对应于优化后的中间语言程序的替换表达式。在机器语言编码右侧,写出了存储器大小和执行周期。在机器语言编码中,一个操作被设置成一个寄存器,因此,“add D0、D1”的存储器大小为“1”,执行周期为“1”,“add D0,D2/存储器大小为“1”,执行周期为“1”。若机器语言编码含有如以前的方法的例子那样的立即数“#10000”,其存储器大小为“4”,执行周期为“4”,如图14所示。当然,会看到本发明的“传送”能实现重写成较低开销的机器语言程序。
如上所述,按照本发明,可有效地进行常量传送和常量合并,并可防止出现由于常量传送引起的开销增加。
在实施例中,指令的大小和运行时间(周期数)同时用作为开销,当需要使产生的编码具有特别小的编码大小或是很短的运行时间时,可设定对各种开销指定优先权。具体来说,当较高的优先权被指定给编码大小时,则编码大小首先用作为开销,在使用同样大小的编码的情形下,再比较各自的周期数。当较高的优先权被指定给运行速度时,周期数首先用作为开销,在使用同样周期数的编码情形下,再比较编码大小。或者,编码大小和周期数可单独使用。通常,对那样的信息完成操作得到的值可用作为开销。
如上所述,按照本发明的优化器,可由第一重写装置的重写来简化程序,由于其它表达式的重写只在第一估计装置的估计的值不大于第二估计装置的估计值时才进行,可避免出现由于常量传送而增加开销。当以这样方式进行常数传送而不增加开销时,多余部分从程序中被清除,所以,根据该程序产生的机器语言程序效率很高。
而且,除上述作用以外,本发明的优化器还能获得下列效果。
由于所有操作数都是常量的表达式被重写成该常量表达式运算结果的常量,以及,重写后的表达式由管理装置管理,由第一和第二重写装置的重写可能产生一个常量保持变量,并且由常量保持变量保持的常量可以传送。当重复这些过程和依次进行“传送”和合并时,许多表达式可从程序中删除,程序变得非常简单。结果,可大大减小最终形成的机器语言程序的运行时间和存储量大小。
而且,除了上述效果以外,本发明的优化器还能取得下列效果。
在由第一、第二和第四重写装置删去表达式的程序中对变量进行资源分配,在作为资源分配的结果而分配给存储器的常量保持变量中,一个常量保持变量不被分配给存储器,而重写为常量。所以,对其中常量保持变量为操作数的表达式和常量被替换的表达式,不需要进行存储器存取。结果,运行时用可缩短相应于存储器存取的时间。
而且,除了上述效果以外,本发明的优化器能得到下列效果。
由于相关表达式组中的表达式被机器语言指令取代,并且由估计相关表达式组单元中机器语言指令的开销的办法来进行估计,开销估计得更加正确。结果,可更准确地判断操作数是否需要被重写。
尽管本发明已按目前较好的实施例进行了叙述,应当理解,这种揭示不意味着限制。各种变化和修改对于那些阅读了上面叙述的本领域技术人员来说,无疑是显然的,由此,权利要求书应被理解为覆盖了落入本发明实质和范围内的所有变化和修改。
Claims (5)
1.一种位于编译器中的优化器,其中所述编译器用于将编程语言编写的程序编译成机器语言程序或汇编程序,所述优化器用于优化用编程语言编写的程序,并输出优化后的程序,其特征在于,包括:
管理装置,在所述管理装置中,常量保持变量被定义在所述程序中被赋值以常量的变量,相关表达式组被定义一个表达式集合,所述集合是通过将所述常量保持变量赋值为一常数而获得的一个表达式与所述常量保持变量为一操作数的表达式相关联而建立的,所述相关表达式组由所述管理装置保存;
第一重写装置,用于在所述常量保持变量为操作数的所述相关表达式组中把具有一个常量保持变量操作数和至少一个常量操作数的表达式,以及把具有一个常量保持变量操作数的一元运算表达式,重写成具有所述常量保持变量所保持的常量操作数的表达式;
第一估计装置,用于在所述第一重写装置完成重写操作之后,用常量保持变量保持的立即数替代还未重写成常量的常量保持变量,并将其设置为机器语言运算的操作数,并且根据所述常量的字节长度,估计所述常量保持变量的相关表达式组中,由具有所述常量保持变量操作数的表达式产生的机器语言指令之执行速度和/或编码大小的开销;
第二估计装置,用于在所述第一重写装置完成重写操作之后,将存储常量保持变量所保持常量的寄存器中的一个还未重写为常量的寄存器变量设置为机器语言运算的操作数,并且估计所述常量保持变量的相关表达式组中,由赋值给所述常量保持变量的常量为操作数的表达式和具有所述常量保持变量操作数的表达式产生的机器语言指令之执行速度和/或编码大小的开销;
比较装置,对每个相关表达式组,比较所述第一估计装置的估计结果与所述第二估计装置的估计结果;
第二重写装置,用于在相关表达式中,如果所述比较装置的比较结果为所述第一估计装置的估计结果不大于所述第二估计装置的估计结果,那么将用作操作数的任何常量保持变量重写为由所述常量保持变量保持的常量;以及,
第三重写装置,当把常量保持变量用作操作数的任何表达式被重写为把常量保持变量保持的常量用作操作数的表达式时,删除将常量赋值给所述常量保持变量的表达式。
2.如权利要求1的优化器,其特征在于,还包括:
第四重写装置,用于将由于所述第一和第二重写装置的重写操作而使得所有操作数都成为常数的表达式,重写成所有操作数的运算结果,即一个常量;
控制装置,用于控制所述管理装置,以便保持每个常量保持变量的相关表达式组,其中所述相关表达式组由以下三个内容建立:由所述第四重写装置进行重写操作而产生的新的常量保持变量、将常量赋值给所述新的常量保持变量的表达式、以及所述常量保持变量为操作数的所有表达式;
激活装置,对所述管理装置新保存的相关表达式组,激活所述第一重写装置。
3.如权利要求1或2所述的优化器,其特征在于,还包括:
资源分配装置,用于在所述第二重写装置完成重写操作之后,根据所述变量之工作区的重叠状况和每个变量的使用频率,把所述程序中的变量分配给寄存器或存储器;以及,
第五重写装置,用于在所述资源分配装置分配给存储器的变量中确定一常量保持变量,并将经确定的常量保持变量的相关表达式组中作为操作数的所有所述常量保持变量,重写成所述常量。
4.如权利要求1或2所述的优化器,其特征在于,所述优化器还包括:
开销存储装置,用于存储多个机器语言指令和表示每条机器语言指令之执行周期和/或编码大小的开销,并将所述指令与所述开销相关联;
所述第一估计装置包括:
第一取代装置,用于在所述第一重写装置完成重写操作之
后,用表达式的常量保持变量是一操作数并作为表示所述常量
保持变量所保持的常量的立即数的机器语言指令,来取代相关
表达式组中常量保持变量为操作数的每一表达式;以及,
第一累加装置,用于从所述开销存储装置中读出与每一取
代后的机器语言指令相关联的开销,累加读出的开销,并将累
加结果设定为估计结果;
所述第二估计装置包括:
第二取代装置,用于在所述第一重写装置重写之后,用存
储常量的寄存器被设定为一个操作数的机器语言指令,来取代
相关表达式组中将常量赋值给常量保持变量的每一表达式和
常量保持变量为操作数的每一表达式;以及,
第二累加装置,用于从所述开销存储装置中读出与每一取代后的机器语言指令关联的开销,累加读出的开销,并将累加结果设定为估计结果。
5.如权利要求3所述的优化器,其特征在于,所述优化器还包括:
开销存储装置,用于存储多个机器语言指令和表示每条机器语言指令之执行周期和/或编码大小的开销,并将所述指令与所述开销相关联;
所述第一估计装置包括:
第一取代装置,用于在所述第一重写装置完成重写操作之
后,用表达式的常量保持变量是一操作数并作为表示所述常量
保持变量所保持的常量的立即数的机器语言指令,来取代相关
表达式组中常量保持变量为操作数的每一表达式;以及,
第一累加装置,用于从所述开销存储装置中读出与每一取
代后的机器语言指令相关联的开销,累加读出的开销,并将累
加结果设定为估计结果;
所述第二估计装置包括:
第二取代装置,用于在所述第一重写装置重写之后,用存
储常量的寄存器被设定为一个操作数的机器语言指令,来取代
相关表达式组中将常量赋值给常量保持变量的每一表达式和
常量保持变量为操作数的每一表达式;以及,
第二累加装置,用于从所述开销存储装置中读出与每一取代后的机器语言指令关联的开销,累加读出的开销,并将累加结果设定为估计结果。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP15026195A JP3650649B2 (ja) | 1995-06-16 | 1995-06-16 | 最適化装置 |
JP150261/95 | 1995-06-16 | ||
JP150261/1995 | 1995-06-16 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1143774A CN1143774A (zh) | 1997-02-26 |
CN1122216C true CN1122216C (zh) | 2003-09-24 |
Family
ID=15493080
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN96108810A Expired - Fee Related CN1122216C (zh) | 1995-06-16 | 1996-06-17 | 优化器 |
Country Status (7)
Country | Link |
---|---|
US (1) | US5842021A (zh) |
EP (1) | EP0749067B1 (zh) |
JP (1) | JP3650649B2 (zh) |
KR (1) | KR100215502B1 (zh) |
CN (1) | CN1122216C (zh) |
DE (1) | DE69620057T2 (zh) |
TW (1) | TW434512B (zh) |
Families Citing this family (24)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6223337B1 (en) * | 1997-12-12 | 2001-04-24 | Hewlett-Packard Company | Random test generation for compiler optimization |
KR100492131B1 (ko) * | 1998-04-08 | 2005-08-01 | 한국항공우주산업 주식회사 | 웹 프로그램의 변수 전달 방법 |
US6189141B1 (en) * | 1998-05-04 | 2001-02-13 | Hewlett-Packard Company | Control path evaluating trace designator with dynamically adjustable thresholds for activation of tracing for high (hot) activity and low (cold) activity of flow control |
JP4041248B2 (ja) * | 1999-07-09 | 2008-01-30 | 松下電器産業株式会社 | コンパイラ装置、コンパイルプログラムが記録されたコンピュータ読み取り可能な記録媒体及びコンパイル方法 |
JP2002073333A (ja) * | 2000-08-25 | 2002-03-12 | Hitachi Ltd | 手続き呼び出し先のデータ依存の解析表示方法 |
US20040003383A1 (en) * | 2002-06-28 | 2004-01-01 | Microsoft Corporation | Stripping of unnecessary information from source code |
US20040095348A1 (en) * | 2002-11-19 | 2004-05-20 | Bleiweiss Avi I. | Shading language interface and method |
EP1637990A1 (en) * | 2003-03-10 | 2006-03-22 | Catena Corporation | Static analysis method for lyee-oriented software |
US7784039B2 (en) * | 2004-09-22 | 2010-08-24 | Panasonic Corporation | Compiler, compilation method, and compilation program |
JP4377369B2 (ja) * | 2005-11-09 | 2009-12-02 | 株式会社日立製作所 | リソース割当調停装置およびリソース割当調停方法 |
US20070233745A1 (en) * | 2006-03-29 | 2007-10-04 | Ori Pomerantz | Data Flow Optimization in Meta-Directories |
US7870544B2 (en) * | 2006-04-05 | 2011-01-11 | International Business Machines Corporation | Insuring maximum code motion of accesses to DMA buffers |
FR2902543A1 (fr) | 2006-06-20 | 2007-12-21 | Alcatel Sa | Procede de creation de contenus multimedia pour terminaux mobiles, produit programme d'ordinateur pour la mise en oeuvre d'un tel procede |
US20080250032A1 (en) * | 2007-04-04 | 2008-10-09 | International Business Machines Corporation | Method and system for efficiently saving and retrieving values of a large number of resource variables using a small repository |
US8087012B2 (en) * | 2007-08-21 | 2011-12-27 | International Business Machines Corporation | Eliminating maximum/minimum operations in loop bounds |
JP5165969B2 (ja) * | 2007-08-29 | 2013-03-21 | インターナショナル・ビジネス・マシーンズ・コーポレーション | プログラムのコンパイルのために変数にレジスタを割り付ける技術 |
US7505963B1 (en) * | 2008-01-07 | 2009-03-17 | International Business Machines Corporation | Method and system for efficiently saving and retrieving values of a large number of resource variables using a small repository |
JPWO2009098739A1 (ja) * | 2008-02-05 | 2011-05-26 | パナソニック株式会社 | プログラム最適化装置およびプログラム最適化方法 |
US9176845B2 (en) * | 2010-03-19 | 2015-11-03 | Red Hat, Inc. | Use of compiler-introduced identifiers to improve debug information pertaining to user variables |
CN102184090B (zh) * | 2011-05-27 | 2013-12-04 | 清华大学 | 一种动态可重构处理器及其固定数的调用方法 |
JP6481515B2 (ja) | 2015-05-29 | 2019-03-13 | 富士通株式会社 | 情報処理装置、コンパイル方法、及びコンパイラプログラム |
US11334469B2 (en) * | 2018-04-13 | 2022-05-17 | Microsoft Technology Licensing, Llc | Compound conditional reordering for faster short-circuiting |
CN109145013A (zh) * | 2018-08-10 | 2019-01-04 | 上海达梦数据库有限公司 | 一种表达式转换方法、装置、设备及存储介质 |
JP6950772B2 (ja) * | 2020-03-13 | 2021-10-13 | 株式会社安川電機 | 生産システム、制御方法、及びプログラム |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4802091A (en) * | 1986-10-31 | 1989-01-31 | International Business Machines Corporation | Method for improving the efficiency of arithmetic code generation in an optimizing compiler using the technique of reassociation |
JPH01108638A (ja) * | 1987-10-21 | 1989-04-25 | Hitachi Ltd | 並列化コンパイル方式 |
JPH0417031A (ja) * | 1990-05-10 | 1992-01-21 | Nec Corp | 定数値伝播最適化方式 |
JP3280449B2 (ja) * | 1993-03-01 | 2002-05-13 | 富士通株式会社 | コンパイル装置 |
US5659754A (en) * | 1995-03-31 | 1997-08-19 | Sun Microsystems, Inc. | Method and apparatus for an improved optimizing compiler |
-
1995
- 1995-06-16 JP JP15026195A patent/JP3650649B2/ja not_active Expired - Fee Related
-
1996
- 1996-06-04 TW TW085106680A patent/TW434512B/zh not_active IP Right Cessation
- 1996-06-04 US US08/657,489 patent/US5842021A/en not_active Expired - Lifetime
- 1996-06-12 DE DE69620057T patent/DE69620057T2/de not_active Expired - Fee Related
- 1996-06-12 EP EP96304374A patent/EP0749067B1/en not_active Expired - Lifetime
- 1996-06-15 KR KR1019960021648A patent/KR100215502B1/ko not_active IP Right Cessation
- 1996-06-17 CN CN96108810A patent/CN1122216C/zh not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
KR100215502B1 (ko) | 1999-08-16 |
CN1143774A (zh) | 1997-02-26 |
EP0749067A3 (en) | 1997-05-14 |
EP0749067B1 (en) | 2002-03-27 |
US5842021A (en) | 1998-11-24 |
DE69620057T2 (de) | 2002-09-05 |
JPH096627A (ja) | 1997-01-10 |
TW434512B (en) | 2001-05-16 |
EP0749067A2 (en) | 1996-12-18 |
DE69620057D1 (de) | 2002-05-02 |
KR970002621A (ko) | 1997-01-28 |
JP3650649B2 (ja) | 2005-05-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1122216C (zh) | 优化器 | |
CN1284095C (zh) | 多处理器***中的任务分配方法和多处理器*** | |
CN1101019C (zh) | 数据序列产生方法及设备、转换方法及计算机 | |
CN1115884C (zh) | 可编程的呼叫处理***和方法 | |
CN1249963C (zh) | 使用分组摘要信息快速和自适应处理分组的设备和方法 | |
CN1097226C (zh) | 编译程序器 | |
CN1613058A (zh) | 配有jit编译器的虚拟计算机,操作所述计算机的方法以及包括所述虚拟计算机的终端设备 | |
CN1783012A (zh) | 程序转换器件及方法、程序转换执行器件及转换执行方法 | |
CN1795434A (zh) | 程序执行控制设备,程序执行控制方法,控制程序和记录介质 | |
CN1918546A (zh) | 程序转换装置及程序转换方法 | |
CN1908892A (zh) | 测试用例设计方法和*** | |
CN1758221A (zh) | 程序处理装置 | |
CN1900959A (zh) | 设计制造的支援装置、支援程序和支援方法 | |
CN1439137A (zh) | 优化成果驱动作业流程合成及简化的方法、处理和*** | |
CN1802632A (zh) | 用于在程序代码转换期间执行解释器优化的方法和装置 | |
CN1586063A (zh) | 流数据处理器、流数据处理方法、程序和媒体 | |
CN1176426A (zh) | 在数据处理***中对计算机指令执行排序的方法和装置 | |
CN1174319C (zh) | 数据结构管理装置、数据结构管理***和方法 | |
CN1742257A (zh) | 基于识别寻址模式的双目的寄存器的数据预测机制 | |
CN1722140A (zh) | 信息处理设备及信息处理方法 | |
CN1711523A (zh) | 用于管理多***群集中资源争用的方法和装置 | |
CN1811632A (zh) | 一种数控代码编译器以及基于其建立数控***软件的方法 | |
CN1731402A (zh) | 用协处理器加速文件***操作的方法及装置 | |
CN101065725A (zh) | 命令供给装置 | |
CN1744054A (zh) | 一种自动化测试辅助***及相应的软件自动测试方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C06 | Publication | ||
PB01 | Publication | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C17 | Cessation of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20030924 Termination date: 20120617 |