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);