笔者必须说明一点,在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的动作,才需要重置,仅修改操作符、操作数是不需要重置的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。