非循环的指令模式的识别方法

文档序号:6656631阅读:169来源:国知局
专利名称:非循环的指令模式的识别方法
非循环的指令模式的识别方法交叉引用本申请要求于2002年11月12日提交的美国临时申请No.60/425251的 权益;是于2003年3月7日提交的美国专利申请No.10/382578的部分继续; 并且要求于2004年8月12日提交的美国临时申请No.60/600999的权益,通 过引用将所有内容合并于此。技术领域本公开涉及程序中的指令模式识别,本发明涉及通过优化编译器识别非 循环模式。
背景技术
开是必要的。定点饱和算法(fixed —point saturating arithmetic)被广泛用于i某体和数 字信号处理应用中。给定B位二互补(two's complement)运算OP,其饱和 对应方(saturating counterpart)检测上溢,并且将结果设置到可表示数范围 的极限MaxB 如果OP (x, y)上溢 OPsat(x,y)=MinB 如果OP(x, y)下溢 (1)OP (x, y),其它情况 例如,依据饱和算法运算(参考文献1和2 )表示在GSM标准中的语音 编码解码器。诸如TIC6x、 IntellA-32和ARM之类的很多现代处理器架构 实现饱和算法指令。诸如ANSI C之类的标准编程语言不提供用于饱和算法的运算符。通常, 应用程序开发者加入了根据基本二互补算法实现这些运算的函数库或宏。为 了在给定基本架构上获得高性能,不得不集合地编码这些库,或者使用卖家 专用的库或语言扩展来编码这些库。这显然使软件开发和维护复杂化。已经提出了各种语言扩展和标准(参考文献3)。由于已经成立的卖家一般不愿意进行标准化,所以它们的未来是不明朗的。因此,程序员被迫在可移^i性和效率之间进行折衷。解决该折衷问题的方式是编译器自动识别实现饱和算法的代码段,并且 将它们转换为合适的机器指令。为了使该解决方案有效,识别算法必须足够强健,并且可以跨越不同编码类型(style)进行工作。可以以抽象语法树上 的筒单模式匹配开始。然而,由于需要考虑饱和加法(addition)的各种实现,因此这样的方法 的限制是明显的。在美国专利申请No.10/382578中展示了这些实例。为了证 明两个饱和的加法指令都等效于方程1中的定义,需要证明各种位操作序列 和逻辑运算的结果之间的等效性。需要具有形式代数基础的方法来代替专门(ad - hoc )方法。在美国专利申请No.10/382578中,具体描述了用于识别饱和加法和减法 的方法。本公开认识到在前述申请中的原理可以应用到任何非循环操作中, 并且可以以一^:术语表示。发明内容本公开的方法通过优化编译器来确定给定程序中的任何变量是否等于程 序中应用到给定变量x, y...的给定非循环数学函数f (x, y…)。在一个实施 例中,该方法包括将函数f(x, y...)的值的位表示为输入x, y…的位的布 尔函数;对于每个变量v和程序语句s,将当执行s时v取的值表示为x, y… 的位的布尔函数V(s, v) (x, y...);和对于每个语句s,将执行语句的条件 表示为输入x, y...的位的布尔函数C (s) (x, y…)。最后,使用布尔满足性 谕示(oracle)确定对于给定变量v和程序语句s,下面的布尔表达式是否成 立C(s)(x, y...)=>V(s, v)(x, y…)=f(x, y…)。在第二实施例中,该方法包括将f (x, y…)的值表示为具有对应的判 定(predicate) P」(x, y…)的多个函数fj ( x, y…);对于每个变量v和程序 语句s,将当执行s时v取的值表示为多个函数Vj (s, v)(x, y...),每个判 定Pj(x, y...)对应一个;和对于每个语句s,将执行语句的条件表示为多个 函数C」(s)(x, y…),每个判定Pj(x, y…)对应一个。最后,确定是否只 要判定Pj(x, y...)和条件Cj (s) (x, y…)为真,则对于给定变量v和程序语句s, Vj (s, v) (x, y…)=fj (x, y…)。在任一实施例中,可以变换程序,使得通过添加指令t = f (x, y...)的 调用;和在每个语句s中用对t的引用替换对变量v的每个引用,使得在s 中v的值等于f(x, y...),来由可用函数f(x, y...)计算取函数f (x, y...) 的值的每个变量v的值。通过失效码(dead-code)消除法消除程序变换之 后不使用的指令。其中以硬件计算数学函数f (x, y...),可以变换程序,使 得通过可用的用于f (x, y…)的硬件指令来计算取函数f (x, y...)的值的 每个变量v的值。当接合附图考虑时,本发明的这些和其它方面将从下面的本发明详细描 述中变得更加清楚。


图1是合并本公开的原理的方法的第一实施例的流程图。 图2是合并本公开的原理的方法的第二实施例的流程图。 图3是图表和数据流组。
具体实施方式
将描述用于饱和算法运算的自动识别的一系列技术。在大多数情况下, 识别问题仅是布尔电路等效之一。给定解决电路等效的开销,还描述基于抽 象解释的一系列实际近似。实验显示出本技术在可靠地识别饱和算法的同时,具有小的汇编时间开 销。本方法不限于饱和算法,而是可以应用到识别诸如进位加(add-with-carry)和算术移位之类的其它的语法(idiom)中。可以通过非循环程序段来定义饱和运算。因此,可以按位(bit-wise) 地将它们的结果和中间值描述为依据输入的布尔表达式。该观察暗示出下面 的解决方案 给定非循环候选代码段,提取描述其变量的值的布尔表达式。
使用布尔表达式等效谕示(equivalence oracle ),测试是否有任何表达 式匹配才莫々反。为了测试本方法的实用性,实现了采用二元决策图包(binary decision diagram package ) BuDDy (参考文献4 )的、用于饱和加法的识别算法作为谕示。该算法挑选候选二互补加法运算z-x + y,并且尝试发现在程序中依赖于 该运算的哪些值承载其饱和值(saturated value )。对于该程序的控制流程图的 每个边,该算法计算(只要可能)执行该边的条件。将该条件表示为x, y的 位的布尔函数。对于每个变量,该算法将在每个边上的变量值作为x, y的位 的布尔函数计算。基于BDD的算法的概要是ExactMatch (G:程序CFG, OP:要匹配的运算){重复{ —才兆选^美选《直x牙口 y 如果没有找到,则退出 -让F是OP (x, y)的位的布尔表达式 -对于每个边e和变量v-计算边条件C (e) -计算变量值V (e, v) -标识程序边e和变量v,使得 Vx,y : C(e)(x,y) =^> (F(x,y) = V(e, v)(x,y)) (利用正在经由BDD测试的布尔表达式) 对于每个候选加法运算OP (x, y),该算法形成用于饱和值的布尔表达 式。其还表示执行边e的条件C (e)和依据对候选运算的输入的变量V (e, v)的值。然后在执行它们时,该算法搜索承载饱和值的程序位置(边)和变 量。可以将边条件和变量值的计算表达(phrase)为标准抽象解释问题(参考 文献5、 6和7)。在这种情况下,抽象解释的域是候选输入的所有布尔函数 的集合。在图1中显示了实施例一的'该方法。使用该第一实施例检测饱和加法的时间很长,例如,尝试证明加法是饱 和加法需要10毫秒/每次尝试。甚至在添加了过滤大多数加法的试探 (heuristic)之后,使用BDD也可能使编译时间增加数十秒。尝试使用该方 法识别饱和乘法,但是在形成初始相乘的BDD时会用光存储器空间。例如, 随着硬件和/或布尔表达式等效或可满足性谕示的改进,可以将第一实施例用 于饱和乘法。在使用当前硬件和布尔解算器(solver)有困难的情况下,开发用于发现 饱和算法运算的快速近似算法作为第二实施例。构建描述程序变量的值的布 尔表达式的近似。通过构建,将近似限制在一定大小,并且可以针对等效进行快速测试。可以使用多种语法(如,全范围、子范围)实现给定饱和运算(如,加 法),并且可以以多种方式实现每种语法。可以依据语句和变量的筒单属性来 描述每种语法。这可以允许程序段的等效而不需要解决 一般布尔可满足性。可以将语法识别的问题定义为如下 给定计算二互补运算的语句z = xOPy 给定根据输入x, y和结果z的饱和值的定义。该定义必须是判定形 式f, (x, y, z)如果Condition' (x, y, z) OPsat(x, y, z) = <) f2 (x, y, z)如果Condition 2 (x, y, z) 目标是标识程序中等于OPsat (x, y, z)的值例如,可以将全范围加法语法定义为MAX如果(x 2 0) a (y》0) a (z < 0) addsat(x, y, z) = j MIN如果(x < 0) a (y < 0) a (z 2 0)在下面显示的GSMEFR编码解码器中的L—add函数中,在14行上的返 回语句中的L—var_outvariable的值匹配该定义。如果这个可以自动证明,贝'J 可以使用饱和加法指令(如果这在目标基础架构中是可用的话)来计算返回 值。1: Word32 L一add(2: Word3 2 L一varl, Word3 2 L一var24:6:7:8 :9:10:1112:Word32 L一var—out;L—var一out = L—varl + L—var2;if (((L一vari A L—曹2) & MIN—32)=喝if ((L_var—outA L—var 1 ) & MIN—32)L—var一out =(L一varl < 0) MIN一32 : MAX—32;<formula>formula see original document page 9</formula>然后失效码消除法会产生最佳代码<formula>formula see original document page 9</formula>最初,输入程序已经被降低为三地址格式,该格式被表示为语句的控制 流程图G- (N, E)。节点包括唯一的开始和结束节点、形如x:二OP(y,z)的赋 值语句、形如IF ( x#0 )的切换和显示控制流程归并(merge )。如果仅有的可用标量类型是32位int (整数)和16位short (短整数), 则可以将推论容易地归纳到其它位宽的运算,诸如8位有符号和无符号像素 运算。给定程序位置和变量x和y,并且任务是标识变量v,其在所有的程序执 行中承载给定函数f (x, y)的值。形式上,我们给出 , 候选程序边e0和候选变量x, y 试探证据(witness ) z。该^L据帮助简化判定。在饱和运算的情况下, 通常是非饱和运算的结果。
由蕴涵式的片斤耳又(disjunction of implication)表示的才莫式函lt f ( x, y, z):f(x, y, z)=f;(x,y,z)如果P,(x,y,z) f2(x,y,z)如果P2(x,y,z) (2)fn(x,y,z)如果PJx,y,z)目标是标识边e和变量v,使得当执行e时v的值是f (xQ, y。, z。),其 中xo、 yo和zo是在最近执行的候选边e0中候选变量的值。在本实施例中,对于给定的候选边和候选变量,对方程2中的每个条件 执行一次抽象解释。在抽象解释的每个相继实例中,在判定Pj为真的假设下, 计算对变量值V (e, a)和边条件或声明(assertoin) A (e)的近似。如果执行程序边,则边声明A (e)是为真的条件。作为候选x, y和证 据z的函数,计算边声明A(e)。变量值V(e, v)表示关于当执行边e时 的v ^i的知识。V ( e, v)也是x、 y和z的函lt。修改程序来在候选边e。将x、 y和z的值保存在临时变量x。、 y。和z。中。 然后在每个边e,该声明assert ( A (e) (xo, y。, Zo)),以及对于每个变量, 声明assert ((v = =V (e, v) (x0, y0, z0))都满足。给定以上定义,如果下面公式3成立,则变量a承载模式函数f (x, y, z)的值Vj: Vx, y, z: (A(e)(x, y, z) a P」(x, y, z)) ^> (V(e, a)(x, y, z) = f」(x, y, z)) ( 3 ) 换句话说,对于方程2中的每个条件P」,测试(a)执行边e,或(b)执行边e,并且变量a等于合适的情况fj。在图2中示出第二实施例。为了近似声明和值,使用两种格(lattice), —种近似条件或判定,而另一种近似值。O表示判定的格,而A表示值的格。这些格必须满足下面的要求 ①和A都必须包括顶端和底端元素。都必须定义相遇运算符和比 较运算符。比较运算符对于合式的格是必要的。相遇运算符用在 程序合并点。
①必须定义合耳又(conjunction )、析耳又(disjunction )和非(negation )。 CD必须包括真值和假值。O必须遵守必须持有用于合取、析取、 真和假关系的通用代数规则。
对于在中间程序语言中的每个算术运算OP,格A必须定义解释 P: AxA—A。(我们假设所有操作是二进制的)。将值链接到相应判定的两个函数 MayNonZero: A—O函数测试值是否可能是非零的。 ,MayZero: A—O函数测试值是否可能是零。MayNonZero和MayZero函数不一定产生矛盾的结果。有时候它可能需 要将值同时近似为可能为零和可能为非零。给出这些定义、依据边声明A (e)的程序的抽象解释和与候选边eo相 关的变量值V(e, a),定义候选变量x, y和证据z。在图3中示出了该方程。 这是较标准方程组。用于归并语句的方程考虑Wegman - Zadeck型单边条件 传播(参考文献8和9)。整体算法概括如下ApproxMatch ( G:程序CFG, OP:要匹配的运算)\{重复\{ -试探性挑选候选值x,y和证据z 如果没有发现,则退出-对于每个蕴涵式Pj(x,y,z) => 5 (x,y,z)(在模式函数中){ -假设Pj为真-使用抽象解释计算边声明A (e)和变量值V (e, v) -标识满足下式的边e和变量v:Vx, y, z: (A(e)(x, y, z) a P」(x, y, z))(V(e, a)(x, y, z) = f」(x, y, z))f(x,y,z):(4)下面是如何将本方法应用到乘法和全范围和子范围加法的实例。可以直 接将我们的技术扩展到识别饱和减法。要说明的进一步实例包括识别进位相 加和算术移位。还可以将该方法应用到诸如截短(clipping)之类的运算上。A.全范围々包和加法为了匹配全范围饱和加法,从非饱和加法运算z-x + y开始,输入变量x和y是候选变量。输出变量z是证明。模式函数为'MAX32如杲x + y上溢 MIN32如果x + y下溢 z,其它情况可以通过符号测试来定义上溢和下溢判定rMAX32如果(x > 0) a (y 2 0) a (z (0) MIN32如果(x < 0) a (y < 0) a (z 2 0) z,其它情况在该定义中比较运算符使用32位二互补算法。全范围饱和加法的各种实现依据x、y和z的符号位按判定分支(branch): 和/或执行符号位的位操作。因此,将边声明表示为符号位(和更多)的判定-另外,跟踪任何变量v的位段[p,p+n]是否等于x、 y或z的位段[q,q+n]。格①是依据六个输入变量的所有判定的集合f(x,y,z)=(5)crx s (x < O)X的符号位 C7y三(y〈0)y的符号位azE(z〈0)z的符号位 (6) C三(x =0)G三(y =0)"e (z =0)作为两个格的乘积来建立值格A = (D32xr: 032是0中判定的长度32的所有向量的格。a)"用于根据x、 y 和z的符号位近似变量位。
r = {T Xp,q,n, yp,q,n} , Zp,q,n,丄}用于将变量近似为x、 y和z的位的 子范围。将变量v近似为Xp,q,n意味着v的位v[p,p + n]与x的位 x[q,q+n]相同。在A中每个元素是〈v, p〉对,其中在〈v, p〉中,v&D32,而pGT。 v是 向量分量,而p是位范围(bitrange)分量。依据向量分量的算术运算符的解释OP是更直接的,也就是说,对于任 何算术运算,可以为结果的每一位导出判定。试探地,除了可以转换为移位 或按位的那些外,不解释乘法、除法和余数运算。将这些运算的结果(适当 地)设置成丄的向量。依据位范围分量的解释也是很简单的。关于常数的常数移位和按位运算 产生不是丄的输出。不解释所有其它运算。作为解释的实例,考虑等同比较c: = (a=0)。如果对于vGx, y, z, a 的位范围分量是v。, Q, 3!的形式,则必须将c的向量分量设置为<0...0;v>。MayNonZero和MayZero运算符测试输入值的表示是否可以分别为非零 或零。MayNonZero形成①32分量中所有位的析取。如果析取一般(trivially ) 不是假,则MayNonZero返回1。类似地,如果析取一般不是真,则MayZero 返回1。一般(trivially)编码用于模式函数的条件Pj: Overflow(x^ y, z)三~i crx a ~i cry a ~i crzUnderflow(x, y, z)三crx a cry a crz ( 7 )NoOverflow(x, y, 三~iOverflow a ~i Underflow候选边eo的初始值是V(e0, x)=《dx丄…丄〉x0, o, 31>V(e0, y)=《cjyl...J>y0, o, 31> (8)V(e。, z)=《ozJ-----L>z0, o, 31>为了声明抽象解释在本实例中如何工作,考虑下面的实例 1: int addsat一32bit (int x, int y) { 2: int z = x + y;3: int tl = ( ~(x A y) & (x A z)); 4: int t2 = MIN32 & tl; 5:if(t2){6: intt3 =(x》31)& 1; 7: z = MAX32 + t3; 8:}9: return z; 10: }只有tl的最高有效位(行3)可以被表示为V1=< ,(0"X cry))A(CTx十CTz)),丄,…,丄〉,丄〉与MIN32 (即,0x80000000 )合耳又孤立了 tl的最高有效位。因此行4 上的t2的值的表示为V2 =<《^(C7x十0"y))A((7x十C7z)),0,…,0〉,丄〉由于隐含的测试是t2#0,因此通过t2的位的析取来给出执行行6和7的 语句的条件MayNonZero(V2) = ("Ox cry》a Ox ctz》因此,行6和7的声明是A, = P a MayNonZero(V2)=P A 。(CJ (CTX @ C7Z》 其中如方程7所给出的那样,P是当前假设(上溢,下溢,二者皆否)。很容易看到,如果我们假设"二者皆否,,则A,O,而在其它情况下则不为0。因此, 在"二者皆否,,的假设下,在候选边上只有对z的赋值到达返回语句(行9)。 针对行6上的t3的所计算的近似是V3 =《0, O..,O, cjx> x0, 31, 0> 即,t3承载x的符号(第31 )位。在上溢的假设下cjx = 0。因此,将常数MAX32 赋给z。当布i设下溢时,cjx = 1,并且将MAX32 + 1==MIN32赋给z。以上所有都证明了当上溢发生时值MAX32到达返回语句,当下溢发生 时MIN32到达,在其它情况下则为z的原始值到达。这依次证明了由饱和值 到达返回语句。B. 子范围加法用于子范围加法的模式函数是'MAX16如果z〉MAX16 f(x,y,z) —MIN16如果z〈MIN16 (9) z,其它情况在该定义中的比较使用32位二互补算法。子范围加法更筒单。候选加法z-x + y,其中将x和y声明为16位"short"。依据对z的范围测试表示上溢、下溢和非溢出条件Overflow(、 y, z)三(z e〗Maxl6, + co[) Underflow(x, y, z)三(z e] — qo, Mini 6[) NoOverflow(x, y, z)三(z e]Minl6, Maxl6[)因此,对上溢和下溢假设执行范围传播,而对非溢出假设传播"该变量等于z"的属性。C. 乘法考虑定点饱和乘法的实现(16位到32位)<formula>formula see original document page 14</formula>事实上,更通用的语法是"位移k乘法,, 1: #defme MAX32 (0x80000000) 3: #defmekO2: int mult—sat—k (short x, short y) {3: int z = x * y;4: if(z== 0x40000000) {5: z = MAX32;6:}10: return (z》(k-l)); 11:}这计算被表示为32 - k位的定点数的x和y的乘积。通常k- 16。为了确定当上溢发生时赋给的值,使用下式定义的附加映射来简单地执 行常数传播V (e0, x) = 0x8000V (e0, y) = 0x8000V (eG, z) =0x40000000 为了确定当没有溢出发生时赋给了哪些值,跟踪变量等于哪个常数(如果有的话),已知不等于哪个常数,以及变量是否包含来自x、 y和z的位的 范围。在这种情况下,值格是乘积-.A = cxcxr其中格r具有与实例a中的r相同的含义。常常跟踪位范围。c是通常用在 常数传播的格。c格包括与c相同的元素,但是其具有相反的含义如果已知从不等于该常数,则将con"GC赋给变量。用于算术运算的解释是直接的。必须对定义用于比较的解释的规则予以特別关注。经由下面的规则解释等同cmpeq测试f 〈1,丄,丄〉:fe口杲c,C2 L< 0,丄,丄〉^口果c! # c2cmpeq(< c, 一,一>,< —, c, 一 >) =< 0,丄,丄> 为其它比较定义类似的规则。用于乘法的特殊规则是mul ( 〈0x8000,—,—〉,<_,0x8000—> ) = <_,0x40000000,—> 即,如果我们将0x8000与不是0x8000的其他数相乘,我们永远不能获得 0x40000000。必须对不创建诸如<0,0,一>之类的矛盾表示予以特别关注从不创建具有 C的元素和被设置为常数的C的元素二者的数组(tuple )。如果后者被设置为常数,则将前者设置为丄。为了简化分析,将经移位的饱和乘法的定义分为三种情况,其中两种处理非溢出条件,给出模式函数z〉> (k-l)如果x-0x8000 f(x, y, z) = " (k -1)如果y # 0x8000Max32》k如果x = y = 0x8000在第一种情况下,使用在候选边的x的初始值(为<丄,(^8000^,0,15> )执 行抽象解释。在第二种情况下,将类似的格值给予y。在两种情况下,证据z 被赋予〈丄,Ox40000000,zo,Q,3!〉。在第三种情况下,上溢始于赋值V(e。, x) =< 0x8000, l,x0,0,15>V ( e0, y) = <0x8000,丄,x0,0,15>V(eo, z) =<0x40000000,i, Zo,0,31>D. 进位力口纟会定力口法运算z = x + y和进4立车lT入变量(carry — in variable ) cin,才示识j呆 持进位输出位(carry-out bit)的变量。标识加法的结果是很简单的使用全 局值编号来标识保存Z + Cm的变量。基于先前程序分析(诸如范围传播)的 重要假设是 £{0,1}。实例为1: int addc(int x, int y,2: int c_in, int *p—c_out){3: int z = x + y;4: int c一intemal;5: int c一out;6: assert (c == 0 || c == 1); 7: if((x<0) &&(y<0)) { 8: c—internal = 1 ; 9:}10: else if (MIN32 & ((x Ay) & z)) {11: c一internal = 1 ;12:}13: else {14: c internal = 0;15:}16: if (z == OxFFFFFFFF) { c—out = c—in; } 17: else { c—out = c_internal; } 18 : *p—c—out = c—out; 19: return (z + c_in); 20: j为了定义关于进位输出位的模式函数,首先将"cany internal"位定义为 Carrylnternal三(x, _y, z)(crx a cry) v (crx十<ry) a ~> crz 这是加法Sz:x + yS的进位输出位,不用存在额外的进位输入位。在进位输入 位存在时,将进位输出函数定义为、如果z =0xFFFFFFFFCarry(x,y,z,cin)=Carrylnternal (x, y, z) 其它情况这是模式函数。重新使用先前各节的某些处理以便检测进位输出计算。 在下面的假设下执行抽象解释 z = OxFFFFFFFF z # OxFFFFFFFF需要传播"等于常数"和"不等于常数',信息。我们利用C和为检测饱和乘法引 入的C格。检测Carrylnternal的计算,其为符号位 和进位输入位 Cm的布尔判定。为此,我们利用<D32。总体上,值格是A-CxCx(D32。观察到条件z = OxFFFFFFFF还暗示x和y必须具有不同的符号。所以对 于第一情况,在下面的假设下执行抽象解释在候选边,将格值赋给该变量z:V (e0, z) = OxFFFFFFFF,,丄,<1, 1, ...1》 为了实现z^0xFFFFFFFF假设,将初始值赋给z:V ( e0, z ) = <10xFFFFFFFF,< cjz,丄,...丄>〉 E.算术移位计算ANSIC标准不定义当第一操作数是带符号型时右移位运算符"x >> y"从 左侧引入哪些位。该问题是它引入x的符号位还是零。在第一种情况下,称 为"算术移位",而在第二种情况下,称为"逻辑移位"。这里是算术移位的一些可移植实现int arith—shift—1 (int x, int y) {if(y<o){return x《(-y);else if(y>=31){return (x<0) -l : 0;else {int z = (x >> y); intt = (l (31-y)); if(z&t){z = z I (OxFFFFFFFF《(32 - y)); return z;int arith_shift—2 (int x, int y) { if(y<0){return x (-y);else if(y>=31){return (x<0) -l : 0;else {if(x,return ( x 〉> y);else {return x >> y;观察到(a)变量被移位了作为y中的线性量那么多,(b)大多数变量被分到两个位范围
和[p(y)+l,31],其中p ( y )是y的线性函数。两个位范围的值是常数,或x的子范围,也可能被相反。将算术移位的定义分为5种情况(x《(-y))如果y < 0 -l 如果y 2 31 a x < 0Shra(x,y) = 0 :^果y2 3lAX^(U(x >> y) 如果0《y S 30和x 2 0 +x y)如果0 S y S 30和x < 0(在以上公式中"本地(native),,右移运算符的符号扩展行为是不相关的)为了确定对于以上5种情况中的每一种执行哪些语句,传播范围和"等于 常数"和"不等于常数"属性。为了确定哪些变量等于x《(-y)、 -1、 0、 x>〉y、 ,(,x y),执行全局值编号(global value numbering )。观察到正在重新使用 早先引入的或希望在成熟的编译器中实现的值格。本方法允许编译器代替硬件实现,其中当已经识别了身份时,运算符的 软件实现也是可用的。可以变换程序,使得通过添加指令t=f (x, y...)的 调用来由可用函数f (x, y…)计算取函数f (x, y…)的值的每个变量v的 值;和在每个语句s中用对t的引用替换对变量v的每个引用,使得在s中v 的值等于f(x, y...)。在通过失效码消除法消除程序变换之后不使用的指令。 其中以硬件计算数学函数f(x, y...),可以变换程序,使得通过关于f(x, y...) 的可用硬件指令来计算取函数f (x, y...)的值的每个变量v的值。用于自动识别饱和算法运算的以上技术具有相当低的编译时间开销。此 外,这些技术是比较通用的,原因在于甚至当使用很不同的语法表示时它们 也能识别潜在的饱和算法运算。该方法的通用性在于以语义方式开发潜在语 义概念,而不是进行语义模式匹配。此外,与专门方式相反,抽象解释允许 应用程序系统地进行推理。 一旦已经确定合适的语义元素并构建格,就可以 系统地确定用于每个运算的翻译。虽然已经详细描述和图解了本发明,但是应该理解,这仅是用于图解和 实例的目的而做出的,并且不是进行限制。仅由所附权利要求的术语限定本 发明的范围。参考文献[1] E. T. S. Institute, D/g"a/ fe/ecommM"/ca/z'o"s sjAste附,J_/V57-Ccode/or * GWA/"扁騰^/FM〃i 她(E, ,ec/z codec. (GSM 46.053), ftp : 〃ftp .3gpp.org/ specs/archive.[2]-, D/g/to/ ce〃w/ar Ze/ecommwm'c加'ora ,&m, JjV57-C coc/e/or Z/zeG>W爿鄉"ve她/印/e i 她M爐」,ec/z codec. (GSM 26.073), ftp :〃ftp. 3 gpp. org/specs/archive.[3] IXS尸-C/Vo/ osed ^SV(3"(iani, www.dsp- c.org.[4] J. Lind-Nielsen, 5wZ)Z)j/ - J 5/w"r少Z)ec^/o" D/agnam PacA:age, http:〃www.itu.dk/research/buddy.[5] P. Cousot and R. Cousot, "Abstract interpretation: a unified lattice model for static analysis of programs by construction or approximation of fixpoints," in POP丄/, [6]-, "Systematic design of program transformation frameworks byabstract interpretation," z'w /VoceWwgs o/2她a朋wa/JCM" 57G/4Cr-57G/^L4iVs;Km/ oWMm iVz' ci^/es o/prograwwwVzg Aawgwages. ACM Press, 2002, pp. 178-1卯.[7]-, "Automatic synthesis of optimal invariant assertions: Mathematicalfoundations," z>z尸raceec^wg^ o/f/ze 7977 s戸pas7-Mm ^4rf折c/a/ z'她〃z'gewce朋c/ pragrawmz'wg/朋g薦ges, 1977, pp. 1-12.[8] M. N. Wegman and F. K. Zadeck, "Constant propagation with conditional branches," TORLAS, vol. 13, no. 2, pp. 181-210, 1991.[9] K. Pingali, M. Beck, R. Johnson, M. Moudgill, and P. Stodghill, "Dependence flow graphs: an algebraic approach to program dependencies,",力/ rognaww/wg /awgwages. ACM Press, 1991, pp. 67-78.
权利要求
1. 一种通过优化编译器来确定给定程序中的任何变量是否等于程序中应用到给定变量x,y...的给定数学函数f(x,y...)的方法,该方法包括将函数f(x,y...)的值的位表示为输入x,y...的位的布尔函数;对于每个变量v和程序语句s,将当执行s时v取的值表示为x,y...的位的布尔函数V(s,v)(x,y...);对于每个语句s,将执行语句的条件表示为输入x,y...的位的布尔函数C(s)(x,y...);和使用布尔满足性谕示确定对于给定变量v和程序语句s,下面的布尔表达式是否成立C(s)(x,y...)=>V(s,v)(x,y...)=f(x,y...)。
2. 如权利要求1所述的方法,其中能以硬件计算出数学函数f(x, y...)。
3. 如权利要求2所述的方法,其中变换程序,使得通过关于f(x, y...) 的可用硬件指令计算取函数f (x, y...)的值的每个变量v的值。
4. 如权利要求3所述的方法,包括 添加硬件指令t:f (x, y)的调用;和在每个语句s中用对t的引用替换对变量v的每个引用,使得在s中的v 的值等于f(x, y,...)。
5. 如权利要求4所述的方法,其中在通过失效码消除法消除程序变换之 后不使用的软件指令。
6. 如权利要求l所述的方法,其中变换程序,使得通过 添加指令t-f (x, y…)的调用;和在每个语句s中用对t的引用替换对变量v的每个引用,使得在s中v 的值等于f(x, y…),来由可用函数f(x, y...)计算取函数f (x, y...)的值的每个变量v的值。
7. 如权利要求6所述的方法,其中通过失效码消除法消除程序变换之后 不使用的指令。
8. —种通过优化编译器来确定给定程序中的任何变量是否等于程序中应 用到给定变量x, y...的给定数学函数f (x, y...)的方法,该方法包括将f (x, y…)的值表示为具有对应的判定P」(x, y…)的多个函数f,(x, y...);对于每个变量v和程序语句s,将当执行s时V取的值表示为多个函数Vj(s, v)(x, y…),每个判定Pj(x, y…)对应一个;对于每个语句s,将执行语句的条件表示为多个函数Cj (s) (x, y.,.), 每个判定Pj(x, y…)对应一个;和确定是否只要判定Pj (x, y…)和条件Cj (s) (x, y…)为真,则对于 给定变量v和程序语句s, Vj(s, v)(x, y…)-fj(x, y…)。
9. 如权利要求8所述的方法,其中能以硬件计算出数学函数f(x, y...)。
10. 如权利要求9所述的方法,其中变换程序,使得通过关于f(x, y...) 的可用硬件指令计算取函数f (x, y...)的值的每个变量v的值。
11. 如权利要求IO所述的方法,包括 添加硬件指令t:f (x, y)的调用;和在每个语句s中用对t的引用替换对变量v的每个引用,使得在s中的v 的值等于f(x, y,...)。
12. 如权利要求IO所述的方法,其中在通过失效码消除法消除程序变换 之后不使用的软件指令。
13. 如权利要求8所述的方法,其中变换程序,使得通过 添加指令t:f (x, y…)的调用;和在每个语句s中用对t的引用替换对变量v的每个引用,使得在s中v 的值等于f(x, y…),来由可用函数f(x, y...)计算取函数f (x, y...)的值的每个变量v的值。
14. 如权利要求13所述的方法,其中在通过失效码消除法消除程序变换 之后不使用的指令。
15. 如权利要求8所述的方法,其中编译器根据判定Pj (x, y...)或函 数f」(x, y...),使用程序值的近似来确定条件Cj (s) (x, y...)是否成立, 以及是否只要Pj(x, y…)成立则Vj(s, v)(x, y…)=fj(x, y…)。
16. 如权利要求15所述的方法,其中该近似是应用到全体变量或变量的 位范围的常数传播、全局值编号、范围传播的一个或多个组合。
全文摘要
通过优化编译器来确定给定程序中的任何变量是否等于程序中应用到给定变量x,y...的给定非循环数学函数f(x,y...)的方法。在一个实施例中,该方法包括将函数f(x,y...)的值的位表示为输入x,y...的位的布尔函数;对于每个变量v和程序语句s,将当执行s时v取的值表示为x,y...的位的布尔函数V(s,v)(x,y...);和对于每个语句s,将执行语句的条件表示为输入x,y...的位的布尔函数C(s)(x,y...)。最后,使用布尔满足性谕示确定对于给定变量v和程序语句s,下面的布尔表达式是否成立C(s)(x,y...)=>V(s,v)(x,y...)=f(x,y...)。在第二实施例中,该方法包括将f(x,y...)的值表示为具有对应的判定P<sub>j</sub>(x,y...)的多个函数f<sub>j</sub>(x,y...);对于每个变量v和程序语句s,将当执行s时v取的值表示为多个函数V<sub>j</sub>(s,v)(x,y...),每个判定P<sub>j</sub>(x,y...)对应一个;和对于每个语句s,将执行语句的条件表示为多个函数C<sub>j</sub>(s)(x,y...),每个判定P<sub>j</sub>(x,y...)对应一个。最后,确定是否只要判定P<sub>j</sub>(x,y...)和条件C<sub>j</sub>(s)(x,y...)为真,则对于变量v和程序语句s,V<sub>j</sub>(s,v)(x,y...)=f(x,y...)。
文档编号G06F9/45GK101278262SQ200580027382
公开日2008年10月1日 申请日期2005年8月11日 优先权日2004年8月12日
发明者弗拉迪米尔·科特利亚, 梅延·穆德吉尔 申请人:桑德布里奇技术公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1