@@ -70,25 +70,6 @@ void variable_sensitivity_dependence_domaint::transform(
7070 dynamic_cast <variable_sensitivity_dependence_grapht*>(&ai);
7171 assert (dep_graph!=nullptr );
7272
73- // We do not propagate control dependencies on function calls, i.e., only the
74- // entry point of a function should have a control dependency on the call
75- if (!control_deps.empty ())
76- {
77- const goto_programt::const_targett &dep = control_deps.begin ()->first ;
78- if (dep->is_function_call ())
79- {
80- INVARIANT (
81- std::all_of (
82- std::next (control_deps.begin ()),
83- control_deps.end (),
84- [](const std::pair<const goto_programt::const_targett, tvt> &d)
85- { return d.first ->is_function_call (); }),
86- " All entries must be function calls" );
87-
88- control_deps.clear ();
89- }
90- }
91-
9273 // propagate control dependencies across function calls
9374 if (from->is_function_call ())
9475 {
@@ -115,13 +96,15 @@ void variable_sensitivity_dependence_domaint::transform(
11596 // modify abstract state of return location
11697 if (s->merge_control_dependencies (
11798 control_deps,
118- control_dep_candidates))
99+ control_dep_candidates,
100+ control_dep_calls))
119101 s->has_changed =true ;
120102
121103 control_deps.clear ();
122- control_deps.insert (std::make_pair (from, tvt::unknown ()));
123-
124104 control_dep_candidates.clear ();
105+
106+ control_dep_calls.clear ();
107+ control_dep_calls.insert (from);
125108 }
126109 }
127110 else
@@ -178,7 +161,9 @@ void variable_sensitivity_dependence_domaint::control_dependencies(
178161 control_dep_candidates.insert (from);
179162 else if (from->is_end_function ())
180163 {
164+ control_deps.clear ();
181165 control_dep_candidates.clear ();
166+ control_dep_calls.clear ();
182167 return ;
183168 }
184169
@@ -253,6 +238,7 @@ void variable_sensitivity_dependence_domaint::control_dependencies(
253238 }
254239
255240 control_deps.insert (std::make_pair (cd, branch));
241+ control_dep_calls.clear ();
256242 }
257243 }
258244
@@ -263,7 +249,8 @@ void variable_sensitivity_dependence_domaint::control_dependencies(
263249
264250bool variable_sensitivity_dependence_domaint::merge_control_dependencies (
265251 const control_depst &other_control_deps,
266- const control_dep_candidatest &other_control_dep_candidates)
252+ const control_dep_candidatest &other_control_dep_candidates,
253+ const control_dep_callst &other_control_dep_calls)
267254{
268255 bool changed=false ;
269256
@@ -312,6 +299,16 @@ bool variable_sensitivity_dependence_domaint::merge_control_dependencies(
312299
313300 changed|=n!=control_dep_candidates.size ();
314301
302+ // Merge call control dependencies
303+
304+ n=control_dep_calls.size ();
305+
306+ control_dep_calls.insert (
307+ other_control_dep_calls.begin (),
308+ other_control_dep_calls.end ());
309+
310+ changed|=n!=control_dep_calls.size ();
311+
315312 return changed;
316313}
317314
@@ -349,7 +346,8 @@ bool variable_sensitivity_dependence_domaint::merge(
349346
350347 changed |= merge_control_dependencies (
351348 cast_b.control_deps ,
352- cast_b.control_dep_candidates );
349+ cast_b.control_dep_candidates ,
350+ cast_b.control_dep_calls );
353351
354352 has_changed=false ;
355353 has_values=tvt::unknown ();
@@ -398,7 +396,7 @@ void variable_sensitivity_dependence_domaint::output(
398396 const ai_baset &ai,
399397 const namespacet &ns) const
400398{
401- if (!control_deps.empty ())
399+ if (!control_deps.empty () || !control_dep_calls. empty () )
402400 {
403401 out << " Control dependencies: " ;
404402 for (control_depst::const_iterator
@@ -414,6 +412,18 @@ void variable_sensitivity_dependence_domaint::output(
414412
415413 out << cd->location_number << " [" << branch << " ]" ;
416414 }
415+
416+ for (control_dep_callst::const_iterator
417+ it=control_dep_calls.begin ();
418+ it!=control_dep_calls.end ();
419+ ++it)
420+ {
421+ if (!control_deps.empty () || it!=control_dep_calls.begin ())
422+ out << " ," ;
423+
424+ out << (*it)->location_number << " [UNCONDITIONAL]" ;
425+ }
426+
417427 out << " \n " ;
418428 }
419429
@@ -473,6 +483,16 @@ jsont variable_sensitivity_dependence_domaint::output_json(
473483 link[" branch" ]=json_stringt (branch.to_string ());
474484 }
475485
486+ for (const auto &target : control_dep_calls)
487+ {
488+ json_objectt &link=graph.push_back ().make_object ();
489+ link[" locationNumber" ]=
490+ json_numbert (std::to_string (target->location_number ));
491+ link[" sourceLocation" ]=json (target->source_location );
492+ link[" type" ]=json_stringt (" control" );
493+ link[" branch" ]=json_stringt (" UNCONDITIONAL" );
494+ }
495+
476496 for (const auto &dep : domain_data_deps)
477497 {
478498 json_objectt &link=graph.push_back ().make_object ();
@@ -503,6 +523,9 @@ void variable_sensitivity_dependence_domaint::populate_dep_graph(
503523 for (const auto &c_dep : control_deps)
504524 dep_graph.add_dep (vs_dep_edget::kindt::CTRL, c_dep.first , this_loc);
505525
526+ for (const auto &c_dep : control_dep_calls)
527+ dep_graph.add_dep (vs_dep_edget::kindt::CTRL, c_dep, this_loc);
528+
506529 for (const auto &d_dep : domain_data_deps)
507530 dep_graph.add_dep (vs_dep_edget::kindt::DATA, d_dep.first , this_loc);
508531}
0 commit comments