理论教育 条件跳转优化实现方法

条件跳转优化实现方法

时间:2023-11-04 理论教育 版权反馈
【摘要】:笔者必须说明一点,在Neo Pascal中,虽然JE指令也是条件跳转IR,但是并不做优化处理。因为JE指令仅仅应用于CASE语句翻译,而CASE语句的优化思想与条件跳转优化是大相径庭的,所以本小节并不涉及相关内容与技术。下面,来看看条件跳转优化的源代码实现。程序7-16 IRSimplify.cpp第5~45行:遍历IR序列,逐一判断IR是否满足条件跳转优化的要求,如满足则进行优化。第12行:判断m_Opl的值是否为false。

条件跳转优化实现方法

笔者必须说明一点,在Neo Pascal中,虽然JE指令也是条件跳转IR,但是并不做优化处理。因为JE指令仅仅应用于CASE语句翻译,而CASE语句的优化思想与条件跳转优化是大相径庭的,所以本小节并不涉及相关内容与技术。下面,来看看条件跳转优化的源代码实现。

程序7-16 IRSimplify.cpp

第5~45行:遍历IR序列,逐一判断IR是否满足条件跳转优化的要求,如满足则进行优化。

第7行:获取当前IR。

第8行:判断当前IR是否为JNT指令。

第10行:判断当前IR的m_Opl是否为常量。如果是变量,则不满足跳转优化的要求。

第12行:判断m_Opl的值是否为false。

第13~18行:当前IR的形式为“JNT FALSE标号”,因此,可进行如下优化:

JNT FALSE标号一JMP标号

其中,将bOptiChanged置为true表示本次优化过程中代码发生了变化,以便编译器进一步优化。

第21~23行:删除当前IR。这里并没有直接将当前IR删除,而是通过continue语句实现相应功能。这里是借助于临时代码列表TmpCodes实现IR删除的,即在遍历IR序列的过程中,将所有需要的IR加入到TmpCodes中(第44行),而略过不需要的IR。然后,遍历完成后,则使用TmpCodes中的IR列表替代程序的实际IR序列(第47行)。因此,删除一条IR,只需使用continue语句,保证程序不执行第44行代码即可。(www.daowen.com)

第26行:判断当前IR是否为JT指令。

第28行:判断当前IR的m_Opl是否为常量。如果是变量,则不满足跳转优化的要求。

第30行:判断m_Opl的值是否为true。

第31~36行:当前IR的形式为“JT TRUE标号”,因此,可进行如下优化:

JT TRUE标号一JMP标号

其中,将bOptiChanged置为true表示本次优化过程中代码发生了变化,以便编译器进一步优化。

第38~41行:删除当前IR。

第44行:将当前IR插入TmpCodes中。

第46行:根据bFlag标志,判断是否重置实际的IR列表。注意,只有当遍历过程中出现了删除IR的动作,才需要重置,仅修改操作符、操作数是不需要重置的。

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

我要反馈