修复若干bug

This commit is contained in:
rain2133
2025-06-23 17:04:45 +08:00
parent 3d233ff199
commit 10b43fc90d
4 changed files with 26 additions and 21 deletions

View File

@ -17,6 +17,7 @@ add_executable(sysyc
SysYIRGenerator.cpp
# Backend.cpp
SysYIRPrinter.cpp
SysYIROptPre.cpp
RISCv32Backend.cpp
)
target_include_directories(sysyc PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include)

View File

@ -38,9 +38,8 @@ void SysYOptPre::SysYDelInstAfterBr() {
for (auto &basicBlock : basicBlocks) {
bool Branch = false;
auto &instructions = basicBlock->getInstructions();
auto iter = instructions.begin();
auto Branchiter = instructions.end();
for (auto iter = instructions->begin(); iter != instructions->end();iter++) {
for (auto iter = instructions.begin(); iter != instructions.end(); ++iter) {
if (Branch)
usedelete(iter->get());
else if ((*iter)->isTerminator()){
@ -48,8 +47,8 @@ void SysYOptPre::SysYDelInstAfterBr() {
Branchiter = iter;
}
}
Branchiter++;
while(Branchiter != instructions->begin())
if (Branchiter != instructions.end()) ++Branchiter;
while (Branchiter != instructions.end())
Branchiter = instructions.erase(Branchiter);
if (Branch) { // 更新前驱后继关系
@ -183,10 +182,8 @@ void SysYOptPre::SysYDelNoPreBLock() {
}
for (auto blockIter = func->getBasicBlocks().begin(); blockIter != func->getBasicBlocks().end();blockIter++) {
for (auto blockIter = func->getBasicBlocks().begin(); blockIter != func->getBasicBlocks().end();) {
if (!blockIter->get()->getreachable()) {
//// 处理phi指令
// 删除不可达基本块的phi指令的操作数
for (auto succblock : blockIter->get()->getSuccessors()) {
int indexphi = 1;
for (auto pred : succblock->getPredecessors()) {
@ -202,14 +199,16 @@ void SysYOptPre::SysYDelNoPreBLock() {
phiinst->removeOperand(indexphi);
}
}
// 删除不可达基本块
func->removeBasicBlock(blockIter->get());
// 删除不可达基本块,注意迭代器不可达问题
func->removeBasicBlock((blockIter++)->get());
} else {
blockIter++;
}
}
}
}
void SysyOptimization::SysyDelEmptyBlock() {
void SysYOptPre::SysYDelEmptyBlock() {
auto &functions = pModule->getFunctions();
for (auto &function : functions) {
// 收集不可达基本块
@ -259,7 +258,7 @@ void SysyOptimization::SysyDelEmptyBlock() {
--thelastinst;
// 根据br指令传递的后继块信息跳过空块链
if (thelastinst->get()->getKind()->isUnconditional()) {
if (thelastinst->get()->isUnconditional()) {
BasicBlock* OldBrBlock = dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(0));
BasicBlock *thelastBlockOld = nullptr;
// 如果空块链表为多个块
@ -285,7 +284,7 @@ void SysyOptimization::SysyDelEmptyBlock() {
// 更新phi指令的操作数
// 移除thelastBlockOld对应的phi操作数
for (auto &InstInNew : dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(1))->getInstructions()) {
for (auto &InstInNew : dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(0))->getInstructions()) {
if (InstInNew->isPhi()) {
dynamic_cast<PhiInst *>(InstInNew.get())->removeOperand(indexphi + 1);
} else {
@ -322,12 +321,12 @@ void SysyOptimization::SysyDelEmptyBlock() {
// auto indexInNew = dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(0))->getPredecessors().
if (thelastBlockOld != nullptr) {
int index = 0;
int indexphi = 0;
for (auto &pred : dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(1))->getPredecessors()) {
if (pred == thelastBlockOld) {
break;
}
index++;
indexphi++;
}
for (auto &InstInNew : dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(1))->getInstructions()) {
@ -362,12 +361,12 @@ void SysyOptimization::SysyDelEmptyBlock() {
dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(2))->addPredecessor(basicBlock.get());
if (thelastBlockOld != nullptr) {
int index = 0;
int indexphi = 0;
for (auto &pred : dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(2))->getPredecessors()) {
if (pred == thelastBlockOld) {
break;
}
index++;
indexphi++;
}
for (auto &InstInNew : dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(2))->getInstructions()) {
if (InstInNew->isPhi()) {
@ -398,12 +397,12 @@ void SysyOptimization::SysyDelEmptyBlock() {
basicBlock->addSuccessor(dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(0)));
dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(0))->addPredecessor(basicBlock.get());
if (thelastBlockOld != nullptr) {
int index = 0;
int indexphi = 0;
for (auto &pred : dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(0))->getPredecessors()) {
if (pred == thelastBlockOld) {
break;
}
index++;
indexphi++;
}
for (auto &InstInNew : dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(0))->getInstructions()) {
@ -461,7 +460,7 @@ void SysYOptPre::SysYAddReturn() {
auto &functions = pModule->getFunctions();
for (auto &function : functions) {
auto &func = function.second;
auto &basicBlocks = func->getBasicBlocks();
auto basicBlocks = func->getBasicBlocks();
for (auto &block : basicBlocks) {
if (block->getNumSuccessors() == 0) {
// 如果基本块没有后继块,则添加一个返回指令

View File

@ -19,7 +19,7 @@ class SysYOptPre {
SysYOptPre(Module *pMoudle, IRBuilder *pBuilder) : pModule(pMoudle), pBuilder(pBuilder) {}
void SysYOptimizateAfterIR(){
SysYDelAfterBr();
SysYDelInstAfterBr();
SysYBlockMerge();
SysYDelNoPreBLock();
SysYDelEmptyBlock();
@ -31,7 +31,7 @@ class SysYOptPre {
void SysYBlockMerge(); // 合并基本块(主要针对嵌套if while的exit块
// 也可以修改IR生成实现回填机制
void SysYAddReturn(); // 添加return指令(主要针对Void函数)
void usedelete(); // use删除
void usedelete(Instruction *instr); // use删除
};
} // namespace sysy

View File

@ -9,6 +9,7 @@ using namespace antlr4;
// #include "Backend.h"
#include "SysYIRGenerator.h"
#include "SysYIRPrinter.h"
#include "SysYIROptPre.h"
// #include "LLVMIRGenerator.h"
using namespace sysy;
@ -79,6 +80,10 @@ int main(int argc, char **argv) {
auto moduleIR = generator.get();
SysYPrinter printer(moduleIR);
printer.printIR();
auto builder = generator.getBuilder();
SysYOptPre optPre(moduleIR, builder);
optPre.SysYOptimizateAfterIR();
printer.printIR();
return EXIT_SUCCESS;
}
return EXIT_SUCCESS;