From d038884ffba636ba6c55fe4e90a4853d223acf69 Mon Sep 17 00:00:00 2001 From: rain2133 <1370973498@qq.com> Date: Sat, 16 Aug 2025 15:43:51 +0800 Subject: [PATCH] =?UTF-8?q?[midend-GVN]=20commit=E5=A4=B4=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/include/midend/Pass/Optimize/GVN.h | 82 ++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/include/midend/Pass/Optimize/GVN.h diff --git a/src/include/midend/Pass/Optimize/GVN.h b/src/include/midend/Pass/Optimize/GVN.h new file mode 100644 index 0000000..3358e48 --- /dev/null +++ b/src/include/midend/Pass/Optimize/GVN.h @@ -0,0 +1,82 @@ +#pragma once + +#include "Pass.h" +#include "IR.h" +#include "Dom.h" +#include "SideEffectAnalysis.h" +#include +#include +#include +#include +#include + +namespace sysy { + +// GVN优化遍的核心逻辑封装类 +class GVNContext { +public: + // 运行GVN优化的主要方法 + void run(Function* func, AnalysisManager* AM, bool& changed); + +private: + // 值编号的哈希表:Value -> 代表值 + std::unordered_map hashtable; + + // 已访问的基本块集合 + std::unordered_set visited; + + // 逆后序遍历的基本块列表 + std::vector rpoBlocks; + + // 需要删除的指令集合 + std::unordered_set needRemove; + + // 分析结果 + DominatorTree* domTree = nullptr; + SideEffectAnalysisResult* sideEffectAnalysis = nullptr; + + // 计算逆后序遍历 + void computeRPO(Function* func); + void dfs(BasicBlock* bb); + + // 检查哈希表并获取值编号 + Value* checkHashtable(Value* value); + + // 为不同类型的指令获取值编号 + Value* getValueNumber(Instruction* inst); + Value* getValueNumber(BinaryInst* inst); + Value* getValueNumber(UnaryInst* inst); + Value* getValueNumber(GetElementPtrInst* inst); + Value* getValueNumber(LoadInst* inst); + Value* getValueNumber(CallInst* inst); + + // 访问指令并进行GVN优化 + void visitInstruction(Instruction* inst); + + // 检查是否可以安全地用一个值替换另一个值 + bool canReplace(Instruction* original, Value* replacement); + + // 生成表达式的标准化字符串 + std::string getCanonicalExpression(Instruction* inst); +}; + +// GVN优化遍类 +class GVN : public OptimizationPass { +public: + // 静态成员,作为该遍的唯一ID + static void* ID; + + GVN() : OptimizationPass("GVN", Granularity::Function) {} + + // 在函数上运行优化 + bool runOnFunction(Function* func, AnalysisManager& AM) override; + + // 返回该遍的唯一ID + void* getPassID() const override { return ID; } + + // 声明分析依赖 + void getAnalysisUsage(std::set& analysisDependencies, + std::set& analysisInvalidations) const override; +}; + +} // namespace sysy