18 return a->location_number < b->location_number;
25 auto &instruction = *it;
26 std::vector<goto_programt::targett> backedges;
31 for(
auto predecessor : instruction.incoming_edges)
33 if(predecessor->location_number > instruction.location_number)
34 backedges.push_back(predecessor);
37 if(backedges.size() < 2)
42 auto last_backedge = backedges.back();
47 if(!last_backedge->is_goto() || last_backedge->targets.size() > 1)
54 if(!last_backedge->guard.is_true())
60 last_backedge->guard =
not_exprt(last_backedge->guard);
61 last_backedge->set_target(std::next(new_goto));
63 last_backedge = new_goto;
72 for(
auto backedge : backedges)
74 if(backedge->is_goto() && backedge->targets.size() == 1)
76 backedge->set_target(last_backedge);
85 bool any_change =
false;
103 goto_function.body.update();
113 bool any_change =
false;