[midend]部分DCE遍实现(传播活跃代码),修改优化遍运行逻辑,TODO:完善优化遍的getAnalysisUsage,删除无用代码

This commit is contained in:
rain2133
2025-07-24 14:36:33 +08:00
parent f4d231b989
commit 4b9d067c12
10 changed files with 175 additions and 781 deletions

View File

@@ -1,40 +0,0 @@
#pragma once
#include "Pass.h" // 包含 Pass 框架
#include "IR.h" // 包含 IR 定义
#include "IRBuilder.h" // 包含 IRBuilder
namespace sysy {
// 前向声明 IRBuilder (如果在其他地方定义,确保路径正确)
// class IRBuilder; // 如果IRBuilder不在IRBuilder.h中定义需要前向声明
// CFG 优化遍
class CFGOptimizationPass : public OptimizationPass {
public:
// 唯一的 Pass ID
static char ID;
CFGOptimizationPass() : OptimizationPass("CFGOptimization", Pass::Granularity::Function) {}
// 实现 getPassID
void* getPassID() const override { return &ID; }
// 声明分析依赖和失效
void getAnalysisUsage(std::set<void*>& analysisDependencies, std::set<void*>& analysisInvalidations) const override;
// 运行优化,现在接受 AnalysisManager& AM 参数
bool runOnFunction(Function* F, AnalysisManager& AM) override;
private:
// 将原 SysYCFGOpt 中的静态方法移入或直接使用
// 这些方法可以直接声明为静态成员函数,并在 runOnFunction 中调用
static bool SysYDelInstAfterBr(Function *func);
static bool SysYDelEmptyBlock(Function *func, IRBuilder* pBuilder);
static bool SysYDelNoPreBLock(Function *func);
static bool SysYBlockMerge(Function *func);
static bool SysYAddReturn(Function *func, IRBuilder* pBuilder);
static bool SysYCondBr2Br(Function *func, IRBuilder* pBuilder);
};
} // namespace sysy

46
src/include/DCE.h Normal file
View File

@@ -0,0 +1,46 @@
#pragma once
#include "IR.h" // 包含IR相关的定义如Instruction, Function, BasicBlock等
#include "IRBuilder.h" // 包含IR构建器的定义
#include "SysYIROptUtils.h" // 包含SysY IR优化工具类的
#include "Liveness.h"
#include "Dom.h" // 包含支配树的定义
#include "Pass.h" // 包含Pass的基类定义
#include <unordered_set> // 用于存储活跃指令
namespace sysy {
// DCE 优化遍类,继承自 OptimizationPass
class DCE : public OptimizationPass {
private:
std::unordered_set<Instruction *> alive_insts;
// 判断指令是否是“天然活跃”的(即总是保留的)
// inst: 要检查的指令
// 返回值: 如果指令是天然活跃的则为true否则为false
bool isAlive(Instruction *inst);
// 递归地将活跃指令及其依赖加入到 alive_insts 集合中
// inst: 要标记为活跃的指令
void addAlive(Instruction *inst);
public:
static void *ID;
DCE() : OptimizationPass("DCE", Granularity::Function) {}
bool runOnFunction(Function *func, AnalysisManager &AM) override;
void getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const override{
// DCE不依赖特定的分析结果它通过遍历和副作用判断来工作。
// DCE会删除指令这会影响许多分析结果。
// 至少,它会影响活跃性分析、支配树、控制流图(如果删除导致基本块为空并被合并)。
// 假设存在LivenessAnalysisPass和DominatorTreeAnalysisPass
// analysisInvalidations.insert(&LivenessAnalysisPass::ID);
// analysisInvalidations.insert(&DominatorTreeAnalysisPass::ID);
// 任何改变IR结构的优化都可能导致通用分析如活跃性、支配树、循环信息失效。
// 最保守的做法是使所有函数粒度的分析失效,或者只声明你明确知道会受影响的分析。
// 考虑到这个DCE仅删除指令如果它不删除基本块CFG可能不变但数据流分析会失效。
// 对于更激进的DCE如ADCECFG也会改变。
// 这里我们假设它主要影响数据流分析并且可能间接影响CFG相关分析。
// 如果有SideEffectInfo它也可能被修改但通常SideEffectInfo是静态的不因DCE而变。
}
void *getPassID() const override { return &ID; }
};
} // namespace sysy

View File

@@ -291,6 +291,7 @@ public:
AnalysisManager &getAnalysisManager() { return analysisManager; }
void clearPasses();
};
// ======================================================================

View File

@@ -54,6 +54,7 @@ public:
static void *ID;
SysYDelEmptyBlockPass(IRBuilder *builder) : OptimizationPass("SysYDelEmptyBlockPass", Granularity::Function), pBuilder(builder) {}
bool runOnFunction(Function *F, AnalysisManager& AM) override;
void getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const override;
void *getPassID() const override { return &ID; }
};
@@ -62,6 +63,7 @@ public:
static void *ID;
SysYDelNoPreBLockPass() : OptimizationPass("SysYDelNoPreBLockPass", Granularity::Function) {}
bool runOnFunction(Function *F, AnalysisManager& AM) override;
void getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const override;
void *getPassID() const override { return &ID; }
};
@@ -70,6 +72,7 @@ public:
static void *ID;
SysYBlockMergePass() : OptimizationPass("SysYBlockMergePass", Granularity::Function) {}
bool runOnFunction(Function *F, AnalysisManager& AM) override;
void getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const override;
void *getPassID() const override { return &ID; }
};
@@ -80,6 +83,7 @@ public:
static void *ID;
SysYAddReturnPass(IRBuilder *builder) : OptimizationPass("SysYAddReturnPass", Granularity::Function), pBuilder(builder) {}
bool runOnFunction(Function *F, AnalysisManager& AM) override;
void getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const override;
void *getPassID() const override { return &ID; }
};
@@ -90,6 +94,7 @@ public:
static void *ID;
SysYCondBr2BrPass(IRBuilder *builder) : OptimizationPass("SysYCondBr2BrPass", Granularity::Function), pBuilder(builder) {}
bool runOnFunction(Function *F, AnalysisManager& AM) override;
void getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const override;
void *getPassID() const override { return &ID; }
};