数据相关控制流简化的制作方法

文档序号:12287779阅读:283来源:国知局
数据相关控制流简化的制作方法与工艺

计算系统和相关联的网络彻底改变了人类工作、游戏和通信的方式。我们生活的几乎每个方面都在某种方式上受到计算系统的影响。计算系统的功能主要由计算系统的一个或多个处理器执行的指令驱动。这样的指令通常统称为“软件”。

软件通常最初使用以具有更容易被人解释和撰写的语义的编程语言编写的源代码来生成。编译器和解释器的任务是将该软件从源代码转换为处理器可直接解释的机器代码。有时,存在若干编译阶段,其中源代码首先被转换为相对独立于运行时平台的中间代码,然后一旦知晓或使用运行时平台执行该代码,则将中间代码转换为机器码。

为了生成用于软件的逻辑控制流的概念,编译器通常生成逻辑上表示可能发生的可能的执行流的全部或至少大部分的控制流图。此外,编译器尝试执行软件优化,使得软件的执行在运行时更快更有效,而不会不利地改变由软件在运行时执行的逻辑。

本文要求保护的主题不限于解决任何缺点或仅在诸如上述环境这样的环境中操作的各实施例。相反,提供该背景仅用于例示其中可实施所述一些实施例的一个示例性技术领域。

简要概述

本文所描述的至少一些实施例涉及软件程序的控制流的改进。作为示例,控制流可由编译器在编译时或者通过一些其他的控制流图分析器来改进。

通过遍历对应于软件程序的控制流的控制流图来改进控制流,直到检测到流控制元素(例如条件分支或跳转表),该流控制元素根据运行时参数(在本文中也称为“流驱动参数”)的值指定可能在运行时采取的多个出口控制流。然后,在控制流图中找出在流控制元素之前的值缩减点,在该流控制元素处可充分确定流驱动参数的值,使得由流控制元素选择的出口控制流的身份是确定性的。接着,针对每个找到的值缩减点,修改控制流以使得控制流(不通过流控制元素)从该找到的值缩减点导向将选择的标识的出口控制流。可对所有流控制元素重复该方法,从而完成一遍控制流。也可迭代地执行这遍控制流,以在每一遍之后进一步改进控制流。

令人惊讶的是,该过程可被用来执行控制流的各种各样的改进。例如,该过程可被用来执行控制等效简化和if循环交换。然而,可使用相同的过程(诸如在本文中称为“周期循环展开”和“切换循环收缩”)来执行更加复杂的改进。

本概述并非旨在标识出要求保护的主题的关键特征或必要特征,亦非旨在用作辅助确定要求保护的主题的范围。

附图简述

为了描述能够获得上述和其它优点和特征的方式,各实施例的更具体的描述将通过参考各附图来呈现。可以理解,这些附图只描绘了示例实施例,并且因此不被认为是对其范围的限制,将通过使用附图并利用附加特征和细节来描述和解释各实施例,在附图中:

图1抽象地示出了其中可采用本文中所描述的一些实施例的计算系统;

图2抽象地示出了包括多个流控制元素的软件程序,每个流控制元素根据流驱动参数的值控制执行控制的流程进入多个控制流中的一个控制流中;

图3抽象地示出了对应于图2的软件程序的流图;

图4示出了用于优化软件程序的控制流的方法的流程图;

图5示出了从其中可执行被称为“控制等效简化(control equivalency reduction)”的控制流简化技术的代码的第一示例产生的控制流图;

图6示出了在已被修改为将一个值缩减点与对应的标识的控制流耦合之后的图5的控制流图;

图7示出了在已被修改为将另一个值缩减点与其对应的标识的控制流耦合之后的图6的控制流图;

图8示出了在执行不到的代码被移除之后的图7的控制流图;

图9示出了其中本文描述的方法的应用导致对控制流执行被称为“周期循环展开(cyclic loop unrolling)”的控制流简化技术的代码;

图10示出了其中本文描述的方法的应用导致对控制流执行被称为“循环外提(loop unswitching)”的控制流简化技术的代码;

图11示出了其中本文描述的方法的应用导致对控制流执行被称为“if循环交换(if-loop exchanges)”的控制流简化技术的代码;

