Skip to content

Commit d3c0eb9

Browse files
authored
Merge pull request diffblue#531 from diffblue/smowton/feature/csvsa-constant-propagator-selective-domains
CSVSA constant propagator: use a sparse domain
2 parents 7e95819 + 2951861 commit d3c0eb9

File tree

3 files changed

+34
-16
lines changed

3 files changed

+34
-16
lines changed

cbmc/src/analyses/constant_propagator.h

+12-4
Original file line numberDiff line numberDiff line change
@@ -175,23 +175,29 @@ class constant_propagator_ait:public ait<constant_propagator_domaint>
175175

176176
explicit constant_propagator_ait(
177177
const goto_functionst &goto_functions,
178-
should_track_valuet should_track_value = track_all_values):
178+
should_track_valuet should_track_value = track_all_values,
179+
std::function<bool(locationt)> retain_domain_predicate = nullptr):
180+
ait<constant_propagator_domaint>(retain_domain_predicate),
179181
dirty(goto_functions),
180182
should_track_value(should_track_value)
181183
{
182184
}
183185

184186
explicit constant_propagator_ait(
185187
const goto_functiont &goto_function,
186-
should_track_valuet should_track_value = track_all_values):
188+
should_track_valuet should_track_value = track_all_values,
189+
std::function<bool(locationt)> retain_domain_predicate = nullptr):
190+
ait<constant_propagator_domaint>(retain_domain_predicate),
187191
dirty(goto_function),
188192
should_track_value(should_track_value)
189193
{
190194
}
191195

192196
constant_propagator_ait(
193197
goto_modelt &goto_model,
194-
should_track_valuet should_track_value = track_all_values):
198+
should_track_valuet should_track_value = track_all_values,
199+
std::function<bool(locationt)> retain_domain_predicate = nullptr):
200+
ait<constant_propagator_domaint>(retain_domain_predicate),
195201
dirty(goto_model.goto_functions),
196202
should_track_value(should_track_value)
197203
{
@@ -203,7 +209,9 @@ class constant_propagator_ait:public ait<constant_propagator_domaint>
203209
constant_propagator_ait(
204210
goto_functionst::goto_functiont &goto_function,
205211
const namespacet &ns,
206-
should_track_valuet should_track_value = track_all_values):
212+
should_track_valuet should_track_value = track_all_values,
213+
std::function<bool(locationt)> retain_domain_predicate = nullptr):
214+
ait<constant_propagator_domaint>(retain_domain_predicate),
207215
dirty(goto_function),
208216
should_track_value(should_track_value)
209217
{

src/pointer-analysis/context_sensitive_value_set_analysis.cpp

+11-8
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,17 @@ void csvsa_function_contextt::csvsa_visit(locationt l)
118118
return;
119119
}
120120

121-
// Constant propagator: visit this instruction
121+
// Pointer analysis: visit this instruction
122+
working_sett value_set_successors;
123+
visit(l, value_set_successors, goto_function.body, empty_goto_functions);
124+
125+
for(auto &successor : value_set_successors)
126+
driver.queue_instruction(context_number, successor.second);
127+
128+
// Constant propagator: visit this instruction. Note this must come *after*
129+
// pointer analysis because pointer analysis consults the constant propagator
130+
// state, and the constant propagator's visit routine may clear this
131+
// instruction's domain to save memory.
122132
csvsa_constant_propagatort::working_sett constant_prop_successors;
123133
constant_propagator.visit(
124134
l, constant_prop_successors, goto_function.body, empty_goto_functions, ns);
@@ -131,13 +141,6 @@ void csvsa_function_contextt::csvsa_visit(locationt l)
131141
if(!constant_propagator[successor.second].is_bottom())
132142
driver.queue_instruction(context_number, successor.second);
133143
}
134-
135-
// Pointer analysis: visit this instruction
136-
working_sett value_set_successors;
137-
visit(l, value_set_successors, goto_function.body, empty_goto_functions);
138-
139-
for(auto &successor : value_set_successors)
140-
driver.queue_instruction(context_number, successor.second);
141144
}
142145

143146
void csvsa_function_contextt::merge_call_return_state(

src/pointer-analysis/context_sensitive_value_set_analysis.h

+11-4
Original file line numberDiff line numberDiff line change
@@ -227,8 +227,13 @@ class csvsa_constant_propagatort : public constant_propagator_ait
227227
}
228228

229229
explicit csvsa_constant_propagatort(
230-
const goto_functiont &goto_function, bool is_root_context) :
231-
baset(goto_function, constant_propagator_should_track_value)
230+
const goto_functiont &goto_function,
231+
bool is_root_context,
232+
std::function<bool(locationt)> must_retain_state_predicate) :
233+
baset(
234+
goto_function,
235+
constant_propagator_should_track_value,
236+
must_retain_state_predicate)
232237
{
233238
initialize(goto_function);
234239
if(is_root_context)
@@ -498,7 +503,8 @@ class csvsa_function_contextt :
498503
recursive_status(NOT_RECURSIVE),
499504
driver(driver),
500505
parent(parent),
501-
constant_propagator(goto_function, false)
506+
constant_propagator(
507+
goto_function, false, get_retain_domain_predicate(driver))
502508
{
503509
callers.insert({parent, parent_loc});
504510
}
@@ -522,7 +528,8 @@ class csvsa_function_contextt :
522528
recursive_status(NOT_RECURSIVE),
523529
driver(driver),
524530
parent(),
525-
constant_propagator(goto_function, true)
531+
constant_propagator(
532+
goto_function, true, get_retain_domain_predicate(driver))
526533
{
527534
}
528535

0 commit comments

Comments
 (0)