40 std::map<exprt, polynomialt> polynomials;
46 std::cout <<
"Polynomial accelerating program:\n";
48 for(goto_programt::instructionst::iterator
54 it->output(std::cout);
57 std::cout <<
"Modified:\n";
59 for(expr_sett::iterator it=
modified.begin();
63 std::cout <<
format(*it) <<
'\n';
84 for(expr_sett::iterator it=
modified.begin();
91 if(it->type().id()==ID_bool)
97 if(target.
id()==ID_index ||
98 target.
id()==ID_dereference)
106 std::map<exprt, polynomialt> this_poly;
107 this_poly[target]=poly;
112 std::cout <<
"Fitted a polynomial for " <<
format(target)
115 polynomials[target]=poly;
122 if(polynomials.empty())
135 for(patht::iterator it=accelerator.
path.begin();
136 it!=accelerator.
path.end();
139 if(it->loc->is_assign() || it->loc->is_decl())
141 assigns.push_back(*(it->loc));
145 for(expr_sett::iterator it=dirty.begin();
150 std::cout <<
"Trying to accelerate " <<
format(*it) <<
'\n';
153 if(it->type().id()==ID_bool)
158 std::cout <<
"Ignoring boolean\n";
163 if(it->id()==ID_index ||
164 it->id()==ID_dereference)
167 std::cout <<
"Ignoring array reference\n";
176 std::cout <<
"We've accelerated it already\n";
187 std::cout <<
"Ignoring because it depends on an array\n";
198 std::map<exprt, polynomialt> this_poly;
199 this_poly[target]=poly;
203 polynomials[target]=poly;
210 std::cout <<
"Failed to accelerate " <<
format(*it) <<
'\n';
230 bool path_is_monotone;
237 catch(
const std::string &s)
240 std::cout <<
"Assumptions error: " << s <<
'\n';
244 exprt pre_guard(guard);
246 for(std::map<exprt, polynomialt>::iterator it=polynomials.begin();
247 it!=polynomials.end();
296 for(std::map<exprt, polynomialt>::iterator it=polynomials.begin();
297 it!=polynomials.end();
300 program.assign(it->first, it->second.to_expr());
329 program.append(
fixed);
330 program.append(
fixed);
339 for(distinguish_valuest::iterator jt=it->begin();
343 exprt distinguisher=jt->first;
344 bool taken=jt->second;
349 distinguisher.
swap(negated);
352 or_exprt disjunct(new_path, distinguisher);
353 new_path.
swap(disjunct);
356 program.assume(new_path);
366 std::cout <<
"Found a path\n";
374 catch(
const std::string &s)
376 std::cout <<
"Error in fitting polynomial SAT check: " << s <<
'\n';
380 std::cout <<
"Error in fitting polynomial SAT check: " << s <<
'\n';
392 std::vector<expr_listt> parameters;
393 std::set<std::pair<expr_listt, exprt> > coefficients;
401 std::cout <<
"Fitting a polynomial for " <<
format(var)
402 <<
", which depends on:\n";
404 for(expr_sett::iterator it=influence.begin();
408 std::cout <<
format(*it) <<
'\n';
412 for(expr_sett::iterator it=influence.begin();
416 if(it->id()==ID_index ||
417 it->id()==ID_dereference)
426 exprs.push_back(*it);
427 parameters.push_back(exprs);
430 parameters.push_back(exprs);
436 parameters.push_back(exprs);
440 parameters.push_back(exprs);
444 parameters.push_back(exprs);
446 for(std::vector<expr_listt>::iterator it=parameters.begin();
447 it!=parameters.end();
451 coefficients.insert(make_pair(*it, coeff.
symbol_expr()));
472 std::map<exprt, exprt> ivals1;
473 std::map<exprt, exprt> ivals2;
474 std::map<exprt, exprt> ivals3;
476 for(expr_sett::iterator it=influence.begin();
525 std::map<exprt, exprt> values;
527 for(expr_sett::iterator it=influence.begin();
531 values[*it]=ivals1[*it];
536 for(std::list<symbol_exprt>::iterator it =
distinguishers.begin();
546 for(
int n=0; n <= 1; n++)
548 for(expr_sett::iterator it=influence.begin();
552 values[*it]=ivals2[*it];
555 values[*it]=ivals3[*it];
558 values[*it]=ivals1[*it];
562 for(expr_sett::iterator it=influence.begin();
566 values[*it]=ivals3[*it];
580 for(distinguish_valuest::iterator jt=it->begin();
584 exprt distinguisher=jt->first;
585 bool taken=jt->second;
590 distinguisher.
swap(negated);
593 or_exprt disjunct(new_path, distinguisher);
594 new_path.
swap(disjunct);
597 program.assume(new_path);
612 std::cout <<
"Found a polynomial\n";
622 catch(
const std::string &s)
624 std::cout <<
"Error in fitting polynomial SAT check: " << s <<
'\n';
628 std::cout <<
"Error in fitting polynomial SAT check: " << s <<
'\n';
636 std::map<exprt, exprt> &values,
637 std::set<std::pair<expr_listt, exprt> > &coefficients,
645 for(std::map<exprt, exprt>::iterator it=values.begin();
649 if(!expr_type.has_value())
651 expr_type=it->first.type();
655 expr_type =
join_types(*expr_type, it->first.type());
660 for(std::map<exprt, exprt>::iterator it=values.begin();
664 program.
assign(it->first, it->second);
668 for(
int i=0; i<num_unwindings; i++)
670 program.
append(loop_body);
676 for(std::set<std::pair<expr_listt, exprt> >::iterator it=coefficients.begin();
677 it!=coefficients.end();
682 for(expr_listt::const_iterator e_it=it->first.begin();
683 e_it!=it->first.end();
691 from_integer(num_unwindings, *expr_type), concrete_value);
692 mult.
swap(concrete_value);
696 std::map<exprt, exprt>::iterator v_it=values.find(e);
700 mult_exprt mult(concrete_value, v_it->second);
701 mult.
swap(concrete_value);
741 for(
const auto &loop_instruction :
loop)
749 for(
const auto &jt : succs)
774 "we should have a looping path, so we should never hit a location "
775 "with no successors.");
787 bool found_branch=
false;
789 for(
const auto &succ : succs)
792 bool taken=scratch_program.
eval(distinguisher).
is_true();
797 (succ->location_number < next->location_number))
817 for(goto_programt::targetst::iterator it=t->targets.begin();
818 it!=t->targets.end();
823 cond = t->condition();
843 std::map<exprt, exprt> shadow_distinguishers;
849 if(instruction.is_assert())
850 instruction.turn_into_assume();
872 for(std::list<symbol_exprt>::iterator it =
distinguishers.begin();
876 exprt &distinguisher=*it;
880 shadow_distinguishers[distinguisher]=shadow;
899 fixedt->turn_into_skip();
907 exprt &distinguisher=d->second;
908 exprt &shadow=shadow_distinguishers[distinguisher];
914 assign->swap(*fixedt);
930 for(
const auto &target : t->targets)
932 if(target->location_number > t->location_number)
943 fixedt->targets.clear();
944 fixedt->targets.push_back(kill);
954 fixedt->targets.clear();
955 fixedt->targets.push_back(end);
960 fixedt->targets.clear();
961 fixedt->targets.push_back(kill);
974 const exprt &shadow=shadow_distinguishers[expr];
991 for(std::list<symbol_exprt>::iterator it =
distinguishers.begin();
1009 for(expr_sett::iterator it=influence.begin();
1010 it!=influence.end();
1013 if(it->id()==ID_index ||
1014 it->id()==ID_dereference)