保留部分冗余移去的运行时间行为的制作方法

文档序号:6375146阅读:161来源:国知局
专利名称:保留部分冗余移去的运行时间行为的制作方法
背景技术
部分冗余移去(PRE)准许部分冗余表达式从程序中移除。这在图1(a)(现有领域)和图1(b)(现有领域)中阐明。图1(a)证明典型的PRE问题。在控制流程图100中,存在四个表达式h(x)的出现。为简单起见,这四个出现被假定计算相同的值,而且没有其它副作用。节点7处的表达式h(x)是完全冗余的,这是因为在该点处,h(x)已经在节点4或节点5处被预先计算了。节点9处的表达式是部分冗余的,这是因为在该点处,h(x)可能已经沿着从节点1到节点8的路径而被计算了,后者没有沿着从节点1到节点2的路径计算。
移除冗余的传统方法在图1(b)中阐明了。为移去在节点7处标识的完全冗余,在节点4或节点5处计算的表达式h(x)的数值被分配一临时变量t。在节点7处,h(x)的计算由t替换。为移除节点9处的部分冗余,表达式h(x)的实例被插入并被保存在临时变量t中。该插入使得节点9处的表达式h(x)是完全冗余的,并且这样其h(x)计算由临时变量t的使用而替代。
与部分冗余移去的传统解决方法相关联的问题是其改变了原代码的运行时间行为。若h(x)的计算抛出一异常(throws an exception)或者该h(x)的计算不能终止,则h(x)的向上运动可促使基础代码(underlying code)表现不同。例如,若h(x)抛出异常A,则h(x)在另一个抛出异常B的计算之前被向上移动了。现在,该变换会促使代码抛出异常A,而不是异常B。由于同样的原因,向下移动也可促使运行时间行为的类似变化。因此,传统方法通常不能被用于要求保留异常行为的环境中。


