optimize local array init

This commit is contained in:
ridethepig 2023-06-08 17:13:53 +08:00
parent 3073d69806
commit 5c1278280a
5 changed files with 19 additions and 19 deletions

2
.vscode/launch.json vendored
View File

@ -9,7 +9,7 @@
"request": "launch", "request": "launch",
"name": "Debug", "name": "Debug",
"program": "${workspaceFolder}/build/sysy", "program": "${workspaceFolder}/build/sysy",
"args": ["../sysytests/functional_2022/21_if_test2.sy", "-S", "-o", "build/21_my.ll", "-O1", "-emit-llvm"], "args": ["../sysytests/functional_2022/34_arr_expr_len.sy", "-S", "-o", "build/21_my.ll", "-O1", "-emit-llvm"],
"cwd": "${workspaceFolder}" "cwd": "${workspaceFolder}"
} }
] ]

View File

@ -1,5 +1,6 @@
#pragma once #pragma once
#include "3rdparty/easylogging++.h" #include "3rdparty/easylogging++.h"
#include "fmt/core.h"
#include <algorithm> #include <algorithm>
#include <any> #include <any>
#include <bitset> #include <bitset>

View File

@ -199,6 +199,7 @@ public:
class ConstantArr : public Constant { class ConstantArr : public Constant {
public: public:
//! By default, this value_list is flattened and with size equal to declared size
std::vector<ValuePtr_t> value_list; std::vector<ValuePtr_t> value_list;
ConstantArr(const std::string &name, const std::vector<ValuePtr_t> &value_list, std::shared_ptr<ArrayType> type) ConstantArr(const std::string &name, const std::vector<ValuePtr_t> &value_list, std::shared_ptr<ArrayType> type)
: Constant(name, type), value_list(value_list) {} : Constant(name, type), value_list(value_list) {}

View File

@ -67,7 +67,6 @@ void _sysy_stoptime(int lineno);
*/ */
Visitor::Visitor(SysyLexer &) { Visitor::Visitor(SysyLexer &) {
#pragma region RegisterLibFunc
auto fparam_i32 = std::make_shared<FParam>("", TypeHelper::TYPE_I32); auto fparam_i32 = std::make_shared<FParam>("", TypeHelper::TYPE_I32);
auto pointer_type = std::make_shared<PointerType>(TypeHelper::TYPE_I32); auto pointer_type = std::make_shared<PointerType>(TypeHelper::TYPE_I32);
auto fparam_ptr_i32 = std::make_shared<FParam>("", pointer_type); auto fparam_ptr_i32 = std::make_shared<FParam>("", pointer_type);
@ -107,7 +106,9 @@ Visitor::Visitor(SysyLexer &) {
func_stoptime->fparam_list = {fparam_i32}; func_stoptime->fparam_list = {fparam_i32};
_func_tab.push_name("stoptime", func_stoptime); _func_tab.push_name("stoptime", func_stoptime);
#pragma endregion auto func_memset = std::make_shared<Function>("memset", TypeHelper::TYPE_VOID);
func_memset->fparam_list = {fparam_ptr_i32, fparam_i32, fparam_i32};
_func_tab.push_name("memset", func_memset);
} }
std::any Visitor::visitConstDecl(SysyParser::ConstDeclContext *ctx) { std::any Visitor::visitConstDecl(SysyParser::ConstDeclContext *ctx) {
@ -235,11 +236,17 @@ std::any Visitor::visitVarDef(SysyParser::VarDefContext *ctx) {
for (int i = 1; i < dim_list.size(); ++i) { for (int i = 1; i < dim_list.size(); ++i) {
base_ptr = build_InstGEP(base_ptr, {CONST0, CONST0}, _state.current_bb); base_ptr = build_InstGEP(base_ptr, {CONST0, CONST0}, _state.current_bb);
} }
auto inst_call = build_InstCall(
_func_tab.get_name("memset").value(),
{base_ptr, CONST0, ConstantInt::make_shared(array_value.size() * 4)},
_state.current_bb
);
// TODO: BAAU-2021 calls memset in `libc` (not sysylib) to optimize this process // TODO: BAAU-2021 calls memset in `libc` (not sysylib) to optimize this process
build_InstStore(array_value[0] ? array_value[0] : CONST0, base_ptr, _state.current_bb); if (array_value[0]) build_InstStore(array_value[0], base_ptr, _state.current_bb);
for (int i = 1; i < array_value.size(); ++i) { for (int i = 1; i < array_value.size(); ++i) {
if (!array_value[i]) continue;
auto ptr = build_InstGEP(base_ptr, {ConstantInt::make_shared(i)}, _state.current_bb); auto ptr = build_InstGEP(base_ptr, {ConstantInt::make_shared(i)}, _state.current_bb);
build_InstStore(array_value[i] ? array_value[i] : CONST0, ptr, _state.current_bb); build_InstStore(array_value[i], ptr, _state.current_bb);
} }
} }
// If there is no init expr, let it be // If there is no init expr, let it be
@ -288,17 +295,9 @@ std::any Visitor::visitInitVal(SysyParser::InitValContext *ctx) {
} }
for (auto init_val : ctx->initVal()) { for (auto init_val : ctx->initVal()) {
if (init_val->exp()) { if (init_val->exp()) {
if (_state.isGlobalIint) { auto exp_value = any_to_Value(visitInitVal(init_val));
auto const_value = any_to_Value(visitInitVal(init_val)); if (_state.isGlobalIint) assert(Value::is<ConstantInt>(exp_value));
// should evaluate to const int cur_arr.push_back(exp_value);
sysy_assert(Value::is<ConstantInt>(const_value));
cur_arr.push_back(const_value);
}
else {
// God knows what it evaluates to
auto exp_value = any_to_Value(visitInitVal(init_val));
cur_arr.push_back(exp_value);
}
} }
else { else {
// evaluate sub-array // evaluate sub-array
@ -614,7 +613,6 @@ std::any Visitor::visitUnaryExp(SysyParser::UnaryExpContext *ctx) {
} }
else if (ctx->IDENT()) { else if (ctx->IDENT()) {
// Fucntion call // Fucntion call
// TODO: buildCall/isRealParam
// TODO: Handle string & putf() // TODO: Handle string & putf()
auto func_name = ctx->IDENT()->getText(); auto func_name = ctx->IDENT()->getText();
VLOG(5) << "Calling Func: " << func_name; VLOG(5) << "Calling Func: " << func_name;

View File

@ -11,8 +11,8 @@
namespace CompSysY { namespace CompSysY {
const std::array<std::string, 8> libfunc_list = const std::array<std::string, 9> libfunc_list =
{"getint", "getch", "getarray", "putint", "putch", "putarray", "starttime", "stoptime"}; {"getint", "getch", "getarray", "putint", "putch", "putarray", "starttime", "stoptime", "memset"};
// On generation, the array is flattened, thus we have to calculate them // On generation, the array is flattened, thus we have to calculate them
std::shared_ptr<ConstantArr> gen_arr_hierarchy( std::shared_ptr<ConstantArr> gen_arr_hierarchy(