@@ -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
@@ -679,19 +684,31 @@ void goto_symext::try_filter_value_sets(
679
684
680
685
if (value_set_for_true_case && modified_condition.is_false ())
681
686
{
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);
687
688
}
688
689
else if (value_set_for_false_case && modified_condition.is_true ())
689
690
{
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);
695
712
}
696
713
}
697
714
}
0 commit comments