CN1265290C - 优化链接后代码的方法 - Google Patents

优化链接后代码的方法 Download PDF

Info

Publication number
CN1265290C
CN1265290C CNB021053723A CN02105372A CN1265290C CN 1265290 C CN1265290 C CN 1265290C CN B021053723 A CNB021053723 A CN B021053723A CN 02105372 A CN02105372 A CN 02105372A CN 1265290 C CN1265290 C CN 1265290C
Authority
CN
China
Prior art keywords
code
function
instruction
calling
redirected
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
Application number
CNB021053723A
Other languages
English (en)
Other versions
CN1374585A (zh
Inventor
盖德·哈伯
摩舍·克劳斯纳
瓦迪姆·埃森博格
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Publication of CN1374585A publication Critical patent/CN1374585A/zh
Application granted granted Critical
Publication of CN1265290C publication Critical patent/CN1265290C/zh
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

代码优化的方法包括分解已经编译和链接的目标代码,识别分解了的代码中包括关于寄存器的存储和恢复指令的函数。对已分解的代码进行分析,以便定位对后面跟有注销寄存器指令的函数的调用。修改代码,使得当该函数由已定位的调用进行调用时,从函数中消除存储指令。

Description

优化链接后代码的方法
技术领域
本发明主要涉及计算机代码的优化,以实现更快地运行速度,特别是涉及代码编译和链接后目标代码的优化。
背景技术
链接后代码优化器主要对全部可执行代码,包括静态链接库代码,进行整体性分析。由于可执行代码将不会重新编译或重新链接,链接后优化器不必保留编译器和链接器的约定。因此它可以利用优化编译器所无法实现的方式,对编译单元进行快速优化。
同时,链接后优化器必须处理在编译时优化中不会遇到的困难。优化编译器处理的输入是以高级语言的形式描述的,通常是源代码,其语义的定义明确。相比较而言,静态链接后优化工具接收的输入是低级可执行指令(目标代码)。链接后优化器必须首先分解目标代码以便识别其中的数据和指令。即使分解后,链接后优化器也许只能部分地分辨出给定可执行代码的语义,原因如下:
·可执行目标代码中的指令和数据是混合在一起的,有时不可能将它们区分开。通常,有些代码区不能被优化器明确地区分为数据或代码指令。在本专利申请中,这些区称作“未分类代码区”。
·即使对于已知含有代码指令的完全分类代码区,程序的语义也常常不能确定。机器指令在寄存器中执行,其中可能包括数据信息或存储器地址。因此,优化器不能确定给定的指令是进行纯数据计算,还是计算地址以便程序在以后用来检索/存储数据,或是在程序代码中完成控制转换。
·数据元素和它们的类型,如数组、结构或标量,只能在高级语言中识别,如C、C++、Pascal等。在链接后代码中,这些元素表现为任意的数据区,而对它们的引用则以任意的地址来处理。因此,在链接后的级别上,不能彻底解决数据元素的引用问题。
由于上述因素,程序的代码语义不可能完全从链接后代码中提取出来,且程序所使用的数据和代码元素间的某些相关性也不能确定。
Haber等人在论文中提出了处理这些困难的一种方法,论文题为“根据局部信息的可靠链接后优化”(Reliable Post-Link OptimizationsBased on Partial Information),定向反馈和动态优化专题学术讨论会3会议录(蒙特瑞,加利福尼亚,2000年12月),第91-100页,现将该文列在此处以供参考。首先,通过以渐增方式遵循可以在程序中分解的所有控制流路径,将需优化的程序分解为基本块。基本块可以标记为代码、数据或未分类(未彻底分析)。代码块可根据它们控制流的特性进一步标记。限定程序的局部分析区的范围,使其含有未分类块,同时解除这些未分类块在优化时对程序其它部分的限制。选定局部分析区的目的是,即使它们不能进行内部优化,仍能安全地做为整体重新定位,从而能够将代码做为一个整体重新排序和优化。
链接后代码优化和重构的另一个特点在Henis等人的“大型子系统基于链接后优化的反馈”(Feedback Based Post-Link Optimizationfor Large Subsystems)第二次定向反馈优化专题讨论会(海法,以色列,1999年11月),第13-20页;以及Schmidt等人在“操作系统代码定向简档重构”(Profile-Directed Restructuring of OperatingSystem Code)IBM系统杂志37:2(1998),第270-297页,中进行了描述。现将这些文献列于此处以供参考。
在程序执行过程中,当调用使用某些寄存器的函数时,通常有必要在运行该函数前,将寄存器中的内容存储(保存到存储器),当该函数返回后将寄存器的内容恢复。为此,编译器通常将适当的存储指令添加到编译代码中该函数的前端,并在后端增加相应的恢复指令。但是,对函数的某些调用来说,有些存储/恢复指令可能是多余的。例如,当函数调用完成后,寄存器被“注销”时(即在重新使用寄存器前,寄存器中的值被重写),没有必要存储和恢复寄存器的内容。因为对于现代高速处理器来说,存储器的访问已成为瓶颈,消除这些多余的存储和恢复操作能够减少程序的实际运行时间。
Martin等人在发表于Proceedings of Micro-30(研究三角地,北卡莱罗纳,1997)论文集中的“死信息值的开发”(Exploiting Dead ValueInformation)中描述了一种基于消除存储和恢复死寄存器中内容的编译器优化方法,现将该文列于此处以供参考。死信息值,假如在以后还要使用的话,会在编译时计算。作者建议将处理器指令集合结构扩展,以使这些信息能够传递到处理器。如果不能对硬件进行这种专门处理,RISC标准调用约定仍充许在程序调用和返回时,由处理器在消除某些存储和恢复操作中,推测并利用死信息值的子集。
发明内容
为了优化程序的执行,本发明的优选实施例提出了一个链接后除去多余的存储和恢复指令的方法。与基于编译器的方法不同,如Martin等人所描述的方法,链接后优化能够跨过编译边界识别死寄存器。这样,本发明的方法能够对整个程序进行优化,因为它能够将整个可执行代码视为统一的整体,而与编译器优化不同,它通常限定在优化单元的范围内。
而且,当优化编译器用链接约定连接时,链接后优化器在除去不必要的存储和恢复指令时,会忽略这些约定。与仅用编译时工具相比,本发明的方法因而可以用来更彻底地消除不需要的存储操作。另外,即使编译时优化得不到的源代码,就像在可执行程序中,遗留的目标代码或静态链接的目标代码库合并时的情况一样,这些方法依然可以进行代码优化。
在本发明的优选实施例中,链接后优化器分解链接后代码以便识别代码中所调用的函数。它不必象现有优化方法那样去分析函数的整个流程图,而仅需确定它们的指令构成。每个函数通常具有前端和后端,其中含有关于函数所使用寄存器的存储和恢复指令。此处所指的寄存器为非易失性寄存器。优化器分析分解的代码,以寻找调用函数的位置,然后检查每个函数调用后面的指令,以确定非易失性寄存器是否在函数返回后被注销。如果是,优化器则认定函数前端和后端中关于死寄存器的存储和恢复指令对于该函数的这次调用是不必要的(且对于其它调用可能也是不必要的)。然后它修改链接后代码,使得当函数被该请求调用时,从函数中至少消除不需要的存储指令,消除恢复指令则更好。
在本发明的某些优选实施例中,优化器识别并分析链接后代码中对给定函数的多个调用,以便确定在这些函数调用后哪些非易失性寄存器被注销。然后它创建一个优化了的函数版本,其中关于所有被注销非易失性寄存器的存储/恢复指令被除去。对于每个后面跟有注销某个非易失性寄存器的函数调用,优化器分别创建一个调用函数的优化版本的包装代码,并将函数调用替换为无条件转移到合适的包装代码的指令。包装代码通常包括一个或多个在调用优化函数之前的存储指令,该指令是用来存储在特殊的函数调用后未注销寄存器的内容,以及在优化函数之后的相应恢复指令。换句话说,包装代替了某些从优化函数的前端和后端除去的存储/恢复指令,只留下对于特殊函数调用所必需的指令。
包装代码和优化函数最好加在原始链接后代码的末尾。这样,除了将原始的函数调用替换为转移到包装代码的指令外,在本阶段不会对代码本身进行修改。因而,把原始函数替换为优化的函数是非常安全的,即使是位于原始代码中不能被彻底分析部分的信息也不会受到影响,并保持有效。尽管优化代码通常较原始的链接后代码长,当前技术中的附加优化步骤,如代码整理,能够应用于其后的代码。
做为选择方案,如果存储指令能在上述分析过的函数(或函数的优化版本)前端方便地排序,通过相应地重新定向函数调用,可以修改链接后代码,从而方便地跳过不必要的存储操作。对于本领域技术熟练的人来说,其它修改代码的方法显而易见,并认为是在本发明的范围内。
依照本发明的优选实施例,在此提供一个代码优化的方法,包括:
分解已编译和链接的目标代码;
识别已分解代码中的函数,函数中包括关于寄存器的存储和恢复指令;
分析已分解代码以确定后面跟有要注销寄存器指令的函数调用位置;
修改代码,使得当该函数由已定位的调用进行调用时,从函数中消除存储指令;
优选情况下,修改代码包括进一步修改代码,使得当函数由已定位的调用进行调用时,从函数中消除恢复指令。
在优选实施例中,修改代码包括重定向已定位的调用,以便跳过存储指令。优选的是,修改代码包括复制代码中与函数对应的部分,以便创建函数的优化版本,并从中除去存储指令,且重定向已定位的调用包括将调用定向到函数优化版本的地址。进一步的优选情况是,分析分解的代码包括定位对函数的多个调用,且重定向已定位的调用包括将多个调用重定向到函数优化版本的地址。
优选情况下,当函数包括多个寄存器的存储和恢复指令,且各个重定向调用后面均跟有注销至少其中一个寄存器的相应指令时,复制部分代码包括从函数的优化版本中除去所有重定向调用后注销寄存器的存储和恢复指令。最优选的情况是,修改代码包括为多个重定向调用中的至少一个创建包装代码,包装代码包括函数优化版本的调用,在之前有至少一个注销寄存器的存储指令,在之后有至少一个注销寄存器的恢复指令,且重定向已定位的调用包括将调用定向到包装代码。进一步优选的情况是,将调用定向到包装代码包括将已定位的调用替换为转移到包装代码的指令。
优选情况下,创建包装代码包括为不同的重定向调用创建多个、各自的包装代码,重定向多个调用包括将不同的调用重定向到各自的包装代码。
进一步优选的情况是,当分解的代码包括以最后一个指令为结尾的固定指令顺序时,复制部分代码包括在最后指令后增补复制的代码,而不改变固定的顺序。
在可选择的实施例中,分解的代码包括固定的指令顺序,修改代码包括消除存储指令而不改变固定的顺序。优选情况下,分析分解的代码包括在与函数对应的代码部分中识别存储指令,重定向已定位的调用包括重定向调用以便跳过识别出的存储指令。最优选的情况是,部分代码包括函数的前端,其中修改代码包括调整部分代码的位置,以使识别出的存储指令处于前端的开始,重定向调用包括将调用定向到识别出的存储指令之后的目标地址。
在另一个实施例中,消除存储指令包括将存储指令替换为NOP指令。
依照本发明的优选实施例,本发明也提供了一个代码优化装置,包括一个代码处理器,它被安排得能用来分解已经编译和链接的目标代码,在分解的代码中识别包含关于寄存器的存储和恢复指令的函数,对分解的代码进行分析,以便确定后面跟有注销寄存器指令的函数调用位置,以及修改代码使得当函数被定位的请求调用时,从函数中消除存储指令。
依照本发明的优选实施例,本发明另外提供了一个计算机软件产品,包括存储程序指令的计算机可读媒质,其中的指令被计算机读取时,能使计算机分解已经编译和链接的目标代码,以识别分解代码中的函数,该函数包含关于寄存器的存储和恢复指令,对分解的代码进行分析,以便确定后面跟有注销寄存器指令的函数调用位置,以及修改代码使得当函数被定位的请求调用时,从函数中消除存储指令。
通过下面对优选实施的详细说明,结合附图,本发明将更加便于理解。
附图说明
图1为依照本发明的优选实施例,说明处理计算机程序代码的系统的结构示意图;
图2为依照本发明的优选实施例,说明优化链接后代码方法的流程图;
图3为依照本发明的优选实施例,说明消除链接后代码中冗余的存储和恢复指令的方法的流程图。
具体实施方式
图1为依照本发明的优选实施例,说明处理计算机程序代码的系统20的结构示意图。系统20在优选情况下由一台通用计算机处理器组成,对它进行编程以完成下面所述的功能。处理器在软件的控制下完成这些功能,而软件是为这个目的编制的。软件可以以电子格式下载到处理器,比如从网络,也可以用实物介质的形式提供,如CD-ROM。
系统20通常接收由程序员准备的源代码。如当前技术所知,编译器22编译源代码以产生目标代码,链接器24用库代码链接编译的代码。链接的目标代码输入到优化器26,如下文中详细描述的那样,它分析并修改代码以消除冗余的存储/恢复指令。同样如当前技术所知,优化的代码能在此后由运行时模块28执行。尽管所有从22到28简单说明的功能是在系统20中完成的,但应该理解,这些功能也可以分开,并在不同的计算机上完成。这样,做为本发明的一个重要单元,优化器26可以从系统20以外的来源接收链接后代码,并可以传递优化代码到另外的计算机执行。
图2为依照本发明的优选实施例,说明由优化器26进行链接后代码优化的方法的流程图。为了识别代码中的指令,链接后代码在分解步骤30中被分解。为达到这个目的,任何已知的适宜的现有技术均可使用。最好利用增量分解方法将代码分到基本块中,如上面所提到的由Haber等人以及Henis等人在论文中描述的方法。为此,可执行代码中的指令地址从各种来源中提取出来,以形成“可能的入口点”列表。源通常包括程序/DLL入口点,符号表(为函数和表),和再定位表(通过它可以访问指向代码的指针)。优化器从这些入口点开始,按照控制流(解析所有可能的控制流路经)扫描程序,将新发现的附加可能入口点的地址增加到列表,如JUMP和CALL指令的目标。
以这种方式按照程序的控制流能覆盖大部分代码。不能直接由增量分解方法识别的基本块标为“未分类代码”。这些块通常由目标寄存器通过跳转指令才能到达的代码组成,而这些寄存器只有在运行时才能确定。有时可以使用如Henis等人所述的代码测试法和动态运行分析对这些块进行分类,但这些方法的说明超出了本专利申请的范围。
在增量分解过程的最后,原始程序的整个代码段被分为基本块,基本块可以是分类的也可以是未分类的。分类的块用标记注明,以标志它们特性为代码还是数据(如转移表数据),以及识别代码块的控制流特性,如下推、继续、调用、返回、跳转等。在函数识别步骤32中,调用和返回标志特别用于代码中函数和函数调用的识别。
通常,在步骤32中每个识别的函数具有前端和后端,包含函数所使用的某些寄存器中内容的存储和恢复指令。在本专利申请中,这些寄存器指“非易失性寄存器”。在分析步骤34中,分析每个函数中对非易失性寄存器的处理方法,以确定运行时在每0个函数调用之后,再次使用之前,哪个寄存器被注销。优选情况下,为了确定程序代码中调用函数的指令之后,寄存器Rx是否在给定的地址addr被注销,跟踪地址后面的分解代码控制流,直到找到注销Rx的指令。此时,则认为Rx在addr被注销。另外的方案是,如果跟踪到的指令是使用Rx,或由于某些原因,如到达一个条件转移指令,通过寄存器转移,或到达一个未分类的代码区而导致跟踪失败,则不能认为Rx在地址addr被注销。
对于每个函数f,分析步骤34在优选情况下用来确定下列信息:
·REG(f)-所有在函数f中使用的非易失性寄存器的集合。
·KREG(addr,f)-在地址addr被注销的REG(f)中所有寄存器的子集,其中,如上所述,是f调用指令后面的地址。
·OPT(f)-所有KREG(addri,f)并集中非易失性寄存器的集合,其中addri为f调用指令后面的地址(即,在整个程序中,f调用指令后被注销的f中非易失性寄存器的集合)。
当OPT(f)非空时,则存在一个或多个f调用指令,其后某个f的非易失性寄存器被注销。因此,在代码修改步骤36中,修改程序代码以消除f中关于注销寄存器的冗余存储和恢复指令。更优选的修改是,如下文所述,复制函数f的代码,不要其中的任何冗余存储/恢复指令,而在“包装代码”中增加必须的存储/恢复指令。另外,为达到相同的目的,其它修改代码的方法也可使用。
图3为依照本发明的优选实施例,说明代码修改步骤36详细内容的流程图。如OPT(f)非空时,对程序中每个函数f进行代码修改。首先,在复制步骤40中,复制函数f的代码,最好在当前程序代码结束时。令新复制的函数名称为f_opt。对OPT(f)集合中的每个寄存器Rx,在除去步骤42中,除去f_opt前端Rx的存储指令和f_opt后端Rx的恢复指令。
在包装步骤44中,为程序中每个函数f调用指令创建包装代码。为达到本步骤的目的,令addr为f调用指令后面的代码地址。假设OPT(f)-KREG(addr,f)非空,包装代码由下面的指令组成:
store R1
store R2
store Rn
call f_opt
restore Rn
restore Rn-1
restore R1
branch addr
其中{R1,R2,...Rn}=OPT(f)-KREG(addr,f)。在转移步骤46中,原始程序中f的调用指令被替换为无条件转移到上述包装代码的指令。如OPT(f)-KREG(addr,f)为空,将f的调用指令替换为直接调用f_opt的指令就足够了。另一方面,当KREG(addr,f)为空时,原始程序中f的调用指令最好不变。
在步骤40中复制f函数代码的原因在于保持正确的程序,因为程序中可能仍然含有其它未发现的f调用指令。这些调用指令可能通过寄存器或其它代码块执行,如库或其它链接后代码未给出的可执行代码,从而使静态链接后分析不可能可靠地发现这些调用。如上所述,所有发现的后面跟有注销f非易失性寄存器的调用指令均重定向为调用优化的f_opt函数。而后面没有注销非易失性寄存器的调用指令最好不变。同样,未发现的调用指令将继续转移到原来的未优化函数f,从而保持了原程序的语义。
下面的表I给出了分解的链接后代码的例子,其中有对函数foo的若干次调用。为了示例,foo由下面的定义描述:
·REG(foo)=(R27,R28,R29}
·KREG(L2,foo)={R27},KREG(L4,foo)={},KREG(L6,foo)={R28}
·OPT(foo)={R27,R28}
下表中左侧列显示的是优化前的链接后代码,右侧显示的是通过将两个foo的调用替换为转移到适当包装代码的指令而优化后的代码。
表I--代码比较
优化前                       优化后
Program begin                 Program begin
…                                                       …
L1:call foo                  L1:branch L7
L2:R27 is killed here        L2:R27 is killed here
…                                                        …
…                                                        …
L3:call foo                   L3:call foo
L4   .../*no non-volatile*/    L4  .../*no non-volatile*/
     .../*regs of foo are*/        .../*regs of foo are*/
     .../*killed here*/            .../*killed here*/
     ...                           ...
L5:call foo                   L5:branch L8
L6:R28 is killed here         L6:R28 is killed here
     ...                           ...
     ...                           ...
function foo:                 function foo:
  Prolog:                        Prolog:
     store R27                      store R27
     store R28                      store R28
     store R29                      store R29
     ...                            ...
  Epilog:                       Epilog:
     ...                            ...
     restore R29                    restore R29
     restore R28                    restore R28
     restore R27                    restore R27
     return                         return
     ...                           ...
Program end
                               L7:store R28/*wrapper*/
                                        /*code 1*/
                                   call foo_opt/*redi-*/
                                        /*rected call*/
                                   restore R28
                                   branch L2
                               L8:store R27/*wrapper*/
                                        /*code 2*/
                                   call foo_opt/*redi-*/
                                        /*rected call*/
                                   restore R27
                                   branch L6
                                   ...
                           function foo_opt:
                             Prolog:
                                store R29
                                /*store R27,R28*/
                                       /*removed*/
                                ...
                             Epilog:
                                restore R29
                                /*restore R27,R28*/
                                     /*removed*/
                                return
                                ...
                           Program end
优选情况下,在执行上述优化后,为了将无条件转移指令移到包装代码,并从包装代码返回,对生成的代码应用代码整理算法。整理算法属于现有技术中的链接后优化工具,如IBM公司(Armonk,纽约)提供的FDPR(定向反馈程序重构)工具,它做为AIXTM操作系统中性能工具箱(PTX)的一部分。PTX的其它方面在上述Haber等人、Henis等人和Schmidt等人的论文中进行了说明。
上述代码复制和包装代码的使用是一种方便、通用的解决办法,即使当部分程序仍未分类或未知时,也能消除冗余的存储/恢复指令。有时,整个程序代码都能得到并能完全分析,从而使代码中f的所有函数调用指令均能可靠地发现。此时,复制步骤40是不必要的。而是将f前端和后端中的冗余存储/恢复指令替换为相应的NOP指令。步骤44中创建的包装代码中将含有f的调用,而不是f_opt。将冗余的存储/恢复指令替换为NOP指令而不是简单地除去它们,这样就不必重新定位f的整个程序代码。
对于给定的f函数调用指令,关于函数调用后注销的非易失性寄存器集合KREG(addr,f)的存储指令也可能是函数前端首批指令。另外,这些存储指令也能够重新排定到前端的开始,而不会影响程序的语义。此例中,存储指令能够留在f_opt(或f中,如果f没有被复制,如上述例子中的一样)。通过重定向给定的调用指令目标地址以跳过处于f_opt或f前端的冗余存储,就可以简单地避开冗余的存储指令。这种方法能够缩短和简化使用的包装代码。
同样,关于f的注销的非易失性寄存器OPT(f)的存储指令也是函数前端首批指令或者也能用这种方式重排。此例中,不用复制函数f的代码依照能完成本发明所述的优化。f中的存储指令会留在前端的初始位置,且函数的调用指令会重定向以跳过相应的存储指令。此时,部分冗余的存储指令仍然会被执行。
在链接后阶段,当能够增加或建立一个新的堆栈结构时,可以使用本发明的另一个实施例。在该实施例中,f中关于OPT(f)中寄存器的所有存储和恢复指令均被替换为NOP指令,f更名为f_opt。然后,所有分解的对f的调用指令被替换为调用适当的包装代码以存储和恢复未注销的寄存器,如上所述。为了处理任何未分解的对f的调用指令,在程序代码中增加新的函数f,如下所列:
store R1
store R2
store Rn
call f_opt
restore Rn
restore Rn-1
restore R1
return
这里,{R1,R2,...Rn}为OPT(f)中非易失性寄存器的集合。
通过为f增加或建立一个新的堆栈结构,更新链接后程序的重新定位信息,以便所有对原始函数f的访问能够重定向到新的函数。用这种方式,所有未分解的对f的调用指令将自动地转移到新的函数f,且原始的程序语义不变。
上述优选实施例均基于这样的假定,即为了安全起见,在优化过程中,原始的链接后代码不能扩展或缩小。但本发明的原理也能够应用于可以删除、增加和移动代码的环境。在这种环境中,可以不用包装代码,而是将所需的存储和恢复指令直接插在相应的对f的调用指令之前和之后。基于同样的理由,不用象上面所述的那样,用NOP指令代替存储和恢复指令,而只需简单地将不必要的指令从代码中删除。
由实例方式列举的上述优选实施例比较容易理解,且本发明并不限于上面特别展示和说明内容。而且,本发明的范围包括上述各种功能的结合和亚结合,以及本领域技术熟练人员根据先前的描述而对其所做的各种变化和修改,和现有技术中未公开的各种变化和修改。

Claims (14)

1.代码优化的方法,包括:
分解已经编译和链接的目标代码;
识别已分解代码中的函数,函数中包括关于寄存器的存储和恢复指令;
分析已分解代码以定位对后面跟有注销寄存器指令的函数的调用;
修改代码,使得当该函数由已定位的调用进行调用时,从函数中消除存储指令。
2.根据权利要求1中的方法,其中修改代码包括进一步修改代码,使得当该函数由已定位的调用进行调用时,从函数中消除恢复指令。
3.根据权利要求1中的方法,其中修改代码包括重定向已定位的调用,以便跳过存储指令。
4.根据权利要求3中的方法,其中修改代码包括复制代码中与函数对应的部分,以便创建从中除去存储指令的函数的优化版本,其中重定向已定位的调用包括将调用定向到函数优化版本的地址。
5.根据权利要求4中的方法,其中分析分解的代码包括定位对函数的多个调用,且重定向已定位的调用包括将多个调用重定向到函数优化版本的地址。
6.根据权利要求5中的方法,其中函数包括多个寄存器的存储和恢复指令,且其中各个重定向调用后面均跟有注销至少其中一个寄存器的相应指令,且其中复制部分代码包括从函数的优化版本中除去所有关于重定向调用后注销的寄存器的存储和恢复指令。
7.根据权利要求6中的方法,其中修改代码包括为多个重定向调用中的至少一个创建包装代码,包装代码包括函数优化版本的调用,在之前有关于至少一个注销寄存器的存储指令,在之后有关于至少一个注销寄存器的恢复指令,且其中重定向已定位的调用包括将调用定向到包装代码。
8.根据权利要求7中的方法,其中将调用定向到包装代码包括将已定位的调用替换为转移到包装代码的指令。
9.根据权利要求7中的方法,其中创建包装代码包括为不同的重定向调用创建多个、各自的包装代码,其中重定向多个调用包括将不同的调用重定向到各自的包装代码。
10.根据权利要求4中的方法,其中分解的代码包括以最后一个指令结尾的固定指令顺序,且其中复制部分代码包括在最后指令之后增补复制的代码,而不改变固定的顺序。
11.根据权利要求3中的方法,其中分解的代码包括固定的指令顺序,其中修改代码包括消除存储指令而不改变固定的顺序。
12.根据权利要求3中的方法,其中分析分解的代码包括在与函数对应的代码部分中识别存储指令,其中重定向已定位的调用包括重定向调用以便跳过识别出的存储指令。
13.根据权利要求12中的方法,其中代码部分包括函数的前端,其中修改代码包括调整代码部分的位置,以使识别出的存储指令处于前端的开始,其中重定向调用包括将调用定向到识别出的存储指令之后的目标地址。
14.根据权利要求1中的方法,其中消除存储指令包括将存储指令替换为NOP指令。
CNB021053723A 2001-03-02 2002-02-27 优化链接后代码的方法 Expired - Fee Related CN1265290C (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US09/798,879 US6966055B2 (en) 2001-03-02 2001-03-02 Optimizing post-link code
US09/798,879 2001-03-02

Publications (2)

Publication Number Publication Date
CN1374585A CN1374585A (zh) 2002-10-16
CN1265290C true CN1265290C (zh) 2006-07-19

Family

ID=25174497

Family Applications (1)

Application Number Title Priority Date Filing Date
CNB021053723A Expired - Fee Related CN1265290C (zh) 2001-03-02 2002-02-27 优化链接后代码的方法

Country Status (4)

Country Link
US (1) US6966055B2 (zh)
JP (1) JP4181326B2 (zh)
KR (1) KR20020070809A (zh)
CN (1) CN1265290C (zh)

Families Citing this family (25)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6748589B1 (en) 1999-10-20 2004-06-08 Transmeta Corporation Method for increasing the speed of speculative execution
WO2001075669A1 (en) * 2000-03-31 2001-10-11 British Telecommunications Public Limited Company Resource modelling
CN100388191C (zh) * 2003-04-01 2008-05-14 松下电器产业株式会社 程序连接方法、装置以及终端装置
US7269830B2 (en) * 2003-09-16 2007-09-11 Sun Microsystems, Inc. Methods and hardware for safe memory allocation in arbitrary program environments
US7814467B2 (en) * 2004-01-15 2010-10-12 Hewlett-Packard Development Company, L.P. Program optimization using object file summary information
CN100359470C (zh) * 2004-06-30 2008-01-02 中国科学院计算技术研究所 动静结合二进制翻译中静态信息不完备的处理方法及装置
US7797690B2 (en) * 2005-03-15 2010-09-14 International Business Machines Corporation System, method and program product to optimize code during run time
JP5119590B2 (ja) * 2005-11-10 2013-01-16 富士通セミコンダクター株式会社 マルチプロセッサを有するプロセッサ装置用のタスク分配プログラム及びタスク分配装置
US8214813B2 (en) 2007-01-12 2012-07-03 Microsoft Corporation Code optimization across interfaces
US8370821B2 (en) * 2007-08-21 2013-02-05 International Business Machines Corporation Method for enabling profile-based call site tailor-ing using profile gathering of cloned functions
US8776030B2 (en) * 2008-04-09 2014-07-08 Nvidia Corporation Partitioning CUDA code for execution by a general purpose processor
US9678775B1 (en) 2008-04-09 2017-06-13 Nvidia Corporation Allocating memory for local variables of a multi-threaded program for execution in a single-threaded environment
GB2463942B (en) * 2008-10-03 2012-08-08 Icera Inc Disassembling an executable to analyse function calls to minimise cache misses
CA2684226A1 (en) * 2009-10-30 2011-04-30 Ibm Canada Limited - Ibm Canada Limitee Eleminating redundant operations for common properties using shared real registers
US9134977B2 (en) * 2010-02-26 2015-09-15 Red Hat, Inc. Compiler operation for handling conditional statements
US8694978B1 (en) * 2011-03-25 2014-04-08 Google Inc. Function side-effect modeling by prototyping
US9183021B2 (en) * 2011-05-31 2015-11-10 Red Hat, Inc. Runtime optimization of application bytecode via call transformations
US8966463B2 (en) * 2011-11-29 2015-02-24 Microsoft Technology Licensing, Llc Eliminating redundant function calls
CN104063208B (zh) * 2013-03-21 2017-11-17 北京百度网讯科技有限公司 代码文件的优化方法、系统和服务器
KR102152735B1 (ko) 2013-09-27 2020-09-21 삼성전자주식회사 그래픽 처리 장치 및 이의 동작 방법
US9274769B1 (en) 2014-09-05 2016-03-01 International Business Machines Corporation Table of contents pointer value save and restore placeholder positioning
US9146715B1 (en) 2014-09-05 2015-09-29 International Business Machines Corporation Suppression of table of contents save actions
US9244663B1 (en) 2014-12-22 2016-01-26 International Business Machines Corporation Managing table of contents pointer value saves
US20170123798A1 (en) * 2015-11-01 2017-05-04 Centipede Semi Ltd. Hardware-based run-time mitigation of blocks having multiple conditional branches
CN109726816A (zh) * 2018-12-12 2019-05-07 中国航空工业集团公司西安航空计算技术研究所 一种汇编级染色器程序链接优化方法

Family Cites Families (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
AU7355494A (en) * 1993-07-15 1995-02-13 Apple Computer, Inc. Multiple entry point method dispatch
JP3311462B2 (ja) * 1994-02-23 2002-08-05 富士通株式会社 コンパイル処理装置
JPH08147155A (ja) * 1994-11-22 1996-06-07 Sumitomo Metal Ind Ltd オブジェクトプログラムの命令の変更/挿入方法及びシステム
US6021272A (en) * 1995-10-04 2000-02-01 Platinum Technology, Inc. Transforming and manipulating program object code
US6324683B1 (en) * 1996-02-23 2001-11-27 International Business Machines Corporation System, method and program for debugging external programs in client/server-based relational database management systems
JP3278603B2 (ja) * 1998-01-12 2002-04-30 エヌイーシーマイクロシステム株式会社 コンパイル装置、コンパイラの最適化方法及びコンパイラの最適化手順を記録した記録媒体
JPH11272473A (ja) 1998-03-24 1999-10-08 Toshiba Corp プログラム言語処理装置のコード最適化方式
GB2345989A (en) * 1999-01-23 2000-07-26 Ibm Executing defined sequences of prolog instructions.
US6763452B1 (en) * 1999-01-28 2004-07-13 Ati International Srl Modifying program execution based on profiling
GB2349485B (en) * 1999-04-23 2003-12-10 Ibm Application management
US6408433B1 (en) * 1999-04-23 2002-06-18 Sun Microsystems, Inc. Method and apparatus for building calling convention prolog and epilog code using a register allocator
US6539543B1 (en) * 1999-11-29 2003-03-25 Adelante Technologies, Nv Method and apparatus for compiling source code by flattening hierarchies
US6588009B1 (en) * 1999-11-29 2003-07-01 Adelante Technologies Nv Method and apparatus for compiling source code using symbolic execution

Also Published As

Publication number Publication date
JP2002259134A (ja) 2002-09-13
CN1374585A (zh) 2002-10-16
US20040205739A1 (en) 2004-10-14
US6966055B2 (en) 2005-11-15
JP4181326B2 (ja) 2008-11-12
KR20020070809A (ko) 2002-09-11

Similar Documents

Publication Publication Date Title
CN1265290C (zh) 优化链接后代码的方法
CN1302385C (zh) 编译装置
CN1152287C (zh) 二进制程序转换设备和转换方法
CN1752934A (zh) 编译器、编译方法以及编译程序
US10534590B2 (en) Dynamic recompilation techniques for machine learning programs
US7707566B2 (en) Software development infrastructure
CN1570870A (zh) 终极管道和最优重排技术
US6983458B1 (en) System for optimizing data type definition in program language processing, method and computer readable recording medium therefor
CN103984582A (zh) 一种热更新方法和装置
CN1361891A (zh) 用于可扩展宏语言的方法和系统
CN1257454C (zh) 用于展开计算机程序中超级块的编译装置和方法
CN1613058A (zh) 配有jit编译器的虚拟计算机,操作所述计算机的方法以及包括所述虚拟计算机的终端设备
CN1672150A (zh) 用于软件原子化的视图
CN1419192A (zh) 中间代码预处理、执行装置及执行系统及计算机程序产品
US20040019884A1 (en) Eliminating cold register store/restores within hot function prolog/epilogs
CN1904853A (zh) 一种嵌入式软件装载调试方法及其系统
CN1823322A (zh) 用于程序代码转换的共享代码缓存方法及设备
US7036116B2 (en) Percolating hot function store/restores to colder calling functions
CN106648638A (zh) 一种基于python的R.java文件的优化方法及优化系统
JPH0926884A (ja) バイナリ操作を必要とするタスク中に必要なフロー情報を使用可能とする方法および装置
US20090119652A1 (en) Computer Program Functional Partitioning System for Heterogeneous Multi-processing Systems
CN1900910A (zh) 二进制翻译中经由跳转表的多目标分支语句的识别方法
CN1525323A (zh) 处理器以及用于产生在处理器中使用的程序的编译器
CN1949176A (zh) 用于管理试探特性的方法和系统
Sabot et al. CMAX: A Fortran translator for the ConnectIon Machine system

Legal Events

Date Code Title Description
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20060719

Termination date: 20210227

CF01 Termination of patent right due to non-payment of annual fee