deploy-20250820-3 #1

Merged
gh0s7 merged 352 commits from deploy-20250820-3 into master 2025-08-20 21:20:33 +08:00
4 changed files with 71 additions and 124 deletions
Showing only changes of commit 22cf18a1d6 - Show all commits

View File

@@ -1,33 +1,20 @@
#pragma once #pragma once
#include "Pass.h"
#include "IR.h" #include "IR.h"
#include "Instruction.h" #include "Pass.h"
#include <queue> #include <queue>
#include <set> #include <set>
namespace sysy { namespace sysy {
class DominatorTreeAnalysisPass;
class LivenessAnalysisPass;
class BuildCFG : public OptimizationPass { class BuildCFG : public OptimizationPass {
public: public:
// Pass的唯一ID用于PassRegistry static void *ID;
static char ID; BuildCFG() : OptimizationPass("BuildCFG", Granularity::Function) {}
bool runOnFunction(Function *F, AnalysisManager &AM) override;
void getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const override;
void *getPassID() const override { return &ID; }
BuildCFG() : OptimizationPass("BuildCFG", Pass::Granularity::Function, Pass::PassKind::Optimization) {}
// 重载 runOnFunction 方法,实现具体的优化逻辑
bool runOnFunction(Function *F, AnalysisManager& AM) override;
// 提供PassID
void *getPassID() const override { return &ID; }
// 声明Pass的分析使用
// BuildCFG不依赖任何分析但会使其他依赖CFG的分析失效
void getAnalysisUsage(std::set<void *> &analysisDependencies,
std::set<void *> &analysisInvalidations) override;
}; };
} // namespace sysy } // namespace sysy

View File

@@ -11,6 +11,7 @@ add_library(midend_lib STATIC
Pass/Optimize/Reg2Mem.cpp Pass/Optimize/Reg2Mem.cpp
Pass/Optimize/SysYIRCFGOpt.cpp Pass/Optimize/SysYIRCFGOpt.cpp
Pass/Optimize/SCCP.cpp Pass/Optimize/SCCP.cpp
Pass/Optimize/BuildCFG.cpp
) )
# 包含中端模块所需的头文件路径 # 包含中端模块所需的头文件路径

View File

