[midend-mem2reg]增加遍打印方法,修复reg2mem构造函数错误
This commit is contained in:
38
src/Pass.cpp
38
src/Pass.cpp
@@ -46,6 +46,10 @@ void PassManager::runOptimizationPipeline(Module* moduleIR, IRBuilder* builderIR
|
|||||||
registerOptimizationPass<SysYCondBr2BrPass>(builderIR);
|
registerOptimizationPass<SysYCondBr2BrPass>(builderIR);
|
||||||
registerOptimizationPass<SysYAddReturnPass>(builderIR);
|
registerOptimizationPass<SysYAddReturnPass>(builderIR);
|
||||||
|
|
||||||
|
registerOptimizationPass<DCE>();
|
||||||
|
registerOptimizationPass<Mem2Reg>(builderIR);
|
||||||
|
registerOptimizationPass<Reg2Mem>(builderIR);
|
||||||
|
|
||||||
if (optLevel >= 1) {
|
if (optLevel >= 1) {
|
||||||
//经过设计安排优化遍的执行顺序以及执行逻辑
|
//经过设计安排优化遍的执行顺序以及执行逻辑
|
||||||
if (DEBUG) std::cout << "Applying -O1 optimizations.\n";
|
if (DEBUG) std::cout << "Applying -O1 optimizations.\n";
|
||||||
@@ -60,18 +64,38 @@ void PassManager::runOptimizationPipeline(Module* moduleIR, IRBuilder* builderIR
|
|||||||
this->addPass(&SysYAddReturnPass::ID);
|
this->addPass(&SysYAddReturnPass::ID);
|
||||||
this->run();
|
this->run();
|
||||||
|
|
||||||
|
if(DEBUG) {
|
||||||
|
std::cout << "=== IR After CFGOpt Optimizations ===\n";
|
||||||
|
printPasses();
|
||||||
|
}
|
||||||
|
|
||||||
this->clearPasses();
|
this->clearPasses();
|
||||||
this->addPass(&DCE::ID);
|
this->addPass(&DCE::ID);
|
||||||
this->run();
|
this->run();
|
||||||
|
|
||||||
|
if(DEBUG) {
|
||||||
|
std::cout << "=== IR After DCE Optimizations ===\n";
|
||||||
|
printPasses();
|
||||||
|
}
|
||||||
|
|
||||||
this->clearPasses();
|
this->clearPasses();
|
||||||
this->addPass(&Mem2Reg::ID);
|
this->addPass(&Mem2Reg::ID);
|
||||||
this->run();
|
this->run();
|
||||||
|
|
||||||
|
if(DEBUG) {
|
||||||
|
std::cout << "=== IR After Mem2Reg Optimizations ===\n";
|
||||||
|
printPasses();
|
||||||
|
}
|
||||||
|
|
||||||
this->clearPasses();
|
this->clearPasses();
|
||||||
this->addPass(&Reg2Mem::ID);
|
this->addPass(&Reg2Mem::ID);
|
||||||
this->run();
|
this->run();
|
||||||
|
|
||||||
|
if(DEBUG) {
|
||||||
|
std::cout << "=== IR After Reg2Mem Optimizations ===\n";
|
||||||
|
printPasses();
|
||||||
|
}
|
||||||
|
|
||||||
if (DEBUG) std::cout << "--- Custom optimization sequence finished ---\n";
|
if (DEBUG) std::cout << "--- Custom optimization sequence finished ---\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,6 +186,20 @@ bool PassManager::run() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PassManager::printPasses() const {
|
||||||
|
std::cout << "Registered Passes:\n";
|
||||||
|
for (const auto &p : passes) {
|
||||||
|
std::cout << " - " << p->getName() << " (Granularity: "
|
||||||
|
<< static_cast<int>(p->getGranularity())
|
||||||
|
<< ", Kind: " << static_cast<int>(p->getPassKind()) << ")\n";
|
||||||
|
}
|
||||||
|
std::cout << "Total Passes: " << passes.size() << "\n";
|
||||||
|
if (pmodule) {
|
||||||
|
SysYPrinter printer(pmodule);
|
||||||
|
std::cout << "Module IR:\n";
|
||||||
|
printer.printIR();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
template <typename AnalysisPassType> void registerAnalysisPass() {
|
template <typename AnalysisPassType> void registerAnalysisPass() {
|
||||||
PassRegistry::getPassRegistry().registerPass(&AnalysisPassType::ID,
|
PassRegistry::getPassRegistry().registerPass(&AnalysisPassType::ID,
|
||||||
|
|||||||
@@ -292,6 +292,9 @@ public:
|
|||||||
AnalysisManager &getAnalysisManager() { return analysisManager; }
|
AnalysisManager &getAnalysisManager() { return analysisManager; }
|
||||||
|
|
||||||
void clearPasses();
|
void clearPasses();
|
||||||
|
|
||||||
|
// 输出pass列表并打印IR信息供观察优化遍效果
|
||||||
|
void printPasses() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ======================================================================
|
// ======================================================================
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ private:
|
|||||||
IRBuilder *builder; ///< IR构建器,用于插入指令
|
IRBuilder *builder; ///< IR构建器,用于插入指令
|
||||||
public:
|
public:
|
||||||
static void *ID; ///< Pass的唯一标识符
|
static void *ID; ///< Pass的唯一标识符
|
||||||
Reg2Mem() : OptimizationPass("Reg2Mem", Pass::Granularity::Function), builder(builder) {}
|
Reg2Mem(IRBuilder* builder) : OptimizationPass("Reg2Mem", Pass::Granularity::Function), builder(builder) {}
|
||||||
bool runOnFunction(Function *F, AnalysisManager &AM) override;
|
bool runOnFunction(Function *F, AnalysisManager &AM) override;
|
||||||
void getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const override;
|
void getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const override;
|
||||||
void *getPassID() const override { return &ID; } ///< 获取 Pass ID
|
void *getPassID() const override { return &ID; } ///< 获取 Pass ID
|
||||||
|
|||||||
Reference in New Issue
Block a user