@@ -639,6 +639,11 @@ void goto_symext::try_filter_value_sets(
639
639
value_setst::valuest value_set_elements;
640
640
state.value_set .get_value_set (*symbol_expr, value_set_elements, ns);
641
641
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
+
642
647
// Try evaluating the condition with the symbol replaced by a pointer to each
643
648
// one of its possible values in turn. If that leads to a true for some
644
649
// 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(
677
682
678
683
if (value_set_for_true_case && modified_condition.is_false ())
679
684
{
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 (value_set_element);
685
686
}
686
687
else if (value_set_for_false_case && modified_condition.is_true ())
687
688
{
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 (value_set_element);
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);
693
710
}
694
711
}
695
712
}
0 commit comments