@@ -1,121 +1,79 @@
#include "BuildCFG.h" #include "BuildCFG.h"
#include "Instruction.h" #include "Dom.h"
#include "IR.h" #include "Liveness.h"
#include "Liveness.h" // 包含活跃性分析的头文件以引用其ID
#include "Dom.h" // 包含支配树分析的头文件以引用其ID
#include <iostream> #include <iostream>
#include <queue> #include <queue>
#include <set> #include <set>
namespace sysy { namespace sysy {
char BuildCFG::ID = 0; void *BuildCFG::ID = (void *)&BuildCFG::ID; // 定义唯一的 Pass ID
// 声明Pass的分析使用 // 声明Pass的分析使用
void BuildCFG::getAnalysisUsage(std::set<void *> &analysisDependencies, void BuildCFG::getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const {
std::set<void *> &analysisInvalidations) { // BuildCFG不依赖其他分析
// BuildCFG不依赖其他分析 // analysisDependencies.insert(&DominatorTreeAnalysisPass::ID); // 错误的例子
// analysisDependencies.insert(&DominatorTreeAnalysisPass::ID); // 错误的例子
// BuildCFG会使所有依赖于CFG的分析结果失效所以它必须声明这些失效 // BuildCFG会使所有依赖于CFG的分析结果失效所以它必须声明这些失效
analysisInvalidations.insert(&DominatorTreeAnalysisPass::ID); analysisInvalidations.insert(&DominatorTreeAnalysisPass::ID);
analysisInvalidations.insert(&LivenessAnalysisPass::ID); analysisInvalidations.insert(&LivenessAnalysisPass::ID);
} }
bool BuildCFG::runOnFunction(Function *F, AnalysisManager& AM) { bool BuildCFG::runOnFunction(Function *F, AnalysisManager &AM) {
if (DEBUG) { if (DEBUG) {
std::cout << "Running BuildCFG pass on function: " << F->getName() << std::endl; std::cout << "Running BuildCFG pass on function: " << F->getName() << std::endl;
}
bool changed = false;
// 1. 清空所有基本块的前驱和后继列表
for (auto &bb : F->getBasicBlocks()) {
bb->clearPredecessors();
bb->clearSuccessors();
}
// 2. 遍历每个基本块重建CFG
for (auto &bb : F->getBasicBlocks()) {
// 获取基本块的最后一条指令
auto &inst = *bb->terminator();
Instruction *termInst = inst.get();
// 确保基本块有终结指令
if (!termInst) {
continue;
} }
bool changed = false; // 根据终结指令类型,建立前驱后继关系
if (termInst->isBranch()) {
// 无条件跳转
if (termInst->isUnconditional()) {
auto brInst = dynamic_cast<UncondBrInst *>(termInst);
BasicBlock *succ = dynamic_cast<BasicBlock *>(brInst->getBlock());
assert(succ && "Branch instruction's target must be a BasicBlock");
bb->addSuccessor(succ);
succ->addPredecessor(bb.get());
changed = true;
// 1. 清空所有基本块的前驱和后继列表 // 条件跳转
for (auto &bb : *F) { } else if (termInst->isConditional()) {
bb->predecessors.clear(); auto brInst = dynamic_cast<CondBrInst *>(termInst);
bb->successors.clear(); BasicBlock *trueSucc = dynamic_cast<BasicBlock *>(brInst->getThenBlock());
BasicBlock *falseSucc = dynamic_cast<BasicBlock *>(brInst->getElseBlock());
assert(trueSucc && falseSucc && "Branch instruction's targets must be BasicBlocks");
bb->addSuccessor(trueSucc);
trueSucc->addPredecessor(bb.get());
bb->addSuccessor(falseSucc);
falseSucc->addPredecessor(bb.get());
changed = true;
}
} else if (auto retInst = dynamic_cast<ReturnInst *>(termInst)) {
// RetInst没有后继无需处理
// ...
} }
}
// 2. 遍历每个基本块重建CFG return changed;
for (auto &bb : *F) {
// 获取基本块的最后一条指令
Instruction *termInst = bb->getTerminator();
// 确保基本块有终结指令
if (!termInst) {
continue;
}
// 根据终结指令类型,建立前驱后继关系
if (auto brInst = dynamic_cast<BrInst *>(termInst)) {
// 无条件跳转
if (brInst->getNumOperands() == 1) {
BasicBlock *succ = dynamic_cast<BasicBlock *>(brInst->getOperand(0));
assert(succ && "Branch instruction's target must be a BasicBlock");
bb->successors.push_back(succ);
succ->predecessors.push_back(bb.get());
changed = true;
// 条件跳转
} else if (brInst->getNumOperands() == 3) {
BasicBlock *trueSucc = dynamic_cast<BasicBlock *>(brInst->getOperand(1));
BasicBlock *falseSucc = dynamic_cast<BasicBlock *>(brInst->getOperand(2));
assert(trueSucc && falseSucc && "Branch instruction's targets must be BasicBlocks");
bb->successors.push_back(trueSucc);
trueSucc->predecessors.push_back(bb.get());
bb->successors.push_back(falseSucc);
falseSucc->predecessors.push_back(bb.get());
changed = true;
}
} else if (auto retInst = dynamic_cast<RetInst *>(termInst)) {
// RetInst没有后继无需处理
// ...
}
}
// 3. 额外处理:可达性分析,标记不可达基本块
std::queue<BasicBlock*> q;
std::set<BasicBlock*> visited;
// 默认所有块不可达
for (auto &bb : *F) {
bb->setreachableFalse();
}
// 从函数入口基本块开始
BasicBlock* entryBB = F->getEntryBlock();
if (entryBB) {
q.push(entryBB);
visited.insert(entryBB);
entryBB->setreachableTrue();
}
// 广度优先搜索 (BFS) 遍历所有可达的基本块
while (!q.empty()) {
BasicBlock* currentBB = q.front();
q.pop();
for (auto& succ : currentBB->successors) {
if (visited.find(succ) == visited.end()) {
q.push(succ);
visited.insert(succ);
succ->setreachableTrue();
}
}
}
// 将未访问到的基本块标记为不可达
for (auto& bb : *F) {
if (visited.find(bb.get()) == visited.end()) {
bb->setreachableFalse();
changed = true; // 发现不可达块,视为改变
}
}
return changed;
} }
} // namespace sysy } // namespace sysy

View File

@@ -36,11 +36,12 @@ void PassManager::runOptimizationPipeline(Module* moduleIR, IRBuilder* builderIR
3. 添加优化passid 3. 添加优化passid
*/ */
// 注册分析遍 // 注册分析遍
registerAnalysisPass<sysy::DominatorTreeAnalysisPass>(); registerAnalysisPass<DominatorTreeAnalysisPass>();
registerAnalysisPass<sysy::LivenessAnalysisPass>(); registerAnalysisPass<LivenessAnalysisPass>();
// 注册优化遍 // 注册优化遍
registerOptimizationPass<BuildCFG>(builderIR); registerOptimizationPass<BuildCFG>();
registerOptimizationPass<SysYDelInstAfterBrPass>(); registerOptimizationPass<SysYDelInstAfterBrPass>();
registerOptimizationPass<SysYDelNoPreBLockPass>(); registerOptimizationPass<SysYDelNoPreBLockPass>();
registerOptimizationPass<SysYBlockMergePass>(); registerOptimizationPass<SysYBlockMergePass>();
@@ -66,7 +67,7 @@ void PassManager::runOptimizationPipeline(Module* moduleIR, IRBuilder* builderIR
} }
this->clearPasses(); this->clearPasses();
this->addPass(&&BuildCFG::ID); this->addPass(&BuildCFG::ID);
this->run(); this->run();
this->clearPasses(); this->clearPasses();