[midend]重构中端,建立遍管理器,注册器等,初步构建支配树分析遍,增加基本块方法

This commit is contained in:
rain2133
2025-07-21 15:19:38 +08:00
parent 88604c1f94
commit 550f4017be
5 changed files with 538 additions and 1 deletions

View File

@@ -522,12 +522,20 @@ public:
void setParent(Function *func) { parent = func; }
inst_list& getInstructions() { return instructions; }
arg_list& getArguments() { return arguments; }
const block_list& getPredecessors() const { return predecessors; }
block_list& getPredecessors() { return predecessors; }
void clearPredecessors() { predecessors.clear(); }
block_list& getSuccessors() { return successors; }
void clearSuccessors() { successors.clear(); }
iterator begin() { return instructions.begin(); }
iterator end() { return instructions.end(); }
iterator terminator() { return std::prev(end()); }
void insertArgument(AllocaInst *inst) { arguments.push_back(inst); }
bool hasSuccessor(BasicBlock *block) const {
return std::find(successors.begin(), successors.end(), block) != successors.end();
} ///< 判断是否有后继块
bool hasPredecessor(BasicBlock *block) const {
return std::find(predecessors.begin(), predecessors.end(), block) != predecessors.end();
} ///< 判断是否有前驱块
void addPredecessor(BasicBlock *block) {
if (std::find(predecessors.begin(), predecessors.end(), block) == predecessors.end()) {
predecessors.push_back(block);
@@ -580,6 +588,15 @@ public:
next->addPredecessor(prev);
}
void removeInst(iterator pos) { instructions.erase(pos); }
void removeInst(Instruction *inst) {
auto pos = std::find_if(instructions.begin(), instructions.end(),
[inst](const std::unique_ptr<Instruction> &i) { return i.get() == inst; });
if (pos != instructions.end()) {
instructions.erase(pos);
} else {
assert(false && "Instruction not found in BasicBlock");
}
} ///< 移除指定位置的指令
iterator moveInst(iterator sourcePos, iterator targetPos, BasicBlock *block);
};