@@ -97,14 +97,18 @@ void variable_sensitivity_dependence_domaint::transform(
97
97
if (s->merge_control_dependencies (
98
98
control_deps,
99
99
control_dep_candidates,
100
- control_dep_calls))
100
+ control_dep_calls,
101
+ control_dep_call_candidates))
101
102
s->has_changed =true ;
102
103
103
104
control_deps.clear ();
104
105
control_dep_candidates.clear ();
105
106
106
107
control_dep_calls.clear ();
107
108
control_dep_calls.insert (from);
109
+
110
+ control_dep_call_candidates.clear ();
111
+ control_dep_call_candidates.insert (from);
108
112
}
109
113
}
110
114
else
@@ -161,19 +165,19 @@ void variable_sensitivity_dependence_domaint::control_dependencies(
161
165
162
166
// Add new candidates
163
167
168
+ PRECONDITION (!control_dep_call_candidates.empty ());
169
+
164
170
if (from->is_goto () || from->is_assume ())
165
171
control_dep_candidates.insert (from);
166
172
else if (from->is_end_function ())
167
173
{
168
174
control_deps.clear ();
169
175
control_dep_candidates.clear ();
170
176
control_dep_calls.clear ();
177
+ control_dep_call_candidates.clear ();
171
178
return ;
172
179
}
173
180
174
- if (control_dep_candidates.empty ())
175
- return ;
176
-
177
181
// Compute postdominators if needed
178
182
179
183
const goto_functionst &goto_functions=dep_graph.goto_functions ;
@@ -242,10 +246,18 @@ void variable_sensitivity_dependence_domaint::control_dependencies(
242
246
}
243
247
244
248
control_deps.insert (std::make_pair (cd, branch));
245
- control_dep_calls.clear ();
246
249
}
247
250
}
248
251
252
+ if (control_deps.empty ())
253
+ {
254
+ util_inplace_set_union (control_dep_calls, control_dep_call_candidates);
255
+ }
256
+ else
257
+ {
258
+ control_dep_calls.clear ();
259
+ }
260
+
249
261
// add edges to the graph
250
262
for (const auto &c_dep : control_deps)
251
263
dep_graph.add_dep (vs_dep_edget::kindt::CTRL, c_dep.first , to);
@@ -254,7 +266,8 @@ void variable_sensitivity_dependence_domaint::control_dependencies(
254
266
bool variable_sensitivity_dependence_domaint::merge_control_dependencies (
255
267
const control_depst &other_control_deps,
256
268
const control_dep_candidatest &other_control_dep_candidates,
257
- const control_dep_callst &other_control_dep_calls)
269
+ const control_dep_callst &other_control_dep_calls,
270
+ const control_dep_callst &other_control_dep_call_candidates)
258
271
{
259
272
bool changed=false ;
260
273
@@ -313,6 +326,16 @@ bool variable_sensitivity_dependence_domaint::merge_control_dependencies(
313
326
314
327
changed|=n!=control_dep_calls.size ();
315
328
329
+ // Merge call control dependency candidates
330
+
331
+ n=control_dep_call_candidates.size ();
332
+
333
+ control_dep_call_candidates.insert (
334
+ other_control_dep_call_candidates.begin (),
335
+ other_control_dep_call_candidates.end ());
336
+
337
+ changed|=n!=control_dep_call_candidates.size ();
338
+
316
339
return changed;
317
340
}
318
341
@@ -351,7 +374,8 @@ bool variable_sensitivity_dependence_domaint::merge(
351
374
changed |= merge_control_dependencies (
352
375
cast_b.control_deps ,
353
376
cast_b.control_dep_candidates ,
354
- cast_b.control_dep_calls );
377
+ cast_b.control_dep_calls ,
378
+ cast_b.control_dep_call_candidates );
355
379
356
380
has_changed=false ;
357
381
has_values=tvt::unknown ();
0 commit comments