[IR]消除Falltrhough现象
[IR]优化生成Ret指令逻辑 [README]添加TODO表
This commit is contained in:
11
README.md
11
README.md
@@ -37,4 +37,13 @@ mysysy/ $ bash setup.sh
|
|||||||
```
|
```
|
||||||
|
|
||||||
### 配套脚本
|
### 配套脚本
|
||||||
(TODO: 需要完善)
|
(TODO: 需要完善)
|
||||||
|
|
||||||
|
|
||||||
|
### TODO_list:
|
||||||
|
|
||||||
|
除开注释中的TODO后续时间充足可以考虑的TODO:
|
||||||
|
|
||||||
|
- store load指令由于gep指令的引入, 维度信息的记录是非必须的, 考虑删除
|
||||||
|
|
||||||
|
- use def关系经过mem2reg和phi函数明确转换为ssa形式, 以及函数参数通过value数组明确定义, 使得基本块的args参数信息记录非必须, 考虑删除
|
||||||
@@ -340,7 +340,6 @@ std::any SysYIRGenerator::visitFuncType(SysYParser::FuncTypeContext *ctx) {
|
|||||||
std::any SysYIRGenerator::visitFuncDef(SysYParser::FuncDefContext *ctx){
|
std::any SysYIRGenerator::visitFuncDef(SysYParser::FuncDefContext *ctx){
|
||||||
// 更新作用域
|
// 更新作用域
|
||||||
module->enterNewScope();
|
module->enterNewScope();
|
||||||
HasReturnInst = false;
|
|
||||||
|
|
||||||
auto name = ctx->Ident()->getText();
|
auto name = ctx->Ident()->getText();
|
||||||
std::vector<Type *> paramTypes;
|
std::vector<Type *> paramTypes;
|
||||||
@@ -376,22 +375,34 @@ std::any SysYIRGenerator::visitFuncDef(SysYParser::FuncDefContext *ctx){
|
|||||||
module->addVariable(paramNames[i], alloca);
|
module->addVariable(paramNames[i], alloca);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 在处理函数体之前,创建一个新的基本块作为函数体的实际入口
|
||||||
|
// 这样 entryBB 就可以在完成初始化后跳转到这里
|
||||||
|
BasicBlock* funcBodyEntry = function->addBasicBlock("funcBodyEntry");
|
||||||
|
|
||||||
|
// 从 entryBB 无条件跳转到 funcBodyEntry
|
||||||
|
builder.createUncondBrInst(funcBodyEntry, {});
|
||||||
|
builder.setPosition(funcBodyEntry,funcBodyEntry->end()); // 将插入点设置到 funcBodyEntry
|
||||||
|
|
||||||
for (auto item : ctx->blockStmt()->blockItem()) {
|
for (auto item : ctx->blockStmt()->blockItem()) {
|
||||||
visitBlockItem(item);
|
visitBlockItem(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(HasReturnInst == false) {
|
// 如果函数没有显式的返回语句,且返回类型不是 void,则需要添加一个默认的返回值
|
||||||
// 如果没有return语句,则默认返回0
|
ReturnInst* retinst = nullptr;
|
||||||
if (returnType != Type::getVoidType()) {
|
retinst = dynamic_cast<ReturnInst*>(builder.getBasicBlock()->terminator()->get());
|
||||||
Value* returnValue = ConstantInteger::get(0);
|
|
||||||
if (returnType == Type::getFloatType()) {
|
if (!retinst) {
|
||||||
returnValue = ConstantFloating::get(0.0f);
|
if (returnType->isVoid()) {
|
||||||
}
|
builder.createReturnInst();
|
||||||
builder.createReturnInst(returnValue);
|
} else if (returnType->isInt()) {
|
||||||
|
builder.createReturnInst(ConstantInteger::get(0)); // 默认返回 0
|
||||||
|
} else if (returnType->isFloat()) {
|
||||||
|
builder.createReturnInst(ConstantFloating::get(0.0f)); // 默认返回 0.0f
|
||||||
} else {
|
} else {
|
||||||
builder.createReturnInst();
|
assert(false && "Function with no explicit return and non-void type should return a value.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module->leaveScope();
|
module->leaveScope();
|
||||||
|
|
||||||
return std::any();
|
return std::any();
|
||||||
@@ -549,6 +560,7 @@ std::any SysYIRGenerator::visitIfStmt(SysYParser::IfStmtContext *ctx) {
|
|||||||
ctx->stmt(0)->accept(this);
|
ctx->stmt(0)->accept(this);
|
||||||
module->leaveScope();
|
module->leaveScope();
|
||||||
}
|
}
|
||||||
|
builder.createUncondBrInst(exitBlock, {});
|
||||||
BasicBlock::conectBlocks(builder.getBasicBlock(), exitBlock);
|
BasicBlock::conectBlocks(builder.getBasicBlock(), exitBlock);
|
||||||
|
|
||||||
labelstring << "if_exit.L" << builder.getLabelIndex();
|
labelstring << "if_exit.L" << builder.getLabelIndex();
|
||||||
@@ -570,6 +582,7 @@ std::any SysYIRGenerator::visitWhileStmt(SysYParser::WhileStmtContext *ctx) {
|
|||||||
labelstring << "while_head.L" << builder.getLabelIndex();
|
labelstring << "while_head.L" << builder.getLabelIndex();
|
||||||
BasicBlock *headBlock = function->addBasicBlock(labelstring.str());
|
BasicBlock *headBlock = function->addBasicBlock(labelstring.str());
|
||||||
labelstring.str("");
|
labelstring.str("");
|
||||||
|
builder.createUncondBrInst(headBlock, {});
|
||||||
BasicBlock::conectBlocks(curBlock, headBlock);
|
BasicBlock::conectBlocks(curBlock, headBlock);
|
||||||
builder.setPosition(headBlock, headBlock->end());
|
builder.setPosition(headBlock, headBlock->end());
|
||||||
|
|
||||||
@@ -654,7 +667,7 @@ std::any SysYIRGenerator::visitReturnStmt(SysYParser::ReturnStmtContext *ctx) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
builder.createReturnInst(returnValue);
|
builder.createReturnInst(returnValue);
|
||||||
HasReturnInst = true;
|
|
||||||
return std::any();
|
return std::any();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -62,8 +62,6 @@ private:
|
|||||||
public:
|
public:
|
||||||
SysYIRGenerator() = default;
|
SysYIRGenerator() = default;
|
||||||
|
|
||||||
bool HasReturnInst;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Module *get() const { return module.get(); }
|
Module *get() const { return module.get(); }
|
||||||
IRBuilder *getBuilder(){ return &builder; }
|
IRBuilder *getBuilder(){ return &builder; }
|
||||||
|
|||||||
Reference in New Issue
Block a user