在这里做出权利要求或在这里说明的本发明依照范例实施例而被进一步说明。这些范例实施例是参考附图而被详细说明的。这些实施例是非限制性范例实施例,其中,在这几个附图视图中,相同的参考数字代表相同的部分,附图如下图1(a)-(b)(现有领域)阐明冗余问题以及移除完全和部分冗余的传统解决方法;图2依照本发明的实施例,描述保留冗余移去的运行时间行为;图3依照本发明的实施例,描述保留冗余移去的运行时间行为的范例内部高层框图;图4依照本发明的实施例,示出数据流分析器的范例内部结构;图5(a)阐明四点金刚石格点;图5(b)依照本发明阐明范例控制流程图上范例数据流分析器的输出;图6依照本发明,示出完全冗余移去机制的范例内部结构;图7依照本发明,描述部分冗余移去机制的范例内部结构;图8是依照本发明的范例进程流程图,其中冗余被以保留运行时间行为的方式而被移去;图9是依照本发明的范例进程的流程图,其中完全冗余被标识并被移去;图10是依照本发明的范例进程的流程图,其中部分冗余被标识并被移去;图11依照本发明阐明保留冗余移去的运行时间行为的范例;图12(a)-(c)依照本发明阐明移去关于循环中的循环不变式的部分冗余的范例;图13(a)-(c)依照本发明阐明移去关于循环中的循环不变式的部分冗余的范例;图14依照本发明,描述使用保留冗余移去的运行时间行为机制的框架。
具体实施例方式
下面说明的处理可由正确编程的通用计算机单独或者与专用计算机结合而执行。这样的处理可由单独平台或由分布式处理平台执行。另外,这样的处理和功能性能以专用硬件的形式或以由通用或网络处理器运行的软件或固件形式而实现。在这样的处理中操作或被创建为这样的处理结果的数据可被保存在任何存储器中,如传统领域中的。例如,这样的数据可被保存在暂态存储器中,如所给计算机系统或子系统的RAM。另外,或者其它方法,这样的数据可被保存在长期存储器件中,如磁盘、可重写光盘,等等。为这里揭示起见,计算机可读介质可包含任何形式的数据存储机制,这包括这样的现有存储器技术,以及这样结构或这样数据的硬件或电路表示。
图2依照本发明,描述保留冗余移去的运行时间行为。保留冗余移去的运行时间行为机制210采用原代码200作为输入,并移除原代码200中的冗余,以通过原代码200的运行时间行为被保留的方式而产生最优化代码220。最初代码200可用诸如Pascal、Visual Basic、C和Java这样的编程语言来开发。C语言的异体也可被包括在内,这如C++、Borland C和C#。
原代码200可包括不同的变量声明、结构定义以及不同的语句。语句可使用诸如变量或函数这样的定义。语句也可计算一个或多个变量的值。例如,赋值语句可计算特定的变量值。不同的赋值语句可将常量分配给整个阵列。原代码200中的冗余可存在于相同的数值沿着与原代码200相关联的控制流程图中的路径而被计算不止一次的时候。完全冗余存在于要被计算的数值已经被预先肯定计算的时候。部分冗余出现在要被计算的数值可能已经被预先计算的时候。
图3依照本发明的实施例,描述保留冗余移去的运行时间行为机制210的范例内部高层框图。保留冗余移去的运行时间行为机制210包含临界边断开机制(a critical edge breaking mechanism)310、编号机制320、数据流分析器330、完全冗余移去机制340,以及部分冗余移去机制350。
保留冗余移去的运行时间行为机制210的操作可依照原代码200的控制流程图而被说明。一个范例控制流程图在图1(a)中阐明了。在控制流程图中,存在节点和边。每个节点可代表一条或多条指令、语句或子例程调用。有向边是尾节点和头节点之间的链接,其表示从尾节点到头节点的流程。边可以是有关基本节点的流入边或流出边。流入边表示进入基本节点的流程。例如,图1(a)中节点2和节点9之间的边是有关节点9的流入边,其表示从节点2到节点9的计算流程。
控制流程图中的节点可具有不止一个与其相关联的边。例如,节点可既具有流入边,又具有流出边。节点2具有流入边和流出边。节点也可具有不止一个流入边或不止一个流出边。如可在图1(a)中看到的,节点1具有两个流出边,其表示在节点1之后的流程有不止一条路径。例如,若节点1代表双分支条件语句(如IF…ELSE语句),则其具有相应于两个输出边的两个结果。同样的,图1(a)中的节点9具有大于两条的流入边,其表示流程进入节点9存在不止一条路径。例如,一条路径相应于沿着由开始于节点1处语句IF部分的路径的计算序列,另一条路径相应于开始于节点1处语句ELSE部分的路径。
临界边断开机制310标识控制流程图中的临界边,并且通过插入新节点而断开每个这样的临界边。若初始节点具有多个流出边且结束节点具有多个流入边,则该边就被定义为临界边。通过在初始节点和结束节点之间插入新的节点而“断开”临界边。例如,在图1(a)中,节点2和节点8是预先存在于节点1和节点9之间以及存在于节点7和节点9之间的临界边上这样被插入的新节点。
编号机制320负责执行数值编号。这样的数值编号将符号名分配给所有或者计算相同数值或者显示诸如抛出相同异常或不能终止这样的相同运行时间行为的定义。例如,两条定义”x=5/a”和”y=5/b”可被分配相同的数值编号,若”a”和”b”的变量数值具有相同的数值编号的话。在这种情况下,当“a”和“b”相等时,商在两种情形下也是相等的,且这两种情况均会在“a”和“b”均是零的时候抛出“被零除”的异常。
定义是计算表达式值并将已计算的值分配给目的文件(destination)的指令或语句。最好的结果是,或者表达式或者目的文件(或者两者)应当为本地无地址变量(a local non-address-taken variable)。进一步,表达式应该不比可能组成想要移去的部分冗余工作的最小单元复杂。在定义更加复杂的情况下,其可能通过引入新的变量或新的赋值语句而被分解为令人满意的形式。例如,”b[i]=h(a[i])”可被分解为”s=a[i];t=h(s);b[i]=t”,或者甚至更进一步分解(若允许取地址“&”算子和取内容“*”算子”s=a[i];t=h(s);u=&b[i];*u=t”。)。
数值编号机制320确保若两个定义的行为相同(包括在正常条件下以及在异常条件下),则它们被赋予相同的数值编号。任何本领域已知的数值编号技术可用来实现编号机制320。在一个较佳实施例中,采用渐进数值编号算法(aggressive value numbering algorithm)。通过使用渐进编号算法,既可处理函数调用定义,又可处理非函数调用定义。在处理功能调用定义中,对函数调用的输出相应于被调用函数可读取的所有位置集合。这样的位置组成一函数的读取集合。假定对相同函数有两个不同调用,则读取集合没有在调用之间被修改的证明保证这两个调用将具有相同的行为。也就是说,它们将计算相同的数值、写相同的数值,并抛出相同的异常。这甚至对间接(虚拟)调用也是真实的,依照它们的目标具有相同的值号码。
数据流分析器330根据控制流程图来执行流分析,那里所有的定义都是已编号的数值。对每个独特的值号码而言(其可相应于多个定义实例),数据流分析器330扫描通过整个基础控制流程图,以识别有关每个定义实例的其可用性状态和预期状态。特定指令(如k)的定义可用性状态(如相应值号码n)(如在特定的节点,这包括被临界边断开机制310新近添加的节点)可被表示为AVAIL(k,n)。这个AVAIL(k,n)值表明指令k中具有值号码n的定义数值是否可用在评估点处。
同样的,指令k具有值号码n的定义预期状态可被表示为ANTIC(k,n)。ANTIC(k,n)的数值表明指令k中具有值号码n的定义数值是否需要或在评估点后使用,以及该定义是否可在这个点处被计算。有关确立这些状态数值的更详细的讨论参考图4-5被给出。
基于与控制流程图中每个节点处的每个定义相关联的已检测可用性状态信息(AVAIL),完全冗余移去机制340标识现有的完全冗余,并随后移去这样标识的完全冗余。部分冗余移去机制350根据AVAIL和ANTIC状态来标识现有的部分冗余,并随后移去已标识的部分冗余。
图4根据本发明的实施例,示出在计算涉及数值编号定义的状态信息时数据流分析器330的范例内部结构。数据流分析器330包含前进流分析器410和后退流分析器420。前者执行有关基础控制流程图的前进方向的流分析,以生成可用性状态信息AVAIL。后者执行后退方向的流分析,以生成预期状态ANTIC。
AVAIL和ANTIC均具有表明基础状态的数值。AVAIL表明特定节点处定义数值的可用性。也就是说,其表明该定义的数值是否已经可用于该节点之前。可能的不同状态可包括“不可用”、“可能可用”、“必须可用”或者“不关心”。另一个方面,特定节点处定义的预期状态表明基础定义的值是否需要或用于这个特定节点以外。同样的,不同的状态信息可包括“没有使用”、“可能使用”、“必须使用”以及“不能确定”。图5(a)阐明包含那四个提到值的四点金刚石格点,那里“顶端”意味着“不关心”。有关格点值的交操作符∩表示“最坏情形”。下面是做出定义的表格

