void polynomial_acceleratort::cone_of_influence( goto_programt::instructionst &orig_body, exprt &target, goto_programt::instructionst &body, expr_sett &cone) { utils.gather_rvalues(target, cone); for (goto_programt::instructionst::reverse_iterator r_it = orig_body.rbegin(); r_it != orig_body.rend(); ++r_it) { if (r_it->is_assign()) { // XXX -- this doesn't work if the assignment is not to a symbol, e.g. // A[i] = 0; // or // *p = x; code_assignt assignment = to_code_assign(r_it->code); expr_sett lhs_syms; utils.gather_rvalues(assignment.lhs(), lhs_syms); for (expr_sett::iterator s_it = lhs_syms.begin(); s_it != lhs_syms.end(); ++s_it) { if (cone.find(*s_it) != cone.end()) { // We're assigning to something in the cone of influence -- expand the // cone. body.push_front(*r_it); cone.erase(assignment.lhs()); utils.gather_rvalues(assignment.rhs(), cone); break; } } } } }
void scratch_programt::append(goto_programt::instructionst &new_instructions) { instructions.insert( instructions.end(), new_instructions.begin(), new_instructions.end()); }
void insert_program(goto_programt &body, goto_programt::targett pos, const goto_programt::instructionst &prog, const replacementst &replacements) { copy_instructionst copy_instr; insert_instrt insert_instr(copy_instr, body, pos, replacements); goto_programt::const_targett first=prog.begin(); goto_programt::const_targett last=prog.end(); if (first == last) return; --last; for (; first != last; ++first) insert_instr(first); copy_instr.finalize(++pos, last); }
goto_programt::targett find_instruction( const xmlt &xml, goto_programt::instructionst &instructions, const irep_idt &label) { goto_programt::targett ins_it=instructions.begin(); xmlt::elementst::const_iterator it=xml.elements.begin(); for(; it != xml.elements.end() && ins_it!=instructions.end(); it++) { if(label==it->get_attribute("targetlabel")) return ins_it; ins_it++; } return instructions.end(); }