[midend-SCCP]增加基本块对的哈希值计算方法,增加删除use关系和指令的函数

This commit is contained in:
rain2133
2025-07-31 16:57:47 +08:00
parent 206a0af424
commit 6868f638d7
2 changed files with 30 additions and 1 deletions

View File

@@ -179,4 +179,12 @@ Branch 和 Return 指令: 这些是终结符指令,不产生一个可用于其
好处优化友好性方便mem2reg提升
目前没有实现这个机制,如果想要实现首先解决同一函数不同域的同名变量命名区分
需要保证符号表能正确维护域中的局部变量
需要保证符号表能正确维护域中的局部变量
# 关于中端优化提升编译器性能的TODO
## usedelete_withinstdelte方法
这个方法删除了use关系并移除了指令逻辑是根据Instruction* inst去find对应的迭代器并erase
有些情况下外部持有迭代器和inst,可以省略find过程

View File

@@ -10,6 +10,18 @@ namespace sysy {
class SysYIROptUtils{
public:
struct PairHash {
template <class T1, class T2>
std::size_t operator () (const std::pair<T1, T2>& p) const {
auto h1 = std::hash<T1>{}(p.first);
auto h2 = std::hash<T2>{}(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<GlobalValue *>(val);