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

View File

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

View File

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