在前进流分析阶段,前进流分析器410(图4)可开始于控制流程图中的第一(顶端)节点(如图1(a)中的节点1)并顺着边方向而遍历整个控制流程图。在前进流分析中,在每个节点处,执行两个可用性评估。一个是在节点的入口点处,或者沿着节点的流入边。这是用AVAILin来表示的。另一个是在节点的出口点处,或者沿着节点的流出边。这是用AVAILout来表示的。AVAILin和AVAILout分别表示进入节点时和离开节点时相关定义值的可用性。
节点的AVAILout可由该节点的AVAILin以及在该节点中执行何种计算来确定。例如,若基础定义的值在该节点处没有变化(即在这个节点处没有计算该值,而且在这个节点处影响该值计算的位置没有发生变化),则AVAILout简单地继承AVAILin的值。当节点具有单个流入边时,AVAILin的数值与前导节点(即流入边的初始节点)的AVAILout相同。当节点具有多个引入边时,AVAILin的值可根据来自所有前任节点的AVAILout的值而被确定。在一个较佳实施例中,特定节点处的AVAILin和AVAILout的值均可被定义为 若指令k是进入指令(如图1(a)中的节点1),则AVAILin(k,n)的数值是“否”。若节点k不是进入指令,则AVAILin(k,n)的值被计算为所有前导节点的所有AVAILout值的“交”(如操作符∩)。
若基础定义用指令k来计算(在节点处)并且该计算不改变用于计算该定义的输入,则AVAILout的值是“必须”。也就是说,在这种情况下,我们确切的知道该值是可用的。若用于计算定义的输入被改变(ALTERED(k,n)=true),则AVAILout的值是“否”。否则,AVAILout的数值简单继承相同节点AVAILin(k,n)的值,这是因为没有对此节点进行任何操作已改变了该值的可用性。
当后退流分析器420执行后退流分析时,其开始于控制流程图的最后节点(如图1(a)中的节点10)并顺着该边的相反方向而遍历整个控制流程图。在后退流分析中,在每个节点处,执行两个预期评估。一个是在节点的退出点处,或者沿着节点的流出边。这是用ANTICout来表示的。另一个是在节点的入口点处,或者沿着节点的流入边。这是用ANTICin来表示的。ANTICin和ANTICout分别表示有关进入节点时和离开节点时节点处相关定义值的预期需要。在一个较佳实施例中,ANTICin和ANTICout的数值可被计算为 若指令k计算定义,则ANTICin(k,n)的值是“必须”,这是因为其一定有可能在该节点处计算。若指令k不计算定义并改变用于计算定义的输入,则ANTICin(k,n)的值是“否”,这是因为在节点前计算的值可能在影响其计算的输入改变的作用下变成过时状态。否则,ANTICin(k,n)的值就是ANTICout(k,n)的值。若指令k是退出指令,则ANTICin(k,n)的值是“否”。否则,ANTICin(k,n)的值被计算为所有后继节点的所有ANTICin值的“交”(如操作符∩)。
前进流分析和后退流分析产生四个状态值(AVAILin(k,n)、AVAILout(k,n)、ANTICout(k,n)、ANTICout(k,n)),其关于具有每个节点处每条指令k的值号码n的每个定义。这样的评估状态既用于标识冗余(完全和部分),又用于已标识冗余的移去。
图5(b)阐明关于范例控制流程图中每个节点的AVAILin、AVAILout、ANTICin以及ANTICout的计算值。
图6根据本发明的实施例,示出完全冗余移去机制340的范例内部结构。该完全冗余移去机制340包含完全冗余标识器610和完全冗余移去器620。前者是要标识完全冗余的位置,而后者是要将完全冗余从这样标识的位置中移去。在一个较佳实施例中,完全冗余标识器610使用准则AVAILin(k,n)=”Must”来识别完全冗余。也就是说,若具有值号码n的定义值在流进入节点k的时候确保可用,则完全冗余存在于节点k处。有关移去完全冗余的细节参考图9来讨论。
图7根据本发明的实施例,描述部分冗余移去机制620的范例内部结构。部分冗余移去机制350包含部分冗余标识器710、标志插入机制720以及保护插入机制730。部分冗余标识器710负责根据有关每个节点处每条指令中的每个定义的可用性和预期状态而对部分冗余进行定位。
标志插入机制720负责初始化在适当节点处插入的必要标志数值,以表示部分冗余已经被检测到的定义值的可用性。保护插入机制730负责在部分冗余被检测到的节点处插入与插入标志相关联的保护指令。涉及部分冗余检测的细节参考图10来讨论。
图8是根据本发明实施例的范例进程的流程图,其中代码中的冗余以保留运行时间行为的方式而被移去。首先在动作810处,根据关于要执行冗余移去的原代码而构造控制流程图。在动作820处,控制流程图中的临界边通过插入添加的节点而被标识并被断开。这就创建已更新的控制流程图。
然后在动作830处执行值编号。在动作840和850处,关于每条指令中的每个独特的值号码,根据值号码来执行前进流分析和后退流分析。这就产生相应于每条指令中每个定义值的可用性和预期用途的四个状态值,其在基础节点的登录和退出点处均被评估。根据这些可用性和预期使用状态信息,完全冗余在动作860处被移去,并且部分冗余在动作870处被移去。涉及移去完全和部分冗余的细节在下面参考图9和图10来讨论。
图9是根据本发明实施例的范例进程的流程图,其中节点处的完全冗余被标识并被移去。对每个指令而言(或者在控制流程图的每个节点处),具有值号码n的定义d首先在动作910处被标识。然后,在动作920处决定,当前节点处定义d的计算根据上述准则是否是完全冗余的。若其不是完全冗余的,则在动作960处决定,在这个节点处是否有其它需要检查有关完全冗余的定义。若至少剩余一个定义,则处理返回到动作910处,以检查下一个定义。否则,有关当前节点的处理在动作970处终止。该处理可前进到下一个节点(未示出)。
若定义d的计算被标识为完全冗余,则执行一系列操作,以移去该冗余。在动作930处,临时变量t(n)被用来替换具有值号码n的定义d。然后,在动作940处,插入指令,其将t(n)的值复制到定义d的初始目的文件。最后,在动作950处,通过使用临时变量t(n),定义d(具有值号码n)的每个使用都被替换了。移去完全冗余的一个例子在图11中阐明了。图1(a)示出初始控制流程图。在这个例子中没有临界边。在节点7处计算的定义h(x)被标识为完全冗余。不是在节点7处再次计算h(x),而是在节点4或节点5处计算的h(x)被复制到临时变量t中。然后,在节点7处,h(x)的计算参考临时变量t而被替换。
图10是根据本发明实施例的范例进程的流程图,其中给出原代码中的部分冗余被标识并被移去。首先在动作1010处标识合并点(a merge point)之前的指令k。合并点是具有不止一个流入边的节点。例如,图1(a)中所示控制流程图中的节点9是合并点处的节点。用j表示的第一指令也在动作1015处被标识。这个合并点之前的指令可为节点1处或节点7处的指令(节点2和8是被添加的节点)。相关指令k,具有值号码n的定义d在动作1020处被标识。
在动作1025处确定指令k中具有值号码n的定义d是否为部分冗余。用来做出该判决的准则包括两部分。一部分是AVAILin(j,n)的值是“可能”,这意味着合并点处第一指令j处的定义d可能是可用的。另一部分是指令k处定义d的预期需要或者为“可能”或者为“必须”。当两个条件都满足时,存在要移去的有用部分冗余。仅当第一条件被满足时,存在部分冗余,但是表达式是“无用”,并且其通常通过编译器内的其它优化而被移去。仅当第二条件符合时,就不存在冗余。
若没有关于与指令k相关联的定义d的部分冗余,则处理前进到动作1050,以确定是否有另一个要被检查部分冗余的相关指令k的定义。若有的话,则处理返回到动作1020,以标识下一个定义。若所有与指令k相关联的定义都已经被检查过,则处理前进到下一条指令,若有的话。当还有指令的时候,处理返回到动作1010,以标识合并点之前的下一条指令。
当存在部分冗余时,标志被插入,其具有初始化值。由于合并点处的节点具有不止一个流入边,其依据可用性状态AVAILout(k,n),标志的值可被不同地设置。图5(b)和11共同阐明该点。节点2处AVAILout(k,n)的值是“否”,其在动作1030处被确定,这表明定义d的值是不可用的。在这种情况下,标志在节点2处被插入(一添加节点),其具有初始值零,这代表定义d的值还没有被计算的事实。这在动作1035处执行。另一方面,节点8处AVAILout(k,n)的值是“必须”,其在动作1040处被确定,这表明定义d值的可用性被确保为可用。在这样的情况下,标志在节点8处被插入(一添加节点),其具有初始值一,其在动作1045处被执行。
当处理所有指令中的所有定义,用于检测部分冗余并插入标志之后,保护插入机制730进一步将防护插入到部分冗余存在的每个合并点处。对每个合并点而言,指令(如指令k)在动作1060处标识。然后对合并点处相关指令k的每个定义(如定义d)而言,若具有值号码n的定义d的值的可用性不确定(即AVAILin(k,n)=“可能”),其在动作1065处被确定,则保护插入机制730在动作1075处插入有关定义d的保护。
有关定义d的保护根据沿着合并点之前不同流入分支而插入的标志被设置。这在图11中阐明,其中标志在节点2和节点8处被初始化(即f=0且f=1)。在合并节点9处,根据插入标志f来构造保护。“if”条件指令被插入(在图11中的新节点9a处),其检查标志的值(即“if f=0”)。若f的值是一,则其表明定义d的值(如h(x)=d)已经被计算并可确保用于这个点处。在这种情况下,对指令k中定义d的参考被变量t(n)替换(在第二添加新节点9c处)。
若f的值是零,则其表明定义d的值还没有被计算,且其不可用于这个点。在这样的情况下,h(x)被在第三添加新节点9b处计算。在这个例子中,由于没有循环,所以标志f的值就没有被重新设置为一。在本发明的其它实施例中,标志f的值可在定义d是循环中的循环不变量时被重新设置。图12和图13说明在包括循环不变量定义的情况下的备选保护构造。保护插入机制730(在动作1085处)迭代每条指令的每个定义(动作1080处),并在动作1090处终止该处理。
图12(a)-(c)依照本发明的实施例,阐明移去相关循环中循环不变量的部分冗余的范例。图12(a)示出初始控制流程图,其中控制流h(x)是循环不变量,而其在每次迭代中被重新计算。这是部分冗余,原因是第一次计算是需要的,但其余计算不是需要的。图2(b)根据一个实施例,示出用于移去部分冗余的一个解决方案。标志f在具有初始值为零的循环入口之前被插入。现有领域解决方案将循环不变量提升到循环外。这样解决方案中的h(x)的向上运动改变运行时间异常或终止行为。
在图12(b)中,一保护包围在节点2周围,那里h(x)以保留h(x)运行时间异常以及终止行为的方式(上述)而被计算。然而,附加指令被插入,其将标志f的值设置为1,其表明h(x)已经被计算了。这里,标志在保护外被重新设置。使用这个重新设置的标志值,在后续重复中,h(x)将不被重新计算。通过这个解决方案,标志可在每个后续迭代中被设置。图12(c)中示出不同的备选方案,以移动将标志重新设置到保护内部的指令。这就避免设置标志不止一次。通过这个备选方案,标志f的活动范围可增加。
某些循环可具有零个迭代。这在图13(a)中被阐明。虽然节点2和节点3形成循环,但是循环可能从不迭代超过第一行程。传统的解决方案将在循环之前推理计算h(x),将h(x)的计算值赋给临时变量,并然后用临时变量来替换对h(x)的参考。这就改变了运行异常以及终止行为。如图13(b)所示,本发明的一个实施例通过推理在循环之前设置标志(f=0),并然后用保护围绕定义h(x)。一旦定义h(x)已经被计算,则标志在保护外部被重新设置(f=1)。在图13(c)所示的另一个实施例中,标志在保护内部被重新设置,以避免重复重新设置。同样的,这可增加标志f的活动范围。
图14根据本发明的实施例,描述使用运行时间行为的框架,其保留冗余移去机制,以导出最优化可执行代码。原代码200由运行时间行为处理,其保留冗余移去机制210,以产生最优化代码220。编译器1410对最优化代码220进行编译,以产生可执行最优化代码1420。代码执行机制1430执行可执行最优化代码1420。
虽然已经参考特定的已阐明实施例而说明了本发明,但是已经在这里使用的文字是描述性文字,并非限制性文字。在不背离本发明各方面范畴和主旨的前提下,可在附加权利要求书的范围内进行变化。尽管这里已经参考特定的结构、动作和材料来说明了本发明,但是本发明并不被限制在说明的细节,而是其可体现为多种形式,某些形式可能与说明的实施例大不相同,并且其可扩展到附加权利要求书范围内的所有等效结构、动作以及材料等。
权利要求
1.一种方法包含接收原代码;执行保留关于所述原代码的冗余移去的运行时间行为,以产生最优化代码,其中所述最优化代码是在从所述原代码中移去冗余之后导出的,这是通过以所述最优化代码的所述运行时间行为与所述原代码的所述运行时间行为相同的方式进行的,以及所述移去冗余包括在运行时间移去可能抛出一异常或不能终止的指令。
2.如权利要求1所述的方法,其特征在于所述执行保留冗余移去的运行时间行为包含将标志设置为表明所述原代码定义的所述可用性的值;以及将一保护插入到定义实例周围,其中所述保护能够根据所述标志的所述值来指引处理。
3.如权利要求2所述的方法,进一步包含对基于所述原代码确立的控制流程图中的节点相关联的指令中的每个定义进行编号,以产生编号定义;执行有关所述控制流程图的流分析,以关于所述控制流程图中的节点相关联的指令中的每个编号定义而产生第一对值和第二对值;根据所述第一对值和所述第二对值来移去所述原代码中的冗余。
4.如权利要求3所述的方法,其特征在于所述移去冗余包含使用所述第一和第二对值来移去部分冗余,其中所述第一对值对应于AVAILin和AVAILout,其表明分别在所述指令执行之前和之后所述已编号定义的所述值的所述可用性,并且第二对值对应于ANTICin和ANTICout,其表明所述已编号定义的所述值是否可分别在执行所述指令之前和之后被预期到,以及AVAILin、AVAILout、ANTICin和ANTICout的所述值包括顶端、必须、无,以及可能。
5.如权利要求4所述的方法,其特征在于所述移去部分冗余包含对每个已编号定义而言,标识具有多个流入分支的合并点,其中所述合并点处所述已编号定义的所述AVAILin的所述值表明所述合并点处所述已编号定义的所述值的所述可用性是不确定的;若关于所述已编号定义的AVAILout的所述值表明所述已编号定义不可用,则设置所述标志的第一数值;若关于所述已编号定义的AVAILout的所述值表明所述已编号定义可用,则设置所述标志的第二数值;以及放置对于所述已编号定义的所述合并点处的所述保护,其中所述保护根据所述标志的所述值来指引处理。
6.如权利要求4所述的方法,进一步包含根据所述第一对值来移去所述原代码中的完全冗余。
7.一种关于保留冗余移去的运行时间行为的方法包含在根据原代码构造的控制流程图中的每个节点处对指令中的每个定义进行编号,以产生已编号的定义;以及移去所述原代码中的冗余,使得所述原代码的所述运行时间行为被保留,其中所述冗余移去包括移去所述原代码中的指令,其在运行时可能抛出异常或者无法终止。
8.如权利要求7所述的方法,其特征在于所述移去冗余包含设置具有表明所述原代码定义的所述可用性值的标志;以及将保护插入到所述定义的实例周围,其中所述保护能够根据所述标志的所述值来指引处理。
9.如权利要求8所述的方法,进一步包含执行流分析,以产生关于相关所述控制流程图中节点的指令中的每个已编号定义的第一对值和第二对值,其中所述第一对值,其生成于前进流分析中,相应于AVAILin和AVAILout,这表明分别在执行所述指令之前和之后所述已编号定义的所述值的所述可用性,所述第二对值,其生成于后退流分析中,相应于ANTICin和ANTICout,这表明所述已编号定义的所述值是否可分别在执行所述指令之前和之后被预期到,以及AVAILin、AVAILout、ANTICin和ANTICout的所述值包括顶端、必须、无,以及可能。
10.如权利要求9所述的方法,其特征在于所述移去冗余包含根据所述第一对和所述第二对值来移去部分冗余。
11.如权利要求10所述的方法,其特征在于所述移去部分冗余包含对每个已编号定义而言,标识具有多个流入合并分支的合并点,其中在所述合并点处所述已编号定义的所述AVAILin的所述值表明在所述合并点处所述已编号定义的所述值的所述可用性是不确定的;若关于所述已编号定义的AVAILout的所述值表明所述已编号定义不可用,则设置所述标志的第一数值;若关于所述已编号定义的AVAILout的所述值表明所述已编号定义可用,则设置所述标志的第二数值;以及在对于所述已编号定义的所述合并点处放置所述保护,其中所述保护根据所述标志的所述值来指引处理。
12.如权利要求9所述的方法,进一步包含移去完全冗余,其中所述移去完全冗余包括标识与指令相关联的已编号定义是完全冗余的节点;用临时变量来替换所述已编号的定义;插入指令,其中所述插入的指令将所述临时变量的所述值复制到所述已编号定义的所述目的地;以及用所述临时变量的所述值来替换所述已编号定义的每个使用。
13.一系统包含编号机制,其能够对根据原代码确立的控制流程图的每个节点相关联的指令中的每个定义进行编号;数据流分析器,其能够执行有关所述控制流程图的流分析,以产生相关每个节点的每个已编号定义的第一对值和第二对值;冗余移去机制,其能够根据与每个节点相关联的所述第一对值和所述第二对值来移去所述原代码中的冗余,以产生最优化代码。
14.如权利要求13所述的系统,其特征在于所述数据流分析器包含前进流分析器,其能够执行前进流分析,以产生关于与指令相关联的每个已编号定义的所述第一对值;以及后退流分析器,其能够执行后退流分析,以产生关于与指令相关联的每个已编号定义的所述第二对值;其中所述第一对值对应于AVAILin和AVAILout,其表明分别在执行所述指令之前和之后所述已编号定义的所述值的所述可用性,所述第二对值对应于ANTICin和ANTICout,其表明所述已编号定义的所述值是否可分别在执行所述指令之前和之后被预期到,以及AVAILin、AVAILout、ANTICin和ANTICout的所述值包括顶端、必须、无,以及可能。
15.如权利要求14所述的系统,其特征在于所述冗余移去机制包含部分冗余移去机制,其能够根据所述第一对和所述第二对值来移去所述原代码中的部分冗余。
16.如权利要求15所述的系统,其特征在于所述部分冗余移去机制包含部分冗余标识器,其能够关于已编号定义来标识具有多个流入合并分支的合并点,其中所述合并点处所述已编号定义的所述AVAILin的所述值是“否”,这表明所述合并点处所述已编号定义的所述值是不可用的;标志插入机制,其能够在两个分支处插入标志并设置所述标志的值;以及保护插入机制,其能够在关于已编号定义的所述合并点处插入保护开关,其中所述保护开关根据所述标志的所述值来指引处理,其中所述标志被沿着第一合并分支设置为第一数值,若关于所述第一合并分支处的所述已编号定义的AVAILout的所述值表明所述已编号定义不可用的话,以及所述标志被沿着第二合并分支设置为第二数值,若关于所述第二合并分支处的所述已编号定义的AVAILout的所述值表明所述已编号定义可用的话。
17.如权利要求15所述的系统,进一步包含完全冗余移去机制,其能够根据所述第一对值来移去所述原代码中的完全冗余。
18.如权利要求17所述的系统,其特征在于所述完全冗余移去机制包含完全冗余标识器,其能够标识与一指令相关联的已编号定义是完全冗余的节点;以及完全冗余移去器,其能够移去所述节点处所述已编号定义的所述已标识的完全冗余,这通过将所述已编号定义的所述值赋给临时变量,插入指令,其中所述插入指令将所述临时变量的所述值复制到所述已编号定义的所述目的地,以及用所述临时变量的所述值来替换所述已编号定义的每个使用。
19.如权利要求13所述的系统,进一步包含编译器,其能够编译所述最优化代码,以生成可执行最优化代码;以及执行机制,其能够执行所述可执行最优化代码。
20.一种包含具有保存于其上指令的存储介质的制品,当由机器执行时,会产生如下情况接收原代码;执行保留有关所述原代码的冗余移去的运行时间行为,以产生最优化代码,其中所述最优化代码是在从所述原代码中移去冗余之后导出的,这是通过以所述最优化代码的所述运行时间行为与所述原代码的所述运行时间行为相同的方式进行的,以及所述移去冗余包括在运行时间移去可能抛出异常或不能终止的指令。
21.如权利要求20所述的制品,其特征在于所述执行保留冗余移去的运行时间行为包含设置具有表明所述原代码定义的所述可用性的值的标志;以及将保护插入到所述定义实例的周围,其中所述保护能够根据所述标志的所述值来指引处理。
22.如权利要求21所述的制品,所述指令当由机器执行时,进一步产生对根据所述原代码确立的控制流程图中的与节点相关联的指令中的每个定义进行编号,以产生编号定义;执行有关所述控制流程图的流分析,以关于所述控制流程图中的与节点相关联的指令中的每个编号的定义而产生第一对值和第二对值;根据所述第一对值和所述第二对值来移去所述原代码中的冗余,其中所述第一对值对应于AVAILin和AVAILout,其表明分别在执行所述指令之前和之后所述已编号定义的所述值的所述可用性,以及所述第二对值对应于ANTICin和ANTICout,其表明所述已编号定义的所述值是否可分别在执行所述指令之前和之后被预期到,以及AVAILin、AVAILout、ANTICin和ANTICout的所述值包括顶端、必须、无,以及可能。
23.如权利要求22所述的制品,其特征在于所述移去冗余包含使用所述第一和第二对值来移去部分冗余,所述移去部分冗余包括对于每个已编号定义而言,标识具有多个流入分支的合并点,其中所述合并点处所述已编号定义的所述AVAILin的所述值表明所述合并点处所述已编号定义的所述值的所述可用性是不确定的;若关于所述已编号定义的AVAILout的所述值表明所述已编号定义不可用,则设置所述标志的第一数值;若关于所述已编号定义的AVAILout的所述值表明所述已编号定义可用,则设置所述标志的第二数值;以及放置有关所述已编号定义的所述合并点处的所述保护,其中所述保护根据所述标志的所述值来指引处理。
24.如权利要求22所述的制品,所述指令,当由机器执行时,进一步根据所述第一对值而产生移去所述原代码中的完全冗余。
25.一种包含具有保存于其上有关运行时间行为冗余移去的指令的存储介质的制品,当由机器执行时,产生下面情况对根据原代码而构造的控制流程图的每个节点处指令中的每个定义进行编号,以产生已编号的定义;以及移去所述原代码中的冗余,使得所述原代码的所述运行时间行为被保留,其中所述冗余移去包括移去所述原代码中的指令,这在运行时间可能会抛出异常或无法终止。
26.如权利要求25所述的制品,其特征在于所述移去冗余包含设置具有表明所述原代码定义的所述可用性值的标志;以及将保护插入到所述定义的周围,其中所述保护能够根据所述标志的所述值来指引处理。
27.如权利要求26所述的制品,当由机器执行时,进一步产生执行流分析,以产生关于与所述控制流程图中的节点相关联的指令中的每个已编号定义的第一对值和第二对值,其中所述第一对值,其生成于前进流分析中,相应于AVAILin和AVAILout,这表明分别在执行所述指令之前和之后所述已编号定义的所述值的所述可用性,所述第二对值,其生成于后退流分析中,相应于ANTICin和ANTICout,这表明所述已编号定义的所述值是否可分别在执行所述指令之前和之后被预期到,以及AVAILin、AVAILout、ANTICin和ANTICout的所述值包括顶端、必须、无,以及可能。
28.如权利要求27所述的制品,其特征在于所述移去冗余包含根据所述第一对和所述第二对值来移去部分冗余,所述移去部分冗余包括对于每个已编号定义,标识具有多个流入合并分支的合并点,其中所述合并点处所述已编号定义的所述AVAILin的所述值表明所述合并点处所述已编号定义的所述值的所述可用性是不确定的;若关于所述已编号定义的AVAILout的所述值表明所述已编号定义不可用,则设置所述标志的第一数值;若关于所述已编号定义的AVAILout的所述值表明所述已编号定义可用,则设置所述标志的第二数值;以及放置有关所述已编号定义的所述合并点处的所述保护,其中所述保护根据所述标志的所述值来指引处理。
29.如权利要求26所述的制品,所述指令当由机器执行时,进一步产生移去完全冗余,其中所述移去完全冗余包含标识与指令相关联的已编号定义是完全冗余的节点;用临时变量来替换所述已编号的定义;插入一指令,其中所述插入的指令将所述临时变量的所述值复制到所述已编号定义的所述目的地;以及用所述临时变量的所述值来替换所述已编号定义的每个使用。
全文摘要
提供用于移去部分冗余的布置。处理原代码,以执行保留冗余移去的运行时间特性。部分冗余以原代码的运行时间行为被保留的方式而被移去。
文档编号G06F9/44GK1906577SQ200380107712
公开日2007年1月31日 申请日期2003年12月11日 优先权日2002年12月31日
发明者A·洛宾森 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1