From c76db60e620e9f40b78c1f311f7d58bedf07fa04 Mon Sep 17 00:00:00 2001 From: stflrs <2630419379@qq.com> Date: Sun, 17 Dec 2023 21:14:28 +0800 Subject: [PATCH 1/2] 1 --- src/SysYFIRBuilder/IRBuilder.cpp | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/SysYFIRBuilder/IRBuilder.cpp b/src/SysYFIRBuilder/IRBuilder.cpp index 5db42ba..7d64a6a 100644 --- a/src/SysYFIRBuilder/IRBuilder.cpp +++ b/src/SysYFIRBuilder/IRBuilder.cpp @@ -663,12 +663,17 @@ namespace SysYF void IRBuilder::visit(SyntaxTree::BinaryCondExpr &node) { - node.lhs->accept(*this); - auto lhs = tmp_val; - auto lhstype = lhs->get_type(); - node.rhs->accept(*this); - auto rhs = tmp_val; - auto rhstype = rhs->get_type(); + Ptr lhs, rhs; + Ptr lhstype, rhstype; + if(node.op == SyntaxTree::BinaryCondOp::LAND || node.op == SyntaxTree::BinaryCondOp::LOR){ + node.lhs->accept(*this); + lhs = tmp_val; + lhstype = lhs->get_type(); + node.rhs->accept(*this); + rhs = tmp_val; + rhstype = rhs->get_type(); + } + switch (node.op) { case SyntaxTree::BinaryCondOp::LT: @@ -855,7 +860,9 @@ namespace SysYF auto after_bb = BasicBlock::create(module, labelname, parent); auto result = builder->create_alloca(INT1_T); - + node.lhs->accept(*this); + lhs = tmp_val; + lhstype = lhs->get_type(); if (Type::is_eq_type(lhstype, INT1_T)) { builder->create_cond_br(lhs, next_bb, false_bb); // if true直接跳转到nextbb(rhs判断的bb),否则跳转到falsebb @@ -876,6 +883,9 @@ namespace SysYF } builder->set_insert_point(next_bb); // rhs判断域 + node.rhs->accept(*this); + rhs = tmp_val; + rhstype = rhs->get_type(); if (Type::is_eq_type(rhstype, INT1_T)) { builder->create_cond_br(rhs, true_bb, false_bb); // if true直接跳转到truebb,否则跳转到falsebb @@ -925,6 +935,9 @@ namespace SysYF auto after_bb = BasicBlock::create(module, labelname, parent); auto result = builder->create_alloca(INT1_T); + node.lhs->accept(*this); + lhs = tmp_val; + lhstype = lhs->get_type(); if (Type::is_eq_type(lhstype, INT1_T)) { builder->create_cond_br(lhs, true_bb, next_bb); // if true直接跳转到turebb执行体内,否则跳转到nextbb(rhs判断域) @@ -943,8 +956,11 @@ namespace SysYF { builder->create_br(true_bb); } + builder->set_insert_point(next_bb); // rhs判断域 - + node.rhs->accept(*this); + rhs = tmp_val; + rhstype = rhs->get_type(); if (Type::is_eq_type(rhstype, INT1_T)) { builder->create_cond_br(rhs, true_bb, false_bb); // if true直接跳转到truebb,否则跳转到falsebb From 9ffa4690b8449d94084ae7367d65488596d58d5b Mon Sep 17 00:00:00 2001 From: stflrs <2630419379@qq.com> Date: Sun, 17 Dec 2023 22:54:02 +0800 Subject: [PATCH 2/2] 1 --- src/SysYFIRBuilder/IRBuilder.cpp | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/src/SysYFIRBuilder/IRBuilder.cpp b/src/SysYFIRBuilder/IRBuilder.cpp index 7d64a6a..9f79c2a 100644 --- a/src/SysYFIRBuilder/IRBuilder.cpp +++ b/src/SysYFIRBuilder/IRBuilder.cpp @@ -107,7 +107,6 @@ namespace SysYF // store temporary value Ptr tmp_val = nullptr; // 存储需要全局处理的expr node Ptr lhs_addr = nullptr; - Ptr lval_addr_ = nullptr; Ptr func_parent; // 便于在创建新的bb时获得对应的func_parent int bb_label_num = 0; // 全局控制bb标签编号 bool func_first_bb; // 处理一个func域里有多个{},只创建一个scope @@ -493,7 +492,6 @@ namespace SysYF /* DBGLOG("In LVal array"); */ // a[4] auto lval = builder->create_gep(lval_addr, {CONST_INT(0), tmp_val}); lhs_addr = lval; - lval_addr_ = builder->create_gep(lval_addr, {CONST_INT(0)}); tmp_val = builder->create_load(lval); IsArray = true; } @@ -502,6 +500,7 @@ namespace SysYF auto ptr = builder->create_load(lval_addr); auto lval = builder->create_gep(ptr, {tmp_val}); // 没有CONST_INT(0),基址是ptr + lhs_addr = lval; tmp_val = builder->create_load(lval); } } @@ -665,7 +664,7 @@ namespace SysYF { Ptr lhs, rhs; Ptr lhstype, rhstype; - if(node.op == SyntaxTree::BinaryCondOp::LAND || node.op == SyntaxTree::BinaryCondOp::LOR){ + if((node.op != SyntaxTree::BinaryCondOp::LAND) && (node.op != SyntaxTree::BinaryCondOp::LOR)){ node.lhs->accept(*this); lhs = tmp_val; lhstype = lhs->get_type(); @@ -858,7 +857,7 @@ namespace SysYF auto next_bb = BasicBlock::create(module, labelname, parent); sprintf(labelname, "after_bb_%d", bb_label_num++); // auto after_bb = BasicBlock::create(module, labelname, parent); - + auto result = builder->create_alloca(INT1_T); node.lhs->accept(*this); lhs = tmp_val; @@ -906,19 +905,14 @@ namespace SysYF } builder->set_insert_point(true_bb); // cond_bb判断域结束,进入true_bb执行体内部 - builder->create_store(CONST_INT(true),result); + builder->create_store(result, CONST_INT(true)); builder->create_br(after_bb); - builder->set_insert_point(false_bb); - builder->create_store(CONST_INT(false),result); + builder->create_store(result, CONST_INT(false)); builder->create_br(after_bb); - - // true_bb和false_bb IR结束后都要无条件br到after_bb builder->set_insert_point(after_bb); tmp_val = builder->create_load(result); - - break; } case SyntaxTree::BinaryCondOp::LOR: @@ -956,11 +950,11 @@ namespace SysYF { builder->create_br(true_bb); } - builder->set_insert_point(next_bb); // rhs判断域 node.rhs->accept(*this); rhs = tmp_val; rhstype = rhs->get_type(); + if (Type::is_eq_type(rhstype, INT1_T)) { builder->create_cond_br(rhs, true_bb, false_bb); // if true直接跳转到truebb,否则跳转到falsebb @@ -981,13 +975,11 @@ namespace SysYF } builder->set_insert_point(true_bb); // cond_bb判断域结束,进入true_bb执行体内部 - builder->create_store(CONST_INT(true),result); + builder->create_store(result, CONST_INT(true)); builder->create_br(after_bb); - builder->set_insert_point(false_bb); - builder->create_store(CONST_INT(false),result); + builder->create_store(result, CONST_INT(false)); builder->create_br(after_bb); - // true_bb和false_bb IR结束后都要无条件br到after_bb builder->set_insert_point(after_bb); tmp_val = builder->create_load(result); @@ -1435,8 +1427,6 @@ namespace SysYF else if (ParaType->is_pointer_type()) { if (tmpType->is_array_type()){ - /* auto tmp = dynamic_pointer_cast(tmp_val); */ - /* auto Element_Type = tmp->get_array_element_type(); */ DBGLOG(tmpType->get_type_id()); DBGLOG("debug 1"); auto Element_pointer = builder->create_gep(lhs_addr,{CONST_INT(0),CONST_INT(0)});