57 for(natural_loopst::loop_mapt::const_iterator
62 assert(!l_it->second.empty());
72 it=l_it->second.begin();
73 it!=l_it->second.end();
77 if((*it)->get_target()==loop_start &&
78 (*it)->location_number>loop_end->location_number)
82 if(!
loop_map.insert(std::make_pair(loop_start, loop_end)).second)
94 if(instruction.is_dead())
96 dead_map[instruction.dead_symbol().get_identifier()] =
97 instruction.location_number;
108 if(instruction.is_assign())
110 const exprt &l = instruction.assign_lhs();
111 const exprt &
r = instruction.assign_rhs();
115 r.id() == ID_side_effect &&
121 else if(l.
type().
id()==ID_pointer &&
122 l.
type().
get(ID_C_typedef)==
"va_list" &&
124 r.id()==ID_typecast &&
142 target->type() !=
ASSERT &&
143 !target->source_location().get_comment().empty())
146 dest.
statements().back().add_source_location().set_comment(
147 target->source_location().get_comment());
151 if(target->is_target() && !target->is_goto())
157 upper_bound->location_number > loop_entry->second->location_number))
163 switch(target->type())
176 target->call_lhs(), target->call_function(), target->call_arguments());
182 dest.
add(target->get_other());
197 dest.
statements().back().add_source_location().set_comment(
198 target->source_location().get_comment());
213 dest.
statements().back().add_source_location().set_comment(
"END_THREAD");
224 dest.
add(std::move(f));
251 if(target->is_target())
253 std::stringstream label;
258 latest_block->
add(std::move(l));
263 for(goto_programt::instructiont::labelst::const_iterator
264 it=target->labels.begin();
265 it!=target->labels.end();
280 latest_block->
add(std::move(l));
285 if(latest_block!=&dest)
294 const code_assignt a{target->assign_lhs(), target->assign_rhs()};
309 const exprt this_va_list_expr = target->assign_lhs();
316 {this_va_list_expr});
318 dest.
add(std::move(f));
321 r.id() == ID_side_effect &&
329 dest.
add(std::move(f));
331 else if(
r.id() == ID_plus)
335 {this_va_list_expr});
349 if(next!=upper_bound &&
352 const exprt &n_r = next->assign_rhs();
354 n_r.
id() == ID_dereference &&
357 f.lhs() = next->assign_lhs();
359 type_of.arguments().push_back(f.lhs());
360 f.arguments().push_back(type_of);
362 dest.
add(std::move(f));
368 assert(
r.find(ID_C_va_arg_type).is_not_nil());
369 const typet &va_arg_type=
370 static_cast<typet const&
>(
r.find(ID_C_va_arg_type));
376 type_of.arguments().push_back(deref);
377 f.arguments().push_back(type_of);
381 dest.
add(std::move(void_f));
387 {this_va_list_expr,
r});
389 dest.
add(std::move(f));
399 if(assign.
rhs().
id()==ID_array)
424 target->return_value().id() != ID_side_effect ||
436 while(next!=upper_bound && next->is_dead() && !next->is_target())
439 if(next!=upper_bound &&
463 upper_bound->location_number > entry->second);
467 if(next!=upper_bound &&
469 !next->is_target() &&
470 (next->is_assign() || next->is_function_call()))
472 exprt lhs = next->is_assign() ? next->assign_lhs() : next->call_lhs();
476 if(next->is_assign())
484 next->call_function(),
485 next->call_arguments(),
503 dest.
add(std::move(d));
515 assert(loop_end->is_goto() && loop_end->is_backwards_goto());
524 for( ; target!=loop_end; ++target)
531 dest.
add(std::move(d));
540 assert(target->is_goto());
542 assert(target->targets.size()==1);
548 upper_bound->location_number > loop_entry->second->location_number))
550 else if(!target->condition().is_true())
563 assert(loop_end->is_goto() && loop_end->is_backwards_goto());
575 if(target->get_target()==after_loop)
577 w.cond() =
not_exprt(target->condition());
580 else if(target->condition().is_true())
591 for(++target; target!=loop_end; ++target)
597 if(loop_end->condition().is_false())
601 else if(!loop_end->condition().is_true())
611 if(w.body().has_operands() &&
615 w.body().operands().pop_back();
616 increment.
id(ID_side_effect);
624 else if(w.body().has_operands() &&
634 w.body().operands().pop_back();
643 dest.
add(std::move(w));
651 const exprt &switch_var,
657 std::set<goto_programt::const_targett> unique_targets;
661 cases_it!=upper_bound && cases_it!=first_target;
665 cases_it->is_goto() && !cases_it->is_backwards_goto() &&
666 cases_it->condition().is_true())
668 default_target=cases_it->get_target();
671 first_target->location_number > default_target->location_number)
672 first_target=default_target;
674 last_target->location_number < default_target->location_number)
675 last_target=default_target;
677 cases.push_back(
caset(
682 unique_targets.insert(default_target);
688 cases_it->is_goto() && !cases_it->is_backwards_goto() &&
689 (cases_it->condition().id() == ID_equal ||
690 cases_it->condition().id() == ID_or))
693 if(cases_it->condition().id() == ID_equal)
694 eqs.push_back(cases_it->condition());
696 eqs = cases_it->condition().operands();
700 for(exprt::operandst::const_reverse_iterator
702 e_it!=(exprt::operandst::const_reverse_iterator)eqs.rend();
705 if(e_it->id()!=ID_equal ||
710 cases.push_back(
caset(
714 cases_it->get_target()));
715 assert(cases.back().value.is_not_nil());
718 first_target->location_number>
719 cases.back().case_start->location_number)
720 first_target=cases.back().case_start;
722 last_target->location_number<
723 cases.back().case_start->location_number)
724 last_target=cases.back().case_start;
726 unique_targets.insert(cases.back().case_start);
735 if(unique_targets.size()<3)
739 if(cases_it==upper_bound ||
741 upper_bound->location_number < last_target->location_number) ||
743 last_target->location_number > default_target->location_number) ||
744 target->get_target()==default_target)
754 std::set<unsigned> &processed_locations)
756 std::set<goto_programt::const_targett> targets_done;
758 for(cases_listt::iterator it=cases.begin();
764 if(!targets_done.insert(it->case_start).second)
770 case_end->type() !=
END_FUNCTION && case_end != upper_bound;
773 const auto &case_end_node = dominators.
get_node(case_end);
780 if(case_end==it->case_start)
787 if(!dominators.
dominates(it->case_start, case_end_node))
790 if(!processed_locations.insert(case_end->location_number).second)
793 it->case_last=case_end;
805 for(cases_listt::const_iterator it=cases.begin();
814 cases_listt::const_iterator last=--cases.end();
815 if(last->case_start==default_target &&
830 next_case == default_target &&
831 (!it->case_last->is_goto() ||
832 (it->case_last->condition().is_true() &&
833 it->case_last->get_target() == default_target)))
843 it->case_last->is_goto() && it->case_last->condition().is_true() &&
844 it->case_last->get_target() == default_target)
848 if(!it->case_last->is_goto())
863 exprt eq_cand = target->condition();
864 if(eq_cand.
id()==ID_or)
867 if(target->is_backwards_goto() ||
868 eq_cand.
id()!=ID_equal ||
900 if(cases_start==target)
908 for(target=cases_start; target!=first_target; ++target)
911 std::set<unsigned> processed_locations;
930 for(cases_listt::const_iterator it=cases.begin();
934 it->case_last->location_number > max_target->location_number)
935 max_target=it->case_last;
937 std::map<goto_programt::const_targett, unsigned> targets_done;
942 for(cases_listt::const_iterator it=cases.begin();
948 if(it->value.is_nil())
951 csc.case_op()=it->value;
955 if(targets_done.find(it->case_start)!=targets_done.end())
957 assert(it->case_selector==orig_target ||
958 !it->case_selector->is_target());
966 csc.code().swap(cscp->
code());
973 if(it->case_selector!=orig_target)
977 target=it->case_start;
984 if(it->case_start!=(--cases.end())->case_start)
998 for( ; target!=after_last; ++target)
1003 targets_done[it->case_start]=s.
body().
operands().size();
1013 if(processed_locations.find(it->location_number)==
1014 processed_locations.end())
1023 dest.
add(std::move(s));
1036 bool has_else=
false;
1038 if(!target->is_backwards_goto())
1045 if(before_else==target)
1052 before_else->is_goto() &&
1053 before_else->get_target()->location_number > end_if->location_number &&
1054 before_else->condition().is_true() &&
1056 upper_bound->location_number >=
1057 before_else->get_target()->location_number);
1060 end_if=before_else->get_target();
1064 if(target->is_backwards_goto() ||
1066 upper_bound->location_number < end_if->location_number))
1083 for(++target; target!=before_else; ++target)
1089 for(++target; target!=end_if; ++target)
1095 for(++target; target!=end_if; ++target)
1100 dest.
add(std::move(i));
1123 if(target->get_target()==next)
1132 if(target->get_target()==loop_end &&
1143 dest.
add(std::move(i));
1157 if(target->get_target()==after_loop)
1167 dest.
add(std::move(i));
1182 if(target->get_target()==next)
1192 std::stringstream label;
1194 for(goto_programt::instructiont::labelst::const_iterator
1195 it=target->get_target()->labels.begin();
1196 it!=target->get_target()->labels.end();
1210 if(label.str().empty())
1211 label <<
CPROVER_PREFIX "DUMP_L" << target->get_target()->target_number;
1225 dest.
add(std::move(i));
1235 assert(target->is_start_thread());
1238 assert(thread_start->location_number > target->location_number);
1249 if(!next->is_goto())
1253 assert(this_end->is_end_thread());
1254 assert(thread_start->location_number > this_end->location_number);
1259 for(goto_programt::instructiont::labelst::const_iterator
1260 it=target->labels.begin();
1261 it!=target->labels.end();
1273 dest.
add(std::move(b));
1285 next->is_goto() && next->condition().is_true(),
"START THREAD pattern");
1286 DATA_INVARIANT(!next->is_backwards_goto(),
"START THREAD pattern");
1288 thread_start->location_number < next->get_target()->location_number,
1289 "START THREAD pattern");
1291 ++after_thread_start;
1295 assert(thread_start->location_number < thread_end->location_number);
1296 assert(thread_end->is_end_thread());
1299 thread_end->location_number < upper_bound->location_number);
1305 thread_start->is_function_call() &&
1306 thread_start->call_arguments().size() == 1 &&
1307 after_thread_start == thread_end)
1313 thread_start->call_lhs(),
1317 thread_start->call_function(),
1318 thread_start->call_arguments().front()}));
1324 for( ; thread_start!=thread_end; ++thread_start)
1328 for(goto_programt::instructiont::labelst::const_iterator
1329 it=target->labels.begin();
1330 it!=target->labels.end();
1342 dest.
add(std::move(b));
1367 if(type.
id() == ID_struct_tag || type.
id() == ID_union_tag)
1384 else if(type.
id()==ID_c_enum_tag)
1393 assert(!identifier.
empty());
1396 else if(type.
id()==ID_pointer ||
1397 type.
id()==ID_array)
1410 code.
op1().
id()==ID_side_effect &&
1429 if(!typedef_str.
empty() &&
1442 call.
lhs().
id()==ID_typecast)
1450 if(op.id() == ID_code)
1458 if(statement==ID_label)
1463 assert(!label.
empty());
1471 else if(statement==ID_block)
1473 else if(statement==ID_ifthenelse)
1475 else if(statement==ID_dowhile)
1486 code=do_while.
body();
1491 const exprt &
function,
1494 if(
function.
id()!=ID_symbol)
1507 if(parameters.size()==arguments.size())
1509 code_typet::parameterst::const_iterator it=parameters.begin();
1510 for(
auto &argument : arguments)
1513 argument.type().id() == ID_union ||
1514 argument.type().id() == ID_union_tag)
1516 argument.type() = it->type();
1532 operands.size()>1 && i<operands.size();
1535 exprt::operandst::iterator it=operands.begin()+i;
1538 it->source_location().get_comment().
empty())
1543 bool has_decl=
false;
1553 operands.insert(operands.begin()+i+1,
1554 it->operands().begin(), it->operands().end());
1555 operands.erase(operands.begin()+i);
1565 if(operands.empty() && parent_stmt!=ID_nil)
1567 else if(operands.size()==1 &&
1568 parent_stmt!=ID_nil &&
1579 type.
remove(ID_C_constant);
1581 if(type.
id() == ID_struct_tag || type.
id() == ID_union_tag)
1590 "Symbol "+
id2string(identifier)+
" should be a type");
1594 else if(type.
id()==ID_array)
1596 else if(type.
id()==ID_struct ||
1597 type.
id()==ID_union)
1602 for(struct_union_typet::componentst::iterator
1608 else if(type.
id() == ID_c_bit_field)
1628 if(expr.
is_nil() ||
to_code(expr).get_statement() != ID_block)
1634 block.
statements().back().get_statement() != ID_label)
1715 code =
code_blockt({i_t_e, then_label, else_label});
1748 (expr.
id()==ID_address_of || expr.
id()==ID_member))
1753 else if(!no_typecast &&
1754 (expr.
id()==ID_union || expr.
id()==ID_struct ||
1755 expr.
id()==ID_array || expr.
id()==ID_vector))
1768 expr.
id() == ID_union && expr.
type().
id() != ID_union &&
1769 expr.
type().
id() != ID_union_tag)
1775 if(expr.
id()==ID_typecast &&
1779 if(expr.
id()==ID_union ||
1780 expr.
id()==ID_struct)
1786 expr.
type().
id() == ID_struct_tag || expr.
type().
id() == ID_union_tag,
1787 "union/struct expressions should have a tag type");
1795 if(!typedef_str.
empty() &&
1799 else if(expr.
id()==ID_array ||
1800 expr.
id()==ID_vector)
1803 expr.
get_bool(ID_C_string_constant))
1812 if(!typedef_str.
empty() &&
1816 else if(expr.
id()==ID_side_effect)
1820 if(statement==ID_nondet)
1827 for(symbol_tablet::symbolst::const_iterator
1832 if(it->second.type.id()!=ID_code)
1854 suffix=expr.
type().
get(ID_C_c_type);
1861 if(base_name.
empty())
1872 symbol.
name=base_name;
1890 else if(expr.
id()==ID_isnan ||
1893 else if(expr.
id()==ID_constant)
1895 if(expr.
type().
id()==ID_floatbv)
1901 else if(expr.
type().
id()==ID_pointer)
1904 const irept &c_sizeof_type=expr.
find(ID_C_c_sizeof_type);
1909 else if(expr.
id()==ID_typecast)
1911 if(expr.
type().
id() == ID_c_bit_field)
1918 if(!typedef_str.
empty() &&
1922 assert(expr.
type().
id()!=ID_union &&
1923 expr.
type().
id()!=ID_struct);
1926 else if(expr.
id()==ID_symbol)
1928 if(expr.
type().
id()!=ID_code)
1934 symbol.
type.
id()!=ID_code &&
1955 if(src->get_code().source_location().is_not_nil())
1957 else if(src->source_location().is_not_nil())