#pragma once #include "IR.h" #include "IRBuilder.h" namespace sysy { // 优化前对SysY IR的预处理,也可以视作部分CFG优化 // 主要包括删除无用指令、合并基本块、删除空块等 // 这些操作可以在SysY IR生成时就完成,但为了简化IR生成过程, // 这里将其放在SysY IR生成后进行预处理 // 同时兼容phi节点的处理,可以再mem2reg后再次调用优化 class SysYOptPre { private: Module *pModule; IRBuilder *pBuilder; public: SysYOptPre(Module *pMoudle, IRBuilder *pBuilder) : pModule(pMoudle), pBuilder(pBuilder) {} void SysYOptimizateAfterIR(){ SysYDelInstAfterBr(); SysYBlockMerge(); SysYDelNoPreBLock(); SysYDelEmptyBlock(); SysYAddReturn(); } void SysYDelInstAfterBr(); // 删除br后面的指令 void SysYDelEmptyBlock(); // 空块删除 void SysYDelNoPreBLock(); // 删除无前驱块 void SysYBlockMerge(); // 合并基本块(主要针对嵌套if while的exit块, // 也可以修改IR生成实现回填机制 void SysYAddReturn(); // 添加return指令(主要针对Void函数) void usedelete(Instruction *instr); // use删除 }; } // namespace sysy