Skip to content

Commit 5eaa3d7

Browse files
Merge pull request diffblue#274 from diffblue/fixes/dependence-graph-vs-call-control-dependencies
Unconditional control dependency fix
2 parents a64f087 + 5fce63c commit 5eaa3d7

File tree

3 files changed

+48
-8
lines changed

3 files changed

+48
-8
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
CORE
2+
../dependence-graph15/main.c
3+
--show --dependence-graph-vs
4+
activate-multi-line-match
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
Control dependencies: [0-9]+ \[UNCONDITIONAL\]\n(.*\n){2,3}.*g_out2 = t1;
8+
Control dependencies: [0-9]+ \[TRUE\]\n(.*\n){2,3}.*g_out1 = t2;
9+
Control dependencies: [0-9]+ \[FALSE\]\n(.*\n){2,3}.*g_out1 = 0;
10+
--
11+
^warning: ignoring

src/analyses/variable-sensitivity/variable_sensitivity_dependence_graph.cpp

+31-7
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,18 @@ void variable_sensitivity_dependence_domaint::transform(
9797
if(s->merge_control_dependencies(
9898
control_deps,
9999
control_dep_candidates,
100-
control_dep_calls))
100+
control_dep_calls,
101+
control_dep_call_candidates))
101102
s->has_changed=true;
102103

103104
control_deps.clear();
104105
control_dep_candidates.clear();
105106

106107
control_dep_calls.clear();
107108
control_dep_calls.insert(from);
109+
110+
control_dep_call_candidates.clear();
111+
control_dep_call_candidates.insert(from);
108112
}
109113
}
110114
else
@@ -161,19 +165,19 @@ void variable_sensitivity_dependence_domaint::control_dependencies(
161165

162166
// Add new candidates
163167

168+
PRECONDITION(!control_dep_call_candidates.empty());
169+
164170
if(from->is_goto() || from->is_assume())
165171
control_dep_candidates.insert(from);
166172
else if(from->is_end_function())
167173
{
168174
control_deps.clear();
169175
control_dep_candidates.clear();
170176
control_dep_calls.clear();
177+
control_dep_call_candidates.clear();
171178
return;
172179
}
173180

174-
if(control_dep_candidates.empty())
175-
return;
176-
177181
// Compute postdominators if needed
178182

179183
const goto_functionst &goto_functions=dep_graph.goto_functions;
@@ -242,10 +246,18 @@ void variable_sensitivity_dependence_domaint::control_dependencies(
242246
}
243247

244248
control_deps.insert(std::make_pair(cd, branch));
245-
control_dep_calls.clear();
246249
}
247250
}
248251

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+
249261
// add edges to the graph
250262
for(const auto &c_dep : control_deps)
251263
dep_graph.add_dep(vs_dep_edget::kindt::CTRL, c_dep.first, to);
@@ -254,7 +266,8 @@ void variable_sensitivity_dependence_domaint::control_dependencies(
254266
bool variable_sensitivity_dependence_domaint::merge_control_dependencies(
255267
const control_depst &other_control_deps,
256268
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)
258271
{
259272
bool changed=false;
260273

@@ -313,6 +326,16 @@ bool variable_sensitivity_dependence_domaint::merge_control_dependencies(
313326

314327
changed|=n!=control_dep_calls.size();
315328

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+
316339
return changed;
317340
}
318341

@@ -351,7 +374,8 @@ bool variable_sensitivity_dependence_domaint::merge(
351374
changed |= merge_control_dependencies(
352375
cast_b.control_deps,
353376
cast_b.control_dep_candidates,
354-
cast_b.control_dep_calls);
377+
cast_b.control_dep_calls,
378+
cast_b.control_dep_call_candidates);
355379

356380
has_changed=false;
357381
has_values=tvt::unknown();

src/analyses/variable-sensitivity/variable_sensitivity_dependence_graph.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#include <analyses/cfg_dominators.h>
1414
#include <util/graph.h>
15+
#include <util/container_utils.h>
1516

1617
#include <ostream>
1718

@@ -83,6 +84,7 @@ class variable_sensitivity_dependence_domaint:
8384
control_deps.clear();
8485
control_dep_candidates.clear();
8586
control_dep_calls.clear();
87+
control_dep_call_candidates.clear();
8688
}
8789

8890
virtual void make_top() override
@@ -94,6 +96,7 @@ class variable_sensitivity_dependence_domaint:
9496
control_deps.clear();
9597
control_dep_candidates.clear();
9698
control_dep_calls.clear();
99+
control_dep_call_candidates.clear();
97100
}
98101

99102
virtual void make_entry() override
@@ -179,6 +182,7 @@ class variable_sensitivity_dependence_domaint:
179182

180183
typedef std::set<goto_programt::const_targett> control_dep_callst;
181184
control_dep_callst control_dep_calls;
185+
control_dep_callst control_dep_call_candidates;
182186

183187
void eval_data_deps(
184188
const exprt &expr, const namespacet &ns, data_depst &deps) const;
@@ -197,7 +201,8 @@ class variable_sensitivity_dependence_domaint:
197201
bool merge_control_dependencies(
198202
const control_depst &other_control_deps,
199203
const control_dep_candidatest &other_control_dep_candidates,
200-
const control_dep_callst &other_control_dep_calls);
204+
const control_dep_callst &other_control_dep_calls,
205+
const control_dep_callst &other_control_dep_call_candidates);
201206
};
202207

203208
class variable_sensitivity_dependence_grapht:

0 commit comments

Comments
 (0)