40 lines
1.6 KiB
C++
40 lines
1.6 KiB
C++
#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
|