Skip to content

Commit b4f6bd7

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 7184560 commit b4f6bd7

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
@@ -679,19 +684,31 @@ void goto_symext::try_filter_value_sets(
679684

680685
if(value_set_for_true_case && modified_condition.is_false())
681686
{
682-
value_sett::entryt *entry = const_cast<value_sett::entryt *>(
683-
value_set_for_true_case->get_entry_for_symbol(
684-
symbol_expr->get_identifier(), symbol_type, "", ns));
685-
value_set_for_true_case->erase_value_from_entry(
686-
*entry, value_set_element);
687+
delete_from_value_set_for_true_case.emplace_back(value_set_element);
687688
}
688689
else if(value_set_for_false_case && modified_condition.is_true())
689690
{
690-
value_sett::entryt *entry = const_cast<value_sett::entryt *>(
691-
value_set_for_false_case->get_entry_for_symbol(
692-
symbol_expr->get_identifier(), symbol_type, "", ns));
693-
value_set_for_false_case->erase_value_from_entry(
694-
*entry, value_set_element);
691+
delete_from_value_set_for_false_case.emplace_back(value_set_element);
692+
}
693+
}
694+
if(value_set_for_true_case && !delete_from_value_set_for_true_case.empty())
695+
{
696+
value_sett::entryt *entry = const_cast<value_sett::entryt *>(
697+
value_set_for_true_case->get_entry_for_symbol(
698+
symbol_expr->get_identifier(), symbol_type, "", ns));
699+
for(const exprt &value_to_erase : delete_from_value_set_for_true_case)
700+
{
701+
value_set_for_true_case->erase_value_from_entry(*entry, value_to_erase);
702+
}
703+
}
704+
if(value_set_for_false_case && !delete_from_value_set_for_false_case.empty())
705+
{
706+
value_sett::entryt *entry = const_cast<value_sett::entryt *>(
707+
value_set_for_false_case->get_entry_for_symbol(
708+
symbol_expr->get_identifier(), symbol_type, "", ns));
709+
for(const exprt &value_to_erase : delete_from_value_set_for_false_case)
710+
{
711+
value_set_for_false_case->erase_value_from_entry(*entry, value_to_erase);
695712
}
696713
}
697714
}

0 commit comments

Comments
 (0)