main
Odeinjul 12 months ago
parent e5754f92b9
commit 024aad74f2
No known key found for this signature in database
GPG Key ID: E384228B2B38FFBB

@ -638,11 +638,13 @@ void IRBuilder::visit(SyntaxTree::UnaryCondExpr &node) {
// FINISH // FINISH
void IRBuilder::visit(SyntaxTree::BinaryCondExpr &node) { void IRBuilder::visit(SyntaxTree::BinaryCondExpr &node) {
auto curFunc = builder->get_insert_block()->get_parent(); auto curFunc = builder->get_insert_block()->get_parent();
auto trueBB = BasicBlock::create(module, "trueBB_and", curFunc); Ptr<BasicBlock> trueBB;
auto falseBB = BasicBlock::create(module, "falseBB_and", curFunc); Ptr<BasicBlock> falseBB;
Ptr<Instruction> cond; Ptr<Instruction> cond;
switch (node.op) { switch (node.op) {
case SyntaxTree::BinaryCondOp::LAND: case SyntaxTree::BinaryCondOp::LAND:
trueBB = BasicBlock::create(module, "trueBB_and", curFunc);
falseBB = BasicBlock::create(module, "falseBB_and", curFunc);
node.lhs->accept(*this); node.lhs->accept(*this);
TypeConvert(tmpInst, INT1_T); TypeConvert(tmpInst, INT1_T);
builder->create_cond_br(tmpInst, trueBB, falseBB); builder->create_cond_br(tmpInst, trueBB, falseBB);
@ -658,7 +660,8 @@ void IRBuilder::visit(SyntaxTree::BinaryCondExpr &node) {
break; break;
case SyntaxTree::BinaryCondOp::LOR: case SyntaxTree::BinaryCondOp::LOR:
trueBB = BasicBlock::create(module, "trueBB_and", curFunc);
falseBB = BasicBlock::create(module, "falseBB_and", curFunc);
node.lhs->accept(*this); node.lhs->accept(*this);
TypeConvert(tmpInst, INT1_T); TypeConvert(tmpInst, INT1_T);
builder->create_cond_br(tmpInst, trueBB, falseBB); builder->create_cond_br(tmpInst, trueBB, falseBB);
@ -738,7 +741,7 @@ void IRBuilder::visit(SyntaxTree::IfStmt &node) {
auto curFunc = builder->get_insert_block()->get_parent(); auto curFunc = builder->get_insert_block()->get_parent();
auto trueBB = BasicBlock::create(module, "trueBB_if", curFunc); auto trueBB = BasicBlock::create(module, "trueBB_if", curFunc);
auto falseBB = BasicBlock::create(module, "falseBB_if", curFunc); auto falseBB = BasicBlock::create(module, "falseBB_if", curFunc);
auto exitBB = node.else_statement == nullptr ? falseBB : BasicBlock::create(module, "exitBB_if", curFunc); auto afterBB = node.else_statement == nullptr ? falseBB : BasicBlock::create(module, "afterBB_if", curFunc);
node.cond_exp->accept(*this); node.cond_exp->accept(*this);
@ -747,15 +750,16 @@ void IRBuilder::visit(SyntaxTree::IfStmt &node) {
builder->set_insert_point(trueBB); builder->set_insert_point(trueBB);
node.if_statement->accept(*this); node.if_statement->accept(*this);
builder->create_br(exitBB); if (builder->get_insert_block()->get_terminator() == nullptr)
builder->create_br(afterBB);
if (node.else_statement) { if (node.else_statement) {
builder->set_insert_point(falseBB); builder->set_insert_point(falseBB);
node.else_statement->accept(*this); node.else_statement->accept(*this);
builder->create_br(exitBB); builder->create_br(afterBB);
} }
if (!exitBB->get_pre_basic_blocks().empty()) { if (!afterBB->get_pre_basic_blocks().empty()) {
builder->set_insert_point(exitBB); builder->set_insert_point(afterBB);
} }
} }

Loading…
Cancel
Save