From a2bfa6346a4b4cabfd6acb69e5315ff8b7f86a21 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Fri, 5 Jun 2020 14:15:56 -0400 Subject: [PATCH 204/315] FIXME: implement constraint_manager2::merge; fix selftest::test_constraint_merging --- gcc/analyzer/constraint-manager2.cc | 31 ++++++----------------------- gcc/analyzer/region-model2.cc | 7 ------- 2 files changed, 6 insertions(+), 32 deletions(-) diff --git a/gcc/analyzer/constraint-manager2.cc b/gcc/analyzer/constraint-manager2.cc index 80cc79802f9..83a2f5aeeec 100644 --- a/gcc/analyzer/constraint-manager2.cc +++ b/gcc/analyzer/constraint-manager2.cc @@ -1368,35 +1368,16 @@ constraint_manager2::merge (const constraint_manager2 &cm_a, constraint_manager2 *out/*, const model_merger &merger*/) { - // TODO - // gcc_unreachable (); -#if 0 - gcc_assert (merger.m_sval_mapping); - - /* Map svalue2_ids in each equiv class from both sources - to the merged region_model2, dropping ids that don't survive merger, - and potentially creating svalue2s in *OUT for constants. */ - cleaned_constraint_manager2 cleaned_cm_a (out); - const one_way_svalue2_id_map &map_a_to_m - = merger.m_sval_mapping->m_map_from_a_to_m; - clean_merger_input (cm_a, map_a_to_m, &cleaned_cm_a); - - cleaned_constraint_manager2 cleaned_cm_b (out); - const one_way_svalue2_id_map &map_b_to_m - = merger.m_sval_mapping->m_map_from_b_to_m; - clean_merger_input (cm_b, map_b_to_m, &cleaned_cm_b); - - /* At this point, the two cleaned CMs have ECs and constraints referring - to svalue2s in the merged region model, but both of them have separate - ECs. */ + /* FIXME: work with a copy, since eval_condition can mutate a cm. */ + constraint_manager2 copy_cm_a (cm_a); + constraint_manager2 copy_cm_b (cm_b); /* Merge the equivalence classes and constraints. The easiest way to do this seems to be to enumerate all of the facts - in cleaned_cm_a, see which are also true in cleaned_cm_b, + in cm_a, see which are also true in cm_b, and add those to *OUT. */ - merger_fact_visitor v (&cleaned_cm_b, out); - cleaned_cm_a.for_each_fact (&v); -#endif + merger2_fact_visitor v (©_cm_b, out); + copy_cm_a.for_each_fact (&v); } /* A subroutine of constraint_manager2::merge. diff --git a/gcc/analyzer/region-model2.cc b/gcc/analyzer/region-model2.cc index eaf879c6052..90febfce222 100644 --- a/gcc/analyzer/region-model2.cc +++ b/gcc/analyzer/region-model2.cc @@ -9629,18 +9629,12 @@ test_constraint_merging () /* model0: 0 <= (x == y) < n. */ region_model2 model0 (&mgr); - // FIXME: uses "set_to_new_unknown_value" -#if 0 - model0.set_to_new_unknown_value (model0.get_lvalue (x, &ctxt), - integer_type_node, &ctxt); model0.add_constraint (x, EQ_EXPR, y, &ctxt); model0.add_constraint (x, GE_EXPR, int_0, NULL); model0.add_constraint (x, LT_EXPR, n, NULL); /* model1: z != 5 && (0 <= x < n). */ region_model2 model1 (&mgr); - model1.set_to_new_unknown_value (model1.get_lvalue (x, &ctxt), - integer_type_node, &ctxt); model1.add_constraint (z, NE_EXPR, int_5, NULL); model1.add_constraint (x, GE_EXPR, int_0, NULL); model1.add_constraint (x, LT_EXPR, n, NULL); @@ -9659,7 +9653,6 @@ test_constraint_merging () tristate (tristate::TS_UNKNOWN)); ASSERT_EQ (merged.eval_condition (x, LT_EXPR, y, &ctxt), tristate (tristate::TS_UNKNOWN)); -#endif } #if 0 -- 2.26.2