[midend-SCCP]增加基本块对的哈希值计算方法,增加删除use关系和指令的函数
This commit is contained in:
@@ -179,4 +179,12 @@ Branch 和 Return 指令: 这些是终结符指令,不产生一个可用于其
|
|||||||
|
|
||||||
好处:优化友好性,方便mem2reg提升
|
好处:优化友好性,方便mem2reg提升
|
||||||
目前没有实现这个机制,如果想要实现首先解决同一函数不同域的同名变量命名区分
|
目前没有实现这个机制,如果想要实现首先解决同一函数不同域的同名变量命名区分
|
||||||
需要保证符号表能正确维护域中的局部变量
|
需要保证符号表能正确维护域中的局部变量
|
||||||
|
|
||||||
|
|
||||||
|
# 关于中端优化提升编译器性能的TODO
|
||||||
|
|
||||||
|
## usedelete_withinstdelte方法
|
||||||
|
|
||||||
|
这个方法删除了use关系并移除了指令,逻辑是根据Instruction* inst去find对应的迭代器并erase
|
||||||
|
有些情况下外部持有迭代器和inst,可以省略find过程
|
||||||
@@ -10,6 +10,18 @@ namespace sysy {
|
|||||||
class SysYIROptUtils{
|
class SysYIROptUtils{
|
||||||
|
|
||||||
public:
|
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关系
|
// 仅仅删除use关系
|
||||||
static void usedelete(Instruction *instr) {
|
static void usedelete(Instruction *instr) {
|
||||||
for (auto &use : instr->getOperands()) {
|
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) {
|
static bool isGlobal(Value *val) {
|
||||||
auto gval = dynamic_cast<GlobalValue *>(val);
|
auto gval = dynamic_cast<GlobalValue *>(val);
|
||||||
|
|||||||
Reference in New Issue
Block a user