PIPS
path_transformer.c
Go to the documentation of this file.
1 /*
2 
3  $Id: mappings.c 22415 2015-07-01 11:11:41Z coelho $
4 
5  Copyright 1989-2016 MINES ParisTech
6 
7  This file is part of PIPS.
8 
9  PIPS is free software: you can redistribute it and/or modify it
10  under the terms of the GNU General Public License as published by
11  the Free Software Foundation, either version 3 of the License, or
12  any later version.
13 
14  PIPS is distributed in the hope that it will be useful, but WITHOUT ANY
15  WARRANTY; without even the implied warranty of MERCHANTABILITY or
16  FITNESS FOR A PARTICULAR PURPOSE.
17 
18  See the GNU General Public License for more details.
19 
20  You should have received a copy of the GNU General Public License
21  along with PIPS. If not, see <http://www.gnu.org/licenses/>.
22 
23 */
24 
25 // do not compile phase if not required
26 #include "phases.h"
27 #ifdef BUILDER_PATH_TRANSFORMER
28 
29 #ifdef HAVE_CONFIG_H
30  #include "pips_config.h"
31 #endif
32 
33 #include <stdio.h>
34 #include <ctype.h>
35 #include <string.h>
36 
37 #include "genC.h"
38 #include "linear.h"
39 
40 #include "ri.h"
41 #include "effects.h"
42 
43 #include "misc.h"
44 #include "pipsdbm.h"
45 #include "properties.h"
46 
47 #include "ri-util.h"
48 #include "prettyprint.h"
49 #include "text-util.h"
50 
51 #include "effects-generic.h" // used
52 #include "effects-simple.h" // expression_to_proper_constant_path_effects
53 // for set_methods_for_convex_effects() && init_convex_rw_prettyprint()
54 #include "effects-convex.h" // used
55 
56 #include "transformer.h"
57 #include "semantics.h"
58 
59 //modes
60 #define PATH_MODE int
61 #define MODE_SEQUENCE 0
62 #define MODE_PROLOGUE 1
63 #define MODE_PERMANENT 2
64 #define MODE_EPILOGUE 3
65 
66 
67 
68 //static bool sbegin_present;
69 //static bool send_present;
70 
71 
72 /*initialization for the use of path transformer */
73 //static int myindices[6];
74 static path pbegin;
75 static path pend;
76 //static int count;
77 
78 
79 static bool gen_indices(statement sl)
80 {
81  if(statement_loop_p(sl)){
82  loop l = statement_loop(sl);
83  expression index_l = range_lower(loop_range(l));//int_to_expression(myindices[count++]);
84  gen_array_addto(pbegin.indices, statement_ordering(sl), (void *)index_l);
85  expression index_u = range_upper(loop_range(l));//int_to_expression(myindices[count++]);
86  gen_array_addto(pend.indices, statement_ordering(sl),(void *)index_u);
87  }
88  return true;
89 }
90 
91 void path_initialize(statement s, statement sbegin, statement send, path *pb, path *pe)
92 {
93  pb->indices = gen_array_make(0);
94  pe->indices = gen_array_make(0);
95  pbegin = *pb;
96  pend = *pe;
97  /*myindices[0]= 2; myindices[1]= 5; myindices[2]= 2; myindices[3]= 5;
98  myindices[4]= 1; myindices[5]= 2;*/
99  //myindices[0]= 1; myindices[1]= 19; myindices[2]= 1; myindices[3]= 19;
100  //count =0;
101  gen_recurse(s,statement_domain,gen_indices,gen_null);
102  /*expression index_l = int_to_expression(myindices[0]);
103  gen_array_addto(pbegin.indices, statement_ordering(sbegin),(intptr_t)index_l);
104  expression index_u = int_to_expression(myindices[1]);
105  gen_array_addto(pend.indices, statement_ordering(send),(intptr_t)index_u);*/
106  //gen_array_append(pbegin.indices, statement_ordering(sbegin));
107  //gen_array_append(pend.indices, statement_ordering(send));
108  *pb = pbegin;
109  *pe = pend;
110  pb->statement = sbegin;
111  pe->statement = send;
112  return;
113 }
114 
115 static transformer precondition_in_off(statement s)
116 {
117  if(get_bool_property("SEMANTICS_COMPUTE_TRANSFORMERS_IN_CONTEXT"))
118  return load_statement_precondition(s);
119  else
120  return transformer_identity();
121 }
122 
123 static transformer do_loop_to_init_transformer(loop l, transformer pre __attribute__ ((unused)))
124 {
125  entity i = loop_index(l);
129  gen_full_free_list(eff);
130  return t_init;
131 }
132 
133 static transformer do_loop_to_enter_condition_transformer(loop l, transformer pre)
134 {
135  entity i = loop_index(l);
139  //transformer t_init = do_loop_to_init_transformer(l, transformer_undefined);
140  transformer t_enter_up = condition_to_transformer(e3, pre, false);
141  free_expression(e3);
142  e1 = entity_to_expression(i);
146  free_expression(e3);
147  transformer t_enter = transformer_combine(t_enter_up, t_enter_low);
148  free_transformer(t_enter_low);
149  return t_enter;
150 }
151 
152 static transformer do_loop_to_exit_condition_transformer(loop l, transformer pre __attribute__ ((unused)))
153 {
154  entity i = loop_index(l);
158  transformer t_exit = condition_to_transformer(e3, /*pre*/ transformer_undefined, true);
159  free_expression(e3);
160  return t_exit;
161 }
162 
163 
164 
165 
166 
167 static transformer approximative(statement sb, statement s, path pbegin, path pend)
168 {
169  statement sbegin = pbegin.statement;
170  loop l = statement_loop(s);
171  transformer tb, t_star, tb_complete;
172  transformer pre = precondition_in_off(sb);
173  tb = path_transformer_on(sb, pbegin, pend, MODE_PERMANENT);
174  transformer t_enter = do_loop_to_enter_condition_transformer(l, pre);
175  tb_complete = transformer_combine(copy_transformer(t_enter), tb);
177  // safe_expression_to_transformer(inc_e, transformer_undefined);
178  tb_complete = transformer_combine(tb_complete, t_inc);
179  //tb_complete = transformer_combine(tb_complete, t_enter);
180  t_star = transformer_derivative_fix_point(tb_complete);
181  //t_star = transformer_combine(t_star, t_enter);
182  //t_star = transformer_convex_hull(t_enter, t_star_plus
183  if(belong_to_statement(s,sbegin, false)){
184  t_star = transformer_combine(t_star, tb_complete);
185  }
186  free_transformer(t_enter);
187  //free_transformer(tb);
188  //free_transformer(t_star);
189  free_transformer(tb_complete);
190  //print_transformer(t);
191  return t_star;
192 }
193 
194 
195 
196 static transformer iterate(statement sb, statement s, path pbegin, path pend, expression low, expression high, PATH_MODE m)
197 {
198  loop l = statement_loop(s);
201  transformer tb, tb_complete;
202  transformer pre = precondition_in_off(sb);
203  transformer t_enter = transformer_identity();
204  t_enter = do_loop_to_enter_condition_transformer(l, precondition_in_off(s));
205  expression iteration_set = MakeBinaryCall(entity_intrinsic("-"),high,low);
206  iteration_set = MakeBinaryCall(entity_intrinsic("+"),iteration_set,int_to_expression(1));
207  tb = path_transformer_on(sb, pbegin, pend, m);
208  for(int i=1;i<=expression_to_int(iteration_set);i++)//low<=i<=high
209  {
210  tb_complete = transformer_combine(t_enter, tb);
211  tb_complete = transformer_add_loop_index_incrementation(tb_complete, l, pre);
212  t = transformer_combine(t, tb_complete);
213  }
214  free_transformer(t_enter);
215  //free_transformer(tb);
216  }
217  else
218  t = approximative(sb, s, pbegin, pend);
219  return t;
220 }
221 
222 static transformer path_transformer_on_loop(
224  path pbegin, path pend, PATH_MODE m,
225  expression ibegin, expression iend)
226 {
227  loop l = statement_loop(s);
228  statement sbegin = pbegin.statement;
229  statement send = pend.statement;
230  transformer pre = precondition_in_off(sb);
231  transformer t_exit = do_loop_to_exit_condition_transformer(l, pre);
232  //transformer t_init = do_loop_to_init_transformer(l, pre);
233  transformer t;
235  tp2 = transformer_undefined;
236 
237  if(m == MODE_SEQUENCE || m == MODE_PROLOGUE)
238  {
239  expression low =
241  expression high = (m == MODE_SEQUENCE) ?
243  : range_upper(loop_range(l));
244 
245  if (belong_to_statement(s, sbegin, false))
246  {
247  tp = path_transformer_on(sb, pbegin, pend, MODE_PROLOGUE);
248  transformer t_inc =
250  l, precondition_in_off(s));
251  tp = transformer_combine(tp, t_inc);
252  tp2 = copy_transformer(tp);
253  }
254  t = iterate(sb, s, pbegin, pend, low, high, MODE_PERMANENT);
255  tp = transformer_combine (tp,t);
256  // optimization: T^* = T^+ union id -- only if prologue exists
257  if (!belong_to_statement(s, send, false)) {
258  tp = transformer_combine(tp, t_exit);
259  }
262  {
263  if (belong_to_statement(s, sbegin, false)){
264  if (!belong_to_statement(s, send, false)){
265  // tp2 initialized above, same belong_ condition
266  tp2 = transformer_combine(tp2, t_exit);
267  }
268  tp = transformer_convex_hull(tp2, tp);
269  }
270  }
271  }
272  if(m == MODE_SEQUENCE || m == MODE_EPILOGUE)
273  {
274  t = transformer_identity();
276  expression high = (m == MODE_SEQUENCE)?
278  iend,int_to_expression(1));
279  if(m == MODE_EPILOGUE)
280  te = iterate(sb, s, pbegin, pend, low, high, MODE_PERMANENT);
281  else{ //avoid T* for the case of sequence: T^(-k)
282  te = transformer_identity();
283  }
284  if(belong_to_statement(s,send, false)){
285  t = path_transformer_on(sb, pbegin, pend, MODE_EPILOGUE);
286  transformer t_enter = do_loop_to_enter_condition_transformer(l, pre);
287  t = transformer_combine(t_enter, t);
288  }
289  te = transformer_combine (t, te);
290  }
291  tp = transformer_combine(tp,te);
292  return tp;
293 }
294 /* We assume that foreach loop, |upper-lower|>0*/
295 
296 transformer path_transformer_on(statement s, path pbegin, path pend, PATH_MODE m)
297 {
299  statement sbegin = pbegin.statement;
300  statement send = pend.statement;
301  if(statement_ordering(sbegin) == statement_ordering(s) && statement_ordering(send) == statement_ordering(s) && (m == MODE_SEQUENCE || m == MODE_EPILOGUE)) {
302  if(get_bool_property("IDENTITY_EMPTY_PATH_TRANSFORMER"))
303  return transformer_identity();
304  else
305  return transformer_empty();
306  }
307  if(statement_ordering(sbegin) == statement_ordering(s))
308  {
309  return complete_statement_transformer(load_statement_transformer(s), precondition_in_off(s),s);
310  }
311  else {
312  if(statement_ordering(send) == statement_ordering(s))
313  {
314  return transformer_identity();
315  }
316  }
317  switch (instruction_tag(inst))
318  {
319  case is_instruction_call:
320  {
321  statement sbegin = pbegin.statement;
322  statement send = pend.statement;
323  transformer ts;
324  ts = ((m == MODE_PERMANENT)
325  ||(m == MODE_SEQUENCE && statement_ordering(sbegin) <= statement_ordering(s)
326  && statement_ordering(s) <= statement_ordering(send))
327  ||(m == MODE_PROLOGUE && statement_ordering(sbegin) <= statement_ordering(s))
328  ||(m == MODE_EPILOGUE && statement_ordering(s) <= statement_ordering(send)))
330  return ts;
331  }
332  case is_instruction_block :
333  {
335  MAPL( stmt_ptr,
336  {
337  statement s1 = STATEMENT(CAR( stmt_ptr ));
338  transformer ts1 = path_transformer_on(s1, pbegin, pend, m);
339  ts = transformer_combine(ts, ts1);
340  },
341  instruction_block( inst ) );
342  return ts;
343  }
344  case is_instruction_test :
345  {
346  test t = instruction_test(inst);
347  transformer tt = path_transformer_on(test_true(t), pbegin, pend, m);
348  transformer tf = path_transformer_on(test_false(t), pbegin, pend, m);
349  //transformer tc = transformer_identity();
350  if(!belong_to_statement(s,sbegin, false) && !belong_to_statement(s,send, false))
352  //return transformer_convex_hull(tt, tf);
353  else {
354  if((belong_to_statement(test_true(t),sbegin, false) && belong_to_statement(test_false(t),send, false)) || (belong_to_statement(test_true(t),send, false) && belong_to_statement(test_false(t),sbegin, false))){
355  if(m == MODE_PERMANENT)
356  return transformer_convex_hull( tt, tf);
357  else
358  return transformer_empty();
359  }
360  else {
361  if(belong_to_statement(test_true(t),sbegin, false) || belong_to_statement(test_true(t),send, false)){
363  return transformer_combine(t_cond, tt);
364  }
365  else {
366  if(belong_to_statement(test_false(t),sbegin, false) || belong_to_statement(test_false(t),send, false)){
368  return transformer_combine(t_cond, tf);
369  }
370  }
371 
372  /*if(!transformer_identity_p(tt) && !transformer_identity_p(tf))
373  return transformer_empty();//false
374  else
375  return transformer_combine( tt, tf);*/
376  }
377  }
378  return transformer_convex_hull( tt, tf);
379  break;
380  }
381  case is_instruction_loop :
382  {
383  loop l = statement_loop(s);
384  statement sb = loop_body(l);
385  transformer pre = precondition_in_off(sb);
388  transformer t_exit = do_loop_to_exit_condition_transformer(l, pre);
389  transformer t_init = do_loop_to_init_transformer(l, precondition_in_off(s));
390  transformer t;
391  if(!belong_to_statement(s,sbegin, false) && !belong_to_statement(s,send, false))
393  else if(m == MODE_PERMANENT){
394  t = iterate(sb, s, pbegin, pend, range_lower(loop_range(l)), range_upper(loop_range(l)), m);
395  t = transformer_combine(copy_transformer(t_init), t);
396  t = transformer_combine(t, t_exit);
397  return t;
398  }
399  else{
400  transformer t_one_iteration = path_transformer_on(sb, pbegin, pend, m);
401  t = path_transformer_on_loop(sb, s, pbegin, pend, m, ibegin, iend);
402  if(!belong_to_statement(s,sbegin, false)){
403  t = transformer_combine(copy_transformer(t_init), t);
404  }
405  if(belong_to_statement(s,sbegin, false) && !belong_to_statement(s,send, false)){
406  transformer t_inc = transformer_add_loop_index_incrementation(transformer_identity(), l, precondition_in_off(s));
407  t_one_iteration = transformer_combine(t_one_iteration, t_inc);
408  t_one_iteration = transformer_combine(t_one_iteration, t_exit);
409  }
410  if(belong_to_statement(s,send, false) && !belong_to_statement(s,sbegin, false)){
411  transformer t_enter = do_loop_to_enter_condition_transformer(l, pre);
412  t_one_iteration = transformer_combine(t_enter, t_one_iteration);
413  t_one_iteration = transformer_combine(t_init, t_one_iteration);
414  }
416  if(m == MODE_SEQUENCE && expression_equal_p(ibegin, iend))
417  return t_one_iteration;
418  else
419  return t;
420  }
421  else{
422  t = transformer_convex_hull(t_one_iteration, t);
423  return t;
424  }
425  }
426  break;
427  return t;
428  }
430  {
431  pips_user_warning("Not implemented yet");
432  return transformer_identity();
433  }
434  default:
435  return load_statement_transformer(s);
436  }
437 }
438 
440 {
441  transformer patht = path_transformer_on(s, pbegin, pend, 0);
442  return patht;
443 }
444 
445 
446 bool path_transformer(const string module_name)
447 {
448  entity module;
449  statement module_stat;
450 
452  module_stat = (statement)db_get_memory_resource(DBR_CODE, module_name, true);
453  set_ordering_to_statement(module_stat);
455  set_current_module_statement(module_stat);
458  db_get_memory_resource(DBR_TRANSFORMERS, module_name, true));
460  db_get_memory_resource(DBR_PROPER_EFFECTS, module_name, true));
462  db_get_memory_resource(DBR_CUMULATED_EFFECTS, module_name, true));
466 
467  /*Properties to set the parameters of the path transformer*/
468  string sbegin_label_name = (string) get_string_property("PATH_TRANSFORMER_BEGIN");
469  string send_label_name = (string) get_string_property("PATH_TRANSFORMER_END");
471  pips_internal_error("The sbegin label does not exist");
473  pips_internal_error("The send label does not exist");
476  path_initialize(module_stat, sbegin, send, &pbegin, &pend);
477  transformer cumulated_transformer = compute_path_transformer(module_stat, pbegin, pend);
478  cumulated_transformer = transformer_normalize(cumulated_transformer,2);
479 
480  string local = db_build_file_resource_name(DBR_PATH_TRANSFORMER_FILE, module_name, ".pt");
481  string dir = db_get_current_workspace_directory();
482  string full = strdup(concatenate(dir,"/",local, NULL));
483  free(dir);
484  FILE * fp = safe_fopen(full,"w");
485  text txt = make_text(NIL);
486  MERGE_TEXTS(txt, text_module(module, module_stat));
487  ADD_SENTENCE_TO_TEXT(txt,MAKE_ONE_WORD_SENTENCE(0,"\nThe path transformer between Sbegin and Send is:"));
488  //init_prettyprint(semantic_to_text);
490  MERGE_TEXTS(txt, text_transformer(cumulated_transformer));
491  print_text(fp,txt);
492  //fprint_transformer(fp, transformer_normalize(cumulated_transformer,2), (get_variable_name_t) external_value_name);
493  //fprint_transformer(fp, cumulated_transformer, (get_variable_name_t) external_value_name);
494  free_text(txt);
495  safe_fclose(fp,full);
496  free(full);
497  DB_PUT_FILE_RESOURCE(DBR_PATH_TRANSFORMER_FILE, module_name, local);
498 
508  return true;
509 }
510 
511 #endif // BUILDER_PATH_TRANSFORMER
float a2sf[2] __attribute__((aligned(16)))
USER generates a user error (i.e., non fatal) by printing the given MSG according to the FMT.
Definition: 3dnow.h:3
void free_transformer(transformer p)
Definition: ri.c:2616
expression copy_expression(expression p)
EXPRESSION.
Definition: ri.c:850
void free_expression(expression p)
Definition: ri.c:853
transformer copy_transformer(transformer p)
TRANSFORMER.
Definition: ri.c:2613
text make_text(list a)
Definition: text.c:107
void free_text(text p)
Definition: text.c:74
gen_array_t gen_array_make(size_t size)
declarations...
Definition: array.c:40
void gen_array_addto(gen_array_t a, size_t i, void *what)
Definition: array.c:87
void * gen_array_item(const gen_array_t a, size_t i)
Definition: array.c:143
transformer transformer_identity()
Allocate an identity transformer.
Definition: basic.c:110
transformer transformer_empty()
Allocate an empty transformer.
Definition: basic.c:120
struct _newgen_struct_statement_ * statement
Definition: cloning.h:21
transformer transformer_derivative_fix_point(transformer)
Computation of a transitive closure using constraints on the discrete derivative.
Definition: fix_point.c:1067
void set_methods_for_convex_effects(void)
methods.c
Definition: methods.c:235
void init_convex_rw_prettyprint(const char *)
void reset_proper_rw_effects(void)
void set_proper_rw_effects(statement_effects)
void set_cumulated_rw_effects(statement_effects)
void generic_effects_reset_all_methods(void)
void reset_cumulated_rw_effects(void)
list expression_to_proper_constant_path_effects(expression)
const char * module_name(const char *s)
Return the module part of an entity name.
Definition: entity_names.c:296
FILE * safe_fopen(const char *filename, const char *what)
Definition: file.c:67
char * get_string_property(const char *)
int safe_fclose(FILE *stream, const char *filename)
Definition: file.c:77
bool get_bool_property(const string)
FC 2015-07-20: yuk, moved out to prevent an include cycle dependency include "properties....
#define gen_recurse(start, domain_number, flt, rwt)
Definition: genC.h:283
void gen_full_free_list(list l)
Definition: genClib.c:1023
void free(void *)
void reset_current_module_entity(void)
Reset the current module entity.
Definition: static.c:97
void reset_current_module_statement(void)
Reset the current module statement.
Definition: static.c:221
const char * get_current_module_name(void)
Get the name of the current module.
Definition: static.c:121
statement set_current_module_statement(statement)
Set the current module statement.
Definition: static.c:165
statement get_current_module_statement(void)
Get the current module statement.
Definition: static.c:208
entity set_current_module_entity(entity)
static.c
Definition: static.c:66
entity get_current_module_entity(void)
Get the entity of the current module.
Definition: static.c:85
void gen_null(__attribute__((unused)) void *unused)
Ignore the argument.
Definition: genClib.c:2752
#define NIL
The empty list (nil in Lisp)
Definition: newgen_list.h:47
#define CAR(pcons)
Get the value of the first element of a list.
Definition: newgen_list.h:92
#define MAPL(_map_list_cp, _code, _l)
Apply some code on the addresses of all the elements of a list.
Definition: newgen_list.h:203
string db_get_memory_resource(const char *rname, const char *oname, bool pure)
Return the pointer to the resource, whatever it is.
Definition: database.c:755
#define DB_PUT_FILE_RESOURCE
Put a file resource into the current workspace database.
Definition: pipsdbm-local.h:85
loop statement_loop(statement)
Get the loop of a statement.
Definition: statement.c:1374
bool statement_loop_p(statement)
Definition: statement.c:349
statement find_statement_from_label_name(statement, const char *, const char *)
Definition: statement.c:3816
bool belong_to_statement(statement, statement, bool)
return true if s is enclosed in stmt NL: What is the difference with statement_in_statement_p?
Definition: statement.c:4304
bool expression_constant_p(expression)
HPFC module by Fabien COELHO.
Definition: expression.c:2453
string db_build_file_resource_name(const char *rname, const char *oname, const char *suffix)
returns an allocated file name for a file resource.
Definition: lowlevel.c:169
#define pips_user_warning
Definition: misc-local.h:146
#define pips_internal_error
Definition: misc-local.h:149
string concatenate(const char *,...)
Return the concatenation of the given strings.
Definition: string.c:183
char * string
STRING.
Definition: newgen_types.h:39
hash_table set_ordering_to_statement(statement s)
To be used instead of initialize_ordering_to_statement() to make sure that the hash table ots is in s...
Definition: ordering.c:172
void reset_ordering_to_statement(void)
Reset the mapping from ordering to statement.
Definition: ordering.c:185
static char * module
Definition: pips.c:74
string db_get_current_workspace_directory(void)
Definition: workspace.c:96
text text_module(entity, statement)
#define GREATER_THAN_OPERATOR_NAME
#define binary_intrinsic_expression(name, e1, e2)
#define is_instruction_block
soft block->sequence transition
#define GREATER_OR_EQUAL_OPERATOR_NAME
#define instruction_block(i)
entity local_name_to_top_level_entity(const char *n)
This function try to find a top-level entity from a local name.
Definition: entity.c:1450
entity module_name_to_entity(const char *mn)
This is an alias for local_name_to_top_level_entity.
Definition: entity.c:1479
static int init
Maximal value set for Fortran 77.
Definition: entity.c:320
entity entity_intrinsic(const char *name)
FI: I do not understand this function name (see next one!).
Definition: entity.c:1292
bool label_defined_in_current_module_p(entity l)
Definition: entity.c:399
int expression_to_int(expression exp)
================================================================
Definition: expression.c:2205
expression entity_to_expression(entity e)
if v is a constant, returns a constant call.
Definition: expression.c:165
expression MakeBinaryCall(entity f, expression eg, expression ed)
Creates a call expression to a function with 2 arguments.
Definition: expression.c:354
bool expression_equal_p(expression e1, expression e2)
Syntactic equality e1==e2.
Definition: expression.c:1347
expression int_to_expression(_int i)
transform an int into an expression and generate the corresponding entity if necessary; it is not cle...
Definition: expression.c:1188
entity find_label_entity(const char *, const char *)
util.c
Definition: util.c:43
#define loop_body(x)
Definition: ri.h:1644
#define transformer_undefined
Definition: ri.h:2847
#define range_upper(x)
Definition: ri.h:2290
#define statement_ordering(x)
Definition: ri.h:2454
#define test_false(x)
Definition: ri.h:2837
#define statement_domain
newgen_sizeofexpression_domain_defined
Definition: ri.h:362
@ is_instruction_test
Definition: ri.h:1470
@ is_instruction_call
Definition: ri.h:1474
@ is_instruction_forloop
Definition: ri.h:1477
@ is_instruction_loop
Definition: ri.h:1471
#define instruction_tag(x)
Definition: ri.h:1511
#define test_true(x)
Definition: ri.h:2835
#define test_condition(x)
Definition: ri.h:2833
#define range_lower(x)
Definition: ri.h:2288
#define statement_instruction(x)
Definition: ri.h:2458
#define loop_range(x)
Definition: ri.h:1642
#define instruction_test(x)
Definition: ri.h:1517
#define loop_index(x)
Definition: ri.h:1640
#define STATEMENT(x)
STATEMENT.
Definition: ri.h:2413
transformer complete_statement_transformer(transformer t, transformer pre, statement s)
Returns the effective transformer ct for a given statement s.
transformer any_scalar_assign_to_transformer(entity v, expression rhs, list ef, transformer pre)
precondition
char * strdup()
transformer condition_to_transformer(expression cond, transformer pre, bool veracity)
To capture side effects and to add C twist for numerical conditions.
Definition: expression.c:5348
transformer transformer_add_loop_index_incrementation(transformer tf, loop l, transformer pre)
Definition: loop.c:1136
void module_to_value_mappings(entity m)
void module_to_value_mappings(entity m): build hash tables between variables and values (old,...
Definition: mappings.c:624
void set_prettyprint_transformer(void)
Definition: prettyprint.c:77
text text_transformer(transformer tran)
text text_transformer(transformer tran) input : a transformer representing a transformer or a precond...
Definition: prettyprint.c:464
bool path_transformer(const string)
transformer path_transformer_on(statement, path, path, int)
transformer load_statement_precondition(statement)
void set_transformer_map(statement_mapping)
transformer load_statement_transformer(statement)
void reset_precondition_map(void)
transformer compute_path_transformer(statement, path, path)
void set_precondition_map(statement_mapping)
void path_initialize(statement, statement, statement, path *, path *)
path_transformer.c
void reset_transformer_map(void)
s1
Definition: set.c:247
The structure used to build lists in NewGen.
Definition: newgen_list.h:41
statement statement
gen_array_t indices
Definition: statement.c:4047
#define MERGE_TEXTS(r, t)
#define MAKE_ONE_WORD_SENTENCE(m, s)
#define ADD_SENTENCE_TO_TEXT(t, p)
void print_text(FILE *fd, text t)
Definition: print.c:195
transformer transformer_convex_hull(transformer t1, transformer t2)
transformer transformer_convex_hull(t1, t2): compute convex hull for t1 and t2; t1 and t2 are slightl...
Definition: convex_hull.c:216
transformer transformer_normalize(transformer t, int level)
Eliminate (some) rational or integer redundancy.
Definition: transformer.c:932
transformer transformer_combine(volatile transformer t1, transformer t2)
transformer transformer_combine(transformer t1, transformer t2): compute the composition of transform...
Definition: transformer.c:238
void free_value_mappings(void)
Normal call to free the mappings.
Definition: value.c:1212
@ full
Definition: union-local.h:65