理论教育 实现不可到达代码删除法

实现不可到达代码删除法

时间:2023-11-04 理论教育 版权反馈
【摘要】:通常,不可到达代码都是以基本块为单位分析的,也就是说,如果某一行IR是不可到达代码,那么,其所属的基本块必定也是不可到达的。反之,则表示该基本块是不可到达的。更多关注的是遍历算法的实现代价及效率。VisitedBlock集合的主要作用是标志己访问过的基本块,避免因流图中的环路而导致遍历算法死循环。第6行:将当前基本块序号加入VisitedBlock集合中。下面继续讨论不可到达代码删除的问题。第7行:判断是否存在不可到达的基本块。

实现不可到达代码删除法

前面已经讲述了不可到达代码分析是基于流图遍历实现的。通常,不可到达代码都是以基本块为单位分析的,也就是说,如果某一行IR是不可到达代码,那么,其所属的基本块必定也是不可到达的。因此,从算法实现来说,可能更多关注的是不可到达基本块。分析不可到达基本块大致有如下几步:

1)从流图入口基本块开始,沿向下流的边(即结点的出度)遍历整个流图。

2)遍历过程中,记录所有访问过的基本块(结点),将其暂存于一个集合中,即Neo Pascal中的ReachableBlock集合。

3)最后,遍历所有基本块,如果基本块属于暂存集合,则表示该基本块是可到达的。反之,则表示该基本块是不可到达的。

显然,遍历流图是分析算法的核心。流图是标准的图结构,因此,数据结构中关于图遍历的算法都是适用的。注意,编译器并不关注到底采用什么方式实现遍历,因为遍历顺序对分析结果不会有任何影响。更多关注的是遍历算法的实现代价及效率。在分析流图遍历算法之前,先引入两个全局数据结构,声明形式如下:

【声明7-12】

ReachableBlock集合描述的是从流图入口出发可到达的所有基本块(序号)。也就是说,不存在于ReachableBlock集合中的基本块就是不可到达的基本块。而优化算法就是依此集合实现冗余删除的。

VisitedBlock集合的主要作用是标志己访问过的基本块,避免因流图中的环路而导致遍历算法死循环。

下面,就来看看流图遍历算法的实现细节。

程序7-19 CodeElimination.cpp

第3行:判断当前基本块(即iPos所标识的基本块)是否已经被访问过了。

第6行:将当前基本块序号加入VisitedBlock集合中。(www.daowen.com)

第7~12行:依次递归调用ReachPath函数,深度遍历当前基本块的各向下流边的目的基本块。

图遍历算法是相对比较简单的,不再赘述。下面继续讨论不可到达代码删除的问题。

程序7-20 CodeElimination.cpp

第3行:获取当前过程的基本块信息。

第4行:清空ReachableBlock集合。

第5行:清空VisitedBlock集合。

第6行:遍历流图,计算可到达基本块集合。

第7行:判断是否存在不可到达的基本块。

第9~17行:在遍历流图基本块集合的过程中,将不可到达基本块的所有IR的m_bEnabled属性置为false,即表示该IR是冗余的。

第18行:调用DeleteCode函数删除所有冗余IR。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