没有合适的资源?快使用搜索试试~ 我知道了~
156网址:http://www.elsevier.nl/locate/entcs/volume70.html20页源到源常数传播策略Karina Olmos和Eelco Visser信息和计算科学乌得勒支大学包装盒800893508 TB Utrecht,荷兰网址:karina@cs.uu.nl,visser@acm.org摘要数据流优化通常在低级中间表示上实现。这不适用于源代码到源代码的优化,因为源代码到源代码的优化会在转换之后重新构造源代码级别的程序。在本文中,我们展示了如何常数传播,一个众所周知的数据流优化问题,可以实现在抽象语法树在Replego,重写系统扩展与可编程重写策略的控制规则和动态重写规则的应用程序的信息传播。1介绍优化命令式语言的编译器应用数据流优化来提高程序的性能.数据流优化(如常数传播、复制传播和死代码消除)基于沿程序的控制流路径传播的数据流信息来转换或消除语句或表达式。例如,在常量传播中,将常量值分配给变量会传播到该变量的出现,然后该变量可以被常量值替换。编译器中的数据流优化通常在中间表示(IR)上执行,其中控制通过标签和跳转来表示,内存访问通过寄存器和内存存储和获取来表示[16,14,22],或者通过堆栈操作来表示。为了实现优化,将指令列表转换为控制流图,该控制流图指导信息的传播在低级中间表示上实现优化的优点在于,该实现对于被翻译成IR的所有源语言都是可重用的另一方面,翻译到IR导致消除了在源级别上可用的信息。在编译中,这导致过度-2002年由ElsevierScienceB. V. 操作访问根据C CB Y-NC-N D许可证进行。157头部,例如,需要控制流分析来恢复控制流结构,如条件分支和循环,这些结构在原始源程序中可用。在源到源转换中,信息的丢失使得重新创建接近原始的源程序变得不可能。源代码到源代码转换系统在源代码级别操作程序,并以相同的(高级)语言生成转换后的程序。应用包括插装、方面编织、软件更新和特定领域的优化。例如,CodeBoost转换系统[4]转换C++程序的目的是消除抽象编程风格引起的开销,并基于C++编译器所不具备的应用领域知识应用优化。为了在转换之后(重新)构造源代码级程序,源代码到源代码的转换最好应用于尽可能接近原始源代码的表示|抽象语法树由于控制流图上的转换不能直接应用于抽象语法树,因此源到源优化器不能重用控制流图上的优化术语重写表明它本身是(抽象语法)树上转换的自然范例。虽然诸如代数简化和常数折叠之类的优化确实可以使用重写规则优雅地表达,但是诸如常数传播和复制传播之类的数据流优化不能直接使用重写来表达。首先,重写规则是上下文无关的,即,只能访问本地信息,而在数据流优化中,需要传播上下文信息。此外,标准的重写策略在整个树中穷尽地应用规则。在数据流优化中,应该遵循程序的控制流路径.在本文中,我们展示了如何在Rightgo [19]中实现抽象语法树上的数据流优化,Rightgo [19]是一个重写系统,扩展了可编程重写策略[20],用于控制规则的应用和动态重写规则[18],用于信息的传播。为了说明这些思想,我们发展了Tiger的常数传播规范[2]。|具有嵌套函数的命令式语言。在第2节中,我们提出了Tiger表达式的抽象语法和定义常量折叠规则,以及简化Tiger表达式的通用策略第3节中我们在语言中加入赋值和顺序组合。恒亲这种直线程序的分页可以使用动态规则来定义,动态规则负责用常量替换它们所分配的变量。该策略确保规则以正确的顺序应用。在第4节中,我们增加了结构化的控制流结构,如条件和循环. 常量赋值的传播在这种控制现在的发言和需要在会议点合并适当操作支持对动态规则集的保存、恢复和计算“满足”操作。158为常数传播的规范开发的构建块可以被认为是实现数据流优化的框架。我们已经使用这些构建块来实现复制pro-pagation,共同的子表达式消除和死代码消除。在第5节中,我们讨论了这一概括,比较相关工作的方法,并提到未来的工作。我们假设读者熟悉术语重写的基本概念。我们将解释所使用的martego结构,但不深入。对于基本概念的介绍,我们建议读者参考[20,18]。2常数合并常量折叠是以已知常量值作为操作数的运算符表达式的简化,即,约简表达式的形式c1 op c2,对于一些具有常数参数c1和c2的运算符op。例如,表达式3 +(6*(5 - 2))/2可以在编译时通过应用算术定律简化为12。常量折叠是常量传播的目标;如果一个变量可以用它的常量值替换,那么运行时计算可以用编译时计算替换。在我们研究常数传播之前,我们考虑表达式上常数折叠的规范。图1展示了表示Tiger表达式的抽象语法树的签名。表达式由对整数值、布尔值和字符串的算术运算和关系运算组成.布尔值在Tiger中用整数值表示,false用整数零表示,true用任何非零整数值表示。模块Tiger-Expressions签名构造函数Int:IntConst->ExpExpExpMUL:EQ:通用电气:BinOp重新操作重新操作NEGT分部:::BinOp重新操作重新操作159ExpString:String->ExpVar:Id -> VarBinOp:BinOp*Exp*Exp ->RelOp:Re160lOp*Exp*Exp ->调用:Var*List(Exp)->NilExp:Exp模块运算符签名构造函数附加:BinOp减:Bi161nOpAND:BinOpOR:BinOpLT:RelOpLE:RelOpFig. 1. Tiger表达式的抽象语法树162EvalBinOp:BinOp(PLUS,Int(i),Int(j))-> Int(add>(i,j))EvalBinOp:BinOp(PLUS,Int(0),e)-> eEvalBinOp:BinOp(PLUS,e,Int(0))-> e评价BinOp:BinOp(MINUS,Int(i),Int(j))->Int(subt>(i,j))EvalBinOp:BinOp(MINUS,Var(x),Var(x))-> Int(0)EvalBinOp:BinOp(MUL,Int(i),Int(j))-> Int(mul>(i,j))EvalBinOp:BinOp(MUL,Var(x),Int(1))->Var(x)EvalBinOp:BinOp(MUL,Int(1),Var(x))-> Var(x)EvalBinOp:BinOp(MUL,Int(0),e)-> Int(0)EvalBinOp:BinOp(MUL,e,Int(0))-> Int(0)EvalBinOp:BinOp(DIV,Int(i),Int(j))->Int(div>(i,j))其中not(0)> jEvalRelOp:RelOp(EQ,Int(a),Int(b))-> Int(eval-rel(eq)>(a,b))EvalRelOp:RelOp(NE,Int(a),Int(b))-> Int(eval-rel(notEvalRelOp:RelOp(GT,Int(a),Int(b))-> Int(eval-rel(gt)>(a,b))图二. Tiger表达式2.1常量折叠规则具有常量操作数的操作符的简化可以使用重写规则直接表示。图2给出了算术和布尔运算符的几个常量折叠规则。这些规则被标记为可以在策略中使用。作为在规则右侧构造新项的一部分,可以使用符号s>t将策略s应用于子项t在常量折叠规则中,这用于计算整数运算。例如,add>(i,j)表示对add原语的调用,用于将整数值i和j相加。策略eval-rel(s)应用参数strategys,并将成功转换为整数值1,将失败转换为0。2.2恒定折叠策略重写规则不会自动应用 相反,Speci-阳离子应该通过定义重写策略来确定哪些规则应用于何处以及以何种顺序应用。对于常量折叠规则的应用,一个单一的、自底向上的遍历表达式树,以减少所有可能的常量运算符应用。这可以通过自底向上的通用术语遍历来指定,如下所示:恒褶曲=bottomup(try(fold))在 恒 定 折 叠 的 定 义 中 使 用 的 折 叠 策 略 被 定 义 为 在 来 自 图 2 的EvalBinOp和EvalRelOp规则之间进行选择:163:List(Exp)->ExpSeqVarDec:Id * Option(TypeId)* Exp -> Dec:List(Dec)* List(Exp)->Exp让模块Tiger语句签名构造器赋值:LValue * Exp -> Exp图三. 简化了Tiger的抽象语法。倍数=EvalBinOp+ EvalRelOp运算符s1 + s2表示策略s1和s2之间的选择。最后,通用遍历策略bottomup遍历树,首先使用all递归地将其自身应用于节点的所有直接子项,然后应用参数策略s:自下而上=return(s);注意到bottomup(s)策略是一次遍历。3常数传播常数传播被定义为发现在程序的所有可能执行中都是常数的值并通过程序传播这些这是一个常见的数据流问题,本规范的结果可以推广到不同的分析。为了简单起见,我们首先考虑Tiger的简化版本,它由表达式,赋值,let和顺序组合组成Figure 3 de nes this language.当简化为这种语法时,常数传播归结为通过一系列赋值来传播常数赋值。重要的是,常量只能在常量赋值有效的程序点中替换变量。例如,在转换)a在右手边的第一次出现被3代替,但是第二次出现不是因为a的介入定义。3.1动态传播规则如上面的例子所示,常量传播的工作原理是用分配给它的常量值替换变量。由于在使用变量的地方无法获得此信息,因此应在定义变量的地方建立关联,即,任务,并在使用现场可用设计了动态重写规则[18]一 :=3B :=一+2一 :=y一 :=3B :=5一 :=y164正是为了这个目的。下面的assign-cp策略识别一个赋值语句并生成一个动态规则PropConst,它将变量Var(x)重写为赋值给它的表达式eassign-cp =? 赋 值 ( Var(x),e);其中(is-value> e e)+规则(PropConst:变量(x)-> Undefined))匹配结构?匹配项模式t,就像重写规则的左侧一样。s1 s2 + s3构造是一个有保护的确定性选择算子。如果保护策略s1成功,则将s2应用于s1的结果,否则将s3应用于原始项。在这种情况下,PropConst规则仅在e为值时生成,即,一个常数在另一种情况下,动态规则是未知的。rules(L:t1->t2)构造生成一个新的(动态的)重写规则,标签为L,它重写一个匹配t1到t2的项,就像普通规则L:t1-> t2一样。不同之处在于,t1和t2中绑定在上下文中的变量是从该上下文中继承的因此,在上面的情况下,(Meta)变量x和e是在规则生成时实例化的,而不是在规则应用时实例在遍历程序时,assign-cp策略可以多次应用于同一个变量。 每次应用此策略时,都会为同一变量生成一个新规则,覆盖以前的规则。但是,不同变量的规则不会被覆盖。如果分配给变量x的表达式e不是常数,则需要遵循PropConst规则,以便取消先前为同一变量生成的规则。例如,在前面的示例中,规则PropConst:Var(“a”)-> Int(3)由assignment Assign(Var(“a”),Var(“y”))定义。 此时,规则被PropConst:Var(“a”)-> Undefined覆盖。 应用一条不成文的规则总是失败的。因此,试图将这一规则应用于术语Var(“a”)失败了。不了解不同变量的规则。3.2传播策略图4中定义了直线代码的传播策略const-prop 1。该策略几乎与上一节的恒定折叠策略 也就是说,在对程序进行自底向上遍历期间,应用常量折叠规则。上一节的组合常量折叠规则折叠扩展为动态生成的PropConst规则和用于生成这些规则的assign-cp策略。因此,如果在常量折叠期间遇到变量,则应用动态规则PropConst来发现其常量值并将其替换为该值。如果变量与常量没有关联,则规则将不会成功,变量将保留在程序中。165Seq3分配(29分配(Var(“a”)中文(简体)Var(“a”)8BinOp56加上Var(“a”)7中文(简体)模块Tiger-ConstProp策略const-prop1 = bottomupS(try(fold1 + assign-cp),control-flow1)fold1 = PropConst + fold控制流1=Assign(id,cp)见图4。 直线代码的常数传播然而,该策略不能是完全的自底向上遍历。例如,考虑序列a:=3; a:= a+ 2。图5使用通用的自底向上遍历,通过这个序列的抽象语法树说明了访问顺序。边上的数字指示参数strategy s应用于边指向的节点的点显然在第二个赋值中的变量之前访问第一个赋值,因此在第二个赋值中将常数3正确地传播给变量a。但是,第二个赋值语句左侧的变量a也将被替换。为了避免这种情况,常量传播遍历不应该访问赋值的左侧。这是通过自底向上策略实现的,自底向上策略是自底向上的变体,其定义为:bottomupS(s,skip:a *(a -> a)-> a)=( skip ( bottomupS ( s , skip ) ) <+all ( bottomupS ( s ,skip); sskip参数提供了一种替代使用all的泛型遍历的在图4中,skip策略是用control-flow 1策略实例化的它只将常量传播策略应用于赋值的右侧 这 是 使 用 一 致 性 策 略 Assign ( id , cp ) 实 现 的 一 致 策 略 c( s1 , ... , Sn ) 与 项 c ( t1 , ... , tn ) 并 构 造 项 c(t1,.,& lt;sn>tn),将论证策略应用于相应的论证项。因此,Assign(id,cp)将身份策略id应用于赋值的左侧,将常量传播cp应用于右侧。因此,实现了忠实于编程语言的控制流的遍历 在图5中,相应的访问顺序是跳过访问1和4的顺序。图五. 自下而上的166:Exp * Exp * Exp -> Exp:Exp * Exp -> Exp:Var * Exp * Exp * Exp-> Exp如果而对于模块Tiger语句签名构造器如果则:Exp * Exp-> Exp4传播和控制流到目前为止,我们已经考虑了直线码中的常数传播真正的程序使用条件语句和循环来派生或替换数据流.控制-Tiger中的ow语句由if-then-else和if-then条件语句组成语句,以及for和while迭代语句。图6给出了这些构造的抽象语法。常量值在control- ow语句上的传播根据不同的执行路径进行分叉和合并.常数值的传播必须遵循程序的数据流所施加的不同路径。例如,考虑以下变换:)其中变量a、b、d是感兴趣的:b和d在IF语句发生之前包含常数值,并且这些值被传播到IF的branches。在if之后,a和d包含常量值,a包含常量值,因为它在两个分支中被定义为相同的常量值。变量d没有在if语句中定义。另一方面,b在每个分支中被赋予不同的值,因此它在if之后不包含常量值,即使它在分支中局部 包含常量值。4.1不可达代码消除Control- ow语句使程序的执行路径分叉.在执行时,某些路径不可达。为了避免考虑不可达的代码,常量折叠规则被扩展以消除控制分支。当条件可以静态计算时,使用ow语句。考虑见图6。 老虎的控制声明b:= 4;2. int n = 2;如果b>x,则(a:= 6 *d;b = 45)其他(b:= 6;a:= b+b);b:= 4;2. int n = 2;如果4>x,则(a:=12;b = 45)其他(b:= 6;a:=167ElimIf: 如果(Int(0),e1,e2)->e2ElimIf: 如果(Int(i),e1,e2)->e1,其中不(eq)>(一, 0个)ElimIfThen: 如果Then(Int(0),e1)->Seq([])ElimIfThen: IfThen(Int(i),e1)168->e1ElimWhile: While(Int(0),e)->Seq([])ElimFor: 对于(v,Int(i),Int(j),e)->Seq([])其中eval-rel(lt)>(j,i)=>1见图7。 消除不可访问代码If语句,带有三个参数表达式,一个条件表达式,一个then表达式和一个else表达式。常量传播rst评估条件(就像程序的执行一样)。如果计算结果是一个常量值,它将决定执行哪个分支(Tiger使用0表示false,另一个整数值表示true)。不可达代码消除可以通过重写规则来表示,如图7所示。ElimIf和ElimIfThen规则的应用程序选择可执行分支,并且If表达式将被剩余分支替换。将在选定的分支中继169合并点延拓叉点其他然如续搜索常量。如果一个循环不被执行,它可以从程序中删除4.2分发和合并传播规则常量传播的规范是基于动态规则来传播常量值的。动态传播规则必须遵循程序的数据流为了实现此行为,传播规则被传递到执行路径,并在执行路径的联接点处合并。图8描述了if语句的数据流。结构化的if-then-else语句分叉并合并两个执行路径。在if-then-else语句分叉处,动态传播规则被传递到then和else分支。在合并点处,组合动态传播规则的两个不同版本。传播规则携带传播常数所需的信息。这些规则必须以模拟程序数据流的方式遍历程序。为了操纵活动传播规则,使用诸如保存、恢复和相交(合并)之类的操作。见图8。 数据结构化If语句170输入项c:= 14 + bPC:变量(c)->未定义c:= a + d + b与活动规则的交集(6,7,8)PC:Var(a)->12}Tdr-then ={PC:Var(d)->2,a:=12);(b:=6;(5)第二节PC:Var(b)->第六章(七)PC:Var(a)->十(b:= 6;a:= b +b);其他恢复dr-in规则PC:变量(b)->45}PC:Var(a)->12,dr-then ={PC:Var(d)->2,PC:Var(b)->第四章(五)PC:Var(d)->保存活动规则其他b = 45)(a:=12;PC:Var(a)->第十二条(三)PC:Var(b)->第(a:= 6 *d;b = 45)如果4>x,则PC:Var(d)->2}dr-in ={PC:Var(b)-> 4,如果b>x,则保存活动规则2. int n = 2;PC:Var(d)->第二章2. int n= 2;b:= 4;PC:Var(b)->第四章(1)b:= 4;套规则主动规则传输Term转换规则图9.第九条。如何使用动态规则传播常量的示例图9说明了传播规则的分发和合并是如何完成的。该示例使用两个额外的列进行装饰,以说明对动态规则进行操作的结果。由于空间原因,规则PropConst的名称被描述为PC。第一列和最后一列表示输入和转换后的项。引入中间列是为了展示如何使用动态规则来传播常量值。第二列显示活动规则的状态。第三列显示对使用额外存储的动态规则进行操作表中的每一行都显示一个已检查的节点、对动态规则的操作结果表的第一行和第二行分别生成传播规则if语句计算条件,并将活动传播规则保存在dr-in中,以便传递到其分支。遍历then分支,传播规则的结果状态存储在dr-then集中。要将传入传播规则的状态遍历else分支到if语句,将恢复dr-in集中的规则在if语句的合并点,指定一个intersect操作以获得在if语句之后有效的活动传播规则。171if语句的常量传播的指定由以下策略定义:if-cp(cp)=If(id,id,id);where(save-PropConst=>dr-in); If(id,cp,id);where(save-PropConst=>dr-then; restore-PropConst> dr-in); If(id,id,cp); where(isect-PropConst> dr-then)该策略使用操作save-PropConst、restore-PropConst和isect-PropConst来操作动态规则。where(s)策略将策略s应用于术语而不修改该术语。为了将传入的活动规则分发到if的分支,保存传播规则的活动集常数传播继续遍历then分支,此检查的结果保存在动态规则的dr-then集中为了在else分支中继续,恢复操作被定义为激活dr-in集合。在这种状态下,常量传播在else分支中继续。要合并来自两个分支的两个不同版本的传播规则,指定了一个相交操作。与动态规则的当前状态(考虑其他规则的活动规则)相关联分支)和DR-THEN集合。如果在两个集中都定义了传播规则并将其重写为相同的常数值,则该传播规则在活动集中保持不变。4.2.1泛化上述if语句的数据流模式是针对常量传播的。事实证明,通过使用不同的保存、恢复和合并操作,该模式可以被重用于其他这种概括可以通过抽象这些操作的模式来形式化,如下所示:if(s,save,restore,merge)=If(id,id,id);where(save=>dr-in); If(id,s,id);where(save=> dr-then; restore> dr-in); If(id,id,s);where(merge> dr-then)此 模 式 的 实 例 化 示 例 是 用 于 常 量 传 播 的 if ( cp , save-PropConst,restore-PropConst,isect-PropConst)。不同的分析和优化可以通过提供不同的策略来操作动态规则来重用此构建块。 在其他控制流结构的规范中,我们考虑了这个一般方法.172while循环合并点合并点for循环延续延续见图10。 合并语句中的控制点。4.3循环语句循环语句执行循环语句体的多次(包括零次)。 一个循环的执行流有一个重新进入的路径,如图10所示。因此,循环语句将数据派生到循环体中,并将数据派生到循环体中。结构化循环语句执行迭代条件作为第一次和最后一次执行。作为循环中常数传播的一个激励性示例,考虑以下代码:)在这个例子中,变量a、b、c和d在检查while语句之前包含常量值。此示例说明了以下情况:a包含常量值,而不管while状态的执行。b是在while的主体中定义的,如果while至少执行了一次迭代,b包含a的值,即5,并且它可以传播到while语句之外。c不包含常量值,因为它在while体中迭代定义。d包含一个常量值,因为它不是在while中定义的。e在while循环中包含从其第 一个定义到其第二个定义的常量值。在while之后,e不包含常数值。(a:=5;b:= 4;c:= 8;d:= 5;while((c<100)|(b:= a;e:= a+b;a:= e * d+c;c:= c+e;e:= e+(a:=5;b:= 4;c:= 8;d:= 5;while((c<100)|x)do(b:= 5;e:= 10;a:=(50+c);c:=(c+ 10);e:=(10+c);int n =5);f:=(15+c+e))173while-p(s,save,restore,merge)=While(id,id); where(save => dr); while(id,s)); while(id,s)); where(merge> dr); While(s,s); where(merge> dr)for-p(s,save,restore,merge)=For(id,id,id,id); where(save => dr); where(For(id,id,s)); where(For(id,id,s))见图11。 数据循环的模式当达到f的赋值时,变量a、b和d包含常量值。恒定传播的规定必须涵盖所有这些情况。为了发现a的值包含常量值,我们检查了while体两次,以考虑在首次检查。该分析考虑回路的重新进入路径在while的展开检查之后,合并操作考虑可能的执行路径来选择有效的传播规则使用有效传播规则的结果执行转换。需要最后一个合并操作来防止来自while执行的传播规则在while循环的范围之外处于活动状态。for语句是以类似的方式定义的。图11显示了循环语句的常数传播的定义4.3.1非悲观常数传播到目前为止,常数传播规范仍然是悲观的,即使我们避免考虑不可达的代码。当条件可以被计算时,未执行的循环语句如果分析不能确定循环是否会执行,它会考虑两种情况。这就是第二次出现mergefor loop语句的原因。在最后一个例子中,这个规范不能将b一种不那么悲观的方法是在循环状态之后,当分析保证循环体至少执行一次时,保留传播规则。is-safe策略检查此条件,并避免执行传播规则的第二次合并因此,循环语句的常数传播规则在程序中的循环发生之后是活动的图12中的策略考虑了这些情况。4.4控制流语句现在,我们已经确定了所有的成分放在一起一个完整的成熟的不断传播战略。图13将成分组合成一种规格174let-exp(s,declare)=Let([tryeval-conditionals(s,指定,声明,保存,恢复,满足)=分配+ifthen(s,save,restore,meet)+if(s,save,restore,meet)+for(s,save,restore,eval-conditionals2(s)为eval-conditionals(s,assign-cp,declVar,save-PropConst,restore-isect-PropConst)fold2(s)=折叠1+ ElimIf; s+ ElimFor+ElimIf; s+ While(s,id);控制流2(s)为Assign(id,s)+ If Then(s,id)+ If(s,id,id)+ 对于(id,s,s,id)const-prop2 =BottomupS(try(fold2(const-prop2))<+的eval-conditionals2(const-prop2))while(s,save,restore,meet)为While(id,id); where(save => dr);(while(s,id);is-safe); while(id,s)); while(id,s)); where(meet> dr); While(s,s)<+while(id,s); while(id,s)); where(meet> dr); While(s,s)安全=?While(Int(i),e);其中(not(eq)>(i,0); dr); where(For(id,id,s)); where(For(id,id,s)); where(merge> dr)安全=?对于(_,Int(i),Int(t),_);其中(geq>(t,见图12。 非悲观回路数据ow schemas图13岁control-ow语句的常量传播175非悲观的过程内常数传播。const-prop 2策略是根据自下而上的策略定义的,包括控制流语句的策略。非悲观常数传播使用计算规则ElimIf、ElimIfThen、ElimWhile和ElimFor,以尽可能简化表达式的执行流程。策略fold2用cp策略参数化,以在语句简化后对结果路径应用常数传播。当常量折叠缩减不适用时,我们考虑不同的执行路径,如前所述。eval-conditionals 2策略是根据assign-cp定义的,数据流模式用于条件和循环。控制流1的策略扩展的条款,需要控制时,减少策略的应用。策略control-flow 2定义了如何遍历control-ow语句来模拟程序的执行。5讨论我们已经展示了如何使用策略动态项重写来指定过程内常量传播。本文中使用的技术,如动态范围规则和上下文敏感的术语遍历,使我们能够编写一个规范,这是优雅和简洁。5.1概括和今后的工作正如这里所介绍的,常数传播优化是过程内的,不考虑函数调用。我们已经指定了一个扩展,它可以分析函数定义,并仅在函数调用时根据新的传播规则在函数体中杀死全局变量。推广到过程间常数传播[7,5]需要进一步研究,但似乎很简单。通过提供不同的传播规则和相应的规则操作,可以使用相同的构建块来构建其他源到源优化器。我们已经使用这种方法指定了副本传播,公共子表达式消除和死代码消除。我们确信这些技术可以用于许多其他机器独立优化的规范,例如代码运动[11],尽管这需要进一步的研究。当前的构建块可以很容易地扩展到包含Tiger中不存在的控制流构造,如case和switch。还可以处理扩展到半非结构化控制流使用中断。该框架可以在不同的语言之间进行重用可以创建不同的动态规则来传播或为程序的不同方面提供信息。 目前,我们有兴趣研究结合几种优化的可能性,而亲,
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- SSM Java项目:StudentInfo 数据管理与可视化分析
- pyedgar:Python库简化EDGAR数据交互与文档下载
- Node.js环境下wfdb文件解码与实时数据处理
- phpcms v2.2企业级网站管理系统发布
- 美团饿了么优惠券推广工具-uniapp源码
- 基于红外传感器的会议室实时占用率测量系统
- DenseNet-201预训练模型:图像分类的深度学习工具箱
- Java实现和弦移调工具:Transposer-java
- phpMyFAQ 2.5.1 Beta多国语言版:技术项目源码共享平台
- Python自动化源码实现便捷自动下单功能
- Android天气预报应用:查看多城市详细天气信息
- PHPTML类:简化HTML页面创建的PHP开源工具
- Biovec在蛋白质分析中的应用:预测、结构和可视化
- EfficientNet-b0深度学习工具箱模型在MATLAB中的应用
- 2024年河北省技能大赛数字化设计开发样题解析
- 笔记本USB加湿器:便携式设计解决方案
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功