Skip to content

Commit 634c11c

Browse files
Merge pull request diffblue#271 from danpoe/fixes/dependence-graph-call-control-dependencies
Unconditional control dependency fix
2 parents d9fa340 + 0b034b5 commit 634c11c

File tree

4 files changed

+71
-8
lines changed

4 files changed

+71
-8
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
int f2(int, const int*);
2+
extern const int g_map[];
3+
4+
int g_out1;
5+
int g_out2;
6+
7+
extern int g_in;
8+
9+
void main(void)
10+
{
11+
int t1;
12+
int t2;
13+
14+
t1 = g_in;
15+
t2 = f2(t1, g_map);
16+
17+
if (t2 >= 0)
18+
g_out1 = t2;
19+
else
20+
g_out1 = 0;
21+
22+
g_out2 = t1;
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
CORE
2+
main.c
3+
--show --dependence-graph
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/dependence_graph.cpp

+31-7
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ bool dep_graph_domaint::merge(
4545
changed|=merge_control_dependencies(
4646
src.control_deps,
4747
src.control_dep_candidates,
48-
src.control_dep_calls);
48+
src.control_dep_calls,
49+
src.control_dep_call_candidates);
4950

5051
has_changed=false;
5152
has_values=tvt::unknown();
@@ -71,19 +72,19 @@ void dep_graph_domaint::control_dependencies(
7172

7273
// Add new candidates
7374

75+
PRECONDITION(!control_dep_call_candidates.empty());
76+
7477
if(from->is_goto() || from->is_assume())
7578
control_dep_candidates.insert(from);
7679
else if(from->is_end_function())
7780
{
7881
control_deps.clear();
7982
control_dep_candidates.clear();
8083
control_dep_calls.clear();
84+
control_dep_call_candidates.clear();
8185
return;
8286
}
8387

84-
if(control_dep_candidates.empty())
85-
return;
86-
8788
// Compute postdominators if needed
8889

8990
const goto_functionst &goto_functions=dep_graph.goto_functions;
@@ -152,10 +153,18 @@ void dep_graph_domaint::control_dependencies(
152153
}
153154

154155
control_deps.insert(std::make_pair(cd, branch));
155-
control_dep_calls.clear();
156156
}
157157
}
158158

159+
if(control_deps.empty())
160+
{
161+
util_inplace_set_union(control_dep_calls, control_dep_call_candidates);
162+
}
163+
else
164+
{
165+
control_dep_calls.clear();
166+
}
167+
159168
// add edges to the graph
160169
for(const auto &c_dep : control_deps)
161170
dep_graph.add_dep(dep_edget::kindt::CTRL, c_dep.first, to);
@@ -264,7 +273,8 @@ void dep_graph_domaint::control_dependencies(
264273
bool dep_graph_domaint::merge_control_dependencies(
265274
const control_depst &other_control_deps,
266275
const control_dep_candidatest &other_control_dep_candidates,
267-
const control_dep_callst &other_control_dep_calls)
276+
const control_dep_callst &other_control_dep_calls,
277+
const control_dep_callst &other_control_dep_call_candidates)
268278
{
269279
bool changed=false;
270280

@@ -323,6 +333,16 @@ bool dep_graph_domaint::merge_control_dependencies(
323333

324334
changed|=n!=control_dep_calls.size();
325335

336+
// Merge call control dependency candidates
337+
338+
n=control_dep_call_candidates.size();
339+
340+
control_dep_call_candidates.insert(
341+
other_control_dep_call_candidates.begin(),
342+
other_control_dep_call_candidates.end());
343+
344+
changed|=n!=control_dep_call_candidates.size();
345+
326346
return changed;
327347
}
328348

@@ -489,14 +509,18 @@ void dep_graph_domaint::transform(
489509
if(s->merge_control_dependencies(
490510
control_deps,
491511
control_dep_candidates,
492-
control_dep_calls))
512+
control_dep_calls,
513+
control_dep_call_candidates))
493514
s->has_changed=true;
494515

495516
control_deps.clear();
496517
control_dep_candidates.clear();
497518

498519
control_dep_calls.clear();
499520
control_dep_calls.insert(from);
521+
522+
control_dep_call_candidates.clear();
523+
control_dep_call_candidates.insert(from);
500524
}
501525
}
502526
else

src/analyses/dependence_graph.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ Date: August 2013
1919

2020
#include <util/graph.h>
2121
#include <util/threeval.h>
22+
#include <util/container_utils.h>
2223

2324
#include "ai.h"
2425
#include "cfg_dominators.h"
@@ -122,6 +123,7 @@ class dep_graph_domaint:public ai_domain_baset
122123
control_deps.clear();
123124
control_dep_candidates.clear();
124125
control_dep_calls.clear();
126+
control_dep_call_candidates.clear();
125127
data_deps.clear();
126128
}
127129

@@ -135,6 +137,7 @@ class dep_graph_domaint:public ai_domain_baset
135137
control_deps.clear();
136138
control_dep_candidates.clear();
137139
control_dep_calls.clear();
140+
control_dep_call_candidates.clear();
138141
data_deps.clear();
139142
}
140143

@@ -198,6 +201,7 @@ class dep_graph_domaint:public ai_domain_baset
198201

199202
typedef std::set<goto_programt::const_targett> control_dep_callst;
200203
control_dep_callst control_dep_calls;
204+
control_dep_callst control_dep_call_candidates;
201205

202206
typedef std::map<goto_programt::const_targett, std::set<exprt>> data_depst;
203207
data_depst data_deps;
@@ -221,7 +225,8 @@ class dep_graph_domaint:public ai_domain_baset
221225
bool merge_control_dependencies(
222226
const control_depst &other_control_deps,
223227
const control_dep_candidatest &other_control_dep_candidates,
224-
const control_dep_callst &other_control_dep_calls);
228+
const control_dep_callst &other_control_dep_calls,
229+
const control_dep_callst &other_control_dep_call_candidates);
225230
};
226231

227232
class dependence_grapht:

0 commit comments

Comments
 (0)