From 6868f638d73d56a5dd7c906cab2758169d228472 Mon Sep 17 00:00:00 2001 From: rain2133 <1370973498@qq.com> Date: Thu, 31 Jul 2025 16:57:47 +0800 Subject: [PATCH] =?UTF-8?q?[midend-SCCP]=E5=A2=9E=E5=8A=A0=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC=E5=9D=97=E5=AF=B9=E7=9A=84=E5=93=88=E5=B8=8C=E5=80=BC?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E6=96=B9=E6=B3=95=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=88=A0=E9=99=A4use=E5=85=B3=E7=B3=BB=E5=92=8C=E6=8C=87?= =?UTF-8?q?=E4=BB=A4=E7=9A=84=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Pass_ID_List.md | 10 ++++++++- .../midend/Pass/Optimize/SysYIROptUtils.h | 21 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/Pass_ID_List.md b/Pass_ID_List.md index 009a0dd..12cee1d 100644 --- a/Pass_ID_List.md +++ b/Pass_ID_List.md @@ -179,4 +179,12 @@ Branch 和 Return 指令: 这些是终结符指令,不产生一个可用于其 好处:优化友好性,方便mem2reg提升 目前没有实现这个机制,如果想要实现首先解决同一函数不同域的同名变量命名区分 -需要保证符号表能正确维护域中的局部变量 \ No newline at end of file +需要保证符号表能正确维护域中的局部变量 + + +# 关于中端优化提升编译器性能的TODO + +## usedelete_withinstdelte方法 + +这个方法删除了use关系并移除了指令,逻辑是根据Instruction* inst去find对应的迭代器并erase +有些情况下外部持有迭代器和inst,可以省略find过程 \ No newline at end of file diff --git a/src/include/midend/Pass/Optimize/SysYIROptUtils.h b/src/include/midend/Pass/Optimize/SysYIROptUtils.h index 1b764ec..1ee1ddc 100644 --- a/src/include/midend/Pass/Optimize/SysYIROptUtils.h +++ b/src/include/midend/Pass/Optimize/SysYIROptUtils.h @@ -10,6 +10,18 @@ namespace sysy { class SysYIROptUtils{ public: + struct PairHash { + template + std::size_t operator () (const std::pair& p) const { + auto h1 = std::hash{}(p.first); + auto h2 = std::hash{}(p.second); + + // 简单的组合哈希值,可以更复杂以减少冲突 + // 使用 boost::hash_combine 的简化版本 + return h1 ^ (h2 << 1); + } + }; + // 仅仅删除use关系 static void usedelete(Instruction *instr) { for (auto &use : instr->getOperands()) { @@ -18,6 +30,15 @@ public: } } + // 删除use关系并删除指令 + static void usedelete_withinstdelte(Instruction *instr) { + for (auto &use : instr->getOperands()) { + Value* val = use->getValue(); + val->removeUse(use); + } + instr->getParent()->removeInst(instr); + } + // 判断是否是全局变量 static bool isGlobal(Value *val) { auto gval = dynamic_cast(val);