36 lines
994 B
C++
36 lines
994 B
C++
#pragma once
|
||
|
||
#include "IR.h"
|
||
|
||
namespace sysy {
|
||
|
||
// 优化工具类,包含一些通用的优化方法
|
||
// 这些方法可以在不同的优化 pass 中复用
|
||
// 例如:删除use关系,判断是否是全局变量等
|
||
class SysYIROptUtils{
|
||
|
||
public:
|
||
// 删除use关系
|
||
// 根据指令的使用情况删除其所有的use关系
|
||
// 找到指令的所有使用者,并从它们的使用列表中删除该指令
|
||
static void usedelete(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);
|
||
return gval != nullptr;
|
||
}
|
||
// 判断是否是数组
|
||
static bool isArr(Value *val) {
|
||
auto aval = dynamic_cast<AllocaInst *>(val);
|
||
return aval != nullptr && aval->getNumDims() != 0;
|
||
}
|
||
};
|
||
|
||
}// namespace sysy
|