图12示出了其中本文描述的方法的应用导致对控制流执行被称为“提升(hoisting)”的控制流简化技术的代码;

图13示出了其中本文描述的方法的应用导致对控制流执行被称为“切换循环收缩(switch loop shrinking)”的控制流简化技术的代码;

详细描述

本文所描述的至少一些实施例涉及软件程序的控制流的改进。作为示例,控制流可由编译器在编译时或者通过一些其他的控制流分析器来改进。

通过遍历对应于软件程序的控制流的控制流图来改进控制流,直到检测到流控制元素(例如条件分支或跳转表),该流控制元素根据运行时参数(在本文中也称为“流驱动参数”)的值指定可能在运行时采取的多个出口控制流。然后,在控制流图中找出在流控制元素之前的值缩减点,在该流控制元素处可充分确定参数的值,使得由流控制元素选择的出口控制流的身份是确定性的。接着,针对每个找到的值缩减点,修改控制流以使得控制流(不通过流控制元素)从该找到的值缩减点导向将选择的标识的出口控制流。可对所有流控制元素重复该方法,从而完成一遍控制流。也可迭代地执行这遍控制流,以在每一遍之后进一步改进控制流。

令人惊讶的是,该过程可被用来执行控制流的各种各样的改进。例如,该过程可被用来执行控制等效简化和if循环交换。然而,可使用相同的过程(诸如在本文中称为“周期循环展开”和“切换循环收缩”)来执行更加复杂的改进。

将参考图1描述对计算系统的一些介绍性讨论。然后,将参照随后的附图描述使用本文描述的原理的软件程序的改进。

计算系统现在越来越多地采取多种多样的形式。例如,计算系统可以是手持式设备、电器、膝上型计算机、台式计算机、大型机、分布式计算系统或甚至常规上不被认为是计算系统的设备。在本说明书以及权利要求书中,术语“计算系统”被广义地定义为包括任何设备或系统(或其组合),该设备或系统包含至少一个物理且有形的处理器以及其上能具有可由处理器执行的计算机可执行指令的物理且有形的存储器。存储器可以采取任何形式,并可取决于计算系统的性质和形式。计算系统可以分布在网络环境中,并可以包括多个组分计算系统。

如图1所例示,在其最基本的配置中,计算系统100通常包括至少一个硬件处理单元102和存储器104。存储器104可以是物理系统存储器,该物理系统存储器可以是易失性的、非易失性的、或两者的某种组合。术语“存储器”也可在此用来指示诸如物理存储介质这样的非易失性大容量存储器。如果计算系统是分布式的,则处理、存储器和/或存储能力也可以是分布式的。如本文中所使用的,术语“可执行模块”或“可执行组件”可以指可以在计算系统上执行的软件对象、例程或方法。此处所描述的不同组件、模块、引擎以及服务可以实现为在计算系统上执行的对象或进程(例如,作为分开的线程)。

在随后的描述中,参考由一个或多个计算系统执行的动作描述了各实施例。如果这样的动作是以软件实现的,则执行动作的相关联计算系统的一个或多个处理器响应于已经执行了计算机可执行指令来引导计算系统的操作。例如,这样的计算机可执行指令可以在形成计算机程序产品的一个或多个计算机可读介质上实现。这样的操作的示例涉及对数据的操纵。计算机可执行指令(以及被操纵的数据)可以存储在计算系统100的存储器104中。计算系统100还可包含允许计算系统100例如通过网络110与其他消息处理器通信的通信信道108。计算系统100还包括显示器112,显示器112可被用于向用户显示视觉表示。

本文中描述的各实施例可包括或利用专用或通用计算机,该专用或通用计算机包括诸如例如一个或多个处理器和系统存储器等计算机硬件,如以下更详细讨论的。本文中描述的各实施例还包括用于承载或存储计算机可执行指令和/或数据结构的物理和其他计算机可读介质。这样的计算机可读介质可以是可由通用或专用计算机系统访问的任何可用介质。存储计算机可执行指令的计算机可读介质是物理存储介质。承载计算机可执行指令的计算机可读介质是传输介质。由此,作为示例而非限制,本发明的各实施例可包括至少两种显著不同的计算机可读介质:计算机存储介质和传输介质。

