From 91007258023d59b17e28bc74c940c8c690e128ef Mon Sep 17 00:00:00 2001 From: ManDude <7569514+ManDude@users.noreply.github.com> Date: Sat, 16 Apr 2022 22:16:08 +0100 Subject: [PATCH] fix unnecessary copy-constructors (no speed increase) --- decompiler/Function/CfgVtx.cpp | 2 +- decompiler/IR2/FormExpressionAnalysis.cpp | 70 +++++++++++------------ decompiler/analysis/find_defstates.cpp | 12 ++-- 3 files changed, 42 insertions(+), 42 deletions(-) diff --git a/decompiler/Function/CfgVtx.cpp b/decompiler/Function/CfgVtx.cpp index b00961a10b..7f561c3597 100644 --- a/decompiler/Function/CfgVtx.cpp +++ b/decompiler/Function/CfgVtx.cpp @@ -2775,7 +2775,7 @@ std::shared_ptr build_cfg( if (is_branch(likely_branch_candidate, true)) { // likely branch! - auto following = func.instructions.at(likely_branch_idx + 1); + auto& following = func.instructions.at(likely_branch_idx + 1); if (branch_delay_asm(following)) { b->end_branch.asm_branch = true; if (debug_asm_branch) { diff --git a/decompiler/IR2/FormExpressionAnalysis.cpp b/decompiler/IR2/FormExpressionAnalysis.cpp index 66a054177e..42616802dd 100644 --- a/decompiler/IR2/FormExpressionAnalysis.cpp +++ b/decompiler/IR2/FormExpressionAnalysis.cpp @@ -660,7 +660,7 @@ void SimpleExpressionElement::update_from_stack_identity(const Env& env, result->push_back(x); } } else if (arg.is_static_addr()) { - auto lab = env.file->labels.at(arg.label()); + auto& lab = env.file->labels.at(arg.label()); if (env.file->is_string(lab.target_segment, lab.offset)) { auto str = env.file->get_goal_string(lab.target_segment, lab.offset / 4 - 1, false); result->push_back(pool.alloc_element(str)); @@ -698,8 +698,8 @@ void SimpleExpressionElement::update_from_stack_gpr_to_fpr(const Env& env, FormStack& stack, std::vector* result, bool allow_side_effects) { - auto src = m_expr.get_arg(0); - auto src_type = env.get_types_before_op(src.var().idx()).get(src.var().reg()); + auto& src = m_expr.get_arg(0); + auto& src_type = env.get_types_before_op(src.var().idx()).get(src.var().reg()); std::vector src_fes; if (src.is_var()) { auto forms = pop_to_forms({src.var()}, env, pool, stack, allow_side_effects); @@ -731,8 +731,8 @@ void SimpleExpressionElement::update_from_stack_fpr_to_gpr(const Env& env, FormStack& stack, std::vector* result, bool allow_side_effects) { - auto src = m_expr.get_arg(0); - auto src_type = env.get_types_before_op(m_my_idx).get(src.var().reg()); + auto& src = m_expr.get_arg(0); + auto& src_type = env.get_types_before_op(m_my_idx).get(src.var().reg()); if (env.dts->ts.tc(TypeSpec("float"), src_type.typespec()) || src_type.typespec() == TypeSpec("int")) { // set ourself to identity. @@ -784,8 +784,8 @@ void SimpleExpressionElement::update_from_stack_float_2(const Env& env, args.at(0), args.at(1)); result->push_back(new_form); } else { - auto type0 = env.get_types_before_op(m_my_idx).get(m_expr.get_arg(0).var().reg()); - auto type1 = env.get_types_before_op(m_my_idx).get(m_expr.get_arg(1).var().reg()); + auto& type0 = env.get_types_before_op(m_my_idx).get(m_expr.get_arg(0).var().reg()); + auto& type1 = env.get_types_before_op(m_my_idx).get(m_expr.get_arg(1).var().reg()); throw std::runtime_error(fmt::format( "[OP: {}] - Floating point math attempted on invalid types: {} and {} in op {}.", m_my_idx, type0.print(), type1.print(), to_string(env))); @@ -875,8 +875,8 @@ void SimpleExpressionElement::update_from_stack_float_2_nestable(const Env& env, make_and_compact_math_op(args.at(0), args.at(1), {}, {}, pool, env, kind, true, false); result->push_back(new_form); } else { - auto type0 = env.get_types_before_op(m_my_idx).get(m_expr.get_arg(0).var().reg()); - auto type1 = env.get_types_before_op(m_my_idx).get(m_expr.get_arg(1).var().reg()); + auto& type0 = env.get_types_before_op(m_my_idx).get(m_expr.get_arg(0).var().reg()); + auto& type1 = env.get_types_before_op(m_my_idx).get(m_expr.get_arg(1).var().reg()); throw std::runtime_error(fmt::format( "[OP: {}] - Floating point math attempted on invalid types: {} and {} in op {}.", m_my_idx, type0.print(), type1.print(), to_string(env))); @@ -1431,7 +1431,7 @@ void SimpleExpressionElement::update_from_stack_vector_plus_minus_cross( pool, stack, allow_side_effects); for (int i = 0; i < 3; i++) { - auto arg_type = env.get_types_before_op(m_my_idx).get(m_expr.get_arg(i).var().reg()); + auto& arg_type = env.get_types_before_op(m_my_idx).get(m_expr.get_arg(i).var().reg()); if (arg_type.typespec() != TypeSpec("vector")) { popped_args.at(i) = cast_form(popped_args.at(i), TypeSpec("vector"), pool, env); } @@ -1454,7 +1454,7 @@ void SimpleExpressionElement::update_from_stack_vector_float_product( pool, stack, allow_side_effects); for (int i = 0; i < 3; i++) { - auto arg_type = env.get_types_before_op(m_my_idx).get(m_expr.get_arg(i).var().reg()); + auto& arg_type = env.get_types_before_op(m_my_idx).get(m_expr.get_arg(i).var().reg()); TypeSpec desired_type(i == 2 ? "float" : "vector"); if (arg_type.typespec() != desired_type) { popped_args.at(i) = cast_form(popped_args.at(i), desired_type, pool, env); @@ -1477,7 +1477,7 @@ void SimpleExpressionElement::update_from_stack_vector_dot(FixedOperatorKind kin env, pool, stack, allow_side_effects); for (int i = 0; i < 2; i++) { - auto arg_type = env.get_types_before_op(m_my_idx).get(m_expr.get_arg(i).var().reg()); + auto& arg_type = env.get_types_before_op(m_my_idx).get(m_expr.get_arg(i).var().reg()); if (arg_type.typespec() != TypeSpec("vector")) { popped_args.at(i) = cast_form(popped_args.at(i), TypeSpec("vector"), pool, env); } @@ -1820,8 +1820,8 @@ void SimpleExpressionElement::update_from_stack_logor_or_logand(const Env& env, auto handle_mr = match(make_handle_matcher, &hack_form); if (handle_mr.matched) { - auto var_a = handle_mr.maps.regs.at(0).value(); - auto var_b = handle_mr.maps.regs.at(1).value(); + auto& var_a = handle_mr.maps.regs.at(0).value(); + auto& var_b = handle_mr.maps.regs.at(1).value(); if (env.get_variable_name(var_a) == env.get_variable_name(var_b) && env.dts->ts.tc(TypeSpec("pointer", {TypeSpec("process")}), env.get_variable_type(var_a, true))) { @@ -2073,7 +2073,7 @@ void SimpleExpressionElement::update_from_stack_int_to_float(const Env& env, FormStack& stack, std::vector* result, bool allow_side_effects) { - auto var = m_expr.get_arg(0).var(); + auto& var = m_expr.get_arg(0).var(); auto arg = pop_to_forms({var}, env, pool, stack, allow_side_effects).at(0); // if we convert from a GPR to FPR, then immediately to int to float, we can strip away the // the gpr->fpr operation beacuse it doesn't matter. @@ -2099,7 +2099,7 @@ void SimpleExpressionElement::update_from_stack_float_to_int(const Env& env, FormStack& stack, std::vector* result, bool allow_side_effects) { - auto var = m_expr.get_arg(0).var(); + auto& var = m_expr.get_arg(0).var(); auto arg = pop_to_forms({var}, env, pool, stack, allow_side_effects).at(0); auto type = env.get_types_before_op(var.idx()).get(var.reg()).typespec(); if (type == TypeSpec("float")) { @@ -2121,7 +2121,7 @@ void SimpleExpressionElement::update_from_stack_subu_l32_s7(const Env& env, FormStack& stack, std::vector* result, bool allow_side_effects) { - auto var = m_expr.get_arg(0).var(); + auto& var = m_expr.get_arg(0).var(); auto arg = pop_to_forms({var}, env, pool, stack, allow_side_effects).at(0); auto type = env.get_types_before_op(var.idx()).get(var.reg()).typespec(); if (type != TypeSpec("handle")) { @@ -2324,7 +2324,7 @@ void SetVarElement::push_to_stack(const Env& env, FormPool& pool, FormStack& sta m_var_info.is_eliminated_coloring_move = true; } - auto var = src_as_se->expr().get_arg(0).var(); + auto& var = src_as_se->expr().get_arg(0).var(); auto& info = env.reg_use().op.at(var.idx()); if (var.reg() == Register(Reg::GPR, Reg::S6) || info.consumes.find(var.reg()) != info.consumes.end()) { @@ -2891,7 +2891,7 @@ void FunctionCallElement::update_from_stack(const Env& env, first_arg_type = actual_arg_type; } - auto desired_arg_type = function_type.get_arg(arg_id); + auto& desired_arg_type = function_type.get_arg(arg_id); if (env.dts->should_attempt_cast_simplify(desired_arg_type, actual_arg_type)) { arg_forms.push_back(cast_form(val, desired_arg_type, pool, env, env.dts->ts.tc(desired_arg_type, actual_arg_type))); @@ -2937,7 +2937,7 @@ void FunctionCallElement::update_from_stack(const Env& env, {Matcher::any_reg(0), Matcher::any(1)}); auto mr = match(matcher, unstacked.at(0)); if (mr.matched && nargs >= 1) { - auto vtable_reg = mr.maps.regs.at(0); + auto& vtable_reg = mr.maps.regs.at(0); ASSERT(vtable_reg); auto vtable_var_name = env.get_variable_name(*vtable_reg); auto arg0_mr = match(Matcher::any_reg(0), unstacked.at(1)); @@ -2993,7 +2993,7 @@ void FunctionCallElement::update_from_stack(const Env& env, auto temp_form = pool.alloc_single_form(nullptr, new_form); auto match_result = match(matcher, temp_form); if (match_result.matched) { - auto type_1 = match_result.maps.strings.at(type_for_method); + auto& type_1 = match_result.maps.strings.at(type_for_method); auto& name = match_result.maps.strings.at(method_name); if (name == "new" && type_1 == "object") { @@ -3042,7 +3042,7 @@ void FunctionCallElement::update_from_stack(const Env& env, alloc != "loading-level") { throw std::runtime_error("Unrecognized heap symbol for new: " + alloc); } - auto type_2 = match_result.maps.strings.at(type_for_arg); + auto& type_2 = match_result.maps.strings.at(type_for_arg); if (type_1 != type_2) { throw std::runtime_error( fmt::format("Inconsistent types in method call: {} and {}", type_1, type_2)); @@ -3096,7 +3096,7 @@ void FunctionCallElement::update_from_stack(const Env& env, auto temp_form = pool.alloc_single_form(nullptr, new_form); auto match_result = match(matcher, temp_form); if (match_result.matched) { - auto name = match_result.maps.strings.at(method_name); + auto& name = match_result.maps.strings.at(method_name); if (name != "new") { // only do these checks on non-new methods. New methods are treated as functions because // they are never virtual and are never called like a method. @@ -3352,8 +3352,8 @@ Form* try_rewrite_as_process_to_ppointer(CondNoElseElement* value, return nullptr; } - auto body_var = *body_mr.maps.regs.at(0); - auto condition_var = *condition_mr.maps.regs.at(0); + auto& body_var = *body_mr.maps.regs.at(0); + auto& condition_var = *condition_mr.maps.regs.at(0); if (env.get_variable_name(body_var) != env.get_variable_name(condition_var)) { return nullptr; @@ -3406,8 +3406,8 @@ Form* try_rewrite_as_pppointer_to_process(CondNoElseElement* value, return nullptr; } - auto body_var = *body_mr.maps.regs.at(0); - auto condition_var = *condition_mr.maps.regs.at(0); + auto& body_var = *body_mr.maps.regs.at(0); + auto& condition_var = *condition_mr.maps.regs.at(0); if (env.get_variable_name(body_var) != env.get_variable_name(condition_var)) { return nullptr; @@ -3630,7 +3630,7 @@ void CondWithElseElement::push_to_stack(const Env& env, FormPool& pool, FormStac // ASSERT(dest_sets.size() == write_output_forms.size()); if (!dest_sets.empty()) { for (size_t i = 0; i < dest_sets.size() - 1; i++) { - auto var = dest_sets.at(i)->dst(); + auto& var = dest_sets.at(i)->dst(); auto* env2 = const_cast(&env); env2->disable_def(var, env2->func->warnings); } @@ -4471,7 +4471,7 @@ void push_asm_srl_to_stack(const AsmOp* op, auto dst = op->dst(); ASSERT(dst.has_value()); - auto integer_atom = op->instruction().get_src(1); + auto& integer_atom = op->instruction().get_src(1); ASSERT(integer_atom.is_imm()); auto integer = integer_atom.get_imm(); @@ -4780,8 +4780,8 @@ void BranchElement::push_to_stack(const Env& env, FormPool& pool, FormStack& sta branch_delay = nullptr; } break; case IR2_BranchDelay::Kind::SET_REG_REG: { - auto src = m_op->branch_delay().var(1); - auto dst = m_op->branch_delay().var(0); + auto& src = m_op->branch_delay().var(1); + auto& dst = m_op->branch_delay().var(0); auto src_form = pool.alloc_single_element_form(nullptr, SimpleAtom::make_var(src)); @@ -4790,7 +4790,7 @@ void BranchElement::push_to_stack(const Env& env, FormPool& pool, FormStack& sta nullptr, dst, src_form, true, env.get_variable_type(src, true)); } break; case IR2_BranchDelay::Kind::SET_REG_FALSE: { - auto dst = m_op->branch_delay().var(0); + auto& dst = m_op->branch_delay().var(0); auto src_form = pool.alloc_single_element_form( nullptr, SimpleAtom::make_sym_val("#f")); @@ -4798,7 +4798,7 @@ void BranchElement::push_to_stack(const Env& env, FormPool& pool, FormStack& sta TypeSpec("symbol")); } break; case IR2_BranchDelay::Kind::SET_REG_TRUE: { - auto dst = m_op->branch_delay().var(0); + auto& dst = m_op->branch_delay().var(0); auto src_form = pool.alloc_single_element_form( nullptr, SimpleAtom::make_sym_val("#t")); @@ -4851,8 +4851,8 @@ void DynamicMethodAccess::update_from_stack(const Env& env, new_val->to_string(env)); } - auto idx = match_result.maps.regs.at(0); - auto base = match_result.maps.regs.at(1); + auto& idx = match_result.maps.regs.at(0); + auto& base = match_result.maps.regs.at(1); ASSERT(idx.has_value() && base.has_value()); auto deref = pool.alloc_element( diff --git a/decompiler/analysis/find_defstates.cpp b/decompiler/analysis/find_defstates.cpp index 0021e1b71e..dfb637cc48 100644 --- a/decompiler/analysis/find_defstates.cpp +++ b/decompiler/analysis/find_defstates.cpp @@ -93,8 +93,8 @@ std::vector get_defstate_entries( temp.to_string(env)); } - auto var = mr.maps.regs.at(0); - auto name = mr.maps.strings.at(1); + auto& var = mr.maps.regs.at(0); + auto& name = mr.maps.strings.at(1); auto val = mr.maps.forms.at(2); auto handler_kind = handler_name_to_kind(name); @@ -229,12 +229,12 @@ std::string verify_empty_state_and_get_name(DecompiledDataElement* state, const int start_word_idx = (lab.offset / 4) - 1; auto& words = env.file->words_by_seg.at(lab.target_segment); - auto first_word = words.at(start_word_idx); + auto& first_word = words.at(start_word_idx); if (first_word.kind() != LinkedWord::TYPE_PTR || first_word.symbol_name() != "state") { env.func->warnings.warn_and_throw("Reference to state bad: invalid type pointer"); } - auto name_word = words.at(start_word_idx + 1); + auto& name_word = words.at(start_word_idx + 1); if (name_word.kind() != LinkedWord::SYM_PTR) { env.func->warnings.warn_and_throw("Reference to state bad: invalid name"); } @@ -286,7 +286,7 @@ FormElement* rewrite_virtual_defstate( body_idx++; // expect this to match the variable in the top let - auto state_var = *inherit_mr.maps.regs.at(0); + auto& state_var = *inherit_mr.maps.regs.at(0); // this expression should be the thing we inherit from. auto parent_state = inherit_mr.maps.forms.at(1); @@ -339,7 +339,7 @@ FormElement* rewrite_virtual_defstate( } // the actual type that gets this as a state - auto type_name = mset_mr.maps.strings.at(0); + auto& type_name = mset_mr.maps.strings.at(0); auto method_id = mset_mr.maps.ints.at(1); // should be the state again.