Skip to content

Commit 29f1e2a

Browse files
author
Daniel Kroening
committed
eliminate constrained BP calls
1 parent 5bfe346 commit 29f1e2a

File tree

3 files changed

+30
-93
lines changed

3 files changed

+30
-93
lines changed

src/goto-programs/goto_inline.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ void goto_inline(
7777

7878
Forall_goto_program_instructions(i_it, goto_program)
7979
{
80-
if(!goto_inlinet::is_call(i_it))
80+
if(!i_it->is_function_call())
8181
continue;
8282

8383
call_list.push_back(goto_inlinet::callt(i_it, false));
@@ -164,14 +164,13 @@ void goto_partial_inline(
164164

165165
Forall_goto_program_instructions(i_it, goto_program)
166166
{
167-
if(!goto_inlinet::is_call(i_it))
167+
if(!i_it->is_function_call())
168168
continue;
169169

170170
exprt lhs;
171171
exprt function_expr;
172172
exprt::operandst arguments;
173-
exprt constrain;
174-
goto_inlinet::get_call(i_it, lhs, function_expr, arguments, constrain);
173+
goto_inlinet::get_call(i_it, lhs, function_expr, arguments);
175174

176175
if(function_expr.id()!=ID_symbol)
177176
// Can't handle pointers to functions
@@ -199,7 +198,7 @@ void goto_partial_inline(
199198
if(goto_function.is_inlined() ||
200199
goto_program.instructions.size()<=smallfunc_limit)
201200
{
202-
assert(goto_inlinet::is_call(i_it));
201+
assert(i_it->is_function_call());
203202
call_list.push_back(goto_inlinet::callt(i_it, false));
204203
}
205204
}
@@ -273,7 +272,7 @@ void goto_function_inline(
273272

274273
Forall_goto_program_instructions(i_it, goto_program)
275274
{
276-
if(!goto_inlinet::is_call(i_it))
275+
if(!i_it->is_function_call())
277276
continue;
278277

279278
call_list.push_back(goto_inlinet::callt(i_it, true));
@@ -318,7 +317,7 @@ jsont goto_function_inline_and_log(
318317

319318
Forall_goto_program_instructions(i_it, goto_program)
320319
{
321-
if(!goto_inlinet::is_call(i_it))
320+
if(!i_it->is_function_call())
322321
continue;
323322

324323
call_list.push_back(goto_inlinet::callt(i_it, true));

src/goto-programs/goto_inline_class.cpp

Lines changed: 21 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ void goto_inlinet::parameter_assignments(
3434
const exprt::operandst &arguments, // arguments of call
3535
goto_programt &dest)
3636
{
37-
assert(is_call(target));
37+
assert(target->is_function_call());
3838
assert(dest.empty());
3939

4040
const source_locationt &source_location=target->source_location;
@@ -160,7 +160,7 @@ void goto_inlinet::parameter_destruction(
160160
const code_typet &code_type, // type of called function
161161
goto_programt &dest)
162162
{
163-
assert(is_call(target));
163+
assert(target->is_function_call());
164164
assert(dest.empty());
165165

166166
const source_locationt &source_location=target->source_location;
@@ -195,8 +195,7 @@ void goto_inlinet::parameter_destruction(
195195

196196
void goto_inlinet::replace_return(
197197
goto_programt &dest, // inlining this
198-
const exprt &lhs, // lhs in caller
199-
const exprt &constrain)
198+
const exprt &lhs) // lhs in caller
200199
{
201200
for(goto_programt::instructionst::iterator
202201
it=dest.instructions.begin();
@@ -231,14 +230,6 @@ void goto_inlinet::replace_return(
231230
assignment->source_location=it->source_location;
232231
assignment->function=it->function;
233232

234-
if(constrain.is_not_nil() && !constrain.is_true())
235-
{
236-
codet constrain(ID_bp_constrain);
237-
constrain.reserve_operands(2);
238-
constrain.move_to_operands(assignment->code);
239-
constrain.copy_to_operands(constrain);
240-
}
241-
242233
dest.insert_before_swap(it, *assignment);
243234
it++;
244235
}
@@ -276,20 +267,8 @@ void goto_inlinet::replace_return(
276267
code_assign.rhs().type())
277268
code_assign.rhs().make_typecast(code_assign.lhs().type());
278269

279-
if(constrain.is_not_nil() && !constrain.is_true())
280-
{
281-
codet constrain(ID_bp_constrain);
282-
constrain.reserve_operands(2);
283-
constrain.move_to_operands(code_assign);
284-
constrain.copy_to_operands(constrain);
285-
it->code=constrain;
286-
it->type=OTHER;
287-
}
288-
else
289-
{
290-
it->code=code_assign;
291-
it->type=ASSIGN;
292-
}
270+
it->code=code_assign;
271+
it->type=ASSIGN;
293272

294273
it++;
295274
}
@@ -346,10 +325,9 @@ void goto_inlinet::insert_function_body(
346325
goto_programt::targett target,
347326
const exprt &lhs,
348327
const symbol_exprt &function,
349-
const exprt::operandst &arguments,
350-
const exprt &constrain)
328+
const exprt::operandst &arguments)
351329
{
352-
assert(is_call(target));
330+
assert(target->is_function_call());
353331
assert(!dest.empty());
354332
assert(goto_function.body_available());
355333

@@ -367,7 +345,7 @@ void goto_inlinet::insert_function_body(
367345
for(auto &instruction : body.instructions)
368346
instruction.function=target->function;
369347

370-
replace_return(body, lhs, constrain);
348+
replace_return(body, lhs);
371349

372350
goto_programt tmp1;
373351
parameter_assignments(
@@ -448,7 +426,7 @@ void goto_inlinet::insert_function_nobody(
448426
const symbol_exprt &function,
449427
const exprt::operandst &arguments)
450428
{
451-
assert(is_call(target));
429+
assert(target->is_function_call());
452430
assert(!dest.empty());
453431

454432
const irep_idt identifier=function.get_identifier();
@@ -501,7 +479,7 @@ void goto_inlinet::expand_function_call(
501479
const bool force_full,
502480
goto_programt::targett target)
503481
{
504-
assert(is_call(target));
482+
assert(target->is_function_call());
505483
assert(!dest.empty());
506484
assert(!transitive || inline_map.empty());
507485

@@ -513,9 +491,8 @@ void goto_inlinet::expand_function_call(
513491
exprt lhs;
514492
exprt function_expr;
515493
exprt::operandst arguments;
516-
exprt constrain;
517494

518-
get_call(target, lhs, function_expr, arguments, constrain);
495+
get_call(target, lhs, function_expr, arguments);
519496

520497
if(function_expr.id()!=ID_symbol)
521498
return;
@@ -576,8 +553,7 @@ void goto_inlinet::expand_function_call(
576553
target,
577554
lhs,
578555
function,
579-
arguments,
580-
constrain);
556+
arguments);
581557

582558
progress() << "Inserting " << identifier << " into caller" << eom;
583559
progress() << "Number of instructions: "
@@ -609,8 +585,7 @@ void goto_inlinet::expand_function_call(
609585
target,
610586
lhs,
611587
function,
612-
arguments,
613-
constrain);
588+
arguments);
614589
}
615590
}
616591
else // no body available
@@ -623,45 +598,15 @@ void goto_inlinet::get_call(
623598
goto_programt::const_targett it,
624599
exprt &lhs,
625600
exprt &function,
626-
exprt::operandst &arguments,
627-
exprt &constrain)
601+
exprt::operandst &arguments)
628602
{
629-
assert(is_call(it));
630-
631-
if(it->is_function_call())
632-
{
633-
const code_function_callt &call=to_code_function_call(it->code);
603+
assert(it->is_function_call());
634604

635-
lhs=call.lhs();
636-
function=call.function();
637-
arguments=call.arguments();
638-
constrain=static_cast<const exprt &>(get_nil_irep());
639-
}
640-
else
641-
{
642-
assert(is_bp_call(it));
643-
644-
lhs=it->code.op0().op0();
645-
function=to_symbol_expr(it->code.op0().op1().op0());
646-
arguments=it->code.op0().op1().op1().operands();
647-
constrain=it->code.op1();
648-
}
649-
}
650-
651-
bool goto_inlinet::is_call(goto_programt::const_targett it)
652-
{
653-
return it->is_function_call() || is_bp_call(it);
654-
}
655-
656-
bool goto_inlinet::is_bp_call(goto_programt::const_targett it)
657-
{
658-
if(!it->is_other())
659-
return false;
605+
const code_function_callt &call=to_code_function_call(it->code);
660606

661-
return it->code.get(ID_statement)==ID_bp_constrain &&
662-
it->code.operands().size()==2 &&
663-
it->code.op0().operands().size()==2 &&
664-
it->code.op0().op1().get(ID_statement)==ID_function_call;
607+
lhs=call.lhs();
608+
function=call.function();
609+
arguments=call.arguments();
665610
}
666611

667612
void goto_inlinet::goto_inline(
@@ -782,7 +727,7 @@ const goto_inlinet::goto_functiont &goto_inlinet::goto_inline_transitive(
782727

783728
Forall_goto_program_instructions(i_it, goto_program)
784729
{
785-
if(is_call(i_it))
730+
if(i_it->is_function_call())
786731
call_list.push_back(i_it);
787732
}
788733

@@ -855,7 +800,7 @@ bool goto_inlinet::check_inline_map(
855800
if(static_cast<int>(target->location_number)<=ln)
856801
return false;
857802

858-
if(!is_call(target))
803+
if(!target->is_function_call())
859804
return false;
860805

861806
ln=target->location_number;

src/goto-programs/goto_inline_class.h

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -76,17 +76,12 @@ class goto_inlinet:public messaget
7676
return inline_log.output_inline_log_json();
7777
}
7878

79-
// is bp call
80-
static bool is_bp_call(goto_programt::const_targett target);
81-
// is normal or bp call
82-
static bool is_call(goto_programt::const_targett target);
8379
// get call info of normal or bp call
8480
static void get_call(
8581
goto_programt::const_targett target,
8682
exprt &lhs,
8783
exprt &function,
88-
exprt::operandst &arguments,
89-
exprt &constrain);
84+
exprt::operandst &arguments);
9085

9186
class goto_inline_logt
9287
{
@@ -175,8 +170,7 @@ class goto_inlinet:public messaget
175170
goto_programt::targett target,
176171
const exprt &lhs,
177172
const symbol_exprt &function,
178-
const exprt::operandst &arguments,
179-
const exprt &constrain);
173+
const exprt::operandst &arguments);
180174

181175
void insert_function_nobody(
182176
goto_programt &dest,
@@ -187,8 +181,7 @@ class goto_inlinet:public messaget
187181

188182
void replace_return(
189183
goto_programt &body,
190-
const exprt &lhs,
191-
const exprt &constrain);
184+
const exprt &lhs);
192185

193186
void parameter_assignments(
194187
const goto_programt::targett target,

0 commit comments

Comments
 (0)