专利名称:编译器装置、编译器方法和编译器程序的制作方法
技术领域:
本发明涉及编译器装置、编译器方法和编译器程序。更具体地,本发明涉及用于在执行速度方面实现经过优化的编译的技术。
背景技术:
执行优化以减少程序执行时间的编译器装置通常用来提高载入到计算机系统用于处理大量数据的程序的性能。
在编译器装置中,用于重新布置指令次序的指令调度被用来提高程序的执行效率,从而进行优化。进一步,在进行优化的过程中,编译器装置通过控制流分析将程序划分为基本块单元,其中所述控制流分析将注意力集中在程序分支点处的指令语句和分支目标处的指令语句。基本块是一串指令语句,其中按照从基本块头指令语句到尾指令语句的次序执行指令,并且在指令语句串中不包含分支和汇合。但是,在基本块的结尾可以包括分支语句。
在基本块中不存在分支和汇合,所以简单地按照每个块进行指令调度。但是,优化的效果就局限于每个基本块的局部优化。因此,需要通过扩展基本块来扩展指令调度的目标范围。
正如在Ikuo Nakata著、Asakura出版有限公司于2004年出版的“编译器的结构和优化(Structure and Optimization of Compiler)”的358-381页中所描述的那样,存在这样的情况在包含多个分支的程序中预先知道具有高执行频率的执行路径(下文中称为“热路径”)。在这种情况下,通常所知的方法是移动热路径上的指令语句来扩展热路径的基本块,从而提高热路径的执行效率。
现在参考图5A和图5B所示程序的情况来描述扩展热路径上基本块的方法。图5A示出了一部分程序,而图5B示出了编译器内部程序的中间程序表述。中间程序由一串诸如S1和S2的中间代码构成。进一步,图5B还举例示出了控制流图,该控制流图用实线箭头示出控制流。程序中的指令语句被表达成编译器中的中间代码。控制流图是有向图,其中基本块B1-B7通过指示分支和汇合的有向边连接。进一步,将会以如下的假设来描述该示例,即依次经过虚线HP上基本块B1、B2、B3、B4、B5和B7的执行路径是热路径。
现在参照图6中所示的程序进行描述。在该程序中,如图7所示,考虑到基本块B4的中间代码S8被移动到基本块B2并且执行从基本块B3到基本块B4的转变的情况,作为中间代码S8的拷贝的中间代码S81被插入基本块B3。根据这一操作,可以扩展热路径HP上的基本块B2,同时还保持程序的一致性。
但是,如图8所示,在基本块B1、B2、B4以这样的次序转变并且基本块B4的分支指令S9被判断为否的情况下,当基本块B5的中间代码S10被移动到基本块B2时,基本块B6的中间代码S12的变量a实际上必须引用基本块B1的中间代码S1的变量a,但是它变为引用转移后中间代码S10的变量a。所以不能保持程序的一致性。
如上所述,当通过移动中间代码越过在尾部包含分支指令的基本块而没有保持原始程序对数据的依赖时,中间代码的移动是受限制的。所以不能扩展基本块。
发明内容
因此,本发明的主要目的是提出一种编译器装置,其可以将程序转换为能够在特定执行路径上扩展基本块,还保持程序的一致性。
(1)根据本发明的编译器装置是一种用于将包括分支指令的源程序转换为目标程序的编译器装置,所述目标程序是一串目标代码。该装置包括执行路径指定设备、第一执行路径代码生成器、保证代码生成器、部分代码生成器、第一分支代码生成器、第一依赖分析器和并行化设备,其中所述执行路径指定设备从中间包括分支指令的部分指令串中所包含的多个执行路径中指定单个执行路径,所述部分指令串构成所述源程序;所述第一执行路径代码生成器生成第一执行路径代码,通过将在由所述执行路径指定设备所指定的执行路径上定义的、并且需要出现在所述指定执行路径的入口处的变量替换为另一变量而获得该第一执行路径代码;所述保证代码生成器生成用于将所述另一变量恢复为原始变量的保证代码,所述另一变量被所述第一执行路径代码生成器替换并且也需要出现在所述指定执行路径的出口处;所述部分代码生成器生成与所述部分指令串相对应的部分代码;当用于执行所述指定执行路径的分支条件不成立时,所述第一分支代码生成器根据所述指定执行路径上条件分支指令的条件,在所述指定执行路径上的所述条件分支指令中生成第一分支代码,其分支到所述部分代码的起点;所述第一依赖分析器根据对所述指定执行路径上的指令之间的依赖关系所进行的分析来计算依赖关系,增加所述保证代码和与所述指定执行路径上的所述条件分支指令相对应的所述分支代码之间的依赖,从而使得所述保证代码在所述指定执行路径上的所述条件分支指令之后执行,并且还增加指令之间的依赖以免生成异常;和所述并行化设备根据由所述第一依赖分析器增加的所述指令之间的所述依赖,重新布置所述指定执行路径上的指令。
上述的本发明的结构是用于设置依赖以免生成任何异常的实施例。在该结构中,执行路径指定设备在其中包含分支指令的部分指令串中指定所谓的热路径。第一执行路径代码生成器生成执行路径代码,在所述执行路径代码中,路径替换目标变量(需要出现在指定执行路径的入口处并且在指定执行路径上定义的变量)被替换为另一变量。进一步,保证代码生成器预先生成将替换后的变量恢复到原始变量所需要的保证代码。部分代码生成器生成与中间包含分支指令的部分指令串相对应的部分代码。第一分支代码生成器生成分支代码,其中分支目标分支到部分代码起点,从而首先相对于执行指定执行路径的条件分支指令而调整到不执行指定执行路径的情况下的条件,然后获得在执行路径中间不包含分支的结构。执行这些以通过在分支条件成立时通过执行高速块中的处理(执行路径)来实现高速处理,而分支到不使用高速块的具有常规次序的处理,从而在分支条件不成立时维持一致性。第一依赖分析器找到指定执行路径上指令之间的依赖关系,并以这种方式对其进行调整,即保证代码比条件分支指令出现得晚以免生成任何异常。并行化设备根据所获得的指令间的关系来重新安排执行路径上的指令。
根据该结构,可以扩展指定执行路径上的基本块,并且扩展对所述指令所执行的调度的目标范围。因此,可以更有效地实现优化。进一步,如此构成该结构,使得执行路径上的指令语句被优先执行,并且没有分支被包含在执行路径中间。因此,在执行路径的执行几率高于其它执行路径的执行几率时,可以提高执行路径的执行速度。
(2)在上述编译器装置(1)中存在这样的实施例,其中编译器装置将所述源程序中的循环当作单个指令,所述装置进一步包括循环单元处理设备,其中所述循环单元处理设备从所述循环的最内层循环朝着外层循环启动所述执行路径指定设备、所述第一执行路径代码生成器、所述保证代码生成器、所述第一分支代码生成器、所述第一依赖分析器和所述并行化设备。
通过提供循环单元处理装置,可以从最内层循环向外层循环反复扩展执行路径的指定范围。因此,可以在更广的范围内提高程序的执行速度。
(3)在上述编译器装置(1)中存在这样的实施例,其中编译器装置进一步包括第一执行路径转换判断设备,其中所述第一执行路径转换判断设备根据所述指定执行路径的执行几率,判断在执行所述并行化设备之后的所述程序是否被当作所述目标代码。
如果在执行并行化设备之后的程序在所有时间都被当作目标代码,而不管指定执行路径的执行几率较低的情况,可以预期处理时间会延长。因此,提供了上述执行路径转换判断设备。执行路径转换判断设备通过将执行并行化设备之后的程序当作目标代码,缩短了处理时间。与此相反,当指定执行路径的执行几率等于或者小于预定值时,执行路径转换判断设备将源程序当作目标代码,而不执行并行化设备。因此进一步缩短了处理时间。
(4)上述编译器装置(1)还存在这样的实施例,其中该编译器装置进一步包括第二执行路径转换判断设备,其中所述第二执行路径转换判断设备根据所述指定执行路径的执行几率和所述部分代码的执行时间,计算所述部分代码的平均执行时间;根据所述执行几率和在执行所述并行化设备之后所述指定执行路径上所述目标代码的执行时间,计算所述指定执行路径的平均执行时间;根据所述部分代码的所述平均执行时间和所述指定执行路径的所述平均执行时间之间的比较,判断在执行所述并行化设备之后的所述程序是否被当作所述目标代码串。
在判断是否将执行并行化设备之后的程序当作目标代码或者是否将源程序当作目标代码而不执行并行化设备时,只应用与指定执行路径的执行几率相关的判断可能在缩短处理时间的精确性方面可能还不够。其原因是因为处理时间和几率彼此具有不同量纲。因此,提供第二执行路径转换判断设备,用于执行时间方面的比较。该执行路径转换判断设备分别计算指定执行路径上的平均执行时间和部分代码中的平均执行时间。然后,当执行并行化设备后执行路径上的平均执行时间比部分代码的平均执行时间短的时候,执行路径转换判断设备将执行并行化设备后的程序设置为目标代码。结果是,可以更可靠地缩短处理时间。
(5)上述编译器装置(1)还存在这样的实施例,其中进一步包括返回位置设置指令代码生成器和第二依赖分析器,其中当在所述指定执行路径的执行期间生成异常时,所述返回点设置指令代码生成器增加用于规定所述指定执行路径上的返回位置的指令代码;和所述第二依赖分析器根据对所述指定执行路径上指令之间的依赖关系的分析,增加所述保证代码和与所述指定执行路径上的所述条件分支指令相对应的所述分支代码之间的依赖,从而使所述保证代码在所述指定执行路径上的所述条件分支指令之后执行;和所述第二依赖分析器不增加由所述第一依赖分析器在所述指令之间增加以避免生成异常的那些依赖。
这种结构是通过在异常时间设置返回位置而不设置用来不生成异常的依赖的结构。后面将参照这一结构来描述本实施例的改进示例。
如果产生零除数,就会在处理器或操作系统中生成异常。进一步,当变量f是C语言中的指针变量,并且存在对变量f的间接引用时,在该变量保持未加载地址或者禁止访问的存储器地址的情况下,处理器或操作系统中会生成异常。针对这一问题,提供了上述返回点设置指令代码生成器和依赖分析器。亦即,设置针对异常情况的返回点,从而使得即使在被不确定地执行的指令中生成异常的情况下,也可以没有矛盾地继续程序的执行。结果是,甚至指定执行路径上可能产生异常的指令也可以不受限制地在指定执行路径上移动。因此,可以促进指令的并行执行,从而提高执行速度。
(6)上述编译器装置(5)还存在这样的实施例,其中该编译器装置进一步包括中断生成时间处的处理例程增加器,其中当生成异常时,所述中断生成时间处的处理例程增加器向所述目标代码增加一处理例程,该处理例程用于返回由所述指令代码指定的所述返回位置。这一结构通过在生成异常时用异常例程(软件上)执行处理,从而继续该程序的执行。针对这一结构可以参考后面描述的实施例的改进示例1。通过采用上述结构,可以避免由于依赖生成的对指定执行路径上高速执行的障碍,可以在指定执行路径上不受限制地移动指定执行路径上可能生成异常的指令。因此,可以进一步促进指令的并行执行,从而提高执行速度。
(7)上述编译器装置(6)还存在这样的实施例,其中编译器装置进一步包括第三执行路径转换判断设备,其中所述第三执行路径转换判断设备根据所述指定执行路径的执行几率和在执行所述并行化设备之后在所述执行路径上生成异常的几率,判断在执行所述并行化设备之后的所述程序是否被当作所述目标代码。
如果像这样构造编译器装置,增加指定执行路径上生成异常的几率作为判断的基础。因此,与没有考虑生成异常的几率的情况相比,根据环境的改变能够更具体地缩短处理时间。
(8)上述编译器装置(7)还存在这样的实施例,其中编译器装置进一步包括第四执行路径转换判断设备,其中所述第四执行路径转换判断设备根据所述指定执行路径的所述执行几率、所述指定执行路径上生成异常的所述几率和所述部分代码的执行时间,计算所述部分代码的平均执行时间;根据所述指定执行路径的所述执行几率、生成所述异常的所述几率、在执行所述并行化设备之后所述执行路径上所述目标代码的执行时间和由所述生成中断时间处的处理例程增加设备所增加的所述处理例程中所述目标代码的执行时间,计算所述处理例程的平均执行时间和在执行所述并行化设备之后所述指定执行路径的平均执行时间;根据所述处理例程的所述平均执行时间和在执行所述并行化设备之后所述执行路径的所述平均执行时间之间的比较,判断在执行所述并行化设备之后所述程序是否被当作所述目标代码。
如果像这样构造编译器装置,执行判断不仅基于部分代码的平均执行时间或基于执行路径和处理例程的平均执行时间,还基于两个平均执行时间的比较。然后按此方式选择任何机会,从而更可靠地缩短处理时间。
(9)上述编译器装置8还存在这样的实施例,其中编译器装置,进一步包括第二执行路径代码生成器,其中所述第二执行代码生成器在所述指定执行路径上被引用的变量经常保持特定值时,将所述变量替换为由所述变量保持的值,并且在所述变量所保持的值不同于所述替换后的值时,生成通过在所述指定执行路径的头部插入条件分支指令而获得的第二执行路径代码,在所述条件分支指令中条件被设置为分支到所述指定执行路径的外部;和在所述第二执行路径代码生成器启动之后,所述编译器装置进行一关于恒定值的冗余消除优化。
如果这样构建编译器装置,当变量保持的值背离特定值时,能够更可靠地缩短处理时间。
(10)上述编译器装置(9)还存在这样的实施例,其中编译器装置进一步包括第五执行路径转换判断设备,其中所述第五执行路径转换判断设备根据所述指定执行路径的所述执行几率和所述指定执行路径上的所述变量保持特定值的几率,判断是否执行所述第二执行路径代码生成器。
如果这样构建编译器装置,就考虑了指定执行路径上变量保持特定值的几率。因此,与没有考虑该几率的情况相比,根据环境的改变能够更具体地缩短处理时间。
(11)上述编译器装置(10)还存在这样的实施例,其中编译器装置进一步包括第六执行路径转换判断设备,其中所述第六执行路径转换判断设备根据所述指定执行路径的所述执行几率、所述指定执行路径上的所述变量保持特定值的几率和在执行所述并行化设备之后所述执行路径上所述目标代码的执行时间,计算在执行所述并行化设备之后所述执行路径的平均执行时间;和根据所述部分代码的所述平均执行时间和在执行所述并行化设备之后所述执行路径的所述平均执行时间之间的比较,判断在执行所述并行化设备之后所述程序是否被当作所述目标代码。
如果这样构建编译器装置,执行判断不仅基于部分代码的平均执行时间或基于与执行路径上变量具有特定值的几率相关的执行路径平均执行时间,还基于两个平均执行时间的比较。然后按此方式选择任何机会,从而更可靠地缩短处理时间。
(12)上述编译器装置11还存在这样的实施例,其中编译器装置进一步包括第三执行路径代码生成器和第二分支代码生成器,其中所述第三执行路径代码生成器在所述指定执行路径上被引用的变量经常保持特定值时,拷贝所述指定执行路径上的指令,然后将所拷贝的执行路径上经常具有特定值的变量替换为由所述变量保持的值,并且在所述指定执行路径上被引用的变量所保持的值不同于所述替换后的值时,生成通过在所述指定执行路径的头部插入条件分支指令而获得的第三执行路径代码,在所述条件分支指令中条件被设置为分支到所述指定执行路径的外部;和当所拷贝的执行路径上条件分支指令的条件不被认可为所述指定执行路径中的条件分支指令时,所述第二分支代码生成器生成第二分支代码,该第二分支代码分支到所拷贝的执行路径上所述条件分支指令中的所述指定执行路径代码的起点。
如果这样构造编译器装置,即使当在指定执行路径上被引用的变量所保持的值与替换后的特定值不同时,执行控制也转变到速度较之部分代码被提高的另一高速块。因此,能够更可靠地缩短处理时间。
(13)上述编译器装置(12)还存在这样的实施例,其中编译器装置进一步包括第七执行路径转换判断设备,其中所述第七执行路径转换判断设备根据所述指定执行路径上的所述变量保持特定值的所述几率、或者根据所述指定执行路径的所述执行时间和其中所述指定执行路径上的所述变量保持特定值的所述几率,计算改进后的所述程序的平均执行时间;和根据所计算的所述改进后程序的平均执行时间,判断是否执行所述第三执行路径代码生成器和所述第二分支代码生成器。
如果这样构造编译器装置,通过基于改进后的程序的平均执行时间执行判断来确定选择任何机会,所述平均执行时间是从保持特定值的几率或者从指定执行路径的几率和执行几率计算得到的。因此可以更可靠地缩短处理时间。
(14)进一步,根据本发明的编译器装置是一种用于将包括分支指令的源程序转换为目标程序的编译器装置,目标程序是一串目标代码,该装置包括执行路径指定设备、执行路径代码生成器、保证代码生成器、部分代码生成器、分支代码生成器、依赖分析器和并行化设备,其中所述执行路径指定设备从中间包括分支指令的部分指令串中包含的多个执行路径中指定单个执行路径,所述部分指令串构成所述源程序;所述执行代码生成器生成执行路径代码,通过将在由所述执行路径指定设备所指定执行路径上定义的、并且需要出现在所述指定执行路径的入口处的变量替换为另一变量而获得该执行路径代码;所述保证代码生成器生成用于将所述另一变量恢复为原始变量的保证代码,所述另一变量被所述执行路径代码生成器替换并且也需要出现在所述指定执行路径的出口处;所述部分代码生成器生成与所述部分指令串相对应的部分代码;当执行所述指定执行路径的分支条件不成立时,所述分支代码生成器根据所述指定执行路径上的条件分支指令的条件,生成一分支代码,从而使得所述指定执行路径上所述条件分支指令的分支目标变成所述部分代码中的所述分支条件不成立的情况下的分支目标;所述依赖分析器根据对所述指定执行路径上的指令之间的依赖关系所进行的分析来计算指令之间的依赖关系,并且增加存在于基本块中的指令和所述条件分支指令之间的依赖,从而使得不能通过从出现在所述多个控制合流的基本块中、并且在所述指定执行路径中的指令,沿着所述执行路径的终点方向跳过首先发现的所述条件分支指令而转移处理,所述依赖分析器还增加所述指令和所述条件分支指令之间的依赖,从而使得不能通过从未出现在所述基本块中、并且在所述指定执行路径中的所述指令跳过所述条件分支指令而转移处理;和所述并行化设备根据由所述依赖分析器增加的所述指令之间的所述依赖,重新布置所述指定执行路径中的指令。
如果这样构造编译器装置,当执行指定执行路径的分支条件不成立时,执行路径被分支到部分代码中间。因此,即使在执行指定执行路径的分支条件不成立的情况下,与从部分代码起点开始执行的情况相比,能够提高执行速度。
(15)上述编译器装置(14)还存在这样的实施例,其中编译器装置进一步包括汇合定义变量替换设备和汇合定义变量保证代码生成器,其中在构成所述源程序、并且中间包含分支指令的部分指令串中,当存在在多个控制合流的基本块中定义的变量时,所述汇合定义变量替换设备将所述变量的定义点和引用点替换为另一变量;和所述汇合定义变量保证代码生成器在所述部分指令串的出口处生成一保证代码,用于将所述另一变量恢复为原始变量,所述另一变量被所述汇合定义变量替换设备替换并且需要出现在所述部分指令串的出口处。
如果这样构造编译器装置,在部分指令串中多个控制合流的基本块内出现的指令可以不受限制地在指定执行路径上移动。因此,可以进一步促进指令的并行执行,从而提高了执行速度。
(16)上述编译器装置(15)还存在这样的实施例,其中编译器装置进一步包括第一执行路径转换判断设备,其中所述第一执行路径转换判断设备根据所述指定执行路径的所述执行几率,判断在执行所述并行化设备之后的所述程序是否被当作所述目标代码。
如果这样构造编译器装置,如同结构(3)的情况那样,当指定执行路径的执行几率大于阈值时,能够通过选择在执行并行化设备之后的程序作为目标代码来缩短处理时间。与此相反,当指定的指令路径的执行几率等于或者小于阈值时,也能通过选择源程序作为目标代码并且不执行并行化设备,从而缩短处理时间。
(17)上述编译器装置(16)还存在这样的实施例,其中编译器装置进一步包括第二执行路径转换判断设备,其中所述第二执行路径转换判断设备根据所述指定执行路径的执行几率和所述部分代码的执行时间,计算所述部分代码的平均执行时间;根据所述指定执行路径的所述执行几率和在执行所述并行化设备之后所述执行路径中所述目标代码的执行时间,计算在执行所述并行化设备之后所述执行路径的平均执行时间;根据所述部分代码的所述平均执行时间和执行所述并行化设备之后所述执行路径的所述平均执行时间之间的比较,判断在执行所述并行化设备之后的所述程序是否被当作所述目标代码串。
如果这样构造编译器装置,如同(4)的结构的情况那样,当执行并行化设备后执行路径上的平均执行时间比部分代码的平均执行时间短的时候,通过选择执行并行化设备后的程序作为目标代码,能够更可靠地缩短处理时间。
(18)进一步,根据本发明的编译器装置是一种用于将包括分支指令的源程序转换为目标程序的装置,目标程序是一串目标代码。该装置包括执行路径指定设备、第一执行路径代码生成器、第一保证代码生成器、第二执行路径代码生成器、汇合定义变量替换设备、汇合定义变量保证代码生成器、第三执行路径代码生成器、第二保证代码生成器、部分代码生成器、第一分支代码生成器、第二分支代码生成器、第三分支代码生成器、依赖分析器和并行化设备;其中所述执行路径指定设备从中间包括分支指令的部分指令串中的多个执行路径中指定单个执行路径,所述部分指令串构成所述源程序;所述第一执行代码生成器生成第一执行路径代码,该第一执行路径代码是与由所述执行路径指定设备指定的执行路径上的整个指令串相对应的目标代码,并且通过将需要出现在所述指定执行路径入口处、并且在由所述执行路径指定设备所指定的执行路径上定义的变量替换为第一另一变量而获得所述第一执行路径代码;所述第一保证代码生成器生成用于将所述第一另一变量恢复为原始变量的第一保证代码,所述第一另一变量需要出现在所述指定执行路径的出口处;所述第二执行路径代码生成器在由所述第一执行路径代码生成器和由所述第一保证代码生成器所生成的代码串中所引用的变量经常保持特定值时,拷贝所述代码串,并将所拷贝的代码串中经常保持所述特定值的所述变量替换为由所述变量保持的值,并且在所述代码串中被引用的变量所保持的值不同于所述替换后的值时,生成通过在所述代码串的头部插入条件分支指令而获得的第二执行路径代码,在所述条件分支指令中条件被设置分支到所述指定执行路径的外部;当所述部分指令串中存在在多个控制合流的基本块中定义的这种变量时,所述汇合定义变量替换设备将变量的定义点和引用点替换为第二另一变量;所述汇合定义变量保证代码生成器在所述部分指令串的出口处生成用于将所述第二另一变量恢复为原始变量的变量保证代码,所述第二另一变量需要出现在所述部分指令串的所述出口处;所述第三执行代码生成器生成第三执行路径代码,该第三执行路径代码是与在执行所述汇合定义变量替换设备和所述汇合定义变量保证代码生成器之后由所述执行路径指定设备指定的所述执行路径上整个指令串相对应的目标代码,并且通过将需要出现在所述指定执行路径的入口处并且在所述指定执行路径上定义的变量替换为第三另一变量而获得;所述第二保证代码生成器生成用于将所述第三另一变量替换为原始变量的第二保证代码,所述第三另一变量需要出现在所述指定执行路径的出口处;所述部分代码生成器生成与在执行所述汇合定义变量替换设备和所述汇合定义变量保证代码生成器之后的所述部分指令串相对应的部分代码;
当执行所述指定执行路径的所述分支条件不成立时,所述第一分支代码生成器根据所述第三执行路径代码中的条件分支指令的条件,生成第一分支代码,从而使得所述第三执行路径代码中的所述条件分支指令的分支目标成为在所述部分代码中的所述分支条件不成立的情况下的分支目标;当执行所述指定执行路径的分支条件不成立时,所述第二分支代码生成器根据所述第一执行路径代码中的条件分支指令的条件,在所述第一执行路径代码中的所述分支指令中生成分支到所述第三执行路径代码的起点的第二分支代码;当执行所述指定执行路径的分支条件不成立时,所述第三分支代码生成器根据所述第二执行路径代码中的条件分支指令的条件,在所述第二执行路径代码中的所述分支指令中生成分支到所述第一执行路径代码的起点的第三分支代码;所述依赖分析器根据对所述由所述第一执行路径代码生成器、所述第一保证代码生成器、所述第二执行路径代码生成器、所述第三执行路径代码生成器和所述第二保证代码生成器生成的每个代码串中的所述指令之间的依赖关系所进行的分析,计算指令之间的依赖关系;和所述并行化设备根据由所述依赖分析器计算的所述指令之间的所述依赖关系,重新布置所述指定执行路径上的所述指令。
这对应于多个上述技术内容的组合,从而使得能够以近乎理想的方式缩短处理时间。
(19)根据本发明的编译器方法对应于上述编译器装置(1)。这是一种用于将包括分支指令的源程序转换为目标程序的编译器方法,目标程序是一串目标代码,该方法包括下列步骤执行路径指定步骤,用于从中间包括分支指令的部分指令串中的多个执行路径中指定单个执行路径,所述部分指令串构成所述源程序;第一执行代码生成步骤,用于通过将在所述执行路径指定步骤中所指定的执行路径上定义的、并且需要出现在所述指定执行路径的入口处的变量替换为另一变量而生成第一执行路径代码;保证代码生成步骤,用于生成用来将所述另一变量恢复为原始变量的保证代码,所述另一变量在所述第一执行路径代码生成步骤中被替换并且也需要出现在所述指定执行路径的出口处;部分代码生成步骤,用于生成与所述部分指令串相对应的部分代码;第一分支代码生成步骤,用于当用于执行所述指定执行路径的分支条件不成立时,根据所述指定执行路径上条件分支指令的条件生成第一分支代码,其分支到所述指定执行路径上的所述条件分支指令中所述部分代码的起点;第一依赖分析步骤,用于根据对所述指定执行路径上的指令之间的依赖关系所进行的分析来计算依赖关系,增加所述保证代码和与所述指定执行路径上的所述条件分支指令相对应的所述分支代码之间的依赖,从而使得所述保证代码在所述指定执行路径上的所述条件分支指令之后执行,并且还增加所述指令之间的依赖从而使得不生成异常;和并行化步骤,用于根据由所述第一依赖分析步骤增加的所述指令之间的所述依赖,重新布置所述指定执行路径上的所述指令。
(20)上述编译器方法(19)还存在这样的实施例,其中该方法进一步包括返回点设置指令代码生成步骤,用于在所述指定执行路径的执行期间生成异常时,增加用于规定所述指定执行路径上的返回点的指令代码;和第二依赖分析步骤,用于根据对所述指定执行路径上指令之间的依赖关系的分析,增加所述保证代码和与所述指定执行路径上的所述条件分支指令相对应的所述分支代码之间的依赖,从而使所述保证代码在所述指定执行路径上的所述条件分支指令之后执行,其中存在这样的实施例,即所述第二依赖分析步骤不增加由所述第一依赖分析步骤在所述指令之间增加以避免生成异常的那些依赖。这对应于上述(5)的编译器装置。
(21)上述编译器方法(20)还存在这样的实施例,其中该方法进一步包括中断生成处的处理例程增加步骤,用于在生成异常时,向所述目标代码增加一处理例程,该处理例程用于返回由所述指令代码指定的所述返回点。这对应于上述(6)的编译器装置。
(22)进一步,根据本发明的编译器方法是一种用于将包括分支指令的源程序转换为目标程序的方法,目标程序是一串目标代码,该方法包括以下步骤执行路径指定步骤,用于从中间包括分支指令的部分指令串中的多个执行路径中指定单个执行路径,所述部分指令串构成所述源程序;第一执行代码生成步骤,用于生成第一执行路径代码,该第一执行路径代码是与由所述执行路径步骤指定步骤指定的执行路径上的整个指令串相对应的目标代码,并且通过将需要出现在所述指定执行路径入口处、并且在由所述执行路径步骤指定步骤所指定的所述执行路径上定义的变量替换为第一另一变量而获得所述第一执行路径代码;第一保证代码生成步骤,用于生成用来将所述第一另一变量恢复为原始变量的第一保证代码,所述第一另一变量需要出现在所述指定执行路径的出口处;第二执行路径代码生成步骤在由所述第一执行路径代码生成步骤和由所述第一保证代码生成步骤所生成的代码串中所引用的变量经常保持特定值时,拷贝所述代码串,并将所拷贝的代码串中经常保持所述特定值的所述变量替换为由所述变量保持的值,并且在所述代码串中被引用的变量所保持的值不同于所述替换后的值时,生成通过在所述代码串的头部插入条件分支指令而获得的第二执行路径代码,在所述条件分支指令中条件被设置分支到所述指定执行路径的外部;汇合定义变量替换步骤,用于当所述部分指令串中存在在多个控制合流的基本块中定义的这种变量时,将变量的定义点和引用点替换为第二另一变量;
汇合定义变量保证代码生成步骤,用于针对需要出现在所述部分指令串的所述出口处的第二另一变量,生成用来将所述第二另一变量恢复为原始变量的变量保证代码;第三执行代码生成步骤,用于生成第三执行路径代码,该第三执行路径代码是与在执行所述汇合定义变量替换步骤和所述汇合定义变量保证代码生成步骤之后所述指定执行路径上的整个指令串相对应的目标代码,并且通过将需要出现在所述指定执行路径的入口处并且在所述指定执行路径上定义的变量替换为第三另一变量而获得;第二保证代码生成步骤,用于生成用来将所述第三另一变量替换为原始变量的第二保证代码,所述第三另一变量需要出现在所述指定执行路径的出口处;部分代码生成步骤,用于生成与在执行所述汇合定义变量替换步骤和所述汇合定义变量保证代码生成步骤之后的所述部分指令串相对应的部分代码;第一分支代码生成步骤,用于当执行所述指定执行路径的分支条件不成立时,根据所述第三执行路径代码中的条件分支指令的条件,生成第一分支代码,从而使得所述第三执行路径中的所述条件分支指令的分支目标成为在所述部分代码中的所述分支条件不成立的情况下的分支目标;第二分支代码生成步骤,用于当执行所述指定执行路径的分支条件不成立时,根据所述第一执行路径代码中的条件分支指令的条件,在所述第一执行路径代码中的所述分支指令中生成分支到所述第三执行路径代码的起点的第二分支代码;第三分支代码生成步骤,用于当执行所述指定执行路径的分支条件不成立时,根据所述第二执行路径代码中的条件分支指令的条件,在所述第二执行路径代码中的所述分支指令中生成分支到所述第一执行路径代码的起点的第三分支代码;依赖分析步骤,用于根据对所述由所述第一执行路径代码生成步骤、所述第一保证代码生成步骤、所述第二执行路径代码生成步骤、所述第三执行路径代码生成步骤和所述第二保证代码生成步骤生成的每个代码串中的所述指令之间的依赖关系所进行的分析,计算指令之间的依赖关系;和并行化步骤,用于根据由所述依赖分析步骤计算的所述指令之间的所述依赖关系,重新布置所述指定执行路径上的所述指令。这对应于上述(18)的编译器装置。
(23)根据本发明的编译器程序对应于上述(19)的编译器方法。它是一种用于将包括分支指令的源程序转换为目标程序的编译器程序,目标程序是一串目标代码。该方法允许计算机执行下列步骤执行路径指定步骤,用于从中间包括分支指令的部分指令串中的多个执行路径中指定单个执行路径,所述部分指令串构成所述源程序;第一执行代码生成步骤,用于通过将在由所述执行路径指定步骤所指定的执行路径上定义的、并且需要出现在所述指定执行路径的入口处的变量替换为另一变量而生成第一执行路径代码;保证代码生成步骤,用于生成用来将所述另一变量恢复为原始变量的保证代码,所述另一变量被所述第一执行路径代码生成步骤替换并且也需要出现在所述指定执行路径的出口处;部分代码生成步骤,用于生成与所述部分指令串相对应的部分代码;第一分支代码生成步骤,用于当用于执行所述指定执行路径的分支条件不成立时,根据所述指定执行路径上条件分支指令的条件生成第一分支代码,其分支到所述指定执行路径上的所述条件分支指令中所述部分代码的起点;第一依赖分析步骤,用于根据对所述指定执行路径上的所述指令之间的依赖关系所进行的分析来计算依赖关系,增加所述保证代码和与所述指定执行路径上的所述条件分支指令相对应的所述分支代码之间的依赖,从而使得所述保证代码在所述指定执行路径的所述条件分支指令之后执行,并且还增加指令之间的依赖从而使得不生成异常;和并行化步骤,用于根据在所述第一依赖分析步骤中增加的所述指令之间的所述依赖,重新布置所述指定执行路径上的所述指令。
(24)上述编译器程序(23)中还存在这样的实施例,其中该程序进一步包括由计算机执行的如下步骤返回点设置指令代码生成步骤,用于在所述指定执行路径的执行期间生成异常时,增加用于规定所述指定执行路径上的返回点的指令代码;和第二依赖分析步骤,用于根据对所述指定执行路径上指令之间的依赖关系的分析,增加所述保证代码和与所述指定执行路径上的所述条件分支指令相对应的所述分支代码之间的依赖,从而使所述保证代码在所述指定执行路径上的所述条件分支指令之后执行,其中所述第二依赖分析步骤不增加由所述第一依赖分析步骤在所述指令之间增加以避免生成异常的那些依赖。这对应于上述(20)的编译器方法。
(25)上述编译器程序(24)还存在这样的实施例,其中该程序进一步包括由计算机执行的以下步骤中断生成处的处理例程增加步骤,用于在生成异常时,向所述目标代码增加一处理例程,该处理例程用于返回由所述指令代码指定的所述返回点。这对应于上述(21)的编译器方法。
(26)更进一步,根据本发明的编译器程序是一种用于将包括分支指令的源程序转换为目标程序的方法,目标程序是一串目标代码。该方法允许计算机执行以下步骤执行路径指定步骤,用于从中间包括分支指令的部分指令串中的多个执行路径中指定单个执行路径,所述部分指令串构成所述源程序;第一执行代码生成步骤,用于生成第一执行路径代码,该第一执行路径代码是与由所述执行路径指定步骤指定的执行路径上的整个指令串相对应的目标代码,并且通过将需要出现在所述指定执行路径入口处、并且在由所述执行路径指定步骤所指定的所述执行路径上定义的变量替换为第一另一变量而获得所述第一执行路径代码;第一保证代码生成步骤,用于生成用来将所述第一另一变量恢复为原始变量的第一保证代码,所述第一另一变量需要出现在所述指定执行路径的出口处;第二执行路径代码生成步骤,用于在由所述第一执行路径代码生成步骤和由所述第一保证代码生成步骤所生成的代码串中所引用的变量经常保持特定值时,拷贝所述代码串,然后将所拷贝的代码串中经常保持所述特定值的所述变量替换为由所述变量保持的值,并且在所述代码串中被引用的变量所保持的值不同于所述替换后的值时,生成通过在所述代码串的头部插入条件分支指令而获得的第二执行路径代码,在所述条件分支指令中条件被设置分支到所述指定执行路径的外部;汇合定义变量替换步骤,用于当所述部分指令串中存在在多个控制合流的基本块中定义的这种变量时,将变量的定义点和引用点替换为第二另一变量;汇合定义变量保证代码生成步骤,用于针对需要出现在所述部分指令串出口处的所述第二另一变量,生成用来在所述部分指令串的出口处将所述第二另一变量恢复为原始变量的变量保证代码;第三执行代码生成步骤,用于生成第三执行路径代码,该第三执行路径代码是与在执行所述汇合定义变量替换步骤和所述汇合定义变量保证代码生成步骤之后所述指定执行路径上的整个指令串相对应的目标代码,并且通过将需要出现在所述指定执行路径的入口处并且在所述指定执行路径上定义的变量替换为第三另一变量而获得;第二保证代码生成步骤,用于生成用来将所述第三另一变量替换为原始变量的第二保证代码,所述第三另一变量需要出现在所述指定执行路径的出口处;部分代码生成步骤,用于生成与在执行所述汇合定义变量替换步骤和所述汇合定义变量保证代码生成步骤之后的所述部分指令串相对应的部分代码;第一分支代码生成步骤,当执行所述指定执行路径的分支条件不成立时,所述第一分支代码生成步骤根据所述第三执行路径代码中的条件分支指令的条件,生成第一分支代码,从而使得所述第三执行路径代码上的所述条件分支指令的分支目标成为在所述部分代码中的所述分支条件不成立的情况下的分支目标;第二分支代码生成步骤,用于当执行所述指定执行路径的分支条件不成立时,根据所述第一执行路径代码中的条件分支指令的条件,在所述第一执行路径代码中的所述分支指令中生成分支到所述第三执行路径代码的起点的第二分支代码;第三分支代码生成步骤,用于当执行所述指定执行路径的分支条件不成立时,根据所述第二执行路径代码中的条件分支指令的条件,在所述第二执行路径代码中的所述分支指令中生成分支到所述第一执行路径代码的起点的第三分支代码;依赖分析步骤,用于根据对由所述第一执行路径代码生成步骤、所述第一保证代码生成步骤、所述第二执行路径代码生成步骤、所述第三执行路径代码生成步骤和所述第二保证代码生成步骤生成的每个代码串中的所述指令之间的依赖关系所进行的分析,计算指令之间的依赖关系;和并行化步骤,用于根据由所述依赖分析步骤计算的所述指令之间的所述依赖关系,重新布置所述指定执行路径上的所述指令。这对应于上述(21)的编译器方法。
进一步,根据本发明的编译器装置可以具有用于顺序执行源程序的解释器功能,并且可以包括路径提取设备,其通过使用解释器功能来收集并行指令串中执行路径的信息,并且提取以高频率执行的执行路径,其中执行路径指定设备指定由提取设备提取的执行路径。更进一步,编译器装置可以包括值提取设备,其通过使用解释器功能来收集在以高频率执行的执行路径上被引用的变量所保持的值的信息,并提取以高频率出现的值,而所提取的变量和该值可以用在执行路径代码生成器中。
如果这样构造编译器装置,能够从解释器获得关于具有高执行频率的执行路径的更精确信息和关于由变量保持的值的更精确信息,这些信息更加对应于执行时的操作模式。因此,与通过用户的指定或者使用特定经验值而向编译器给出信息的情况相比,能够提高执行速度。
根据本发明,因为扩展了指定执行路径上的基本块,而且也扩大了调度目标的范围,所以能够更有效地实现优化。进一步,构造这样的结构,使得优先执行执行路径上的指令语句,并且执行路径中间不包含分支。因此,当该执行路径的执行几率高于其它执行路径的执行几率时,能够提高执行路径的执行速度。
进一步,由于热路径上可能生成异常的指令可以不受约束地在热路径上移动,可以因此可以进一步促进指令的并行执行。结果是,可以提高执行速度。
更进一步,由于执行路径上的变量可以被替换为恒定值,增加了执行恒定值传播优化的机会。因此,可以进一步提高执行速度。
另外,当执行指定执行路径的分支条件不成立时,执行路径被分支到部分代码中间。因此,即使在执行指定执行路径的分支条件不成立的情况下,与从部分代码起点开始执行的情况相比,也能提高执行速度。
进一步,能够从解释器获得关于具有高执行频率的执行路径的更精确信息和关于由变量保持的值的更精确信息,这些更对应于执行时的操作模式。因此,与通过用户的指定或者使用特定经验值向编译器给出信息的情况相比,能够提高执行速度。
根据本发明的编译器装置、编译器方法和编译器程序能够转换包含多个执行路径的程序,从而提高以高频率执行的执行路径的执行速度。因此,可以通过载入到数字家庭电器等的信息处理器来使用本发明的编译器装置、编译器方法和编译器程序。
本发明的其它目的以及优点将由于以下对优选实施例和所附权利要求的描述而变得清晰。在实施本发明之后,本领域技术人员就会认识到本发明还存在许多其他优点。
图1是根据本发明实施例的编译器装置的功能性构成图;图2是根据本发明实施例的编译器装置的操作流程图;图3是由变量信息计算部分进行的变量信息计算处理的流程;图4是由执行路径中间代码生成部分进行的变量替换处理的流程;图5A和图5B是用于描述根据本发明实施例的编译器装置操作的示意图;图6是用来描述传统技术及其问题的示意图;图7是用来描述传统技术及其问题的示意图;图8是用来描述传统技术及其问题的示意图;图9A-图9C是示出由变量信息计算部分所计算的变量信息、以及由执行路径中间代码生成部分生成的变量配对的结构和生成历史内容示例的示意图;图10是用来描述根据本发明实施例的编译器装置的操作的示意图;图11是用来描述根据本发明实施例的编译器装置的操作的示意图;图12是由中间代码依赖分析部分生成的依赖分析信息的示意图;图13是由中间代码并行化部分进行指令调度的执行路径中间代码的示意图;图14是用来描述根据本发明改进示例1的编译器装置的操作的示意图;图15是根据改进示例1由中间代码依赖分析部分生成的依赖分析信息的示意图;图16是示出根据改进示例1由中间代码并行化部分进行指令调度的执行路径中间代码的示意图;图17是示出当生成异常时根据改进示例1的目标程序的操作的示意图;图18是用来描述根据改进示例2的编译器装置的操作的示意图;图19是根据改进示例2由中间代码依赖分析部分生成的依赖分析信息的示意图;图20是根据改进示例2由中间代码并行化部分进行指令调度的执行路径中间代码的示意图;图21是用来描述根据改进示例3的编译器装置的操作的示意图;图22是根据改进示例3由中间代码并行化部分进行指令调度的执行路径中间代码的示意图;图23是根据改进示例4的编译器装置的功能型构成图;图24是根据改进示例4的编译器装置的操作流程图;图25A和图25B是用来描述根据改进示例4的编译器装置的操作的示意图;图26是用来描述根据改进示例4的编译器装置的操作的示意图;图27A-图27C是示出根据改进示例4由变量信息计算部分所计算的变量信息、以及由执行路径中间代码生成部分生成的变量配对的结构和配对生成历史内容示例的示意图;图28是用来描述根据改进示例4的编译器装置的操作的示意图;图29是用来描述根据改进示例4的编译器装置的操作的示意图;图30是根据改进示例4由中间代码依赖分析部分生成的依赖分析信息的示意图;图31是根据改进示例4由中间代码并行化部分进行指令调度的执行路径中间代码的示意图;图32是用来描述根据改进示例4的编译器装置的操作的示意图;图33是用来描述根据本发明实施例的编译器装置的操作的示意图;图34是用来描述根据本发明实施例的编译器装置的操作的示意图;图35是用来描述根据本发明实施例的编译器装置的操作的示意图;图36A-图36C是用来描述根据本发明改进示例的编译器装置的操作的示意图。
具体实施例方式
在下文中,将参照附图描述本发明的优选实施例。
<实施例>
一种根据本发明的编译器装置读取源程序;进行词/短语分析,以将程序分解为词/短语串;进行语法分析,从而根据词/短语串创建编程语言中的语法树;基于语法分析所创建的语法树在装置内部创建用中间代码写成的中间程序;针对中间程序进行诸如指令调度的优化处理;以及在对变量进行诸如寄存器等资源的分配之后,将中间程序转换为执行格式程序。
(结构)图1是示出根据本发明实施例的编译器装置A的整体结构的功能框图。编译器装置A包括语法分析单元1、优化单元2、资源分配单元3和执行代码生成单元4。具体而言,编译器装置A是通过使用微处理器、ROM(只读存储器)、RAM(随机存取存储器)、硬盘设备等实现的计算机系统。ROM或硬盘设备存储计算机程序。图1所示编译器装置中各部分的功能可以在微处理器执行计算机程序时实现。进一步,通过使用RAM和硬盘设备,能够存储并在各部分之间交换信息。
在下文中描述各部分的功能。语法分析单元1读出源程序F1,进行语法分析以识别源程序F1中的控制结构,产生作为中间代码串的中间程序,并将其存储在编译器装置A中。通过使用条件分支中间代码、分支中间代码以及标签中间代码来表述中间程序的控制结构,从而使其成为与源程序F1的控制结构等效的控制结构。条件分支中间代码由判断中间代码(例如图11中S202的t1<=0)和分支中间代码(例如图11中S203的goto S1)构成,所述判断中间代码显示对条件的判断,所述分支中间代码指示在对条件的判断为真的情况下的分支目标。
优化单元2通过包括程序转换部件2A和中间代码部件调度部件2B而构成。优化单元2对语法分析单元1中生成的中间程序进行控制流分析和数据流分析,并将分析结果输出至将在后面描述的程序转换部件2A。通过分析中间程序的控制流来进行控制流分析,从而将中间程序划分成基本块。执行数据流分析,以分析变量的存在时段、定义点和引用点。
下面说明如何确定关于变量的定义和引用。当中间代码中变量的值被更新时,这被表述成“变量在该中间代码中被定义”,并且该中间代码被称为变量的定义点。进一步,当中间代码中变量的值被使用时,这被表述成“变量在该中间代码中被引用”,并且该中间代码通常被当作该变量的引用点。
下面将要描述程序转换部件2A。程序转换部件2A包括变量信息计算部分2a、执行路径中间代码生成部分2b、判断中间代码生成部分2c、保证中间代码生成部分2d、分支中间代码生成部分2e。
当从外部向装置输入热路径信息F2时,程序转换部件2A将其存储在程序转换部件2A的内部,并对包括热路径HP(执行路径的标号)的子例程进行程序转换。
这里,用户输入用来指示用户预先确定的执行路径的信息,作为热路径F2。在对实施例的解释中,包括热路径的子例程程序称为部分程序,而部分程序包含共享热路径HP的起点和终点的多个执行路径。另外,在对实施例的解释中,与部分程序对应的中间代码串通常被当作部分中间代码串。
变量信息计算部分2a根据从优化单元2发送的分析结果计算每个基本块中变量的存在信息和定义信息,并根据所计算出的存在信息和定义信息以及热路径信息F2计算路径输入变量X1、路径输出变量X2、路径替换目标变量X3和保证变量X4(例如,参见图9B)(参见图2中的步骤n14)。进一步,变量信息计算部分2a将计算出的路径替换目标变量X3发送给执行路径中间代码生成部分2b,并将路径保证变量X4发送给保证中间代码生成部分2d。
变量存在信息指示存在于入口处的变量(以下称为“存在信息IN”)和存在于出口处的变量(以下称为“存在信息OUT”),所述入口是由控制流分析生成的每个基本块的起点,所述出口是每个基本块的终点。存在信息IN是在基本块的入口处或入口之后的先被引用后被定义的变量,而存在信息OUT是在基本块的出口处或出口之后的先被引用后被定义的变量。进一步,变量定义信息(以下称为定义信息DEF)指示在每个块中被定义的变量。对于变量的存在,它与上述非专利文献2中描述的存在相同。
路径输入变量X1是在热路径HP的入口处存在的变量,其指示作为热路径HP起点的基本块中的存在信息IN。路径输出变量X2是在热路径HP出口处存在的变量,其指示作为热路径HP终点的基本块中的存在信息OUT。
路径替换目标变量X3所指示的是既是路径输入变量X1而且也在热路径HP上定义的变量。路径保证变量X4所指示的是既是路径替换目标变量X3而且也是路径输出变量X2的变量。
执行路径中间代码生成部分(第一执行路径代码生成器)2b读出存储在程序转换部件2A中的热路径信息F2和存储在编译器装置A中的中间程序。然后,对于中间程序的热路径HP上的中间代码串,执行路径中间代码生成部分2b生成执行路径中间代码串,其中从变量信息计算单元部分2a发送的路径替换目标变量X3的标识符被替换,执行路径中间代码生成部分2b并且将所生成的执行路径中间代码串发送给判断中间代码生成部分2c(参见图2中的步骤n15和图4)。
现在描述对路径替换目标变量X3的标识符的替换。执行路径中间代码生成部分2b将路径替换目标变量X3的标识符替换为不在变量名表中的标识符,在所述变量名表中示出了与变量的标识符等相关的信息。执行路径中间代码生成部分2b生成变量配对,并将所生成的变量配对存储到程序转换部件2A,所述变量配对被仅仅作为变量替换物的路径替换目标变量X3所替换。变量名表是这样一张表,其中收集与在词/短语分析时刻在程序中声明的变量的标识符和类型等相关信息,并且该表存储在编译器装置A中。对于路径替换目标变量X3的标识符的替换,可以参照图10中的t1-t3。进一步,针对替换后变量的配对,可以参照图9C和图4中的步骤n48。
判断中间代码生成部分(部分代码生成器)2c设置从执行路径中间代码生成部分2b发送的执行路径中间代码串中包含的条件分支中间代码中的判断中间代码,从而以未执行热路径HP为条件,并将所转换的执行路径中间代码串存储在程序转换部件2A的内部。另外,在将条件设置为未执行热路径HP时,可以参考图11中所示S202、S203到B1的转变。
保证中间代码生成部分(保证代码生成器)2d根据从变量信息计算部分2a发送的路径保证变量X4,生成保证中间代码串,其是用于将路径保证变量的标识符恢复为原始标识符的中间代码串。然后保证代码生成部分2d将其布置为紧接在执行路径中间代码串之后,并将其存储到程序转换部件2A的内部(参见图11中的S301)。在这里,由执行路径中间代码串和保证中间代码串构成的中间代码串称为高速块(参见图11中的H1)。高速块H1的特征在于,即使在条件分支中间代码中存在从高速块H1中间朝着高速块外部的分支,也不存在朝着高速块H11内部的分支。
分支中间代码生成部分(第一分支代码生成器)2e读出程序转换部件2A的执行路径中间代码串中包含的条件分支中间代码。当条件分支中间代码中的判断中间代码的条件为真时,分支中间代码生成部分2e将条件中间代码的分支中间代码设置为分支到部分中间代码起点的分支中间代码,与此同时,将执行路径中间代码串存储到程序转换部件2A的内部。进一步,分支中间代码生成部分2e将编译器装置A中所存储的部分中间代码串设置为子例程。亦即,在部分中间代码串的终点之后立即分支到中间代码的分支中间代码,被插入到部分中间代码串的终点。进一步,分支中间代码生成部分2e将存储在程序转换部件2A内部的高速块H11布置以下两点之间的位置,即在部分中间代码串起点所紧跟的中间代码不久之后的点和在紧跟部分中间代码终点的中间代码不久之前的点。然后,分支中间代码生成部分2e将以这种方式处理的部分中间代码(部分中间代码串)存储到编译器装置2A的内部。如图11所示的程序结构可用作这里的参考。对于到部分中间代码起点的分支,可以参考图11所示程序结构中的跳转到S1(goto S1)。进一步,关于插入分支中间代码可以参考图11的程序结构中的S151,所述分支中间代码分支到部分中间代码串终点不久之后的中间代码。
接下来将描述中间代码调度部件2B。中间代码调度部件2B读出存储在编译器装置A中的中间程序,并通过中间代码依赖分析部分2f进行依赖分析,以便确定中间代码指令之间的执行次序。进一步,中间代码调度部件2B利用中间代码并行化部分2g重布置中间程序的中间代码,从而使其可以并行执行。针对依赖分析可以参考图12。进一步,关于中间代码的重布置,可以参考从图11的高速块H1到图13的高速块H1的改变。
具体来说,在此将描述在本发明中中间代码依赖分析部分2f和中间代码并行化部分2g对高速块H1的处理。其它部分采用与非专利文献1中记载的方法相同的方法。
中间代码依赖分析部分(第一依赖分析器)2f分析高速块中中间代码串中的中间代码之间的依赖关系,并将作为分析结果的依赖分析信息发送给中间代码并行化部分2g。在本发明中,根据上述分析等设置中间代码之间的具体依赖关系被表述为依赖的生成。尽管对常规操作者来说,中间代码依赖分析部分2f生成与非专利文献1中所述相同的依赖,但是其对一部分中间代码产生特别的依赖。将在下文中描述这一点。
首先,中间代码依赖分析部分2f生成从分支条件中间代码到保证中间代码的依赖,从而使得在执行高速块H1中的保证中间代码之前,执行高速块H1中的分支条件中间代码。对此,可以参照图12,其中S202和S203被放在比S301高的位置。
其次,中间代码依赖分析部分2f指定异常生成中间代码,其是可以导致异常的中间代码,中间代码依赖分析部分2f还指定作为生成异常之原因的异常生成变量。进一步,中间代码依赖分析部分2f判断用于通过引用所指定的异常生成变量来进行判断的判断中间代码是否在异常生成中间代码之前执行。当其判断出判断中间代码在异常生成中间代码之前执行时,中间代码依赖分析部分2f生成从判断中间代码到异常生成中间代码的依赖,以便维持执行次序。对此,可以参考图12,其中S203被放在高于S102的位置。进一步,导致异常意味着生成不能进行处理的状态(即,异常),因为当S102的代入语句(substitute sentence)在S203之前执行时除数f为0(零除)。
中间代码并行化部分(并行化设备)2g根据从中间代码依赖分析部分2f发送来的依赖分析信息对高速块H1中中间代码串进行调度,从而进行并行化(参见图13)。在此,关于调度方法,可以使用非专利文献1中所述的列表调度法。
当读出所生成的整个中间代码并由中间代码生成执行代码时,资源分配单元3根据整个中间代码中变量的存在信息将诸如寄存器和存储器等硬件资源分配给每个变量。执行代码生成单元4将资源所分配给的整个中间代码转换成机器语言的执行代码,并将这些执行代码输出到编译器装置的外部。
<数据>
将要描述根据本实施例的编译器装置A中所使用的数据。在图9A示出的结果中,变量信息计算部分2a已经按照图5B所示控制流图中每个基本块计算出IN12、OUT14作为变量的存在信息、DEF13作为定义信息。在图9B示出的结果中,变量信息计算部分2a已经根据图9A中所示计算的结果计算出路径输入变量X1、路径输出变量X2、路径替换目标变量X3和路径保证变量X4。图9C示出变量配对的生成历史,通过由执行路径中间代码生成部分2b在图5B所示控制流图的每个基本块中将变量替换为路径替换目标变量X3而生成所述变量配对。图10所示控制流图示出根据处理重新生成的执行路径,在所述处理中执行路径中间代码生成部分2b拷贝图5B的热路径HP上的中间代码,并对所拷贝的中间代码进行变量替换处理。
<操作>
接下来将描述图2所示的操作流,并以作为本发明特征部分的优化单元2内部的操作为重点。首先,当输入源程序F1时,语法分析单元1进行语法分析,以生成中间程序,并将其存储到编译器装置A的内部(步骤n11)。
然后,在接收到热路径信息F2(图1)的输入之后,程序转换部件2A将热路径信息F2存储在其内部(步骤n12)。
在步骤n12之后,优化单元2读出中间程序,对所读出的中间程序进行控制流分析和数据流分析,并将分析结果发送给变量信息计算部分2a。变量信息计算部分2a根据优化单元2获得的分析结果,计算部分程序的每个基本块中变量的存在信息(IN,OUT)和定义信息(DEF)(步骤n13)。
然后,变量信息计算单元2a根据在步骤n13中计算的存在信息(IN,OUT)、定义信息DEF和步骤n12中输入的热路径信息F2,计算部分中间代码串的路径输入变量X1、路径输出变量X2、路径替换目标变量X3和保证变量X4。变量信息计算部分2a将路径替换目标变量X3发送给执行路径中间代码生成部分2b,并将路径保证变量X4发送给保证中间代码生成部分2d(步骤n14)。
在步骤n14之后,执行路径中间代码生成部分2b读出热路径信息F2和部分中间代码串,并拷贝与所读出的部分中间代码串中的热路径HP对应的中间串。进一步,执行路径中间代码生成部分2b通过替换所拷贝中间代码串中路径替换目标变量X3的标识符来生成执行路径中间代码串,并将所生成的执行路径中间代码串发送给判断中间代码生成部分2c(步骤n15)。更进一步,对此可以参考图10中的程序。路径替换目标变量X3的标识符的替换符合c→t1、c→t2以及d→t3。
然后,在接收执行路径中间代码串之后,判断中间代码生成部分2c将包含在执行路径中间代码串中的条件分支中间代码中的判断中间代码设置为以不执行热路径为条件,并将所设置的判断中间代码存储到程序转换部件2A内部(步骤n16)。
条件分支中间代码中的判断中间代码对应于图10中程序的下列各项。
S32IF(t1>0)goto S4S92IF(f>0)goto S10“设置判断中间代码为以不执行热路径为条件”对应于图11中程序的下列各项。
S202IF(t1<=0)goto S1S203IF(f<=0)goto S1在此,判断条件的逻辑被反转从而将目标为来自较低流的子例程的部分中间代码串的开始S1。结果是,当逻辑反转之后的判断条件变为肯定时,不执行热路径。
然后,保证中间代码生成部分2d生成保证中间代码串,用于恢复从变量信息计算部分2a接收的路径保证变量X4,并将其存储到程序转换部件2A的内部。进一步,保证中间代码生成部分2d将保证中间代码布置在执行路径中间代码串之后以构造高速块,并将其存储到程序转换部件2A内部(步骤n17)。这对应于在生成基本块B103之后通过将所生成的基本块B103布置在基本块B104之后而构建图11的程序中高速块H1(S301c=t2)。
在步骤n17之后,分支中间代码生成单元2e读出在步骤16中存储的执行路径中间代码串中的条件分支中间代码。然后,分支中间代码生成单元2e将条件分支中间代码中的分支中间代码设置为从分支中间代码起点开始执行,并将这样设置的条件分支中间代码存储到程序转换部件2A的内部。更进一步,分支中间代码生成单元2e将部分中间代码设置为子例程,并将结果存储到编译器装置A的内部(步骤n18)。
在图11的程序中,这对应于将条件分支中间代码S202和分支中间代码S203中相应的分支中间代码分支到作为部分程序起点的块B1的中间代码S1。执行路径中间代码串对应于图11左侧的串,而子例程部分中间代码对应于图11右侧的串。
在步骤n18之后,优化单元2对存储在编译器装置A内部的中间程序进行处理以消除冗余。优化单元2将被执行消除冗余处理的中间程序存储到编译器装置A的内部(步骤n19)。消除冗余处理与上述非专利文献中描述的一样,并且其示例包括为了消除徒然操作而进行的处理。
在步骤n19之后,中间代码依赖分析部分2f对存储在编译器装置A内部的中间程序中的中间代码进行依赖分析(参见图12),并将作为其分析结果的依赖分析信息发送给中间代码并行化部分2g。中间代码依赖分析部分2f在考虑上述异常生成中间代码时,特别地对高速块H1进行依赖分析(步骤n20)。
在步骤n20之后,中间代码并行化部分2g根据从中间代码依赖分析部分2f接收的依赖分析信息,对存储在编译器装置A内部的中间程序进行并行化。
<变量信息计算处理>
接着将参照图3描述变量信息计算处理。这对应于图2中的步骤n13和n14。在步骤n13中,优化单元2对部分中间代码进行控制流分析和数据流分析。然后,在步骤n32中,变量信息计算部分2a根据控制流分析和数据流分析的结果,计算部分程序中变量的存在信息(IN,OUT)和定义信息(DEF)。
随后,在步骤n32中所计算的存在信息IN当中,变量信息计算部分2a将作为热路径起点的基本块的存在信息IN确定为路径输入变量X1;在步骤n32中所计算的存在信息OUT当中,变量信息计算部分2a将作为热路径终点的基本块的存在信息OUT确定为路径输出变量X2(步骤n33)。
在步骤n33之后,变量信息计算部分2a将作为热路径上定义信息DEF并且也作为路径输入变量X1的变量确定为路径替换目标变量X3(步骤n34)。
随后,变量信息计算部分2a将作为在步骤n34中所确定的路径替换目标变量X3并且也作为路径输出变量X2的变量确定为路径保证变量X4,并将路径保证变量X4和路径替换目标变量X3发送给执行路径中间代码生成部分2b(步骤n35)。
<变量替换处理>
在接收到从变量信息计算部分2a发送来的路径替换目标变量X3的数据之后,执行路径中间代码生成部分2b读出部分中间代码和热路径信息F2,拷贝与部分中间代码的热路径HP相对应的中间代码,并对所拷贝中间代码的路径替换目标变量X3反复进行变量替换处理。通过进行上述处理,执行路径中间代码生成部分2b生成路径替换目标变量X3和通过变量替换处理得到的替换后变量的配对(以下称为“变量配对”)。这对应于图2中的步骤n15。
下面将参照图4描述由执行路径中间代码生成部分2b进行的变量替换处理。对拷贝的中间代码反复执行变量替换处理(步骤n41)。然后判断路径替换目标变量X3是否在中间代码中被引用(步骤n42)。当在步骤n42中判断出路径替换目标变量X3未被引用时,流程前进到步骤n45。
当在步骤n42中判断出其被引用时,判断路径替换目标变量X3是否被包含在已经产生的变量配对中(步骤n43)。当在步骤n43中判断出路径替换目标变量X3没有被包含时,流程前进到步骤n45。
当在步骤n43中判断出其被包含时,在指令语句中被引用的路径替换目标变量X3的标识符被替换为所述配对中包含的变量(步骤n44),然后流程前进到步骤n45。
在进行了上述处理(步骤n42-步骤n44)之后,判断路径替换目标变量X3是否在中间代码中被定义(步骤n45)。当在步骤n45中判断出其没有被定义时,流程退出循环n41-n49。当在步骤n45中判断出其被定义时,判断路径替换目标变量X3是否被包含在已有的变量配对中(步骤n46)。当在步骤n46中判断出其被包含时,消除路径替换目标变量X3(步骤n47),然后流程前进到步骤n48。当在步骤n46中判断出其没有被包含时,流程前进到步骤n48,而不执行步骤n47。
在步骤n48中,确定将被替换为所定义的路径替换目标变量X3的变量,在此之后,所定义的路径替换目标变量X3被替换为所确定的变量。然后,重新产生路径替换目标变量X3和替换后变量的配对。在执行了上述处理之后,流程退出循环n41-n49。
<操作示例>
接着将要参照图5、图9-图12描述图2中所示的操作流程的具体示例,从而示例图5A中作为源程序F1一部分的部分程序的情况。在此假设本示例中的中间代码用接近于源程序F1的中间代码来表达。
在步骤n11中,语法分析单元1对部分程序进行语法分析以生成部分中间代码,并将其存储到编译器装置A的内部。然后,在步骤n12中,程序转换部件2A在接收到热路径信息F2的输入之后,将热路径信息F2存储到程序转换部件2A的内部,在F2中按照控制流图的基本块B1、B2、B4、B5、B7的次序进行传输的路径HP被用作热路径(参见图5)在步骤n13中,优化单元2进行控制流分析和数据流分析,而变量信息计算部分2a计算控制流图(参见图5B)的基本块B1-B7(图9)中的存在信息IN、存在信息OUT、定义信息DEF。例如,基本块B1(参见图5B)的存在信息IN是包含在图9A的块B1的IN12中的变量,而同一块的存在信息OUT是包含在图9A中块B1的OUT14中的变量。进一步,同一基本块中的定义信息是包含在图9A中基本块B1的DEF13中的变量。
然后,在步骤n14中,变量信息计算部分2a根据图9A中所示的存在信息和定义信息以及在步骤n12中输入的热路径信息F2,计算路径输入变量X1、路径输出变量X2、路径替换目标变量X3和路径保证变量X4。
路径输入变量X1是存在于热路径HP的入口处的变量,即基本块B1的存在信息IN(参见图5B),其是包含在图9A所示块B1的IN2中的变量。路径输出变量X2是存在于热路径HP的出口处的变量,即基本块B7的存在信息OUT(参见图5B),其是包含在图9A所示块B7的OUT14中的变量。路径替换目标变量X3包含路径输入变量X1和热路径上的基本块B1、B2、B4、B5、B7中DEF13中所包含的变量(参见图9A)。路径保证变量X4是包含在路径输出变量X2和路径替换目标变量X3中的变量。
在本示例中,图9A中所示DEF13中包含的变量为{a,c,d,f,x},路径输入变量X1为{b,c,d,e,g,z,w,y},从而使得{c,d}的积集(productset)成为路径替换目标变量X3。进一步,路径输出变量X2是{a,c,e,f,z,w,x,y},从而使得{c}是路径保证变量X4。变量信息计算部分2a将所计算的路径替换目标变量X3发送给执行路径中间代码生成部分2b,并将所计算的路径保证变量X4发送给保证中间代码生成部分2d。
然后,在步骤n15中,执行路径中间代码生成部分2b读出部分中间代码和热路径信息F2,拷贝图5的热路径HP上的中间代码S1-S15,并生成包含所拷贝中间代码的新的基本块B12-B152。然后,对所拷贝中间代码的路径替换目标变量X3进行变量替换处理,以生成变量配对。图10示出了通过对所拷贝中间代码进行变量替换处理而新生成的执行路径。
在此,将描述变量替换处理的操作(图4),示例图10所示的基本块B12和B22。首先,在变量替换处理之前包含在基本块B12中的所拷贝中间代码与图5B所示基本块B1中所包含的中间代码相同。在基本块B12中所拷贝的中间代码S12中,路径替换目标变量X3(=c)被引用(图4的步骤n42是)。然而,不存在变量c的配对。亦即,变量c的配对不是在该点生成的,从而在步骤n43中被判断为否(配对是在步骤n48中生成的)。因此,执行路径中间代码生成部分2b不对中间代码S12的变量c进行变量替换处理。
进一步,路径替换目标变量X3没有被定义为中间代码S12中的“c”,而是被定义为“a”,从而在步骤n45中被判断为否。因此,现在查看下一个被拷贝的中间代码S22的变量。执行路径中间代码生成部分2b判断出在中间代码S22中在替换变量之前定义了路径替换目标变量X3(=c)(步骤n45中的是),以及不存在变量c的配对(图4的步骤n43中的否)。根据上述判断结果,执行路径中间代码生成部分2b在定义部分将变量c的标识符替换为没有在变量名表和变量配对中使用的t1,以便重新生成变量配对(c,t1)(步骤n48)。
然后,因为在中间代码S32中不存在路径替换目标变量的引用和定义,所以执行路径中间代码生成部分2b注意到下一个基本块B22的执行语句S42,而不进行变量替换处理。在图9C中B12的行的替换变量配对生成历史50示出了在对基本块B12进行变量替换处理之后配对的生成状态。
随后,由于路径输入变量X1(=c)被引用(步骤n42中的是)并且在替换变量之前的指令语句S42中存在变量c的配对(c,t1),所以执行路径中间代码生成部分2b在引用点将变量c的标识符替换为t1。然后,在判断出路径替换目标变量X3(=c)在中间代码S42中被定义(步骤n45中的是)并且存在变量c的配对(c,t1)之后,执行路径中间代码生成部分2b消除带有变量c的配对(c,t1),然后在定义点处将变量c的标识符替换为在变量名表和变量配对中没有使用的t2,以便重新生成变量配对(c,t2)(步骤n48)。
在本示例中,图9c示出了在执行路径中间代码生成部分2b反复执行变量替换处理直至基本块B72的中间代码S152时所产生的变量配对的历史50。
执行路径中间代码生成部分2b将图9C中所示的块B72的变量配对(c,t2)和(d,t3)发送给保证中间代码生成部分2d,并将在图10中所示的执行路径中间代码中的中间代码S12-S152发送给判断中间代码生成部分2c。
然后,在步骤n16中,判断中间代码生成部分2c反转所接收的中间代码中的条件分支中间代码S32(图10的if(t1>0)goto S4)和条件分支中间代码S92(图10的if(f>0)goto S10)的判断条件的逻辑,以便将条件分支中间代码S202(图11的if(t1<=0)goto S1)和条件分支中间代码S203(图11的if(f<=0)goto S1)设置为满足不执行热路径HP的条件。由此生成基本块B104。判断中间代码生成部分2c将以这种方式生成的基本块B104存储到程序转换部件2A的内部。
随后,在步骤n17中,保证中间代码生成部分2d根据变量配对(c,t2)和从变量信息计算部分2a发送来的路径保证变量X4{c},生成保证中间代码的代码S301,其中标识符t2被回复到指示变量c的标识符,并生成包含中间代码S301的基本块B103(图11)。进一步,保证中间代码生成部分2d将基本块B103布置在紧挨程序转换部件2A中的基本块B104之后。高速块H1由基本块B104和基本块B103构成(图11的H1)。
然后,在步骤n18中,分支中间代码生成部分2e读出基本块B104,将条件分支中间代码S202和S03中每一个的分支中间代码设置为分支到作为部分程序起点的块B1的中间代码S1的分支中间代码。然后分支中间代码生成部分2e将所设置的分支中间代码存储到程序转换部件2A的内部。
进一步,分支中间代码生成部分2e生成从部分中间代码的中间代码S15分支到中间代码16的分支中间代码S151,将所生成的分支中间代码S151布置为紧跟在指令语句S15之后(参见图11中的S151),并将其存储到编译器装置A的内部。更进一步,分支中间代码生成部分2e如图11的程序中那样将基本块B104布置到紧跟中间代码S0之后,并将基本块S103布置到中间代码S16不久之前。
然后在步骤n19中,优化单元2对图11中的中间程序进行冗余消除处理。步骤n19的处理并不是本发明的重要特征,所以忽略对其的解释。下文中的解释假设图11自身是执行该步骤之后的中间程序。
然后在步骤n20中,中间代码依赖分析部分2f对图11中的高速块H1进行图12中的依赖分析。中间代码依赖分析部分2f生成从分支条件中间代码S202和分支条件中间代码S203到保证中间代码S301的依赖,以便分支条件中间代码S202和分支条件中间代码S203在保证中间代码S301之前执行。进一步,在图12中,中间代码依赖分析部分2f指定导致异常的异常生成中间代码S102以及异常生成变量f作为生成异常的原因(不允许分母为零的除法),并生成从判断中间代码S203到异常生成中间代码S102的依赖,以便与异常生成变量f相对应的判断中间代码S203在异常生成中间代码S102之前执行。
现在将要描述生成异常的情况。如果中间代码S102在判断中间代码S203之前执行,并且变量f的值为零,那么在中间代码S102中就会生成零除。因此,在处理器或操作系统中生成异常。除此之外还有以下异常的示例。亦即,现在假设存在这样的情况,其中变量f是C语言中的指针变量,由中间代码S102对引起变量f进行间接引用。此时,类似地,如果中间代码S102在判断中间代码S203之前执行,并且变量f保持空载地址或者禁止访问的存储器地址,在处理器和操作系统中也会发生异常。
在接下来的步骤n21中,如图13所示,中间代码并行化部分2g进行调度以根据由中间代码依赖分析部分2f发出的依赖分析信息(参见图12)而并行化中间代码串。通过向图12所示的依赖的深度赋予优先级,图13示出了应用了列表调度方法的程序。符号“//”表示紧随其后的指令语句被并行地执行。
<改进示例1>(可接受的异常生成参见图14-图17)在上述实施例中,中间代码依赖分析部分2f生成图12中的从判断中间代码S203到异常生成中间代码S102的依赖,从而使得不会非正常地生成异常。然而,在改进示例1中,不生成这样的依赖。亦即,执行路径中间代码生成部分2b重新生成图14中程序所示的中间代码S401,在此之后,生成图15所示的从中间代码S401到异常生成中间代码S102的依赖。
亦即,执行路径中间代码生成部分2b将变量和代码插入到如下生成的执行路径中间代码串的头部。
-生成返回点保持变量,该变量是用于在从中断例程返回时保持返回地址的特殊变量。
-生成返回使用中间代码,其是用于将返回地址存储到返回点保持变量的中间代码(返回点设置指令代码生成器)。
进一步,中间代码依赖分析部分2f进行操作,使得没有在与上述异常生成变量相关的判断中间代码和异常生成代码之间的依赖,然后生成从返回使用中间代码到异常生成中间代码的依赖(第二依赖分析器)。
在下文中,将参照图14-图17更详细地描述上述处理。首先,在步骤n15中,执行路径中间代码生成部分2b生成图14中中间代码S401所示的返回点维持变量RA,然后将用于将返回点地址S1存储到变量RA的返回使用中间代码S401插入到执行路径中间代码串的头部。
然后,在步骤n20中,中间代码依赖分析部分2f生成从返回使用中间代码S401到异常生成中间代码S102的依赖。此时,如图15所示,中间代码依赖分析部分2f不生成与上述异常生成变量相关的判断中间代码S203和异常生成中间代码S102之间的依赖。
图16示出了当中间代码并行化部分2g通过使用如图15所示的依赖分析信息进行调度时所得到的结果。在图中,通过调度使得异常生成中间代码S102在判断中间代码S203之前执行。
图17是示出当在异常生成中间代码S102中生成异常时在系统上执行操作的简图。首先,除了一系列中断之外,判断中断的类型。然后,在计算机系统(在生成中断时使用的处理例程加法器)中预先准备将要被分支到返回点保持变量中所保持的地址的中断例程。然后,当在异常生成中间代码S102中生成异常时,控制被处理器或操作系统转变到中断处理例程(参见图17中的虚线A1),并且处理从中断处理例程分支到返回点保持变量RA中所保持的地址S1(参见图17中的虚线A2)。资源分配单元3将返回点保持变量分配在存储元件中,例如特定的存储器或特定的寄存器。
在如图16所示的上述高速块H2的情况中,与如图13所示的高速块H1相比,没有执行步骤数量上的变化,在性能上也不存在特殊的改进。然而,总体来说,在下述情形下在高速块H1中可能产生对实现更快执行的障碍。
-生成异常的可能性较低。
-生成从判断中间代码S203到异常生成中间代码S102的依赖,其中判断中间代码S203是从图12中的程序等生成的。
相对于这些不便,在本改进示例中,可以去除可能称为高速执行的障碍的依赖本身。因此,能够实现高速块的快得多的执行。
<改进示例2>(恒定值传播改进1)在上述实施例中,作为热路径信息F2(参见图1),除了那些显示由用户预先确定的执行路径的信息外,用户还可以输入变量保持信息,其是由热路径HP中所引用的变量所保持的信息。变量保持信息中变量的值是极有可能被变量进行保持的值。
通过利用热路径F2中的变量保持信息,分支中间代码生成部分2e将高速块H3中变量的引用点替换为由变量保持信息所保持的值。进一步,当由变量进行保持的值变得与变量保持信息中所维持的值不同时,分支中间代码生成部分2e可以在将要从部分中间代码起点开始的执行路径中间代码串的头部生成条件分支中间代码(称为恒定值判断条件分支中间代码)(第二执行路径代码生成器)。
在下文中将参照图18-图20详细描述上述处理情形。图18示出了当热路径信息F2中变量保持信息中的变量b取值为“5”而变量e取值为“8”时,由分支中间代码生成部分2e所进行的处理的结果。在图18中,变量b和变量e的引用点被分别替换为值“5”和值“8”。进一步,在执行路径中间代码串的头部生成恒定值判断条件分支中间代码S411,其在变量b保持的值不是“5”时分支到中间代码S1。与此相似,对应于变量e而生成恒定值判断条件分支中间代码S412。
在步骤n18中,分支中间代码生成部分2e取回热路径信息F2中的变量保持信息,并将高速块H3的变量的引用点替换为变量保持信息中所保持的值。
图18示出变量保持信息中变量b的值变为“5”且变量e的值变为“8”的情形。与图11相比可以看出,变量b和变量e的引用点被分别替换为值“5”和值“8”。进一步,当变量保持的值不同于替换后的值时,分支中间代码生成部分2e生成条件分支中间代码,从而从部分中间代码的0起点执行。在图18中,当由变量b保持的值不是“5”时,分支中间代码生成部分2e首先在执行路径中间代码串的头部生成分支到中间代码S1的恒定值判断条件分支中间代码S411。与此相似,分支中间代码生成部分2e生成相应于变量e的恒定值判断条件分支中间代码S412。
在下一步骤n19中,优化单元2对图18中的中间程序进行冗余消除处理。图19示出进行冗余消除处理所得到的结果。通过恒定值传播优化的作用,消除了中间代码S521和中间代码S82,并且由非必要代码消除优化消除了判断中间代码S203。图20示出执行步骤n20和步骤n21所得到的结果。与图13中的情况相比,步骤数量减少了一个步骤。
如上所述,在热路径HP中所引用的变量当中,当变量所保持的值被局限(localize)为特定值时,可以进一步提高高速块的速度。
<改进示例3>(恒定值传播改进2)在上述改进示例2中,分支中间代码生成部分2e已经对高速块H1进行了恒定值判断条件分支中间代码的恒定值替换处理和生成处理。然而,分支中间代码生成部分2e可以先拷贝高速块H1,然后对高速块H1进行恒定值判断条件分支中间代码的恒定值替换处理和生成处理。进一步,分支中间代码生成部分2e可以生成仅仅由标签构成的伪中间代码,所述标签位于拷贝前的高速块H1的起点之前,并且恒定值判断条件分支中间代码的分支目标设置可以被设置为该伪中间代码。更进一步,分支到紧接部分中间代码终点的中间代码的分支中间代码可以被插入到紧接拷贝前高速块H1的终点的位置。
在下文中将参照图21-图22描述上述情况的处理。在步骤n18中,分支中间代码生成部分2e拷贝高速块H1,并进行替换处理,从而将所拷贝的高速块H1中的变量替换为恒定值。在图21中的所拷贝高速块H4中,变量b和变量e的引用点被分别替换为恒定值“5”和恒定值“8”。
更进一步,分支中间代码生成部分2e生成仅仅由标签构成的伪中间代码,所述标签位于拷贝前的高速块H1的起点之前,并生成一分支中间代码,该分支中间代码所分支到的中间代码位于紧跟着拷贝前高速块H1终点的部分中间代码的终点之后。在图21中中间代码S501是只带有标签的中间代码,分支中间代码S502是分支到中间代码S16的中间代码,所述中间代码S16是部分中间代码终点之后的中间代码(第二分支代码生成器)。
进一步,分支中间代码生成部分2e将所拷贝高速块H1中的恒定值判断条件分支中间代码的分支目标设置为所生成的伪中间代码(第三执行路径代码生成器)。在图21中,恒定值判断条件分之中间代码S413的分支目标被设置为中间代码S501,与此相似,恒定值判断条件分之中间代码S414的分支目标被设置为中间代码S501。图22示出了执行步骤n19、步骤n20以及步骤n21所得到的结果。即使在变量保持的值与热路径信息F2中保持的值不同的时候,执行控制可以转变到另一高速块,通过以上述方式进行的程序转换,所述另一高速块的速度与部分中间代码相比得到了提高。因此,可以加速热路径HP的高速执行。
<改进示例4>(分支到部分中间代码串中间的点)在上述<操作示例>中,分支中间代码被设置为从高速块H1分支到作为部分中间代码串起点的中间代码S1,如图11中的条件分支中间代码S202和S203所示。然而,通过将高速块构造为分支到部分中间代码串中间的点从而省略对部分中间代码串的一部分执行,可以缩短部分程序的执行过程,或者减少部分中间代码串。
进一步,也可以对部分中间代码串使用转换,使得高速块中的中间代码能够跳过(越过)条件分支中间代码,所述高速块中的中间代码对应于部分中间代码串内多个控制合流的基本块(例如,图11情形中的基本块B1、基本块B4和基本块B7)中的中间代码。下文中将更加详细地描述这一转换。
如图23所示,在如图1所示的编译器装置A的整个结构中增加了汇合块定义替换部分2h。汇合块定义替换部分2h首先计算汇合块,所述汇合块是热路径HP上多个控制合流的基本块。更确切地说,不可避免地被包含在从热路径起点到终点的整个可见路径中的基本块为汇合块(包含起点和终点的基本块也是汇合块)。
接着,当存在由汇合块定义的变量时,对在变量的定义点和引用点处的标识符进行下列处理,所述变量出现在从汇合块中所定义的变量的定义点到热路径HP出口的整个路径中。亦即,通过参考显示变量的标识符等内容的变量名列表,将变量的标识符替换为在变量名列表中没有出现的标识符。然而,如果在多个时段中存在变量所保持的值,那么逐存在时段地将存在时段中变量的定义点和引用点处的变量标识符替换为变量名列表中没有的标识符(汇合块定义变量替换装置)。
更进一步,当在热路径HP的入口处存在由汇合块定义的变量时,在热路径HP的终点处生成将由汇合块定义的变量的标识符恢复为原始标识符的中间代码串(汇合定义变量保证代码生成器)。
汇合块定义替换部分2h改变已被改变的标识符的数据流信息。在改变数据流信息的过程中,可以再次更新关于所有变量的数据流信息。
进一步,图23中所示的分支中间代码生成部分2e可以进行下列处理。亦即,分支中间代码生成部分2e逐对地按次序读出程序转换部件2A中执行路径中间代码串所包含的条件分支中间代码、以及部分中间代码串中的条件分支中间代码。进一步,分支中间代码生成部分2e从所读出的条件分支中间代码中提取控制所转变到的并且未出现在热路径上的中间代码。然后分支中间代码生成部分2e将条件分支中间代码的分支中间代码设置为不出现在热路径上的中间代码。因此,当执行路径中间代码串所包含的条件分支中间代码的条件通过时,可以分支到原本应该执行的部分中间代码串中间的中间代码。
进一步,图23中所示的中间代码依赖分析部分2f可以进行下列处理。亦即,中间代码依赖分析部分2f从高速块的中间代码当中、由汇合块所生成的中间代码(除了条件分支中间代码)中,提取首先发现的从中间代码朝着高速块终点的条件分支中间代码。进一步,中间代码依赖分析部分2f生成从汇合块中生成的中间代码到所提取的条件分支中间代码的依赖。因此,可以获得下列优势。
中间代码并行化部分2g可以对从汇合块生成的中间代码进行调度,跳过被发现朝着高速块起点的条件分支中间代码。然而,通过进行上述控制,不能通过跳过首先被发现为朝着高速块终点的条件分支中间代码来进行调度。
进一步,图23中所示的中间代码依赖分析部分2f可以进行下列处理。亦即,中间代码依赖分析部分2f从高速块中间代码当中不是汇合块的基本块所生成的中间代码中,提取首先发现的从中间代码朝着高速块起点的条件分支中间代码。进一步,中间代码依赖分析部分2f生成从所提取的条件分支中间代码到由不是汇合块的基本块所生成的中间代码的依赖。
更进一步,图23中所示的中间代码依赖分析部分2f可以进行下列处理。亦即,中间代码依赖分析部分2f从高速块中间代码当中不是汇合块的基本块所生成的中间代码中,提取首先发现的从中间代码朝着高速块终点的条件分支中间代码。进一步,中间代码依赖分析部分2f生成从由不是汇合块的基本块所生成的中间代码到所提取的条件分支中间代码的依赖。因此,中间代码并行化部分2g不能通过跳过由不是汇合块的基础块所生成的中间代码和条件分支中间代码来进行调度。
根据上述对控制的改进来修改图2中的操作流。亦即,如图24所示,在图2的操作流中增加了步骤n40,在步骤n40所生成的中间代码中,汇合块中定义的变量的标识符被替换。进一步,改变步骤n18,从而使得执行路径中间代码串的条件分支中间代码中的分支中间代码在部分中间代码的中间被分支。更进一步,改变步骤n20以生成高速块H4中的中间代码之间的依赖,从而使得只有由汇合块生成的中间代码变为跳过条件分支中间代码而进行的调度的目标。另外,在对中间程序进行并行化之后,增加步骤n22,用于再次对中间程序进行冗余消除处理。
因此,通过生成由汇合块所生成的中间代码和由不是汇合块的基本块所生成的中间代码与条件分支中间代码之间的依赖,可以在程序转换过程中保证转换之前和转换之后的程序的等价性,在转换中对部分中间代码串的中间进行分支。
图25A和图25B示出了通过部分地改变图5A和图5B中源程序而获得的源程序的示例。中间代码S8和中间代码S9是从图5A和图5B所示的程序结构改变得到的。在下文中将参照图26-图32描述图24中的主要步骤。
在步骤n40中,像图26那样更新图25A和图25B中的程序。亦即,在图25A和图25B中,变量a由汇合块B1的中间代码S1定义。变量a中在作为变量a的定义的中间代码S1、中间代码S6中所保持的值,被中间代码S12引用。进一步,由于变量a也存在于基本块B7的出口处,变量a所保持的值在基本块B7之后还得到引用。更进一步,由于变量a也存在于基本块B7的出口处,因此变量a在作为变量a的定义的中间代码S10中所保持的值在基本块B7之后也被引用。
因此,下列每个时段构成了变量a相同的存在时段。
-从中间代码S1开始经过基本块B2、基本块B4和基本块B6到基本块B7出口的时段。
-从中间代码S6开始经过基本块B4和基本块B6到基本块B7出口的时段。
-从中间代码S10开始到基本块B7的出口的时段。
因此,汇合块定义替换部分2h将变量a的定义点和引用点(都存在于变量a的存在时段中)替换为重新产生的标识符t10。更进一步,汇合块定义替换部分2h生成中间代码S151,用于在热路径HP的终点处将标识符t10恢复为标识符a。
与此相似,在变量f中,从中间代码S8开始到基本块B7入口的时段和从中间代码S15开始至少到基本块B7出口的时段是彼此具有不同值的变量f的存在时段。
因此,汇合块定义替换部分2h进行下列处理。
-将存在于从中间代码S8开始到基本块B7入口的时段中的变量f的定义点和引用点替换为重新生成的标识符t12。
-将存在于从中间代码S15开始到基本块B7出口的时段中的定义点替换为重新生成的标识符t13。
进一步,汇合块定义替换部分2h进行生成中间代码S153的处理,该中间代码S153用于在热路径终点处将标识符t13恢复为标识符f。
更进一步,汇合块定义替换部分2h以相同的方式替换变量c。另外,汇合块定义替换部分2h像图27A中所示那样改变已经被改变的标识符的数据流信息。
在步骤n14中,如图27B所示,由图26的中间代码计算路径输入变量X1、路径输出变量X2、路径替换目标变量X3和路径保证变量X4。然而,在示例中没有路径保证变量X4。
在步骤n15中,对图28中的中间代码S52、中间代码S203和图27C中所示路径替换目标变量X3(=d)进行标识符替换处理,以便生成图28中所示的执行路径中间代码串B200。
在步骤n16中,如图28中的条件分支中间代码S202和条件分支中间代码S203所示,设置条件分支中间代码,其中图26中条件分支中间代码S3和条件分支中间代码S9中的判断中间代码的条件被逻辑反转。
在步骤n18中,在该位置将图28中的条件分支中间代码S202和条件分支中间代码S203的分支目标设置为被分支到部分中间代码串的中间。亦即,条件分支中间代码S202的分支中间代码被设置为中间代码S6,条件分支中间代码S203的分支中间代码被设置为中间代码S12。
在步骤n19中,对图28中的中间程序进行冗余消除优化处理。在图28中,由于没有路径能到达基本块B11和基本块B21,因此如图29所示那样消除一部分程序。
在步骤n20中,进行高速块H4的依赖分析。此时,除了进行常规数据的依赖分析(依赖生成)以外,还进行这样的依赖分析(依赖生成),其使得不会通过在由汇合块生成的中间代码中沿着高速块的终点方向跳过所发现的条件分支中间代码来进行调度。例如,如图30所示,中间代码S12、中间代码S22和中间代码S82是由汇合块生成的中间代码。因此,分别生成下列依赖。
-从中间代码S12到条件分支中间代码S202的依赖-从中间代码S22到条件分支中间代码S202的依赖-从中间代码S82到条件分支中间代码S203的依赖关于变量t11的数据依赖也存在于从中间代码S22到条件分支中间代码S202中。进一步,关于变量t12的数据依赖也存在于从中间代码S82到条件分支中间代码S203中。
更进一步,在由不是汇合块的基本块生成的中间代码中生成了依赖,使得不会通过跳过条件分支中间代码来进行调度。例如,如图30所示,中间代码S42和中间代码S52是由不是汇合块的基本块生成的中间代码。因此,分别生成下列依赖。
-从条件分支中间代码S202到中间代码S42的依赖-从条件分支中间代码S202到中间代码S52的依赖-从中间代码S42到条件分支中间代码S203的依赖-从中间代码S52到条件分支中间代码S203的依赖关于变量t3的数据依赖也存在于从中间代码S52到条件分支中间代码S203中。
在步骤n21中,根据图20所示的依赖,如图31所示那样,在并行化后的块H4中调度中间代码串。在步骤n22中,进一步,对图31的中间程序进行冗余消除处理。如图S32中所示,通过使用在上述专利文献1中所示例的等价表述,消除中间代码S8、中间代码S15和中间代码S153。例如,在图31的从中间代码S82到中间代码S8的路径上,不存在用于更新变量d1的中间代码、或者用于更新变量t12的中间代码。因此,将中间代码S8判断作为冗余计算,从而消除它。进一步,图31中的中间代码S15和中间代码S153被判断作为比中间代码S150和中间代码S1530更多的冗余计算,从而消除它们。
<改进示例5>(几率)在上述实施例中,优化单元2可以根据热路径HP上条件分支中间代码的判断条件成立或者不成立的几率、生成异常的几率和特定变量保持特定值的几率,来控制转换的方式。可以从热路径信息F2获得这些几率本身。
例如,在图5A和图5B的程序中,假设条件分支中间代码S3的判断成立的几率为p1、条件分支中间代码S9的判断成立的几率为p2。因此,执行热路径HP的几率为几率p1和几率p2的乘积值,即p1*p2。当某特定阈值T1被设置为本征值(proper value)时,而乘积值p1*p2大于所述阈值T1时,如图5A和图5B所示的程序被转换为图13所示的程序(第一执行路径转换判断设备)。
进一步,当在如图5A和图5B所示异常生成中间代码S10中生成异常的几率为p3时,如果当某特定阈值T2被设置为本征值时几率p3大于T2,那么图5A和图5B所示程序被转换成图13所示程序。如果小于,那么图5A和图5B所示程序被转换成图16所示的程序(第三执行路径转换判断设备)。
更进一步,分别假设量b和e中的每一个在如图5A和图5B所示的基本块B1入口处具有值“5”和“8”的几率分别为p4和p5。结果是将某特定阈值T3设置作为本征值,当p1*p2*p4*p5的乘积值大于阈值T3时,图5A和图5B中所示程序被转换为图20所示程序(第五执行路径转换判断设备)。
阈值T1、阈值T2和阈值T3可以从热路径信息F2获得,或者这些阈值可以是由优化单元2保持的值。
<改进示例6>(平均执行时间)在上述实施例中,优化单元2可以通过使用执行时间的平均来确定最终待输出的中间代码。例如,在图5A和图5B中,假设条件分支中间代码S3为真的几率是p1,而条件分支中间代码S9为真的几率是p2,这些几率可以从热路径信息F2获得。
进一步,在如图5A和图5B所示的程序中,作如下假设。
-顺序执行基本块B1、基本块B2、基本块B4、基本块B5和基本块B7的时间是T51。
-顺序执行基本块B1、基本块B2、基本块B4、基本块B6和基本块B7的时间是T52。
-顺序执行基本块B1、基本块B3、基本块B4、基本块B5和基本块B7的时间是T53。
-顺序执行基本块B1、基本块B3、基本块B4、基本块B6和基本块B7的时间是T54。
在这种情况下,如图5A和图5B所示程序的平均执行时间可以表述如下。
ET1=T51*p1*p2+T52*p1*(1-p2)+T53*(1-p1)*p2+T54*(1-p1)*(1-p2)---------------(表达式1)进一步,作如下假设。
-在图13中从中间代码S52开始到中间代码S112的执行时间是T131。
-从中间代码S52开始到中间代码S203的执行时间是T132。
-从中间代码S52开始到中间代码S202的执行时间是T133。
在这种情况下,如图13所示程序的平均执行时间可以表述如下。
ET2=T131*p1*p2+T132*(1-p2)+T52*p1*(1-p2)+T54*(1-p1)*(1-p2)+T133*(1-p1)*p2+T53*(1-p1)*p2+T54*(1-p1)*(1-p2)--------(表达式2)此时,当判断出平均执行时间ET2小于平均执行时间ET1时,进行用于将图5A和图5B中程序转换为图13中所示程序的处理(第二执行路径转换判断设备)。与此相似,在将程序转换为图16、图20、图22和图32所示程序的处理中,可以计算平均执行时间,然后选择转换到具有较小平均执行时间的程序。
在如图16所示的程序中,作如下假设。
-从中间代码S12开始直到中间代码S112的执行时间是T161。
-从中间代码S12开始直到中间代码S202的执行时间是T162。
-从中间代码S12开始直到中间代码S203的执行时间是T163。
-在如图5A和图5B所示的中间代码S10中生成异常的几率是p3。
在这种情况下,如图16中所示程序的平均执行时间可以表述如下。
ET3={T161*p1*p2+T162*(1-p1)*p2+T53*(1-p1)*p2+T54*(1-p1)*(1-p2)+T163*(1-p2)+T52*p1*(1-p2)+T54*(1-p1)*(1-p2)}*(1-p3)+{T162+T52*p1*(1-p2)+T54*(1-p1)*(1-p2)}*p3-----(表达式3)(第四执行路径转换判断设备)更进一步,在如图20所示的程序中,作如下假设。
-从中间代码S121开始直到中间代码S152的执行时间是T201。
-从中间代码S121开始直到中间代码S411的执行时间是T202。
-从中间代码S121开始直到中间代码S412的执行时间是T203。
-从中间代码S121开始直到中间代码S202的执行时间是T204。
-变量b和e中的每一个在图5中基本块B1入口处具有值“5”和“8”的几率分别为p4和p5。
在这种情况下,如图20中所示程序的平均执行时间可以表述如下。
ET4=T201*p1*p4*p5+(T202+ET1)*(1-p4)+(T203+ET1)*p4*(1-p5)+{T204+T53*(1-p1)*p2+T54*(1-p1)*(1-p2)}*(1-p1)*p4*p5---(表达式4)进一步,在如图22所示的程序中,作如下假设。
-从中间代码S121开始直到中间代码S152的执行时间是T221。
-从中间代码S121开始直到中间代码S413的执行时间是T222。
-从中间代码S121开始直到中间代码S414的执行时间是T223。
-从中间代码S121开始直到中间代码S202的执行时间是T224。
-变量b和e中的每一个在图5中基本块B1入口处具有值“5”和“8”的几率分别为p4和p5。
在这种情况下,如图22中所示程序的平均执行时间可以表述如下。
ET5=T221*p1*p4*p5+(T222+ET2)*(1-p4)+(T223+ET2)*p4*(1-p5)+{T224+T53*(1-p1)*p2+T54*(1-p1)*(1-p2)}*(1-p1)*p4*p5---(表达式5)(第六执行路径转换判断设备)更进一步,在如图32所示的程序中,作如下假设。
-在图32中顺序执行基本块B31、基本块B41、基本块B51和基本块B71的执行时间是T321。
-顺序执行基本块B31、基本块B41、基本块B61和基本块B71的执行时间是T322。
-顺序执行基本块B61和基本块B71的执行时间是T323。
-从中间代码S12开始直到中间代码S151的执行时间是T324。
-从中间代码S12开始直到中间代码S202的执行时间是T325。
-从中间代码S12开始直到中间代码S203的执行时间是T326。
在这种情况下,如图32中所示程序的平均执行时间可以表述如下。
ET6=T324*p1*p2+T325*(1-p1)+T321*p2+T322*(1-p2)+(T326+T322)*p1*(1-p2)--(表达式6)优化单元2根据对以上述方式计算的平均执行时间ET1、平均执行时间ET2、平均执行时间ET3、平均执行时间ET4、平均执行时间ET5和平均执行时间ET6所进行的比较,如下控制转换处理。亦即,平均执行时间ET1在所有平均执行时间当中最小时,将图5中程序按其本身输出,而不进行转换。当其他平均执行时间最小时,将最小平均执行时间的转换输出作为最终中间代码。
<补充解释>
如上,已经参照实施例和改进示例描述了根据本发明的编译器装置。但是,无需强调,本发明不局限于这些实施例和改进示例。
(1)如同在图11所示的程序中那样,在没有生成异常的条件下进行<改进示例2>中的程序转换。然而,如同在图14所示的程序中那样,可以在考虑到生成异常时进行程序转换。进一步,如同在图29所示的程序中那样,可以在生成到部分中间代码串中间的分支的情况下进行程序转换。
(2)在<改进示例3>中,根据图11中的程序,其被转换到图13中没有生成异常的程序,并且将图22的程序中的基本块B174进一步加到以这种方式转换后的程序中。然而,根据图14中程序,其也被转换到图16中考虑了异常生成的程序,并且将图22的程序中的基本块B174进一步加到以这种方式转换后的程序中。
(3)在实施例中,分别描述了<改进示例2>和<改进示例4>。然而,也可以组合<改进示例2>和<改进示例4>。例如,在执行<改进示例2>的图20的程序中,可以进一步对基本块B1-B7进行<改进示例4>中的程序转换从而将其转换成图33的程序。
与此相似,也可以组合<改进示例3>和<改进示例4>。例如,在执行<改进示例3>的图22中的程序中,可以对基本块B1-B7进行<改进示例4>中的程序转换以将其转换成图34和图35中的程序(两图中B201和B503是相同的)。但是,在图34和图35的程序中,被执行来从高速块H7的中间分支到外部的处理,是在图5的程序中所进行的处理,以便不执行热路径HP。因此,在图34和图35的程序中,选择经过基本块B1、基本块B3、基本块B4、基本块B5和基本块B7的路径作为具有第二高执行频率的热路径,并且提高了所选择路径的速度。
另外,可以通过合并<实施例>和<改进示例1>-<改进示例4>来应用其它改进。用实施例中所描述的方法可以很容易地构造通过合并<实施例>和<改进示例1>-<改进示例4>而得到的新的编译器装置。
(4)在实施例中,在中间代码调度部件2B的操作之后启动资源分配单元3。但是,与此相反,也可以先启动资源分配单元3,在此之后再启动中间代码调度部件2B。
(5)没有给出对关于包括循环的热路径的实施例所进行的描述。但是,可以将实施例的程序转换应用于对最内层的循环或者循环展开之后的程序,或者应用将整个循环考虑为等价于单个中间代码的实施例的程序转换。进一步,还可以根据实施例在从内层循环到外层循环的递增步骤中应用程序转换。例如,在图36A的程序中,当内层循环L1的热路径是经过中间代码S1、中间代码S2和中间代码S4的路径时,可以应用实施例的程序转换。这样,可以如图36B中的程序那样生成高速块H124。进一步,如图36C中的程序那样,例如,当整个循环L1被当作新的中间代码S20并且例如循环L2中的热路径是经过中间代码S6、中间代码S7、中间代码S20、中间代码S8、中间代码S9和中间代码S11的路径时,可以像循环L1的情况那样应用实施例的程序转换。
(6)更进一步,本发明可以用作能够由计算机进行读取的记录介质,其中记录有程序或数字信号,例如软盘、硬盘、CD-ROM、MO、DVD、DVD-ROM、DVD-RAM、半导体存储器等等。另外,本发明可以用作通过诸如电信线路、有线或无线电通信线路或因特网等的网络传输的计算机程序或数字信号。
已经参照最佳实施例对本发明进行了详细的描述。但是,可以对各组成部门进行合并和改进,而不脱离所附权利要求的精神和宽的保护范围。
权利要求
1.一种用于将包括分支指令的源程序转换为目标程序的编译器装置,所述目标程序是一串目标代码,所述装置包括执行路径指定设备、第一执行路径代码生成器、保证代码生成器、部分代码生成器、第一分支代码生成器、第一依赖分析器和并行化设备,其中所述执行路径指定设备从中间包括分支指令的部分指令串中的多个执行路径中指定单个执行路径,所述部分指令串构成所述源程序;所述第一执行代码生成器生成第一执行路径代码,通过将在由所述执行路径指定设备所指定的执行路径上定义的、并且需要出现在所述指定执行路径的入口处的变量替换为另一变量而获得该第一执行路径代码;所述保证代码生成器生成用于将所述另一变量恢复为原始变量的保证代码,所述另一变量被所述第一执行路径代码生成器替换并且也需要出现在所述指定执行路径的出口处;所述部分代码生成器生成与所述部分指令串相对应的部分代码;当用于执行所述指定执行路径的分支条件不成立时,所述第一分支代码生成器根据所述指定执行路径上条件分支指令的条件,在所述指定执行路径上的所述条件分支指令中生成第一分支代码,其分支到所述部分代码的起点;所述第一依赖分析器根据对所述指定执行路径上的指令之间的依赖关系所进行的分析来计算依赖关系,增加所述保证代码和与所述指定执行路径上的所述条件分支指令相对应的所述分支代码之间的依赖,从而使得所述保证代码在所述指定执行路径上的所述条件分支指令之后执行,并且还增加指令之间的依赖从而使得不生成异常;和所述并行化设备根据由所述第一依赖分析器增加的所述指令之间的所述依赖,重新布置所述指定执行路径上的指令。
2.根据权利要求1所述的编译器装置,将所述源程序中所包括的循环当作单个指令,所述装置进一步包括循环单元处理设备,其中所述循环单元处理设备从所述循环的最内层循环朝着外层循环启动所述执行路径指定设备、所述第一执行路径代码生成器、所述保证代码生成器、所述第一分支代码生成器、所述第一依赖分析器和所述并行化设备。
3.根据权利要求1所述的编译器装置,进一步包括第一执行路径转换判断设备,其中所述第一执行路径转换判断设备根据所述指定执行路径的执行几率,判断在执行所述并行化设备之后的所述程序是否被当作所述目标代码。
4.根据权利要求1所述的编译器装置,进一步包括第二执行路径转换判断设备,其中所述第二执行路径转换判断设备根据所述指定执行路径的执行几率和所述部分代码的执行时间,计算所述部分代码的平均执行时间;根据在执行所述并行化设备之后所述指定执行路径中所述目标代码的执行时间和所述执行几率,计算所述指定执行路径的平均执行时间;根据所述部分代码的所述平均执行时间和所述指定执行路径的所述平均执行时间之间的比较,判断在执行所述并行化设备之后的所述程序是否被当作所述目标代码串。
5.根据权利要求1所述的编译器装置,进一步包括返回点设置指令代码生成器和第二依赖分析器,其中当在所述指定执行路径的执行期间生成异常时,所述返回点设置指令代码生成器增加用于规定所述指定执行路径上的返回点的指令代码;和所述第二依赖分析器根据对所述指定执行路径上指令之间的依赖关系的分析,增加所述保证代码和与所述指定执行路径上的所述条件分支指令相对应的所述分支代码之间的依赖,从而使所述保证代码在所述指定执行路径上的所述条件分支指令之后执行;和所述第二依赖分析器不增加由所述第一依赖分析器在所述指令之间增加以避免生成异常的那些依赖。
6.根据权利要求5所述的编译器装置,进一步包括中断生成处的处理例程增加器,其中当生成异常时,所述中断生成处的处理例程增加器向所述目标代码增加一处理例程,该处理例程用于返回由所述指令代码指定的所述返回点。
7.根据权利要求6所述的编译器装置,进一步包括第三执行路径转换判断设备,其中所述第三执行路径转换判断设备根据所述指定执行路径的执行几率和在执行所述并行化设备之后在所述执行路径上生成异常的几率,判断在执行所述并行化设备之后的所述程序是否被当作所述目标代码。
8.根据权利要求7所述的编译器装置,进一步包括第四执行路径转换判断设备,其中所述第四执行路径转换判断设备根据所述指定执行路径的所述执行几率、所述指定执行路径上生成异常的所述几率和所述部分代码的执行时间,计算所述部分代码的平均执行时间;根据所述指定执行路径的所述执行几率、生成所述异常的所述几率、在执行所述并行化设备之后所述执行路径上所述目标代码的执行时间和由所述生成中断处的处理例程增加器所增加的所述处理例程中所述目标代码的执行时间,计算所述处理例程的平均执行时间和在执行所述并行化设备之后所述指定执行路径的平均执行时间;根据所述处理例程的所述平均执行时间和在执行所述并行化设备之后所述执行路径的所述平均执行时间之间的比较,判断在执行所述并行化设备之后所述程序是否被当作所述目标代码。
9.根据权利要求8所述的编译器装置,进一步包括第二执行路径代码生成器,其中所述第二执行代码生成器在所述指定执行路径上被引用的变量经常保持特定值时,将所述变量替换为由所述变量保持的值,并且在所述变量所保持的值不同于所述替换后的值时,生成通过在所述指定执行路径的头部插入条件分支指令而获得的第二执行路径代码,在所述条件分支指令中条件被设置为分支到所述指定执行路径的外部;和在所述第二执行路径代码生成器启动之后,所述编译器装置进行一关于恒定值的冗余消除优化。
10.根据权利要求9所述的编译器装置,进一步包括第五执行路径转换判断设备,其中所述第五执行路径转换判断设备根据所述指定执行路径的所述执行几率和所述指定执行路径上的所述变量保持特定值的几率,判断是否执行所述第二执行路径代码生成器。
11.根据权利要求10所述的编译器装置,进一步包括第六执行路径转换判断设备,其中所述第六执行路径转换判断设备根据所述指定执行路径的所述执行几率、所述指定执行路径上的所述变量保持特定值的几率和在执行所述并行化设备之后所述执行路径上所述目标代码的执行时间,计算在执行所述并行化设备之后所述执行路径的平均执行时间;和根据所述部分代码的所述平均执行时间和在执行所述并行化设备之后所述执行路径的所述平均执行时间之间的比较,判断在执行所述并行化设备之后所述程序是否被当作所述目标代码。
12.根据权利要求11所述的编译器装置,进一步包括第三执行路径代码生成器和第二分支代码生成器,其中所述第三执行路径代码生成器在所述指定执行路径上被引用的变量经常保持特定值时,拷贝所述指定执行路径上的指令,然后将所拷贝的执行路径上经常具有特定值的变量替换为由所述变量保持的值,并且在所述指定执行路径上被引用的变量所保持的值不同于所述替换后的值时,生成通过在所述指定执行路径的头部插入条件分支指令而获得的第三执行路径代码,在所述条件分支指令中条件被设置为分支到所述指定执行路径的外部;和当所拷贝的执行路径上条件分支指令的条件不被认可为所述指定执行路径中的条件分支指令时,所述第二分支代码生成器生成第二分支代码,该第二分支代码分支到所拷贝的执行路径上所述条件分支指令中的所述指定执行路径代码的起点。
13.根据权利要求12所述的编译器装置,进一步包括第七执行路径转换判断设备,其中所述第七执行路径转换判断设备根据所述指定执行路径上的所述变量保持特定值的所述几率、或者根据所述指定执行路径的所述执行时间和其中所述指定执行路径上的所述变量保持特定值的所述几率,计算改进后的所述程序的平均执行时间;和根据所计算的所述改进后程序的平均执行时间,判断是否执行所述第三执行路径代码生成器和所述第二分支代码生成器。
14.一种用于将包括分支指令的源程序转换为目标程序的编译器装置,所述目标程序是一串目标代码,所述装置包括执行路径指定设备、执行路径代码生成器、保证代码生成器、部分代码生成器、分支代码生成器、依赖分析器和并行化设备,其中所述执行路径指定设备从中间包括分支指令的部分指令串中包含的多个执行路径中指定单个执行路径,所述部分指令串构成所述源程序;所述执行代码生成器生成执行路径代码,通过将在由所述执行路径指定设备所指定执行路径上定义的、并且需要出现在所述指定执行路径的入口处的变量替换为另一变量而获得该执行路径代码;所述保证代码生成器生成用于将所述另一变量恢复为原始变量的保证代码,所述另一变量被所述执行路径代码生成器替换并且也需要出现在所述指定执行路径的出口处;所述部分代码生成器生成与所述部分指令串相对应的部分代码;当执行所述指定执行路径的分支条件不成立时,所述分支代码生成器根据所述指定执行路径上的条件分支指令的条件,生成一分支代码,从而使得所述指定执行路径上所述条件分支指令的分支目标被指定为所述部分代码中的所述分支条件不成立的情况下的分支目标;所述依赖分析器根据对所述指定执行路径上的指令之间的依赖关系所进行的分析来计算指令之间的依赖关系,并且同时增加存在于基本块中的指令和所述条件分支指令之间的依赖,从而使得不能通过从出现在所述多个控制合流的基本块中、并且在所述指定执行路径中的指令,沿着所述执行路径的终点方向跳过所发现的所述条件分支指令而转移处理,所述依赖分析器还增加所述指令和所述条件分支指令之间的依赖,从而使得不能通过从未出现在所述基本块中、并且在所述指定执行路径中的所述指令跳过所述条件分支指令而转移处理;和所述并行化设备根据由所述依赖分析器增加的所述指令之间的所述依赖,重新布置所述指定执行路径中的指令。
15.根据权利要求14所述的编译器装置,进一步包括汇合定义变量替换设备和汇合定义变量保证代码生成器,其中在构成所述源程序、并且中间包含分支指令的部分指令串中,当存在在多个控制合流的基本块中定义的变量时,所述汇合定义变量替换设备将所述变量的定义点和引用点替换为另一变量;和所述汇合定义变量保证代码生成器在所述部分指令串的出口处生成一保证代码,用于将所述另一变量恢复为原始变量,所述另一变量被所述汇合定义变量替换设备替换并且需要出现在所述部分指令串的出口处。
16.根据权利要求15所述的编译器装置,进一步包括第一执行路径转换判断设备,其中所述第一执行路径转换判断设备根据所述指定执行路径的所述执行几率,判断在执行所述并行化设备之后的所述程序是否被当作所述目标代码。
17.根据权利要求16所述的编译器装置,进一步包括第二执行路径转换判断设备,其中所述第二执行路径转换判断设备根据所述指定执行路径的执行几率和所述部分代码的执行时间,计算所述部分代码的平均执行时间;根据所述指定执行路径的所述执行几率和在执行所述并行化设备之后所述执行路径中所述目标代码的执行时间,计算在执行所述并行化设备之后所述执行路径的平均执行时间;根据所述部分代码的所述平均执行时间和执行所述并行化设备之后所述执行路径的所述平均执行时间之间的比较,判断在执行所述并行化设备之后的所述程序是否被当作所述目标代码串。
18.一种用于将包括分支指令的源程序转换为目标程序的编译器装置,所述目标程序是一串目标代码,所述装置包括执行路径指定设备、第一执行路径代码生成器、第一保证代码生成器、第二执行路径代码生成器、汇合定义变量替换设备、汇合定义变量保证代码生成器、第三执行路径代码生成器、第二保证代码生成器、部分代码生成器、第一分支代码生成器、第二分支代码生成器、第三分支代码生成器、依赖分析器和并行化设备,其中所述执行路径指定设备从中间包括分支指令的部分指令串中的多个执行路径中指定单个执行路径,所述部分指令串构成所述源程序;所述第一执行代码生成器生成第一执行路径代码,该第一执行路径代码是与由所述执行路径指定设备指定的执行路径上的整个指令串相对应的目标代码,并且通过将需要出现在所述指定执行路径入口处、并且在由所述执行路径指定设备所指定的执行路径上定义的变量替换为第一另一变量而获得所述第一执行路径代码;所述第一保证代码生成器生成用于将所述第一另一变量恢复为原始变量的第一保证代码,所述第一另一变量需要出现在所述指定执行路径的出口处;所述第二执行路径代码生成器在由所述第一执行路径代码生成器和由所述第一保证代码生成器所生成的代码串中所引用的变量经常保持特定值时,拷贝所述代码串,并将所拷贝的代码串中经常保持所述特定值的所述变量替换为由所述变量保持的值,并且在所述代码串中被引用的变量所保持的值不同于所述替换后的值时,生成通过在所述代码串的头部插入条件分支指令而获得的第二执行路径代码,在所述条件分支指令中条件被设置分支到所述指定执行路径的外部;当所述部分指令串中存在在多个控制合流的基本块中定义的这种变量时,所述汇合定义变量替换设备将变量的定义点和引用点替换为第二另一变量;所述汇合定义变量保证代码生成器在所述部分指令串的出口处生成用于将所述第二另一变量恢复为原始变量的变量保证代码,所述第二另一变量需要出现在所述部分指令串的所述出口处;所述第三执行代码生成器生成第三执行路径代码,该第三执行路径代码是与在执行所述汇合定义变量替换设备和所述汇合定义变量保证代码生成器之后由所述执行路径指定设备指定的所述执行路径上整个指令串相对应的目标代码,并且通过将需要出现在所述指定执行路径的入口处并且在所述指定执行路径上定义的变量替换为第三另一变量而获得;所述第二保证代码生成器生成用于将所述第三另一变量替换为原始变量的第二保证代码,所述第三另一变量需要出现在所述指定执行路径的出口处;所述部分代码生成器生成与在执行所述汇合定义变量替换设备和所述汇合定义变量保证代码生成器之后的所述部分指令串相对应的部分代码;当执行所述指定执行路径的所述分支条件不成立时,所述第一分支代码生成器根据所述第三执行路径代码中的条件分支指令的条件,生成第一分支代码,从而使得所述第三执行路径中的所述条件分支指令的分支目标被指定为在所述部分代码中的所述分支条件不成立的情况下的分支目标;当执行所述指定执行路径的分支条件不成立时,所述第二分支代码生成器根据所述第一执行路径代码中的条件分支指令的条件,在所述第一执行路径代码中的所述分支指令中生成分支到所述第三执行路径代码的起点的第二分支代码;当执行所述指定执行路径的分支条件不成立时,所述第三分支代码生成器根据所述第二执行路径代码中的条件分支指令的条件,在所述第二执行路径代码中的所述分支指令中生成分支到所述第一执行路径代码的起点的第三分支代码;所述依赖分析器根据对所述由所述第一执行路径代码生成器、所述第一保证代码生成器、所述第二执行路径代码生成器、所述第三执行路径代码生成器和所述第二保证代码生成器生成的每个代码串中的所述指令之间的依赖关系所进行的分析,计算指令之间的依赖关系;和所述并行化设备根据由所述依赖分析器计算的所述指令之间的所述依赖关系,重新布置所述指定执行路径上的所述指令。
19.一种用于将包括分支指令的源程序转换为目标程序的编译器方法,所述目标程序是一串目标代码,所述方法包括下列步骤执行路径指定步骤,用于从中间包括分支指令的部分指令串中的多个执行路径中指定单个执行路径,所述部分指令串构成所述源程序;第一执行代码生成步骤,用于生成第一执行路径代码,通过将在由所述执行路径指定步骤所指定的执行路径上定义的、并且需要出现在所述指定执行路径的入口处的变量替换为另一变量而获得该第一执行路径代码;保证代码生成步骤,用于生成用来将所述另一变量恢复为原始变量的保证代码,所述另一变量被所述第一执行路径代码生成步骤替换并且也需要出现在所述指定执行路径的出口处;部分代码生成步骤,用于生成与所述部分指令串相对应的部分代码;第一分支代码生成步骤,用于当用于执行所述指定执行路径的分支条件不成立时,根据所述指定执行路径上条件分支指令的条件生成第一分支代码,其分支到所述指定执行路径上的所述条件分支指令中所述部分代码的起点;第一依赖分析步骤,用于根据对所述指定执行路径上的指令之间的依赖关系所进行的分析来计算依赖关系,增加所述保证代码和与所述指定执行路径上的所述条件分支指令相对应的所述分支代码之间的依赖,从而使得所述保证代码在所述指定执行路径上的所述条件分支指令之后执行,并且还增加所述指令之间的依赖从而使得不生成异常;和并行化步骤,用于根据由所述第一依赖分析步骤增加的所述指令之间的所述依赖,重新布置所述指定执行路径上的所述指令。
20.根据权利要求19所述的编译器方法,进一步包括以下步骤返回点设置指令代码生成步骤,用于在所述指定执行路径的执行期间生成异常时,增加用于规定所述指定执行路径上的返回点的指令代码;和第二依赖分析步骤,用于根据对所述指定执行路径上指令之间的依赖关系的分析,增加所述保证代码和与所述指定执行路径上的所述条件分支指令相对应的所述分支代码之间的依赖,从而使所述保证代码在所述指定执行路径上的所述条件分支指令之后执行,其中所述第二依赖分析步骤不增加由所述第一依赖分析步骤在所述指令之间增加以避免生成异常的那些依赖。
21.根据权利要求20所述的编译器方法,进一步包括中断生成处的处理例程增加步骤,用于在生成异常时,向所述目标代码增加一处理例程,该处理例程用于返回由所述指令代码指定的所述返回点。
22.一种用于将包括分支指令的源程序转换为目标程序的编译器方法,所述目标程序是一串目标代码,所述方法包括以下步骤执行路径指定步骤,用于从中间包括分支指令的部分指令串中的多个执行路径中指定单个执行路径,所述部分指令串构成所述源程序;第一执行代码生成步骤,用于生成第一执行路径代码,该第一执行路径代码是与由所述执行路径步骤指定步骤指定的执行路径上的整个指令串相对应的目标代码,并且通过将需要出现在所述指定执行路径入口处、并且在由所述执行路径步骤指定步骤所指定的所述执行路径上定义的变量替换为第一另一变量而获得所述第一执行路径代码;第一保证代码生成步骤,用于生成用来将所述第一另一变量恢复为原始变量的第一保证代码,所述第一另一变量需要出现在所述指定执行路径的出口处;第二执行路径代码生成步骤在由所述第一执行路径代码生成步骤和由所述第一保证代码生成步骤所生成的代码串中所引用的变量经常保持特定值时,拷贝所述代码串,并将所拷贝的代码串中经常保持所述特定值的所述变量替换为由所述变量保持的值,并且在所述代码串中被引用的变量所保持的值不同于所述替换后的值时,生成通过在所述代码串的头部插入条件分支指令而获得的第二执行路径代码,在所述条件分支指令中条件被设置分支到所述指定执行路径的外部;汇合定义变量替换步骤,用于当所述部分指令串中存在在多个控制合流的基本块中定义的这种变量时,将变量的定义点和引用点替换为第二另一变量;汇合定义变量保证代码生成步骤,用于生成用来将所述第二另一变量恢复为原始变量的变量保证代码,所述第二另一变量为第二另一变量并且需要出现在所述部分指令串的所述出口处;第三执行代码生成步骤,用于生成第三执行路径代码,该第三执行路径代码是与在执行所述汇合定义变量替换步骤和所述汇合定义变量保证代码生成步骤之后所述指定执行路径上的整个指令串相对应的目标代码,并且通过将需要出现在所述指定执行路径的入口处并且在所述指定执行路径上定义的变量替换为第三另一变量而获得;第二保证代码生成步骤,用于生成用来将所述第三另一变量替换为原始变量的第二保证代码,所述第三另一变量需要出现在所述指定执行路径的出口处;部分代码生成步骤,用于生成与在执行所述汇合定义变量替换步骤和所述汇合定义变量保证代码生成步骤之后的所述部分指令串相对应的部分代码;第一分支代码生成步骤,用于当执行所述指定执行路径的分支条件不成立时,根据所述第三执行路径代码中的条件分支指令的条件,生成第一分支代码,从而使得所述第三执行路径代码中的所述条件分支指令的分支目标被指定为在所述部分代码中的所述分支条件不成立的情况下的分支目标;第二分支代码生成步骤,用于当执行所述指定执行路径的分支条件不成立时,根据所述第一执行路径代码中的条件分支指令的条件,在所述第一执行路径代码中的所述分支指令中生成分支到所述第三执行路径代码的起点的第二分支代码;第三分支代码生成步骤,用于当执行所述指定执行路径的分支条件不成立时,根据所述第二执行路径代码中的条件分支指令的条件,在所述第二执行路径代码中的所述分支指令中生成分支到所述第一执行路径代码的起点的第三分支代码;依赖分析步骤,用于根据对所述由所述第一执行路径代码生成步骤、所述第一保证代码生成步骤、所述第二执行路径代码生成步骤、所述第三执行路径代码生成步骤和所述第二保证代码生成步骤生成的每个代码串中的所述指令之间的依赖关系所进行的分析,计算指令之间的依赖关系;和并行化步骤,用于根据由所述依赖分析步骤计算的所述指令之间的所述依赖关系,重新布置所述指定执行路径上的所述指令。
23.一种用于将包括分支指令的源程序转换为目标程序的编译器程序,所述目标程序是一串目标代码,所述编译器程序使计算机执行以下步骤执行路径指定步骤,用于从中间包括分支指令的部分指令串中的多个执行路径中指定单个执行路径,所述部分指令串构成所述源程序;第一执行代码生成步骤,用于生成第一执行路径代码,通过将在由所述执行路径指定步骤所指定的执行路径上定义的、并且需要出现在所述指定执行路径的入口处的变量替换为另一变量而获得该第一执行路径代码;保证代码生成步骤,用于生成用来将所述另一变量恢复为原始变量的保证代码,所述另一变量被所述第一执行路径代码生成步骤替换并且也需要出现在所述指定执行路径的出口处;部分代码生成步骤,用于生成与所述部分指令串相对应的部分代码;第一分支代码生成步骤,用于当用于执行所述指定执行路径的分支条件不成立时,根据所述指定执行路径上条件分支指令的条件生成第一分支代码,其分支到所述指定执行路径上的所述条件分支指令中所述部分代码的起点;第一依赖分析步骤,用于根据对所述指定执行路径上的所述指令之间的依赖关系所进行的分析来计算依赖关系,增加所述保证代码和与所述指定执行路径上的所述条件分支指令相对应的所述分支代码之间的依赖,从而使得所述保证代码在所述指定执行路径的所述条件分支指令之后执行,并且还增加指令之间的依赖从而使得不生成异常;和并行化步骤,用于根据由所述第一依赖分析步骤增加的所述指令之间的所述依赖,重新布置所述指定执行路径上的所述指令。
24.根据权利要求23所述的编译器程序,进一步包括由所述计算机执行的如下步骤返回点设置指令代码生成步骤,用于在所述指定执行路径的执行期间生成异常时,增加用于规定所述指定执行路径上的返回点的指令代码;和第二依赖分析步骤,用于根据对所述指定执行路径上指令之间的依赖关系的分析,增加所述保证代码和与所述指定执行路径上的所述条件分支指令相对应的所述分支代码之间的依赖,从而使所述保证代码在所述指定执行路径上的所述条件分支指令之后执行,其中所述第二依赖分析步骤不增加由所述第一依赖分析步骤在所述指令之间增加以避免生成异常的那些依赖。
25.根据权利要求24所述的编译器程序,进一步包括由所述计算机执行的如下步骤中断生成处的处理例程增加步骤,用于在生成异常时,向所述目标代码增加一处理例程,该处理例程用于返回由所述指令代码指定的所述返回点。
26.一种用于将包括分支指令的源程序转换为目标程序的编译器程序,所述目标程序是一串目标代码,所述编译器程序使计算机执行以下步骤执行路径指定步骤,用于从中间包括分支指令的部分指令串中的多个执行路径中指定单个执行路径,所述部分指令串构成所述源程序;第一执行代码生成步骤,用于生成第一执行路径代码,该第一执行路径代码是与由所述执行路径指定步骤指定的执行路径上的整个指令串相对应的目标代码,并且通过将需要出现在所述指定执行路径入口处、并且在由所述执行路径指定步骤所指定的所述执行路径上定义的变量替换为第一另一变量而获得所述第一执行路径代码;第一保证代码生成步骤,用于生成用来将所述第一另一变量恢复为原始变量的第一保证代码,所述第一另一变量需要出现在所述指定执行路径的出口处;第二执行路径代码生成步骤,用于在由所述第一执行路径代码生成步骤和由所述第一保证代码生成步骤所生成的代码串中所引用的变量经常保持特定值时,拷贝所述代码串,然后将所拷贝的代码串中经常保持所述特定值的所述变量替换为由所述变量保持的值,并且在所述代码串中被引用的变量所保持的值不同于所述替换后的值时,生成通过在所述代码串的头部插入条件分支指令而获得的第二执行路径代码,在所述条件分支指令中条件被设置分支到所述指定执行路径的外部;汇合定义变量替换步骤,用于当所述部分指令串中存在在多个控制合流的基本块中定义的这种变量时,将变量的定义点和引用点替换为第二另一变量;汇合定义变量保证代码生成步骤,用于针对需要出现在所述部分指令串出口处的所述第二另一变量,生成用来在所述部分指令串的出口处将所述第二另一变量恢复为原始变量的变量保证代码;第三执行代码生成步骤,用于生成第三执行路径代码,该第三执行路径代码是与在执行所述汇合定义变量替换步骤和所述汇合定义变量保证代码生成步骤之后所述指定执行路径上的整个指令串相对应的目标代码,并且通过将需要出现在所述指定执行路径的入口处并且在所述指定执行路径上定义的变量替换为第三另一变量而获得;第二保证代码生成步骤,用于生成用来将所述第三另一变量替换为原始变量的第二保证代码,所述第三另一变量需要出现在所述指定执行路径的出口处;部分代码生成步骤,用于生成与在执行所述汇合定义变量替换步骤和所述汇合定义变量保证代码生成步骤之后的所述部分指令串相对应的部分代码;第一分支代码生成步骤,当执行所述指定执行路径的分支条件不成立时,所述第一分支代码生成步骤根据所述第三执行路径代码中的条件分支指令的条件,生成第一分支代码,从而使得所述第三执行路径代码上的所述条件分支指令的分支目标被指定为在所述部分代码中的所述分支条件不成立的情况下的分支目标;第二分支代码生成步骤,用于当执行所述指定执行路径的分支条件不成立时,根据所述第一执行路径代码中的条件分支指令的条件,在所述第一执行路径代码中的所述分支指令中生成分支到所述第三执行路径代码的起点的第二分支代码;第三分支代码生成步骤,用于当执行所述指定执行路径的分支条件不成立时,根据所述第二执行路径代码中的条件分支指令的条件,在所述第二执行路径代码中的所述分支指令中生成分支到所述第一执行路径代码的起点的第三分支代码;依赖分析步骤,用于根据对由所述第一执行路径代码生成步骤、所述第一保证代码生成步骤、所述第二执行路径代码生成步骤、所述第三执行路径代码生成步骤和所述第二保证代码生成步骤生成的每个代码串中的所述指令之间的依赖关系所进行的分析,计算指令之间的依赖关系;和并行化步骤,用于根据由所述依赖分析步骤计算的所述指令之间的所述依赖关系,重新布置所述指定执行路径上的所述指令。
全文摘要
通过生成和连接新的基本块(包含通过对原始部分程序的热路径上的中间代码的路径替换目标变量进行变量替换处理而获得的中间代码,并且包含在其中热路径上的分支指令被转换以便执行热路径的分支中间代码)和具有用于将路径替换目标变量当中路径保证变量的值恢复为原始变量的值的中间代码的基本块,从而形成高速块。当条件分支中间代码的执行结果为真时,通过执行基本块,并且在高速块中的中间代码之间进行依赖分析和依赖生成以及指令的调度,实现了源程序的速度提升。
文档编号G06F9/45GK101078994SQ200710107338
公开日2007年11月28日 申请日期2007年5月25日 优先权日2006年5月26日
发明者田中旭, 畑野文博, 山名智寻, 峰尾昌明 申请人:松下电器产业株式会社