修复若干bug
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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) {
|
||||||
// 如果基本块没有后继块,则添加一个返回指令
|
// 如果基本块没有后继块,则添加一个返回指令
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user