diff --git a/src/goto-symex/goto_symex_state.cpp b/src/goto-symex/goto_symex_state.cpp index e64dc11c6d7..69b1151cba2 100644 --- a/src/goto-symex/goto_symex_state.cpp +++ b/src/goto-symex/goto_symex_state.cpp @@ -156,6 +156,27 @@ class goto_symex_is_constantt : public is_constantt } }; +template <> +renamedt +goto_symex_statet::set_indices(ssa_exprt ssa_expr, const namespacet &ns) +{ + return level0(std::move(ssa_expr), ns, source.thread_nr); +} + +template <> +renamedt +goto_symex_statet::set_indices(ssa_exprt ssa_expr, const namespacet &ns) +{ + return level1(level0(std::move(ssa_expr), ns, source.thread_nr)); +} + +template <> +renamedt +goto_symex_statet::set_indices(ssa_exprt ssa_expr, const namespacet &ns) +{ + return level2(level1(level0(std::move(ssa_expr), ns, source.thread_nr))); +} + void goto_symex_statet::assignment( ssa_exprt &lhs, // L0/L1 const exprt &rhs, // L2 @@ -188,7 +209,7 @@ void goto_symex_statet::assignment( const auto level2_it = level2.current_names.emplace(l1_identifier, std::make_pair(lhs, 0)).first; symex_renaming_levelt::increase_counter(level2_it); - lhs = set_l2_indices(std::move(lhs), ns).get(); + lhs = set_indices(std::move(lhs), ns).get(); // in case we happen to be multi-threaded, record the memory access bool is_shared=l2_thread_write_encoding(lhs, ns); @@ -235,37 +256,13 @@ void goto_symex_statet::assignment( #endif } -renamedt -goto_symex_statet::set_l0_indices(ssa_exprt ssa_expr, const namespacet &ns) -{ - return level0(std::move(ssa_expr), ns, source.thread_nr); -} - -renamedt -goto_symex_statet::set_l1_indices(ssa_exprt ssa_expr, const namespacet &ns) -{ - return level1(level0(std::move(ssa_expr), ns, source.thread_nr)); -} - -renamedt -goto_symex_statet::set_l2_indices(ssa_exprt ssa_expr, const namespacet &ns) -{ - return level2(level1(level0(std::move(ssa_expr), ns, source.thread_nr))); -} - template ssa_exprt goto_symex_statet::rename_ssa(ssa_exprt ssa, const namespacet &ns) { static_assert( level == L0 || level == L1, "rename_ssa can only be used for levels L0 and L1"); - if(level == L0) - ssa = set_l0_indices(std::move(ssa), ns).get(); - else if(level == L1) - ssa = set_l1_indices(std::move(ssa), ns).get(); - else - UNREACHABLE; - + ssa = set_indices(std::move(ssa), ns).get(); rename(ssa.type(), ssa.get_identifier(), ns); ssa.update_type(); return ssa; @@ -297,7 +294,7 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns) } else if(level==L2) { - ssa = set_l1_indices(std::move(ssa), ns).get(); + ssa = set_indices(std::move(ssa), ns).get(); rename(expr.type(), ssa.get_identifier(), ns); ssa.update_type(); @@ -318,7 +315,7 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns) if(p_it != propagation.end()) expr=p_it->second; // already L2 else - ssa = set_l2_indices(std::move(ssa), ns).get(); + ssa = set_indices(std::move(ssa), ns).get(); } } } @@ -432,7 +429,7 @@ bool goto_symex_statet::l2_thread_read_encoding( if(!no_write.op().is_false()) cond |= guardt{no_write.op()}; - const renamedt l2_true_case = set_l2_indices(ssa_l1, ns); + const renamedt l2_true_case = set_indices(ssa_l1, ns); if(a_s_read.second.empty()) { @@ -442,7 +439,7 @@ bool goto_symex_statet::l2_thread_read_encoding( symex_renaming_levelt::increase_counter(level2_it); a_s_read.first=level2.current_count(l1_identifier); } - const renamedt l2_false_case = set_l2_indices(ssa_l1, ns); + const renamedt l2_false_case = set_indices(ssa_l1, ns); exprt tmp; if(cond.is_false()) @@ -464,7 +461,7 @@ bool goto_symex_statet::l2_thread_read_encoding( source, symex_targett::assignment_typet::PHI); - expr = set_l2_indices(std::move(ssa_l1), ns).get(); + expr = set_indices(std::move(ssa_l1), ns).get(); a_s_read.second.push_back(guard); if(!no_write.op().is_false()) @@ -480,13 +477,13 @@ bool goto_symex_statet::l2_thread_read_encoding( // No event and no fresh index, but avoid constant propagation if(!record_events) { - expr = set_l2_indices(std::move(ssa_l1), ns).get(); + expr = set_indices(std::move(ssa_l1), ns).get(); return true; } // produce a fresh L2 name symex_renaming_levelt::increase_counter(level2_it); - expr = set_l2_indices(std::move(ssa_l1), ns).get(); + expr = set_indices(std::move(ssa_l1), ns).get(); // and record that INVARIANT_STRUCTURED( @@ -543,7 +540,7 @@ void goto_symex_statet::rename_address(exprt &expr, const namespacet &ns) ssa_exprt &ssa=to_ssa_expr(expr); // only do L1! - ssa = set_l1_indices(std::move(ssa), ns).get(); + ssa = set_indices(std::move(ssa), ns).get(); rename(expr.type(), ssa.get_identifier(), ns); ssa.update_type(); diff --git a/src/goto-symex/goto_symex_state.h b/src/goto-symex/goto_symex_state.h index 3b6bf032252..044479cff71 100644 --- a/src/goto-symex/goto_symex_state.h +++ b/src/goto-symex/goto_symex_state.h @@ -113,14 +113,9 @@ class goto_symex_statet final : public goto_statet template void rename_address(exprt &expr, const namespacet &ns); - /// Update level 0 values. - renamedt set_l0_indices(ssa_exprt expr, const namespacet &ns); - - /// Update level 0 and 1 values. - renamedt set_l1_indices(ssa_exprt expr, const namespacet &ns); - - /// Update level 0, 1 and 2 values. - renamedt set_l2_indices(ssa_exprt expr, const namespacet &ns); + /// Update values up to \c level. + template + renamedt set_indices(ssa_exprt expr, const namespacet &ns); // this maps L1 names to (L2) types typedef std::unordered_map l1_typest;