21 const cfgt::nodet &node,
27 dep_graph[dep_graph[node.PC].get_node_id()];
29 for(dependence_grapht::edgest::const_iterator
33 add_to_queue(queue, dep_node_to_cfg[it->first], node.PC);
37 const cfgt::nodet &node,
41 goto_functionst::function_mapt::const_iterator f_it =
45 assert(!f_it->second.body.instructions.empty());
47 f_it->second.body.instructions.begin();
50 for(
const auto &in_edge : entry.in)
55 const cfgt::nodet &node,
66 for(find_symbols_sett::const_iterator
71 decl_deadt::iterator entry=decl_dead.find(*it);
72 if(entry==decl_dead.end())
75 while(!entry->second.empty())
81 decl_dead.erase(entry);
115 jumpst::iterator next=it;
130 for( ; !lex_succ->is_end_function(); ++lex_succ)
135 if(lex_succ->is_end_function())
144 const auto &j_PC_node = pd.
get_node(j.PC);
157 std::size_t post_dom_size=0;
158 for(cfg_dominatorst::target_sett::const_iterator d_it =
159 j_PC_node.dominators.begin();
160 d_it != j_PC_node.dominators.end();
164 if(node.node_required)
166 const irep_idt &id2 = node.function_id;
168 "goto/jump expected to be within a single function");
170 const auto &postdom_node = pd.
get_node(*d_it);
172 if(postdom_node.dominators.size() > post_dom_size)
175 post_dom_size = postdom_node.dominators.size();
179 if(nearest!=lex_succ)
197 std::vector<cfgt::entryt> dep_node_to_cfg;
198 dep_node_to_cfg.reserve(dep_graph.
size());
204 while(!queue.empty())
206 while(!queue.empty())
213 if(node.node_required)
217 node.node_required=
true;
238 const irep_idt &statement=target->code.get_statement();
239 if(statement==ID_array_copy)
242 if(!target->is_assign())
246 if(a.
lhs().
id()!=ID_symbol)
274 for(
const auto &instruction_and_index :
cfg.
entries())
276 const auto &instruction = instruction_and_index.first;
277 const auto instruction_node_index = instruction_and_index.second;
278 if(criterion(
cfg[instruction_node_index].function_id, instruction))
279 add_to_queue(queue, instruction_node_index, instruction);
281 add_to_queue(queue, instruction_node_index, instruction);
283 (instruction->is_goto() && instruction->get_condition().is_true()) ||
284 instruction->is_throw())
285 jumps.push_back(instruction_node_index);
286 else if(instruction->is_decl())
289 decl_dead[s.get_identifier()].push(instruction_node_index);
291 else if(instruction->is_dead())
294 decl_dead[s.get_identifier()].push(instruction_node_index);
300 dep_graph(goto_functions, ns);
303 fixedpoint(goto_functions, queue, jumps, decl_dead, dep_graph);
309 if(f_it->second.body_available())
315 !i_it->is_end_function() &&
316 !cfg_node.node_required)
318 i_it->turn_into_skip();
320 #ifdef DEBUG_FULL_SLICERT
325 for(std::set<unsigned>::const_iterator req_it =
326 cfg_node.required_by.begin();
327 req_it != cfg_node.required_by.end();
330 if(req_it != cfg_node.required_by.begin())
334 i_it->source_location.set_column(c);
335 i_it->source_location.set_comment(c);
371 const std::list<std::string> &properties)
379 const std::list<std::string> &properties)