#pragma once

#include "IR.h"
#include "SysYIRAnalyser.h"
#include "SysYIRPrinter.h"

namespace sysy {

class DeadCodeElimination {
 private:
  Module *pModule;
  ControlFlowAnalysis *pCFA;  // 控制流分析指针
  ActiveVarAnalysis *pAVA;  // 活跃变量分析指针
  DataFlowAnalysisUtils dataFlowAnalysisUtils;  // 数据流分析工具类

 public:
  explicit DeadCodeElimination(Module *pMoudle, 
                               ControlFlowAnalysis *pCFA = nullptr,
                               ActiveVarAnalysis *pAVA = nullptr)
      : pModule(pMoudle), pCFA(pCFA), pAVA(pAVA), dataFlowAnalysisUtils() {}  // 构造函数

  // TODO：根据参数传入的passes来运行不同的死代码删除流程
  // void runDCEPipeline(const std::vector<std::string>& passes = {
  //       "dead-store", "redundant-load-store", "dead-load", "dead-alloca", "dead-global"
  // });
  void runDCEPipeline();  // 运行死代码删除

  void eliminateDeadStores(Function* func, bool& changed);    // 消除无用存储
  void eliminateDeadLoads(Function* func, bool& changed);     // 消除无用加载
  void eliminateDeadAllocas(Function* func, bool& changed);   // 消除无用内存分配
  void eliminateDeadGlobals(bool& changed);   // 消除无用全局变量
  void eliminateDeadIndirectiveAllocas(Function* func, bool& changed);  // 消除无用间接内存分配(phi节点)
  void eliminateDeadRedundantLoadStore(Function* func, bool& changed);  // 消除冗余加载和存储
  bool isGlobal(Value *val);
  bool isArr(Value *val);
  void usedelete(Instruction *instr);

};
}  // namespace sysy
