#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
