CBMC
acceleration_utils.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Loop Acceleration
4 
5 Author: Matt Lewis
6 
7 \*******************************************************************/
8 
11 
12 #ifndef CPROVER_GOTO_INSTRUMENT_ACCELERATE_ACCELERATION_UTILS_H
13 #define CPROVER_GOTO_INSTRUMENT_ACCELERATE_ACCELERATION_UTILS_H
14 
15 #include <list>
16 #include <map>
17 #include <set>
18 
19 #include <util/symbol_table.h>
20 
22 
23 #include <analyses/guard.h>
24 #include <analyses/natural_loops.h>
25 
26 #include "polynomial.h"
27 #include "path.h"
28 #include "cone_of_influence.h"
29 
30 class message_handlert;
32 
33 typedef std::unordered_map<exprt, exprt, irep_hash> expr_mapt;
34 typedef std::list<exprt> expr_listt;
35 
37 {
38 protected:
40 
41 public:
43  symbol_tablet &_symbol_table,
45  const goto_functionst &_goto_functions,
46  exprt &_loop_counter)
48  symbol_table(_symbol_table),
50  goto_functions(_goto_functions),
51  loop_counter(_loop_counter)
52  {
53  }
54 
56  symbol_tablet &_symbol_table,
58  const goto_functionst &_goto_functions)
60  symbol_table(_symbol_table),
62  goto_functions(_goto_functions),
64  {
65  }
66 
67  void extract_polynomial(
68  scratch_programt &program,
69  std::set<std::pair<expr_listt, exprt>> &coefficients,
70  polynomialt &polynomial);
71 
72  bool check_inductive(
73  std::map<exprt, polynomialt> polynomials,
74  patht &path,
75  guard_managert &guard_manager);
76  void stash_variables(scratch_programt &program,
77  expr_sett modified,
78  substitutiont &substitution);
79  void stash_polynomials(scratch_programt &program,
80  std::map<exprt, polynomialt> &polynomials,
81  std::map<exprt, exprt> &stashed,
82  patht &path);
83 
84  exprt precondition(patht &path);
85  void abstract_arrays(exprt &expr, expr_mapt &abstractions);
86  void push_nondet(exprt &expr);
87 
88  bool do_assumptions(
89  std::map<exprt, polynomialt> polynomials,
90  patht &body,
91  exprt &guard,
92  guard_managert &guard_manager);
93 
94  typedef std::pair<exprt, exprt> expr_pairt;
95  typedef std::vector<expr_pairt> expr_pairst;
96 
98  {
102  };
103 
104  typedef std::vector<polynomial_array_assignmentt>
106 
107  bool do_arrays(goto_programt::instructionst &loop_body,
108  std::map<exprt, polynomialt> &polynomials,
109  substitutiont &substitution,
110  scratch_programt &program);
112  goto_programt::instructionst &loop_body,
113  expr_sett &arrays_written);
115  expr_pairst &array_assignments,
116  std::map<exprt, polynomialt> &polynomials,
117  polynomial_array_assignmentst &array_polynomials,
118  polynomialst &nondet_indices);
119  bool expr2poly(
120  exprt &expr,
121  std::map<exprt, polynomialt> &polynomials,
122  polynomialt &poly);
123 
124  bool do_nonrecursive(
125  goto_programt::instructionst &loop_body,
126  std::map<exprt, polynomialt> &polynomials,
127  substitutiont &substitution,
128  expr_sett &nonrecursive,
129  scratch_programt &program);
130  bool assign_array(
131  const index_exprt &lhs,
132  const exprt &rhs,
133  scratch_programt &program);
134 
135  void gather_array_accesses(const exprt &expr, expr_sett &arrays);
136 
137  void gather_rvalues(const exprt &expr, expr_sett &rvalues);
138 
139  void ensure_no_overflows(scratch_programt &program);
140 
141  void find_modified(const patht &path, expr_sett &modified);
142  void find_modified(
143  const goto_programt &program,
144  expr_sett &modified);
145  void find_modified(
146  const goto_programt::instructionst &instructions,
147  expr_sett &modified);
148  void find_modified(
150  expr_sett &modified);
151  void find_modified(
153  expr_sett &modified);
154 
155  symbolt fresh_symbol(std::string base, typet type);
156 
162 };
163 
164 #endif // CPROVER_GOTO_INSTRUMENT_ACCELERATE_ACCELERATION_UTILS_H
acceleration_utilst::symbol_table
symbol_tablet & symbol_table
Definition: acceleration_utils.h:157
path.h
symbol_tablet
The symbol table.
Definition: symbol_table.h:13
polynomialt
Definition: polynomial.h:41
acceleration_utilst
Definition: acceleration_utils.h:36
acceleration_utilst::do_assumptions
bool do_assumptions(std::map< exprt, polynomialt > polynomials, patht &body, exprt &guard, guard_managert &guard_manager)
Definition: acceleration_utils.cpp:331
acceleration_utilst::expr_pairst
std::vector< expr_pairt > expr_pairst
Definition: acceleration_utils.h:95
typet
The type of an expression, extends irept.
Definition: type.h:28
acceleration_utilst::fresh_symbol
symbolt fresh_symbol(std::string base, typet type)
Definition: acceleration_utils.cpp:1248
acceleration_utilst::push_nondet
void push_nondet(exprt &expr)
Definition: acceleration_utils.cpp:306
expr_listt
std::list< exprt > expr_listt
Definition: acceleration_utils.h:34
goto_programt::instructionst
std::list< instructiont > instructionst
Definition: goto_program.h:584
polynomial.h
acceleration_utilst::goto_functions
const goto_functionst & goto_functions
Definition: acceleration_utils.h:159
acceleration_utilst::assign_array
bool assign_array(const index_exprt &lhs, const exprt &rhs, scratch_programt &program)
Definition: acceleration_utils.cpp:992
acceleration_utilst::message_handler
message_handlert & message_handler
Definition: acceleration_utils.h:39
acceleration_utilst::do_arrays
bool do_arrays(goto_programt::instructionst &loop_body, std::map< exprt, polynomialt > &polynomials, substitutiont &substitution, scratch_programt &program)
Definition: acceleration_utils.cpp:531
exprt
Base class for all expressions.
Definition: expr.h:55
acceleration_utilst::check_inductive
bool check_inductive(std::map< exprt, polynomialt > polynomials, patht &path, guard_managert &guard_manager)
Definition: acceleration_utils.cpp:100
acceleration_utilst::find_modified
void find_modified(const patht &path, expr_sett &modified)
Definition: acceleration_utils.cpp:76
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:90
guard.h
guard_expr_managert
This is unused by this implementation of guards, but can be used by other implementations of the same...
Definition: guard_expr.h:19
acceleration_utilst::stash_polynomials
void stash_polynomials(scratch_programt &program, std::map< exprt, polynomialt > &polynomials, std::map< exprt, exprt > &stashed, patht &path)
Definition: acceleration_utils.cpp:177
acceleration_utilst::nil
nil_exprt nil
Definition: acceleration_utils.h:161
acceleration_utilst::expr2poly
bool expr2poly(exprt &expr, std::map< exprt, polynomialt > &polynomials, polynomialt &poly)
Definition: acceleration_utils.cpp:825
scratch_programt
Definition: scratch_program.h:61
nil_exprt
The NIL expression.
Definition: std_expr.h:3025
acceleration_utilst::acceleration_utilst
acceleration_utilst(symbol_tablet &_symbol_table, message_handlert &message_handler, const goto_functionst &_goto_functions, exprt &_loop_counter)
Definition: acceleration_utils.h:42
acceleration_utilst::precondition
exprt precondition(patht &path)
Definition: acceleration_utils.cpp:225
expr_sett
std::unordered_set< exprt, irep_hash > expr_sett
Definition: cone_of_influence.h:21
acceleration_utilst::ensure_no_overflows
void ensure_no_overflows(scratch_programt &program)
Definition: acceleration_utils.cpp:454
acceleration_utilst::extract_polynomial
void extract_polynomial(scratch_programt &program, std::set< std::pair< expr_listt, exprt >> &coefficients, polynomialt &polynomial)
Definition: acceleration_utils.cpp:1199
message_handlert
Definition: message.h:27
acceleration_utilst::polynomial_array_assignmentst
std::vector< polynomial_array_assignmentt > polynomial_array_assignmentst
Definition: acceleration_utils.h:105
acceleration_utilst::abstract_arrays
void abstract_arrays(exprt &expr, expr_mapt &abstractions)
Definition: acceleration_utils.cpp:277
acceleration_utilst::array_assignments2polys
bool array_assignments2polys(expr_pairst &array_assignments, std::map< exprt, polynomialt > &polynomials, polynomial_array_assignmentst &array_polynomials, polynomialst &nondet_indices)
Definition: acceleration_utils.cpp:766
goto_program.h
natural_loops_templatet< goto_programt, goto_programt::targett >::natural_loopt
parentt::loopt natural_loopt
Definition: natural_loops.h:52
substitutiont
std::map< exprt, exprt > substitutiont
Definition: polynomial.h:39
acceleration_utilst::polynomial_array_assignmentt::index
polynomialt index
Definition: acceleration_utils.h:100
goto_functionst
A collection of goto functions.
Definition: goto_functions.h:24
acceleration_utilst::gather_array_assignments
expr_pairst gather_array_assignments(goto_programt::instructionst &loop_body, expr_sett &arrays_written)
Definition: acceleration_utils.cpp:488
patht
std::list< path_nodet > patht
Definition: path.h:44
symbolt
Symbol table entry.
Definition: symbol.h:27
acceleration_utilst::polynomial_array_assignmentt::array
exprt array
Definition: acceleration_utils.h:99
acceleration_utilst::expr_pairt
std::pair< exprt, exprt > expr_pairt
Definition: acceleration_utils.h:94
natural_loops.h
cone_of_influence.h
acceleration_utilst::gather_array_accesses
void gather_array_accesses(const exprt &expr, expr_sett &arrays)
Definition: acceleration_utils.cpp:1180
polynomialst
std::vector< polynomialt > polynomialst
Definition: polynomial.h:63
acceleration_utilst::polynomial_array_assignmentt
Definition: acceleration_utils.h:97
goto_programt
A generic container class for the GOTO intermediate representation of one function.
Definition: goto_program.h:72
acceleration_utilst::loop_counter
exprt & loop_counter
Definition: acceleration_utils.h:160
goto_programt::const_targett
instructionst::const_iterator const_targett
Definition: goto_program.h:587
acceleration_utilst::polynomial_array_assignmentt::value
polynomialt value
Definition: acceleration_utils.h:101
acceleration_utilst::stash_variables
void stash_variables(scratch_programt &program, expr_sett modified, substitutiont &substitution)
Definition: acceleration_utils.cpp:196
index_exprt
Array index operator.
Definition: std_expr.h:1409
symbol_table.h
Author: Diffblue Ltd.
acceleration_utilst::acceleration_utilst
acceleration_utilst(symbol_tablet &_symbol_table, message_handlert &message_handler, const goto_functionst &_goto_functions)
Definition: acceleration_utils.h:55
expr_mapt
std::unordered_map< exprt, exprt, irep_hash > expr_mapt
Definition: acceleration_utils.h:31
acceleration_utilst::gather_rvalues
void gather_rvalues(const exprt &expr, expr_sett &rvalues)
Definition: acceleration_utils.cpp:37
acceleration_utilst::ns
namespacet ns
Definition: acceleration_utils.h:158
acceleration_utilst::do_nonrecursive
bool do_nonrecursive(goto_programt::instructionst &loop_body, std::map< exprt, polynomialt > &polynomials, substitutiont &substitution, expr_sett &nonrecursive, scratch_programt &program)
Definition: acceleration_utils.cpp:855