deploy-20250820-3 #1

Merged
gh0s7 merged 352 commits from deploy-20250820-3 into master 2025-08-20 21:20:33 +08:00
2 changed files with 415 additions and 395 deletions
Showing only changes of commit 009f54863e - Show all commits

View File

@@ -13,10 +13,10 @@ namespace sysy {
// 删除br后的无用指令
void SysYCFGOpt::SysYDelInstAfterBr() {
auto &functions = pModule->getFunctions();
for (auto &function : functions) {
auto basicBlocks = function.second->getBasicBlocks();
bool SysYCFGOpt::SysYDelInstAfterBr(Function *func) {
bool changed = false;
auto basicBlocks = func->getBasicBlocks();
for (auto &basicBlock : basicBlocks) {
bool Branch = false;
auto &instructions = basicBlock->getInstructions();
@@ -30,8 +30,10 @@ void SysYCFGOpt::SysYDelInstAfterBr() {
}
}
if (Branchiter != instructions.end()) ++Branchiter;
while (Branchiter != instructions.end())
while (Branchiter != instructions.end()) {
changed = true;
Branchiter = instructions.erase(Branchiter);
}
if (Branch) { // 更新前驱后继关系
auto thelastinstinst = basicBlock->getInstructions().end();
@@ -55,15 +57,14 @@ void SysYCFGOpt::SysYDelInstAfterBr() {
}
}
}
}
return changed;
}
// 合并空基本块
void SysYCFGOpt::SysYBlockMerge() {
auto &functions = pModule->getFunctions(); //std::map<std::string, std::unique_ptr<Function>>
for (auto &function : functions) {
// auto basicBlocks = function.second->getBasicBlocks();
auto &func = function.second;
bool SysYCFGOpt::SysYBlockMerge(Function *func) {
bool changed = false;
for (auto blockiter = func->getBasicBlocks().begin();
blockiter != func->getBasicBlocks().end();) {
if (blockiter->get()->getNumSuccessors() == 1) {
@@ -117,6 +118,7 @@ void SysYCFGOpt::SysYBlockMerge() {
}
func->removeBasicBlock(nextBlock);
changed = true;
} else {
blockiter++;
@@ -125,15 +127,14 @@ void SysYCFGOpt::SysYBlockMerge() {
blockiter++;
}
}
}
return changed;
}
// 删除无前驱块兼容SSA后的处理
void SysYCFGOpt::SysYDelNoPreBLock() {
bool SysYCFGOpt::SysYDelNoPreBLock(Function *func) {
auto &functions = pModule->getFunctions(); // std::map<std::string, std::unique_ptr<sysy::Function>>
for (auto &function : functions) {
auto &func = function.second;
bool changed = false;
for (auto &block : func->getBasicBlocks()) {
block->setreachableFalse();
@@ -156,7 +157,6 @@ void SysYCFGOpt::SysYDelNoPreBLock() {
// 删除不可达基本块指令
for (auto blockIter = func->getBasicBlocks().begin(); blockIter != func->getBasicBlocks().end();blockIter++) {
if (!blockIter->get()->getreachable())
for (auto &iterInst : blockIter->get()->getInstructions())
SysYIROptUtils::usedelete(iterInst.get());
@@ -183,20 +183,23 @@ void SysYCFGOpt::SysYDelNoPreBLock() {
}
// 删除不可达基本块,注意迭代器不可达问题
func->removeBasicBlock((blockIter++)->get());
changed = true;
} else {
blockIter++;
}
}
}
return changed;
}
void SysYCFGOpt::SysYDelEmptyBlock() {
auto &functions = pModule->getFunctions();
for (auto &function : functions) {
// 删除空块
bool SysYCFGOpt::SysYDelEmptyBlock(Function *func, IRBuilder* pBuilder) {
bool changed = false;
// 收集不可达基本块
// 这里的不可达基本块是指没有实际指令的基本块
// 当一个基本块没有实际指令例如只有phi指令和一个uncondbr指令时也会被视作不可达
auto basicBlocks = function.second->getBasicBlocks();
auto basicBlocks = func->getBasicBlocks();
std::map<sysy::BasicBlock *, BasicBlock *> EmptyBlocks;
// 空块儿和后继的基本块的映射
for (auto &basicBlock : basicBlocks) {
@@ -399,11 +402,11 @@ void SysYCFGOpt::SysYDelEmptyBlock() {
}
}
for (auto iter = function.second->getBasicBlocks().begin(); iter != function.second->getBasicBlocks().end();) {
for (auto iter = func->getBasicBlocks().begin(); iter != func->getBasicBlocks().end();) {
if (EmptyBlocks.find(iter->get()) != EmptyBlocks.end()) {
// EntryBlock跳过
if (iter->get() == function.second->getEntryBlock()) {
if (iter->get() == func->getEntryBlock()) {
++iter;
continue;
}
@@ -429,22 +432,24 @@ void SysYCFGOpt::SysYDelEmptyBlock() {
}
}
function.second->removeBasicBlock((iter++)->get());
func->removeBasicBlock((iter++)->get());
changed = true;
} else {
++iter;
}
}
}
return changed;
}
// 如果函数没有返回指令,则添加一个默认返回指令(主要解决void函数没有返回指令的问题)
void SysYCFGOpt::SysYAddReturn() {
auto &functions = pModule->getFunctions();
for (auto &function : functions) {
auto &func = function.second;
bool SysYCFGOpt::SysYAddReturn(Function *func, IRBuilder* pBuilder) {
bool changed = false;
auto basicBlocks = func->getBasicBlocks();
for (auto &block : basicBlocks) {
if (block->getNumSuccessors() == 0) {
changed = true;
// 如果基本块没有后继块,则添加一个返回指令
if (block->getNumInstructions() == 0) {
pBuilder->setPosition(block.get(), block->end());
@@ -467,7 +472,8 @@ void SysYCFGOpt::SysYAddReturn() {
}
}
}
}
return changed;
}
} // namespace sysy

View File

@@ -26,18 +26,32 @@ class SysYCFGOpt {
SysYCFGOpt(Module *pMoudle, IRBuilder *pBuilder) : pModule(pMoudle), pBuilder(pBuilder) {}
void SysYOptimizateAfterIR(){
SysYDelInstAfterBr();
SysYBlockMerge();
SysYDelNoPreBLock();
SysYDelEmptyBlock();
SysYAddReturn();
auto &functions = pModule->getFunctions();
for (auto &function : functions) {
bool changed = false;
while(changed){
// 删除br后面的无用指令
changed |= SysYDelInstAfterBr(function.second.get());
// 合并空基本块
changed |= SysYBlockMerge(function.second.get());
// 删除无前驱块
changed |= SysYDelNoPreBLock(function.second.get());
// 删除空块
changed |= SysYDelEmptyBlock(function.second.get(), pBuilder);
// 添加return指令
changed |= SysYAddReturn(function.second.get(), pBuilder);
}
void SysYDelInstAfterBr(); // 删除br后面的指令
void SysYDelEmptyBlock(); // 空块删除
void SysYDelNoPreBLock(); // 删除无前驱块(不可达块)
void SysYBlockMerge(); // 合并基本块(主要针对嵌套if while的exit块
}
}
public:
static bool SysYDelInstAfterBr(Function *func); // 删除br后面的指令
static bool SysYDelEmptyBlock(Function *func, IRBuilder* pBuilder); // 空块删除
static bool SysYDelNoPreBLock(Function *func); // 删除无前驱块(不可达块)
static bool SysYBlockMerge(Function *func); // 合并基本块(主要针对嵌套if while的exit块
// 也可以修改IR生成实现回填机制
void SysYAddReturn(); // 添加return指令(主要针对Void函数)
static bool SysYAddReturn(Function *func, IRBuilder* pBuilder); // 添加return指令(主要针对Void函数)
};
} // namespace sysy