Compare commits
2 Commits
midend-mem
...
buildcfg
| Author | SHA1 | Date | |
|---|---|---|---|
| 22cf18a1d6 | |||
| a1cf60c420 |
20
src/include/midend/Pass/Optimize/BuildCFG.h
Normal file
20
src/include/midend/Pass/Optimize/BuildCFG.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "IR.h"
|
||||||
|
#include "Pass.h"
|
||||||
|
#include <queue>
|
||||||
|
#include <set>
|
||||||
|
|
||||||
|
namespace sysy {
|
||||||
|
|
||||||
|
class BuildCFG : public OptimizationPass {
|
||||||
|
public:
|
||||||
|
static void *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; }
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace sysy
|
||||||
@ -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
|
||||||
)
|
)
|
||||||
|
|
||||||
# 包含中端模块所需的头文件路径
|
# 包含中端模块所需的头文件路径
|
||||||
|
|||||||
79
src/midend/Pass/Optimize/BuildCFG.cpp
Normal file
79
src/midend/Pass/Optimize/BuildCFG.cpp
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
#include "BuildCFG.h"
|
||||||
|
#include "Dom.h"
|
||||||
|
#include "Liveness.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include <queue>
|
||||||
|
#include <set>
|
||||||
|
|
||||||
|
namespace sysy {
|
||||||
|
|
||||||
|
void *BuildCFG::ID = (void *)&BuildCFG::ID; // 定义唯一的 Pass ID
|
||||||
|
|
||||||
|
// 声明Pass的分析使用
|
||||||
|
void BuildCFG::getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const {
|
||||||
|
// BuildCFG不依赖其他分析
|
||||||
|
// analysisDependencies.insert(&DominatorTreeAnalysisPass::ID); // 错误的例子
|
||||||
|
|
||||||
|
// BuildCFG会使所有依赖于CFG的分析结果失效,所以它必须声明这些失效
|
||||||
|
analysisInvalidations.insert(&DominatorTreeAnalysisPass::ID);
|
||||||
|
analysisInvalidations.insert(&LivenessAnalysisPass::ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BuildCFG::runOnFunction(Function *F, AnalysisManager &AM) {
|
||||||
|
if (DEBUG) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据终结指令类型,建立前驱后继关系
|
||||||
|
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;
|
||||||
|
|
||||||
|
// 条件跳转
|
||||||
|
} else if (termInst->isConditional()) {
|
||||||
|
auto brInst = dynamic_cast<CondBrInst *>(termInst);
|
||||||
|
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没有后继,无需处理
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return changed;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace sysy
|
||||||
@ -6,6 +6,7 @@
|
|||||||
#include "Mem2Reg.h"
|
#include "Mem2Reg.h"
|
||||||
#include "Reg2Mem.h"
|
#include "Reg2Mem.h"
|
||||||
#include "SCCP.h"
|
#include "SCCP.h"
|
||||||
|
#include "BuildCFG.h"
|
||||||
#include "Pass.h"
|
#include "Pass.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
@ -35,10 +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>();
|
||||||
|
|
||||||
registerOptimizationPass<SysYDelInstAfterBrPass>();
|
registerOptimizationPass<SysYDelInstAfterBrPass>();
|
||||||
registerOptimizationPass<SysYDelNoPreBLockPass>();
|
registerOptimizationPass<SysYDelNoPreBLockPass>();
|
||||||
registerOptimizationPass<SysYBlockMergePass>();
|
registerOptimizationPass<SysYBlockMergePass>();
|
||||||
@ -58,6 +61,15 @@ void PassManager::runOptimizationPipeline(Module* moduleIR, IRBuilder* builderIR
|
|||||||
if (DEBUG) std::cout << "Applying -O1 optimizations.\n";
|
if (DEBUG) std::cout << "Applying -O1 optimizations.\n";
|
||||||
if (DEBUG) std::cout << "--- Running custom optimization sequence ---\n";
|
if (DEBUG) std::cout << "--- Running custom optimization sequence ---\n";
|
||||||
|
|
||||||
|
if(DEBUG) {
|
||||||
|
std::cout << "=== IR Before CFGOpt Optimizations ===\n";
|
||||||
|
printPasses();
|
||||||
|
}
|
||||||
|
|
||||||
|
this->clearPasses();
|
||||||
|
this->addPass(&BuildCFG::ID);
|
||||||
|
this->run();
|
||||||
|
|
||||||
this->clearPasses();
|
this->clearPasses();
|
||||||
this->addPass(&SysYDelInstAfterBrPass::ID);
|
this->addPass(&SysYDelInstAfterBrPass::ID);
|
||||||
this->addPass(&SysYDelNoPreBLockPass::ID);
|
this->addPass(&SysYDelNoPreBLockPass::ID);
|
||||||
|
|||||||
Reference in New Issue
Block a user