#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& 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