计算机存储介质包括RAM、ROM、EEPROM、CD-ROM或其他光盘存储、磁盘存储或其他磁存储设备、或可用于存储计算机可执行指令或数据结构形式的所需程序代码装置且可由通用或专用计算机访问的任何其他介质。

“网络”被定义为使得电子数据能够在计算机系统和/或模块和/或其它电子设备之间传输的一个或多个数据链路。当信息通过网络或另一个通信连接(硬连线、无线、或者硬连线或无线的组合)传输或提供给计算机时,该计算机将该连接适当地视为传输介质。传输介质可以包括可用于携带计算机可执行指令或数据结构形式的期望程序代码装置并可被通用或专用计算机访问的网络和/或数据链路。上述的组合应当也被包括在计算机可读介质的范围内。

此外,在到达各种计算机系统组件之后,计算机可执行指令或数据结构形式的程序代码资料可从传输介质自动传输到计算机存储介质(或反之亦然)。例如,通过网络或数据链路接收到的计算机可执行指令或数据结构可以在网络接口模块(例如,“NIC”)内的RAM中被缓冲,然后最终被传输至计算机系统RAM和/或计算机系统处的较不易失性的计算机存储介质。因而,应当理解,计算机存储介质可被包括在还利用(或甚至主要利用)传输介质的计算机系统组件中。

计算机可执行指令例如包括,当在处理器处执行时使通用计算机、专用计算机、或专用处理设备执行某一功能或某组功能的指令和数据。计算机可执行指令可例如是二进制或甚至是在被处理器直接执行之前经受某种转换(诸如编译)的指令,诸如中间格式指令(诸如汇编语言或甚至是源代码)。尽管用结构特征和/或方法动作专用的语言描述了本主题,但可以理解,所附权利要求书中定义的主题不必限于上述特征或动作。相反,上述特征和动作是作为实现权利要求的示例形式而公开的。

本领域的技术人员将理解,本发明可以在具有许多类型的计算机系统配置的网络计算环境中实践,这些计算机系统配置包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持式设备、多处理器系统、基于微处理器的或可编程消费电子设备、网络PC、小型计算机、大型计算机、移动电话、PDA、寻呼机、路由器、交换机等等。本发明也可在其中通过网络链接(或者通过硬连线数据链路、无线数据链路,或者通过硬连线和无线数据链路的组合)的本地和远程计算机系统两者都执行任务的分布式系统环境中实施。在分布式系统环境中,程序模块可以位于本地和远程存储器存储设备二者中。

图2抽象地示出了包括多个流控制元素的软件程序200。例如,软件程序200被示为包括四个流控制元素201至204。然而,本文描述的原理适用于改进软件程序的控制流而与软件程序内的流控制元素的数量无关。流控制元素的示例是条件分支元素或跳转表。

在运行时,每个流控制元素将根据参数(以下也称为“流驱动参数”)的值来引导执行通过多个可能的出口控制流中的一个出口控制流(例如,经由出口控制流边缘到所连接的后继块),这是因为当遇到流控制元素时存在该值。术语“出口控制流”不同于术语“控制流”。术语“控制流”引用整个程序的控制流,而“出口控制流”引用可被流控制元素选择以将控制传递到(例如,经由出口控制流边缘)连接的后继块的多个路径中的一个路径。本文所述的原理不限于从流控制元素分支的任何特定数量的出口控制流。然而,仅出于提供示例的目的,流控制元素201被示为根据其流驱动参数的值将执行引导到两个出口控制流211和212,流控制元素202也被示为根据其流驱动参数的值将执行引导到两个出口控制流221和222,流控制元素203被示为根据其驱动参数的值将执行引导至三个出口控制流231至233,并且流控制元素204被示为根据其流驱动参数的值将执行引导到两个出口控制流241和242。

