Skip to content

Commit b8569f5

Browse files
author
Owen
committed
Try to speed up try_filter_value_sets
Store a vector of expressions to erase from each entry, so we only have to get each entry once (and only do that if we actually have anything to erase).
1 parent c5e528d commit b8569f5

File tree

1 file changed

+27
-10
lines changed

1 file changed

+27
-10
lines changed

src/goto-symex/symex_main.cpp

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,11 @@ void goto_symext::try_filter_value_sets(
639639
value_setst::valuest value_set_elements;
640640
state.value_set.get_value_set(*symbol_expr, value_set_elements, ns);
641641

642+
std::vector<exprt> delete_from_value_set_for_true_case;
643+
std::vector<exprt> delete_from_value_set_for_false_case;
644+
delete_from_value_set_for_true_case.reserve(value_set_elements.size());
645+
delete_from_value_set_for_false_case.reserve(value_set_elements.size());
646+
642647
// Try evaluating the condition with the symbol replaced by a pointer to each
643648
// one of its possible values in turn. If that leads to a true for some
644649
// value_set_element then we can delete it from the value set that will be
@@ -677,19 +682,31 @@ void goto_symext::try_filter_value_sets(
677682

678683
if(value_set_for_true_case && modified_condition.is_false())
679684
{
680-
value_sett::entryt *entry = const_cast<value_sett::entryt *>(
681-
value_set_for_true_case->get_entry_for_symbol(
682-
symbol_expr->get_identifier(), symbol_type, "", ns));
683-
value_set_for_true_case->erase_value_from_entry(
684-
*entry, value_set_element);
685+
delete_from_value_set_for_true_case.emplace_back(*possible_value);
685686
}
686687
else if(value_set_for_false_case && modified_condition.is_true())
687688
{
688-
value_sett::entryt *entry = const_cast<value_sett::entryt *>(
689-
value_set_for_false_case->get_entry_for_symbol(
690-
symbol_expr->get_identifier(), symbol_type, "", ns));
691-
value_set_for_false_case->erase_value_from_entry(
692-
*entry, value_set_element);
689+
delete_from_value_set_for_false_case.emplace_back(*possible_value);
690+
}
691+
}
692+
if(value_set_for_true_case && !delete_from_value_set_for_true_case.empty())
693+
{
694+
value_sett::entryt *entry = const_cast<value_sett::entryt *>(
695+
value_set_for_true_case->get_entry_for_symbol(
696+
symbol_expr->get_identifier(), symbol_type, "", ns));
697+
for(const exprt &value_to_erase : delete_from_value_set_for_true_case)
698+
{
699+
value_set_for_true_case->erase_value_from_entry(*entry, value_to_erase);
700+
}
701+
}
702+
if(value_set_for_false_case && !delete_from_value_set_for_false_case.empty())
703+
{
704+
value_sett::entryt *entry = const_cast<value_sett::entryt *>(
705+
value_set_for_false_case->get_entry_for_symbol(
706+
symbol_expr->get_identifier(), symbol_type, "", ns));
707+
for(const exprt &value_to_erase : delete_from_value_set_for_false_case)
708+
{
709+
value_set_for_false_case->erase_value_from_entry(*entry, value_to_erase);
693710
}
694711
}
695712
}

0 commit comments

Comments
 (0)