在第二部分,你需要理解Mem2Reg优化遍的具体含义,结合例子说明Mem2Reg是如何对LLVM IR代码进行变换的。
-
任务2-1
你需要仔细阅读
include/Optimize/Mem2Reg.h和src/Optimize/Mem2Reg.cpp,参考静态单赋值构造中的算法,将Mem2Reg优化遍的流程记录在报告中,并结合例子说明在Mem2Reg的哪些阶段分别存储了什么,对IR做了什么处理。- 为了体现
Mem2Reg的效果,例子需要包含至少两层由条件分支、循环组成的嵌套结构,并且对同一个变量有在不同分支或者迭代中的定值和引用。
两层嵌套结构例如
while { if {} else {} }Mem2Reg可能会产生phi指令,关于phi指令的含义可以参考SysYFIR.md Phi小节的说明。- B2-1. 请说明
Mem2Reg优化遍的流程。 - B2-2. 结合例子说明在
Mem2Reg的哪些阶段分别存储了什么,对IR做了什么处理。需要说明Mem2Reg可能会删除的指令类型是哪些?对哪些分配(alloca)指令会有影响?- 在基本块内前进
insideBlockForwarding时,对store指令处理时为什么rvalue在forward_list中存在时,就需要将rvalue替换成forward_list映射中的->second值? - 在基本块内前进时,
defined_list代表什么含义? - 生成phi指令
genPhi的第一步两层for循环在收集什么信息,这些信息在后面的循环中如何被利用生成Phi指令? valueDefineCounting为defined_var记录了什么信息valueForwarding在遍历基本块时采用的什么方式valueForwarding中为什么value_status需要对phi指令做信息收集valueForwarding中第二个循环对load指令的替换是什么含义valueForwarding中出现的defined_var和value_status插入条目之间有什么联系
- B2-3. 请说明上述例子的要求为什么能体现
Mem2Reg的效果?
- 为了体现
请将问题答案写在doc/reports/B2.md中。