简化图2的示例软件程序200以便提供在整个说明书中可被引用的简单示例,而无需读者理解更复杂的示例。然而,本文描述的原理可被应用于任何软件程序而不考虑复杂性。例如,软件程序可实际具有包含在其中的成千上万个流控制元素。此外,在图2中,通过使所有流控制元素串行定位来简化示例软件程序200,其中在遇到下一个流控制元素之前完成每个流控制元素的所有出口控制流。然而,典型的软件程序可包括流控制元素的复杂分层结构,其中一个流控制元素(即,子流控制元素)实际上可出现在另一个流控制元素的特定出口控制流内(即,对应的父流控制元素)。本文所描述的原理也可应用于具有流控制元素的复杂分层结构的这种软件程序。

本文描述的原理通过等效地变换程序控制流来减少控制流中的每个基本块的后继块的数量以及软件程序内的流控制元素的数量从而改进软件程序。因此,在运行时,运行时环境不需要耗费处理或其他计算资源来导航流控制元素。例如,在试图通过预先预测执行将可能采取的流控制元素的哪个出口控制流来提高性能的运行时环境中,运行时环境不需要耗费进行预测的资源(诸如通过补偿指令高速缓存缺失,或在不正确预测的情况下还原推测执行。

在图2的示例计算机程序200中,编译器、分析器或任何其他逻辑分析工具将创建计算机程序200的控制流图。控制流图是计算机程序的存储器表示,其将计算机程序分解成基本块的流,即由控制流边缘连接的一组基本块。下文将描述对应于简单的实际计算机程序代码的实际控制流图的示例。然而现在,继续以抽象术语描述计算机程序200。

当然,控制流图的结构将严格取决于对应的软件程序的操作顺序。然而,现在将参照图3描述对应于软件程序200的控制流图的结构。图3抽象地示出了对应于图2的软件程序200的控制流图300。编译器、分析器或其他逻辑分析工具可创建用于软件程序200的控制流图300,或者以其他方式访问对应于软件程序200的控制流图300。

逻辑分析工具(例如,编译器或分析器)将首先看到通过如由垂直省略号351表示的零个或多个流图元素的执行的流程。“流图元素”是基本块或控制流边缘(如在编译器技术领域中使用的那些术语)。参考软件程序200,这将是在流控制元素201之前发生的控制操作。移动通过控制流图,逻辑分析工具接着将遇到表示软件程序的流控制元素201的流控制元素301。流控制元素301将执行分支为两个出口控制流(每个出口控制流由垂直省略号311和312表示),并且每个出口控制流包括一系列的一个或多个流图元素。图3的出口控制流311和312是图2的出口控制流211和212的示例。如由连接结361表示的,控制流图将在出口控制流的结束处结合。

逻辑分析工具(例如,编译器或分析器)将随后看到通过如由垂直省略号352表示的零个或多个流图元素的执行的流程。移动通过控制流图,逻辑分析工具接着将遇到表示软件程序的流控制元素202的流控制元素302。流控制元素302将执行分支为两个出口控制流(每个出口控制流由垂直省略号321和322表示),并且每个出口控制流包括一系列的一个或多个流图元素。图3的出口控制流321和322是图2的出口控制流221和222的示例。如由连接结362所表示的,控制流图将在出口控制流的结束处结合。

逻辑分析工具(例如,编译器或分析器)将随后看到通过如由垂直省略号353表示的零个或多个流图元素的执行的流程。移动通过控制流图,逻辑分析工具接着将遇到表示软件程序200的流控制元素203的流控制元素303。流控制元素303将执行分支为三个出口控制流(每个出口控制流由垂直省略号331、332和333表示),并且每个出口控制流包括一系列的一个或多个流图元素。图3的出口控制流331、332和333是图2的出口控制流231、232和233的示例。如由连接结363所表示的,控制流图将在出口控制流的结束处结合。

逻辑分析工具(例如,编译器或分析器)将随后看到通过如由垂直省略号354表示的零个或多个流图元素的执行的流程。移动通过控制流图,逻辑分析工具接着将遇到表示软件程序200的流控制元素204的流控制元素304。流控制元素304将执行分支为两个出口控制流(每个出口控制流由垂直省略号341和342表示),并且每个出口控制流包括一系列的一个或多个流图元素。图3的出口控制流341和342是图2的出口控制流241和242的示例。如由连接结364所表示的,控制流图可潜在地在出口控制流的结束处结合。然后,逻辑分析工具将看到由垂直省略号355表示的零个或多个流图元素的流程。

图4示出了用于优化软件程序的控制流的方法400的流程图。可通过图1的计算系统100响应于计算系统访问包括一个或多个计算机可读存储介质的计算机程序产品并执行其上存储的一个或多个计算机可执行指令来执行方法400,从而实例化和/或操作流图分析工具,诸如编译器。

方法400可在控制流图的多个部分上被执行,所述控制流图的多个部分被定义成由流控制元素发起并且在下一个流控制元素处结束。每次执行方法400时,存在完全消除(通过完全简化)或部分消除(通过部分简化)流控制元素的机会。一旦流图分析工具完成一遍控制流图以执行流控制元素数量的减少的一次迭代,则可一次又一次迭代地执行该遍,直到控制流收敛为止(不能再简化)或实现了期望水平的流控制元素减少。通常,从程序中移除的流控制元素的数量越多,程序变得越大,但是在运行时软件程序运行的效率越高。因此,期望的简化水平是软件程序大小与改进的运行时性能之间的平衡。可在任何软件程序上执行方法400,而不管流图的复杂性。然而,现在将参考图3的控制流300和图2的软件程序200来描述方法400。

例如,方法400可首先在软件程序200的部分A上执行。部分A对应于图3的流图300的流图元素351、301、311和312。方法400涉及遍历软件程序的控制流图(动作401),直到检测到合格的流控制元素(在判定框动作402中为“是”)。

在本说明书和权利要求书中,“合格的”流控制元素是指定可以在运行时根据运行时参数的值而采取多个出口控制流的流控制元素。换句话说,合格的流控制元素是具有流驱动参数的流控制元素,并因此是可以经受通过使用方法400以试图找到该流驱动参数的值缩减的部分或完全移除的流控制元素,该流驱动参数的值缩减足以使得由流控制元素选择的出口控制流是确定性的。

控制流图分析器可以以任何方式遍历控制流图以找到流控制元素,这是由于寻找流控制元素的遍历的顺序并不重要。最终目标是在流控制图中找到流控制元素。例如,控制流图可从图入口到图出口向前深度优先遍历、从图出口到图入口向后深度优先遍历、在被编译器使用的中间表示中线性地遍历或任何其他可能的遍历顺序。然而,在下面的示例中,控制流图300将被描述为向前遍历来找到流控制元素。

例如,在向前遍历的情况下,控制流图分析器将遍历零个或多个流图元素351,直到遇到分支成一个或多个流图元素的两个可能的系列311和312的流控制元素301,这取决于其流驱动参数的值,因为在遇到流控制元素301时它将处于运行时。

响应于检测到这种合格的流控制元素(判定框402中的“是”),流图分析器尝试(判定框403)在控制流图中找到在流控制元素之前的值缩减点。在本说明书和权利要求书中,关于流驱动参数的“值缩减点”是流图元素,其中该流图元素充分确定流驱动参数的值使得将由流控制元素选择的出口控制流的标识是确定性的。例如,假设流驱动参数是“x”,并且流控制元素指定如果x大于0则选择一个出口控制流,如果否则选择另一个出口控制流。在这种情况下,有效的值缩减点是允许“x”不能是负数或者“x”只能是负数的推断的任何逻辑(即使运行时的“x”的确切值不能被确定)。如果没有找到这样的值缩减点(在判定框403中为“否”),则至少在这一遍控制流中将不执行流控制元素的减少(结束410)。

例如,可从流控制元素开始的深度优先向后遍历通过流控制图直到找到流驱动参数的未初始化定义或者在定义或控制流图内的定义和流控制元素之间的任何位置都找不到值的设置(可通过静态分析找到)来执行对值缩减点的搜索。在这种情况下,不可能标识流控制元素处的流驱动参数的值为何,因而不发生流控制元素的减少。例如,流驱动参数可能不是局部变量,而是定义在软件程序范围之外的全局变量,或者流驱动参数被起了别名以使得它能够随时改变,除非分析能够另外证明。如果找到的值的设置不是静态已知的,则该路径上的遍历也将停止。这是因为该未知设置基本上消除了具有确定性的流控制元素的可能性。

或者,可能存在定义控制流图应该被向后遍历而无需找到流驱动参数的值缩减点的最大量的后向遍历限制。使用在找到潜在的值缩减点所需的处理资源的代价与在控制流图的进一步后向遍历时找到值缩减点的益处和可能性之间的平衡来设置该后向遍历限制。如果存在有效的值缩减点,但是该值缩减点处于该后向遍历限制之外,则在软件程序的一些后续遍中仍然可能找到该值缩减点,因为控制流图的特有的结构在每遍控制流图后改变。

在针对软件程序200的方法400的第一次执行时(假设前向遍历),针对软件程序200的部分A执行方法400。在这种情况下,流图分析器可以以深度优先顺序从流控制元素301向后遍历通过零个或多个流图元素351,并且没有找到值缩减点(在判定框403中为“否”),从而导致针对软件程序200的部分A的方法400的完成(动作410)。

然后可针对软件程序200的部分B重复方法400。再次,将向前遍历(动作401)流图300通过流图元素311、312和352,直到遇到流控制元素302(在判定框402中为“是”)。然后,分析器将尝试以深度优先顺序向后遍历控制流图(判定框403)来找到流控制元素402的流驱动参数的对应的值缩减点。

在这种情况下,假设存在这样的值缩减点(在判定框403中为“是”)。在这种情况下,分析器将标识在给定找到的值缩减点的情况下要采取的出口控制流路径(动作404)。然后,将修改控制流(动作405),使得来自找到的值缩减点的控制流导向所标识的出口控制流,而无需遍历流控制元素。例如,这可通过标识流图中处于找到的值缩减点与标识的出口控制流之间的一个或多个流元素的中间控制流(动作406)并且在流图中将中间流从找到的值缩减点添加到标识的出口控制流(动作407)来执行。

例如,参考图3,假设基于在找到的值缩减点处为流驱动参数设置的值采取控制流321。无论该值缩减点在哪里,在值缩减点和流控制元素302(不包括流控制元素302)之间的所有中间流图元素将被复制和放置(动作407)以从值缩减点导向标识的出口控制流321。

可以针对该值的每个找到的值缩减点重复动作404和405。这在其中在替代的执行路径中找到值缩减点的情况下是可能的。例如,在图3中,假设在设置由流控制元素302使用的流驱动参数的值使得流控制元素将选择控制流321的流图元素311内存在一个值缩减点。在这种情况下,在第一值缩减点与流控制元素302之间的中间流图元素将被复制到标识的出口控制流321,而不是从该第一值缩减点流向标识的出口控制流321。另外,假设在设置由流控制元素302使用的参数的值使得流控制元素将选择出口控制流322的流图元素312内存在第二值缩减点。在这种情况下,在第二值缩减点与流控制元素302之间的中间流图元素将被复制到控制流322,而不是从该第二值缩减点流向控制流322。

任选地,如果控制流图的修改导致一个或多个不可达的流图元素,则可从流图中标识(动作408)并且移除(动作409)该不可达的流图元素。可采用常规技术来发现并移除一些类型的不可达的流图元素。移除不可达的流图元素是可选的。然而,即使当执行时,移除不可达的流图元素的时机也是灵活的。例如,每次找到值缩减点并且相应地修改控制流图时,可寻找并移除不可达的流图元素。作为替代和补充,每当已经针对对应于流控制元素找到的所有值缩减点修改了控制流图之后执行方法400时,可以寻找和移除不可达的流图元素。作为替代或补充,可以在整个软件程序的每遍之后寻找并移除不可达的流图元素。作为替代或补充,当已经达到软件程序的期望的改进时,可以在软件程序的所有遍之后寻找并移除不可达的流图元素。在本说明书和权利要求书中,术语“流图元素”和“控制流元素”是相同的。

在针对为流控制元素找到的所有值缩减点修改控制流图之后(在动作405之后),或在找到并移除不可达的流图元素之后(动作408和409),方法400结束(动作410)软件程序的该部分。

然后可对软件程序的下一部分执行方法400。例如,方法400可首先在软件程序200的部分C上执行。再次,分析器向前遍历(动作401)通过控制流图(例如,通过流图元素321、322和353)直到遇到流控制元素303(在判定框402中为“是”)。这里假定找到两个值缩减点(判定框403中的“是”的两个实例)。假设在流图元素321之间找到第一值缩减点,并且设置相应的流驱动参数的值,使得出口控制流程332将被跟随。在这种情况下,第一值缩减点和流控制元素303之间的中间流图元素从第一值缩减点被复制并放置到标识的出口控制流332。假设在控制图元素352中找到第二值缩减点,并且设置使得出口控制流331将被跟随的值。在这种情况下,第二值缩减点和流控制元素303之间的中间流图元素反而从第二值缩减点被复制并放置到标识的出口控制流331。假设在控制图元素322中找到第三值缩减点,并且设置使得出口控制流331将被跟随的值。在这种情况下,第三值缩减点和流控制元素303之间的中间流图元素从第三值缩减点被复制并放置到标识的出口控制流331。

注意到在该示例中,没有找到设置将导致出口控制流333被跟随的流驱动参数的值的值缩减点。这并不意味着将不在运行时使用出口控制流333。然而,如果存在分析器知道必须将该值确定性地设置为取决于运行时流程的一组值之一的情况,并且这些组的值中没有一个组的值将导致选择出口控制流333,则可消除流图元素333而不影响由软件程序执行的逻辑。

然后针对软件程序200的部分D执行方法400。分析器然后再次前进通过控制流图(动作401),并且遇到流控制元素304(判定块402中的“是”)。然后,通过以深度优先顺序向后扫描流图找到值缩减点。假设在控制流311中仅找到一个值缩减点,结果造成将导致流控制元素304选择出口控制流341的流驱动参数的值。在这种情况下,可将该值缩减点和流控制元素304之间的中间流图元素直接复制并放置在找到的值缩减点和标识的出口控制流341之间。在这种情况下,在动作408中流控制元素304可不被完全移除,因为它可能不被认定成不可达的(因为仍可能通过采取控制流312来到达它)。

在方法400的下一次执行时,分析器到达控制流的结束处而无需到达另一个流控制元素(判定框402中的“否”),从而快速结束方法400(动作410)。部分D是软件程序200的最后部分,其结束软件程序200的第一前向遍。现在,流图和控制流不同于在流图的第一前向遍开始时的流图和控制流,并且流控制元素的数量已被减少。因此,虽然不改变软件程序的功能,但是软件程序的下一前向遍将处理不同的流图。

注意到,因为没有流控制元素的分层结构,所以该示例相当简单。如果存在流控制元素的分层结构,则执行流图的前向遍历将考虑遍历所处的分层结构的位置。例如,如果遍历在分层结构的第一级上并且在分层结构中的该第一级的两个可能的控制流中一个控制流内,则一旦分层结构的该第一级的第一控制流的遍历完成时,前向遍历将保持注意它需要向前遍历通过分层结构中的该第一级的第二可能的控制流。可递归地执行该跟踪,使得在前向遍历中该分层结构的所有分支都被遍历。

现在将参考实际代码来描述方法400。在该示例中,将该方法应用于代码中的流图导致在流图上执行被称为“控制等价简化”的控制流简化技术。

例如,假设以下代码将通过参考其多个部分(为了清楚起见在后续引用中添加了行编号)执行方法400来实现一遍:

图5示出了产生的流图500。注意到,存在两个流控制元素501和502以及若干其他流图元素511至517。从源代码形成控制流图在本领域中是已知的。然而,出于说明的目的,流图元素511在语义上对应于源代码中的行1和2。流图元素501在语义上对应于源代码中的行3。流图元素512在语义上对应于源代码中的行8和9。流图元素513在语义上对应于源代码中的行4和5。流图元素514在语义上对应于源代码中的行11。流图元素502在语义上对应于源代码中的行12。流图元素515在语义上对应于源代码中的行13。流图元素516在语义上对应于源代码中的行16。流图元素517在语义上对应于源代码中的行18。

在向前遍历以寻找流控制元素的情况下,方法400将开始向前遍历(动作401)流图500以经过流图元素511,并从而遇到流控制元素501(判定框402中的“是”)。定义流控制元素501选择哪个路径的流驱动参数被称为“x”。因此,以深度优先顺序向后遍历控制流图(判定块403)来查看是否存在其中定义“x”的值的值缩减点。然而,在向后遍历中,只有一个流图元素511。然而,只不过“x”的值在流图元素511中没被定义。因此,未找到“x”的值缩减点(在判定框403中为“否”),并且方法400的这次执行结束。

然后重复方法400,再次导致流图的向前遍历(动作401)。遇到流图元素512、513和514,但是这些不是流控制元素。然后遇到流控制元素502(在判定框402中为“是”)。定义所选控制流的流驱动参数为“y”。因此,从流控制元素502向后遍历流图500以试图找到(判定块403)存在设置和保持的“y”的值的情况。流图元素514被评估和确定为不设置或改变“y”的值。然而,下一个流图元素513将“y”的值设置为一(1)。对于值为1的参数“y”,流控制元素502将选择由单个流图元素515表示的控制流(动作404)。因此,分析器将修改(动作405)流图,使得值缩减点和流控制元素之间的中间流图元素(在这种情况下仅流图元素414)将被复制,而直接从该值缩减点(在这种情况下是流图元素513)导向标识的出口控制流(在这种情况下是流图元素515)。所得到的控制流图在图6中示出。注意到,baz函数现在出现在foo函数和foo2函数之间。

继续深度优先向后遍历,流图元素512也被再次评估和确定来设置“y”的值,但在这种情况下为零(0)。对于值为1的参数“y”,流控制元素502将选择由单个流图元素516表示的控制流(动作404)。因此,分析器将修改(动作405)控制流图,使得值缩减点和流控制元素之间的中间流图元素(在这种情况下仅流图元素514)将被复制,而直接从该值缩减点(在这种情况下是流图元素512)导向标识的出口控制流(在这种情况下是流图元素516)。所得到的流图在图7中示出。注意到,baz函数现在出现在bar函数和bar2函数之间。

在方法400的下一次执行时,将评估流图元素515、516和517,并且将遇到流图的结束而不是找到流控制元素,并因此,方法400和第一遍结束。从图7中显而易见,这导致可随后使用常规机制来移除的一些执行不到的代码710,从而产生图8的流图。注意到在此遍中,流控制元素的数量从两个减少到一个。

令人惊讶的是,对控制流图的每个部分使用方法400的多个性能的这种前向遍技术可执行许多类型的控制流简化。用于值缩减点的深度优先后向遍历也可穿过控制流图中的后边缘,在这种情况下,如果执行简化则该技术成为一种循环优化。例如,图9示出了当该技术应用于特定源代码并且导致在流图上执行周期循环展开时的控制流简化(由源代码表示)。图10示出了当将该技术应用于特定源代码并且导致在控制流上执行切换循环收缩(其表示循环外提的切换版本)时的控制流简化(由源代码表示)。因此,这种所描述的技术于是可被用来执行这三种类型的控制流简化中的任一种控制流简化。

图11示出了当技术应用于特定源代码并且导致在流图上执行的范围的if循环交换时的控制流简化(由源代码表示)。图12示出了当技术应用于特定源代码并且导致在流图上执行提升时的控制流简化(由源代码表示)。图13示出了当技术应用于特定源代码并且导致在流图上执行周期循环展开时的控制流简化(由源代码表示)。

因此,本文描述的原理提供了通过减少控制流中每个基本块的后继块的数量以及流控制元素的数量来提高计算机可执行指令序列的代码质量的简洁机制。本发明可具体化为其它具体形式而不背离其精神或本质特征。所描述的实施例在所有方面都应被认为仅是说明性而非限制性的。从而,本发明的范围由所附权利要求书而非前述描述指示。落入权利要求书的等效方案的含义和范围内的所有改变应被权利要求书的范围所涵盖。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1