From d681c9df85eba0ab5112aba5c4b9b89af4ad36a2 Mon Sep 17 00:00:00 2001 From: Rupert Swarbrick Date: Tue, 26 May 2020 11:41:32 +0100 Subject: [PATCH] Pass some more args by reference in select.cc Before this patch, the code passed around std::string objects by value. It's probably not a hot-spot, but it can't hurt to avoid the copying. Removing the copy and clean-up code means the resulting code is ~6.1kb smaller when compiled with GCC 9.3 and standard settings. --- kernel/register.h | 2 +- passes/cmds/select.cc | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/kernel/register.h b/kernel/register.h index 3d89386b7..7bbcd1727 100644 --- a/kernel/register.h +++ b/kernel/register.h @@ -125,7 +125,7 @@ struct Backend : Pass }; // implemented in passes/cmds/select.cc -extern void handle_extra_select_args(Pass *pass, std::vector args, size_t argidx, size_t args_size, RTLIL::Design *design); +extern void handle_extra_select_args(Pass *pass, const std::vector &args, size_t argidx, size_t args_size, RTLIL::Design *design); extern RTLIL::Selection eval_select_args(const vector &args, RTLIL::Design *design); extern void eval_select_op(vector &work, const string &op, RTLIL::Design *design); diff --git a/passes/cmds/select.cc b/passes/cmds/select.cc index f79f979de..13ee030a5 100644 --- a/passes/cmds/select.cc +++ b/passes/cmds/select.cc @@ -54,7 +54,7 @@ static bool match_ids(RTLIL::IdString id, const std::string &pattern) return false; } -static bool match_attr_val(const RTLIL::Const &value, std::string pattern, char match_op) +static bool match_attr_val(const RTLIL::Const &value, const std::string &pattern, char match_op) { if (match_op == 0) return true; @@ -106,7 +106,7 @@ static bool match_attr_val(const RTLIL::Const &value, std::string pattern, char log_abort(); } -static bool match_attr(const dict &attributes, std::string name_pat, std::string value_pat, char match_op) +static bool match_attr(const dict &attributes, const std::string &name_pat, const std::string &value_pat, char match_op) { if (name_pat.find('*') != std::string::npos || name_pat.find('?') != std::string::npos || name_pat.find('[') != std::string::npos) { for (auto &it : attributes) { @@ -124,7 +124,7 @@ static bool match_attr(const dict &attributes, st return false; } -static bool match_attr(const dict &attributes, std::string match_expr) +static bool match_attr(const dict &attributes, const std::string &match_expr) { size_t pos = match_expr.find_first_of(""); @@ -415,7 +415,7 @@ namespace { }; } -static int parse_comma_list(std::set &tokens, std::string str, size_t pos, std::string stopchar) +static int parse_comma_list(std::set &tokens, const std::string &str, size_t pos, std::string stopchar) { stopchar += ','; while (1) { @@ -500,7 +500,7 @@ static int select_op_expand(RTLIL::Design *design, RTLIL::Selection &lhs, std::v return sel_objects; } -static void select_op_expand(RTLIL::Design *design, std::string arg, char mode, bool eval_only) +static void select_op_expand(RTLIL::Design *design, const std::string &arg, char mode, bool eval_only) { int pos = (mode == 'x' ? 2 : 3) + (eval_only ? 1 : 0); int levels = 1, rem_objects = -1; @@ -971,7 +971,7 @@ PRIVATE_NAMESPACE_END YOSYS_NAMESPACE_BEGIN // used in kernel/register.cc and maybe other locations, extern decl. in register.h -void handle_extra_select_args(Pass *pass, vector args, size_t argidx, size_t args_size, RTLIL::Design *design) +void handle_extra_select_args(Pass *pass, const vector &args, size_t argidx, size_t args_size, RTLIL::Design *design) { work_stack.clear(); for (; argidx < args_size; argidx++) { @@ -1675,7 +1675,7 @@ struct CdPass : public Pass { } CdPass; template -static void log_matches(const char *title, Module *module, T list) +static void log_matches(const char *title, Module *module, const T &list) { std::vector matches;