> For the complete documentation index, see [llms.txt](https://mashplant.gitbook.io/decaf-doc/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mashplant.gitbook.io/decaf-doc/pa4/shi-yan-nei-rong.md).

# 实验内容

pa4中我们将进行一定程度的基于数据流分析的中间代码优化。

框架中已经提供了三种优化的实现，即公共表达式提取，常量传播，复写传播，还有一项死代码消除没有实现，这是大家的实验任务。需要说明的是，目前我们只在很有限的测例上检测了优化的正确性，而且这个框架是第一次使用，所以有可能在已经实现的优化中存在bug，大家如果发现bug希望能及时汇报。接下来的文档中分别描述了这些数据流分析是怎样实现的，但是实际上主要只是起到科普的作用，如果不想看的话理论上可以跳过，认真阅读死代码消除的文档即可。

我们以tacvm输出的每个程序执行指令的条数(在`.info`文件中)作为性能的评判标准，建议大家比较以下四种情况：

1. 没有任何优化
2. 只有死代码消除
3. 有公共表达式提取，常量传播，复写传播
4. 四种优化都有

其中情况3是框架中的现状(如果去掉相关的`unimplemented!()`的话)，不能保证它的性能一定强于情况1，这是因为优化过程中可能引入了很多无用的指令。通过分别比较1和2，3和4，可以更全面的展示你实现的优化的效果。

值得注意的是，对于tac语句`%x = call F`，tacvm在会先将它拆分成两条指令来执行；其余语句，包括`call F`，在tacvm中都对应于一条指令。
