修改CFG优化的文件名,修改phidel标签
This commit is contained in:
@@ -21,7 +21,7 @@ add_executable(sysyc
|
|||||||
IR.cpp
|
IR.cpp
|
||||||
SysYIRGenerator.cpp
|
SysYIRGenerator.cpp
|
||||||
SysYIRPrinter.cpp
|
SysYIRPrinter.cpp
|
||||||
SysYIROptPre.cpp
|
SysYIRCFGOpt.cpp
|
||||||
SysYIRAnalyser.cpp
|
SysYIRAnalyser.cpp
|
||||||
DeadCodeElimination.cpp
|
DeadCodeElimination.cpp
|
||||||
Mem2Reg.cpp
|
Mem2Reg.cpp
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ void Reg2Mem::DeletePhiInst(){
|
|||||||
// 创建一个basicblock
|
// 创建一个basicblock
|
||||||
auto newbasicBlock = function.second->addBasicBlock();
|
auto newbasicBlock = function.second->addBasicBlock();
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << " phidel.L" << pBuilder->getLabelIndex();
|
ss << "phidel.L" << pBuilder->getLabelIndex();
|
||||||
newbasicBlock->setName(ss.str());
|
newbasicBlock->setName(ss.str());
|
||||||
ss.str("");
|
ss.str("");
|
||||||
// // 修改前驱后继关系
|
// // 修改前驱后继关系
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "SysYIROptPre.h"
|
#include "SysYIRCFGOpt.h"
|
||||||
#include "SysYIROptUtils.h"
|
#include "SysYIROptUtils.h"
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <list>
|
#include <list>
|
||||||
@@ -13,7 +13,7 @@ namespace sysy {
|
|||||||
|
|
||||||
|
|
||||||
// 删除br后的无用指令
|
// 删除br后的无用指令
|
||||||
void SysYOptPre::SysYDelInstAfterBr() {
|
void SysYCFGOpt::SysYDelInstAfterBr() {
|
||||||
auto &functions = pModule->getFunctions();
|
auto &functions = pModule->getFunctions();
|
||||||
for (auto &function : functions) {
|
for (auto &function : functions) {
|
||||||
auto basicBlocks = function.second->getBasicBlocks();
|
auto basicBlocks = function.second->getBasicBlocks();
|
||||||
@@ -59,7 +59,7 @@ void SysYOptPre::SysYDelInstAfterBr() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 合并空基本块
|
// 合并空基本块
|
||||||
void SysYOptPre::SysYBlockMerge() {
|
void SysYCFGOpt::SysYBlockMerge() {
|
||||||
auto &functions = pModule->getFunctions(); //std::map<std::string, std::unique_ptr<Function>>
|
auto &functions = pModule->getFunctions(); //std::map<std::string, std::unique_ptr<Function>>
|
||||||
for (auto &function : functions) {
|
for (auto &function : functions) {
|
||||||
// auto basicBlocks = function.second->getBasicBlocks();
|
// auto basicBlocks = function.second->getBasicBlocks();
|
||||||
@@ -129,7 +129,7 @@ void SysYOptPre::SysYBlockMerge() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 删除无前驱块,兼容SSA后的处理
|
// 删除无前驱块,兼容SSA后的处理
|
||||||
void SysYOptPre::SysYDelNoPreBLock() {
|
void SysYCFGOpt::SysYDelNoPreBLock() {
|
||||||
|
|
||||||
auto &functions = pModule->getFunctions(); // std::map<std::string, std::unique_ptr<sysy::Function>>
|
auto &functions = pModule->getFunctions(); // std::map<std::string, std::unique_ptr<sysy::Function>>
|
||||||
for (auto &function : functions) {
|
for (auto &function : functions) {
|
||||||
@@ -190,7 +190,7 @@ void SysYOptPre::SysYDelNoPreBLock() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SysYOptPre::SysYDelEmptyBlock() {
|
void SysYCFGOpt::SysYDelEmptyBlock() {
|
||||||
auto &functions = pModule->getFunctions();
|
auto &functions = pModule->getFunctions();
|
||||||
for (auto &function : functions) {
|
for (auto &function : functions) {
|
||||||
// 收集不可达基本块
|
// 收集不可达基本块
|
||||||
@@ -438,7 +438,7 @@ void SysYOptPre::SysYDelEmptyBlock() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 如果函数没有返回指令,则添加一个默认返回指令(主要解决void函数没有返回指令的问题)
|
// 如果函数没有返回指令,则添加一个默认返回指令(主要解决void函数没有返回指令的问题)
|
||||||
void SysYOptPre::SysYAddReturn() {
|
void SysYCFGOpt::SysYAddReturn() {
|
||||||
auto &functions = pModule->getFunctions();
|
auto &functions = pModule->getFunctions();
|
||||||
for (auto &function : functions) {
|
for (auto &function : functions) {
|
||||||
auto &func = function.second;
|
auto &func = function.second;
|
||||||
@@ -11,17 +11,19 @@ namespace sysy {
|
|||||||
// 这里将其放在SysY IR生成后进行预处理
|
// 这里将其放在SysY IR生成后进行预处理
|
||||||
// 同时兼容phi节点的处理,可以再mem2reg后再次调用优化
|
// 同时兼容phi节点的处理,可以再mem2reg后再次调用优化
|
||||||
|
|
||||||
//TODO: 可增加的CFG优化
|
//TODO: 可增加的CFG优化和方法
|
||||||
|
// - 检查基本块跳转关系正确性
|
||||||
// - 简化条件分支(Branch Simplification),如条件恒真/恒假转为直接跳转
|
// - 简化条件分支(Branch Simplification),如条件恒真/恒假转为直接跳转
|
||||||
// - 合并连续的跳转指令(Jump Threading)在合并不可达块中似乎已经实现了
|
// - 合并连续的跳转指令(Jump Threading)在合并不可达块中似乎已经实现了
|
||||||
// - 基本块重排序(Block Reordering),提升局部性
|
// - 基本块重排序(Block Reordering),提升局部性
|
||||||
class SysYOptPre {
|
|
||||||
|
class SysYCFGOpt {
|
||||||
private:
|
private:
|
||||||
Module *pModule;
|
Module *pModule;
|
||||||
IRBuilder *pBuilder;
|
IRBuilder *pBuilder;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SysYOptPre(Module *pMoudle, IRBuilder *pBuilder) : pModule(pMoudle), pBuilder(pBuilder) {}
|
SysYCFGOpt(Module *pMoudle, IRBuilder *pBuilder) : pModule(pMoudle), pBuilder(pBuilder) {}
|
||||||
|
|
||||||
void SysYOptimizateAfterIR(){
|
void SysYOptimizateAfterIR(){
|
||||||
SysYDelInstAfterBr();
|
SysYDelInstAfterBr();
|
||||||
@@ -32,7 +34,7 @@ class SysYOptPre {
|
|||||||
}
|
}
|
||||||
void SysYDelInstAfterBr(); // 删除br后面的指令
|
void SysYDelInstAfterBr(); // 删除br后面的指令
|
||||||
void SysYDelEmptyBlock(); // 空块删除
|
void SysYDelEmptyBlock(); // 空块删除
|
||||||
void SysYDelNoPreBLock(); // 删除无前驱块
|
void SysYDelNoPreBLock(); // 删除无前驱块(不可达块)
|
||||||
void SysYBlockMerge(); // 合并基本块(主要针对嵌套if while的exit块,
|
void SysYBlockMerge(); // 合并基本块(主要针对嵌套if while的exit块,
|
||||||
// 也可以修改IR生成实现回填机制
|
// 也可以修改IR生成实现回填机制
|
||||||
void SysYAddReturn(); // 添加return指令(主要针对Void函数)
|
void SysYAddReturn(); // 添加return指令(主要针对Void函数)
|
||||||
@@ -13,7 +13,7 @@ using namespace antlr4;
|
|||||||
|
|
||||||
#include "SysYIRGenerator.h"
|
#include "SysYIRGenerator.h"
|
||||||
#include "SysYIRPrinter.h"
|
#include "SysYIRPrinter.h"
|
||||||
#include "SysYIROptPre.h"
|
#include "SysYIRCFGOpt.h"
|
||||||
#include "RISCv64Backend.h"
|
#include "RISCv64Backend.h"
|
||||||
#include "SysYIRAnalyser.h"
|
#include "SysYIRAnalyser.h"
|
||||||
#include "DeadCodeElimination.h"
|
#include "DeadCodeElimination.h"
|
||||||
@@ -127,8 +127,8 @@ int main(int argc, char **argv) {
|
|||||||
cout << "Applying middle-end optimizations (level -O" << optLevel << ")...\n";
|
cout << "Applying middle-end optimizations (level -O" << optLevel << ")...\n";
|
||||||
|
|
||||||
// 默认优化 pass (在所有优化级别都会执行)
|
// 默认优化 pass (在所有优化级别都会执行)
|
||||||
SysYOptPre optPre(moduleIR, builder);
|
SysYCFGOpt cfgopt(moduleIR, builder);
|
||||||
optPre.SysYOptimizateAfterIR();
|
cfgopt.SysYOptimizateAfterIR();
|
||||||
|
|
||||||
ControlFlowAnalysis cfa(moduleIR);
|
ControlFlowAnalysis cfa(moduleIR);
|
||||||
cfa.init();
|
cfa.init();
|
||||||
|
|||||||
Reference in New Issue
Block a user