PIPS
alias_pairs.c
Go to the documentation of this file.
1 /*
2 
3  $Id: alias_pairs.c 23412 2017-08-09 15:07:09Z irigoin $
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 #ifdef HAVE_CONFIG_H
25  #include "pips_config.h"
26 #endif
27 #include <stdio.h>
28 #include <string.h>
29 
30 #include <setjmp.h>
31 
32 #include "genC.h"
33 #include "linear.h"
34 #include "ri.h"
35 #include "effects.h"
36 #include "database.h"
37 
38 #include "ri-util.h"
39 #include "effects-util.h"
40 #include "misc.h"
41 #include "text.h"
42 
43 #include "effects-generic.h"
44 #include "effects-convex.h"
45 
46 #include "semantics.h" // value_mappings..
47 #include "transformer.h" // free_value_mappings()
48 
49 #include "pipsdbm.h"
50 
51 /* Instantiation of the dependence graph: */
52 #include "dg.h"
55 
56 #include "graph.h"
57 
58 #define BACKWARD true
59 #define FORWARD false
60 
61 
62 static entity callee;
65 static list list_pairs = NIL;
66 
67 
68 /* creation of a Pbase containing just the PHI variables of the region */
69 static Pbase
71 {
72  Pbase phi_variables;
73  list indices;
74 
75  pips_debug(4,"begin\n");
76  phi_variables = BASE_NULLE;
77 
79  MAP(EXPRESSION, index,
80  {
81  entity e;
82 
84  if (variable_phi_p(e))
85  {
86  pips_debug(9,"add: %s\n",entity_local_name(e));
87 
88  phi_variables = base_add_variable(phi_variables,(Variable) e);
89  }
90  },
91  indices);
92 
93  pips_debug(4,"end\n");
94 
95  return phi_variables;
96 }
97 
98 
99 /* strips from the region all the constraints which do not affect
100  * (even transitively) the PHI variables
101  * i.e. the function representing the region no longer returns the
102  * empty region if a branch condition is not satisfied
103  * so the region becomes MAY-in-the-usual-dataflow-sense
104  */
105 static region
107 {
108  Pbase phi_variables;
109  Psysteme sc;
110  region new_reg;
111 
112  pips_debug(4,"begin\n");
113 
114 
115  sc = region_system(reg);
116  phi_variables = make_base_phi_variables(reg);
117  new_reg = region_dup(reg);
118 
119  ifdebug(9)
120  {
122  pips_debug(9,"call sc_restricted_to_variables_transitive_closure for:\t\n");
123  print_region(reg);
124  }
125 
126  region_system(new_reg) =
128 
129  ifdebug(9)
130  {
131  pips_debug(9,"restricted region:\n\t");
132  print_region(new_reg);
134  }
135 
136  pips_debug(4,"end\n");
137 
138  return new_reg;
139 }
140 
141 /* "convert" EXACT regions to exact representations of
142  * MAY-in-the-usual-dataflow-sense regions
143  */
144 static region
146 {
147  region new_reg;
148 
149  pips_debug(4,"begin\n");
150 
151  new_reg = restrict_to_phi_constraints(reg);
153 
154  pips_debug(4,"end\n");
155 
156  return(new_reg);
157 }
158 
159 
160 /* all MAY regions are "converted" to over-approximate representations of
161  * MAY-in-the-usual-dataflow-sense regions (some regions may in fact be
162  * precise representations of MAY-in-the-usual-dataflow-sense regions after
163  * this operation, but we cannot detect which)
164  */
165 static region
167 {
168  region new_reg;
169 
170  pips_debug(4,"begin\n");
171 
172  new_reg = restrict_to_phi_constraints(reg);
174 
175  pips_debug(4,"end\n");
176 
177  return(new_reg);
178 }
179 
180 
181 /* takes EXACT (i.e. precise representations of MUST in the usual
182  * dataflow sense) and MAY (i.e. over-approximate representations of MUST
183  * regions or either over-approximate or precise representations of
184  * MAY-in-the-usual-dataflow-sense) regions and "converts" them to
185  * exact or over-approximate representations of
186  * MAY-in-the-usual-dataflow-sense) regions
187  * by stripping all the constraints which do not affect
188  * (even transitively) the PHI variables
189  */
190 static region
192 {
193  region new_reg;
194 
195  pips_debug(4,"begin\n");
196 
197  if (region_scalar_p(reg))
198  {
199  pips_debug(9,"scalar\n");
200 
201  new_reg = reg;
203  }
204  else
205  {
206  if ( effect_exact_p(reg) || effect_exact_p(reg) )
207  new_reg = convert_exact_to_exact_may(reg);
208  else
209  {
210  if (!effect_may_p(reg))
211  pips_debug(4,"unknown approximation tag\n");
212  new_reg = approx_convert_may_to_approx_may(reg);
213  }
214  }
215  pips_debug(4,"end\n");
216 
217  return new_reg;
218 }
219 
220 
221 /* modifies global var current_caller_stmt */
222 static bool stmt_filter(s)
223 statement s;
224 {
225  pips_debug(9, "statement %td\n", statement_number(s));
226 
228  return(true);
229 }
230 
231 
232 /* static void
233  * add_parameter_aliases_for_this_call_site(call call_site,
234  * transformer context, list real_args)
235  * constructs the alias pairs for the effective parameters (but not for
236  * COMMON regions) at this call site and adds them to the list
237  * input : parameters: a call site and the calling context
238  * global variables: callee,list_regions_callee,list_pairs
239  * output : void
240  * global vars IN: list_regions_callee and list_pairs
241  * modifies : global var list_pairs
242  * for each region in list_regions_callee which is a region of a
243  * formal parameter (of the callee) and for which the corresponding
244  * real parameter is an expression with only one entity, this
245  * function performs
246  * the backward translation: callee_region -> real_region
247  * and adds an alias pair <callee_region,real_region> to list_pairs
248  * comment :
249  *
250  * Algorithm :
251  * -----------
252  * let list_regions_callee be the list of the regions on variables
253  * of callee
254  * let list_pairs be the list of alias pairs for the callee
255  *
256  * FOR each expression real_exp IN real_args
257  * arg_num = number in the list of the function real arguments
258  * FOR each callee_region IN list_regions_callee
259  * callee_ent = entity of the region callee_region
260  * IF callee_ent is the formal parameter numbered arg_num
261  * IF real_exp is an lhs (expression with one entity)
262  * real_region = translation of the region callee_region
263  * list_pairs = list_pairs + <callee_region,real_region>
264  * ENDIF
265  * ENDIF
266  * ENDFOR
267  * ENDFOR
268  */
269 static void
272  list real_args)
273 {
274  list r_args;
275  int arg_num;
276 
277  pips_debug(4,"begin\n");
278 
279 /* real_args = call_arguments(call_site); */
280 
281  for (r_args = real_args, arg_num = 1; r_args != NIL;
282  r_args = CDR(r_args), arg_num++)
283  {
284  pips_debug(9,"compare formal parameter arg_num %03d\n",arg_num);
285 
286  MAP(EFFECT, callee_region,
287  {
288 /* entity callee_ent = region_entity(callee_region); */
289 
290  pips_debug(9,"\tand entity %s\n",
291  entity_name(region_entity(callee_region)));
292 
293  /* If the formal parameter corresponds to the real argument then
294  * we perform the translation.
295  */
296  if (ith_parameter_p(callee,region_entity(callee_region),arg_num))
297  {
298  expression real_exp = EXPRESSION(CAR(r_args));
299  syntax real_syn = expression_syntax(real_exp);
300 
301  pips_debug(9,"match\n");
302 
303  /* If the real argument is a reference to an entity, then we
304  * translate the regions of the corresponding formal parameter
305  */
306  if (syntax_reference_p(real_syn))
307  {
308  reference real_ref = syntax_reference(real_syn);
309  entity real_ent = reference_variable(real_ref);
310  region trans;
311  region formal;
312  region actual;
313  list pair;
314 
315  pips_debug(9,"arg refers to entity\n");
316  pips_debug(9,"\t%s\n",entity_name(real_ent));
317 
318  trans =
320  callee_region,
321  callee,
323  real_ent,
325  real_ref,
326  VALUE_ZERO,
327  BACKWARD);
328 
329  pair = CONS(EFFECT,trans,NIL);
330 
331  ifdebug(9)
332  {
333  pips_debug(9,"region translated to:\n\t");
334  print_inout_regions(pair);
335  }
336 
337  /* the actual parameter must be expressed relative to
338  the store at the point of entry of the caller, so
339  that it can be compared to other regions */
340 
341  pair =
343 
344  ifdebug(9)
345  {
346  pips_debug(9,"relative to initial store:\n\t");
347  print_inout_regions(pair);
348  }
349 
350  /* convert actual and formal regions to
351  MAY-in-the-usual-dataflow-sense */
352  actual = approx_convert(EFFECT(CAR(pair)));
353 
354  pair = CONS(EFFECT,actual,NIL);
355 
356  ifdebug(9)
357  {
358  pips_debug(9,"restricted to:\n\t");
359  print_inout_regions(pair);
360  }
361 
362 /* gave Newgen error
363  formal = approx_convert(callee_region); */
364 
365  formal = approx_convert(region_dup(callee_region));
366 
367  pair = CONS(EFFECT,formal,pair);
368 
369  ifdebug(9)
370  {
371  pips_debug(9,"alias pair:\n\t");
372  print_inout_regions(pair);
373  }
374 
376  }
377  }
379  }
380 
381  pips_debug(4,"end\n");
382 
383 }
384 
385 /* constructs the alias pairs for this call site and adds them to the list
386  * global vars IN: callee, list_regions_callee, current_caller_stmt
387  * and list_pairs
388  * modifies global var: list_pairs
389  */
390 
391 static bool
393 {
395  list real_args;
396 
397  if (call_function(call_site) != callee) return true;
398 
399  pips_debug(4,"begin\n");
400 
401 /* pips_debug(9,
402  "try load_statement_precondition for statement %03d\n",
403  statement_number(current_caller_stmt));
404  */
405 
407 
408 /* transformer_to_string no longer implemented */
409 /* pips_debug(9,"got context:\n\t%s\n",transformer_to_string(context)); */
410 
411 /* pips_debug(9,"try call_arguments\n"); */
412 
413  real_args = call_arguments(call_site);
414 
415 /* pips_debug(9,"try set_interprocedural_translation_context_sc\n");
416  pips_debug(9,"\tfor callee %s\n",entity_name(callee)); */
417 
419 
420 /* pips_debug(9,"try set_backward_arguments_to_eliminate\n"); */
421 
423 
425 /* add_common_aliases_for_this_call_site(); */
426 
429 
430  pips_debug(4,"end\n");
431 
432  return true;
433 }
434 
435 
436 /* constructs the alias pairs for this caller and adds them to the list
437  * global vars IN: callee, list_regions_callee and list_pairs
438  * modifies global vars: list_pairs and current_caller_stmt
439  */
440 static void
442 {
443  const char *caller_name;
444  statement caller_statement;
445 
448  caller_name = module_local_name(caller);
449  pips_debug(4,"begin for caller: %s\n", caller_name);
450 
451  /* ATTENTION: we must do ALL this before calling
452  * set_interprocedural_translation_context_sc
453  * (in add_alias_pairs_for_this_call_site
454  * called by the gen_multi_recurse below) !!!
455  */
456  /* the current module becomes the caller */
457  regions_init();
460  db_get_memory_resource(DBR_CODE, caller_name, true) );
462  db_get_memory_resource(DBR_CUMULATED_EFFECTS, caller_name, true));
464  db_get_memory_resource(DBR_PROPER_EFFECTS, caller_name, true));
465  module_to_value_mappings(caller);
467  db_get_memory_resource(DBR_PRECONDITIONS, caller_name, true));
468  /* that's it,
469  * but we musn't forget to reset it all again below !
470  */
471 
472  caller_statement = get_current_module_statement();
473 
474 
475 /* gen_multi_recurse(obj,
476  * [domain, filter, rewrite,]*
477  * NULL);
478  *
479  * recurse from object obj,
480  * applies filter_i on encountered domain_i objects,
481  * if true, recurses down from the domain_i object,
482  * and applies rewrite_i on exit from the object.
483  */
484 
485  gen_multi_recurse(caller_statement,
487  stmt_filter,
488  gen_null,
489  call_domain,
491  gen_null,
492  NULL);
493 
499  regions_end();
500 
503 
504  pips_debug(4,"end\n");
505 
506 }
507 
508 
509 /* generic function (i.e. used for IN and OUT regions) for constructing
510  * the list of alias pairs for this module
511  * parameters: module name and list of regions
512  * global vars IN: none
513  * modifies global vars: callee, list_regions_callee, current_caller_stmt
514  * and list_pairs
515  */
516 static list
517 alias_pairs( const char* module_name, list l_reg )
518 {
519 
520  callees callers;
521 
522  pips_debug(4,"begin for module %s\n",module_name);
523 
526  list_regions_callee = l_reg;
527 
528  ifdebug(9)
529  {
530  /* ATTENTION: we have to do ALL this
531  * just to call print_inout_regions for debug !!
532  */
534  db_get_memory_resource(DBR_CODE,
535  module_name,
536  true) );
539  DBR_CUMULATED_EFFECTS,
540  module_name,
541  true));
544  DBR_PROPER_EFFECTS,
545  module_name,
546  true));
548  /* that's it, but we musn't forget to reset everything below */
549 
550  pips_debug(9,"list_regions_callee is: \n");
552 
557  }
558 
559  /* we need the callers of the current module */
560  callers = (callees) db_get_memory_resource(DBR_CALLERS,
561  module_name,
562  true);
563 
564  /* we scan the callers to find the call sites,
565  * and fill in the list of alias pairs (list_pairs)
566  */
567  list_pairs = NIL;
569  {
572  },
573  callees_callees(callers));
574 
576 
577  pips_debug(4,"end\n");
578 
579  return list_pairs;
580 }
581 
582 
583 /* top-level creation of pairs of aliases of IN regions of the module
584  * modifies global vars callee, list_regions_callee, list_pairs and
585  * current_caller_stmt
586  */
587 bool in_alias_pairs( const string module_name )
588 {
589  list l_reg, l_pairs;
590 
591  debug_on("ALIAS_PAIRS_DEBUG_LEVEL");
592  pips_debug(4,"begin for module %s\n",module_name);
593 
594  /* we need the IN summary regions*/
595  l_reg = effects_to_list((effects)
596  db_get_memory_resource(DBR_IN_SUMMARY_REGIONS,
597  module_name,
598  true));
599 
600 /* was (but didn't work)
601  l_reg = (list) db_get_memory_resource(DBR_IN_SUMMARY_REGIONS,
602  module_name,
603  true);
604  */
605 
606  l_pairs = alias_pairs(module_name, l_reg);
607 
608  DB_PUT_MEMORY_RESOURCE(DBR_IN_ALIAS_PAIRS,
610  (char*) make_effects_classes(l_pairs));
611 
612  pips_debug(4,"end\n");
613  debug_off();
614 
615  return(true);
616 
617 }
618 
619 /* top-level creation of pairs of aliases of OUT regions of the module
620  * modifies global vars callee, list_regions_callee, list_pairs and
621  * current_caller_stmt
622  */
623 bool out_alias_pairs( const char* module_name )
624 {
625  list l_reg, l_pairs;
626 
627  debug_on("ALIAS_PAIRS_DEBUG_LEVEL");
628  pips_debug(4,"begin for module %s\n",module_name);
629 
630  /* we need the OUT summary regions*/
631  l_reg = effects_to_list((effects)
632  db_get_memory_resource(DBR_OUT_SUMMARY_REGIONS,
633  module_name,
634  true));
635 
636 /* was (but didn't work)
637  l_reg = (list) db_get_memory_resource(DBR_OUT_SUMMARY_REGIONS,
638  module_name,
639  true);
640  */
641 
642 
643  l_pairs = alias_pairs(module_name, l_reg);
644 
645  DB_PUT_MEMORY_RESOURCE(DBR_OUT_ALIAS_PAIRS,
647  (char*) make_effects_classes(l_pairs));
648 
649  pips_debug(4,"end\n");
650  debug_off();
651 
652  return(true);
653 
654 }
655 
656 
657 
658 
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
effects_classes make_effects_classes(list a)
Definition: effects.c:526
effects make_effects(list a)
Definition: effects.c:568
static const char * caller_name
Definition: alias_check.c:122
static statement current_caller_stmt
Definition: alias_pairs.c:64
static list list_pairs
Definition: alias_pairs.c:65
static bool add_alias_pairs_for_this_call_site(call call_site)
constructs the alias pairs for this call site and adds them to the list global vars IN: callee,...
Definition: alias_pairs.c:392
static void add_parameter_aliases_for_this_call_site(call call_site __attribute__((unused)), transformer context, list real_args)
static void add_parameter_aliases_for_this_call_site(call call_site, transformer context,...
Definition: alias_pairs.c:270
static region convert_exact_to_exact_may(region reg)
"convert" EXACT regions to exact representations of MAY-in-the-usual-dataflow-sense regions
Definition: alias_pairs.c:145
static region approx_convert_may_to_approx_may(region reg)
all MAY regions are "converted" to over-approximate representations of MAY-in-the-usual-dataflow-sens...
Definition: alias_pairs.c:166
static Pbase make_base_phi_variables(region reg)
creation of a Pbase containing just the PHI variables of the region
Definition: alias_pairs.c:70
static bool stmt_filter(statement s)
modifies global var current_caller_stmt
Definition: alias_pairs.c:222
dg_vertex_label vertex_label
Definition: alias_pairs.c:54
bool in_alias_pairs(const string module_name)
top-level creation of pairs of aliases of IN regions of the module modifies global vars callee,...
Definition: alias_pairs.c:587
static entity callee
Definition: alias_pairs.c:62
static list list_regions_callee
Definition: alias_pairs.c:63
dg_arc_label arc_label
Instantiation of the dependence graph:
Definition: alias_pairs.c:53
static void add_alias_pairs_for_this_caller(entity caller)
constructs the alias pairs for this caller and adds them to the list global vars IN: callee,...
Definition: alias_pairs.c:441
static list alias_pairs(const char *module_name, list l_reg)
generic function (i.e.
Definition: alias_pairs.c:517
bool out_alias_pairs(const char *module_name)
top-level creation of pairs of aliases of OUT regions of the module modifies global vars callee,...
Definition: alias_pairs.c:623
static region restrict_to_phi_constraints(region reg)
strips from the region all the constraints which do not affect (even transitively) the PHI variables ...
Definition: alias_pairs.c:106
#define BACKWARD
Definition: alias_pairs.c:58
static region approx_convert(region reg)
takes EXACT (i.e.
Definition: alias_pairs.c:191
#define VALUE_ZERO
Pbase base_add_variable(Pbase b, Variable var)
Pbase base_add_variable(Pbase b, Variable v): add variable v as a new dimension to basis b at the end...
Definition: base.c:88
#define region_any_reference(reg)
To be avoided.
#define region_entity(reg)
#define region_system(reg)
#define region
simulation of the type region
#define region_scalar_p(reg)
void set_backward_arguments_to_eliminate(entity)
void get_in_out_regions_properties(void)
void regions_end(void)
void regions_init(void)
void set_interprocedural_translation_context_sc(entity, list)
void reset_arguments_to_eliminate(void)
effect region_dup(effect)
effect region_translation(effect, entity, reference, entity, entity, reference, Value, bool)
void print_inout_regions(list)
void reset_translation_context_sc(void)
list convex_regions_transformer_compose(list, transformer)
compose.c
#define ACTION_IN
#define ACTION_OUT
void reset_action_interpretation(void)
void reset_proper_rw_effects(void)
void set_proper_rw_effects(statement_effects)
void set_cumulated_rw_effects(statement_effects)
void set_action_interpretation(string, string)
prettyprint.c
void reset_cumulated_rw_effects(void)
#define effect_may_p(eff)
#define effect_approximation_tag(eff)
#define effect_exact_p(eff)
#define variable_phi_p(e)
true if e is a phi variable PHI entities have a name like: REGIONS:PHI#, where # is a number.
list effects_to_list(effects)
Definition: effects.c:209
#define EFFECTS(x)
EFFECTS.
Definition: effects.h:682
@ is_approximation_may
Definition: effects.h:341
@ is_approximation_exact
Definition: effects.h:343
#define EFFECT(x)
EFFECT.
Definition: effects.h:608
const char * module_name(const char *s)
Return the module part of an entity name.
Definition: entity_names.c:296
#define STRING(x)
Definition: genC.h:87
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
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_multi_recurse(void *o,...)
Multi recursion visitor function.
Definition: genClib.c:3428
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 CONS(_t_, _i_, _l_)
List element cell constructor (insert an element at the beginning of a list)
Definition: newgen_list.h:150
#define CAR(pcons)
Get the value of the first element of a list.
Definition: newgen_list.h:92
#define CDR(pcons)
Get the list less its first element.
Definition: newgen_list.h:111
#define MAP(_map_CASTER, _map_item, _map_code, _map_list)
Apply/map an instruction block on all the elements of a list (old fashioned)
Definition: newgen_list.h:226
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_MEMORY_RESOURCE(res_name, own_name, res_val)
conform to old interface.
Definition: pipsdbm-local.h:66
static list indices
Definition: icm.c:204
#define debug_on(env)
Definition: misc-local.h:157
#define pips_debug
these macros use the GNU extensions that allow variadic macros, including with an empty list.
Definition: misc-local.h:145
#define debug_off()
Definition: misc-local.h:160
#define print_region(x)
Definition: print.c:343
const char * entity_local_name(entity e)
entity_local_name modified so that it does not core when used in vect_fprint, since someone thought t...
Definition: entity.c:453
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
const char * module_local_name(entity e)
Returns the module local user name.
Definition: entity.c:582
bool ith_parameter_p(entity, entity, int)
returns true if v is the ith formal parameter of function f
Definition: util.c:125
struct _newgen_struct_callees_ * callees
Definition: ri.h:55
#define syntax_reference_p(x)
Definition: ri.h:2728
#define syntax_reference(x)
Definition: ri.h:2730
#define reference_undefined
Definition: ri.h:2302
#define call_function(x)
Definition: ri.h:709
#define callees_callees(x)
Definition: ri.h:675
#define reference_variable(x)
Definition: ri.h:2326
#define statement_domain
newgen_sizeofexpression_domain_defined
Definition: ri.h:362
#define call_domain
newgen_callees_domain_defined
Definition: ri.h:58
#define EXPRESSION(x)
EXPRESSION.
Definition: ri.h:1217
#define entity_name(x)
Definition: ri.h:2790
#define reference_indices(x)
Definition: ri.h:2328
#define call_arguments(x)
Definition: ri.h:711
struct _newgen_struct_formal_ * formal
Definition: ri.h:191
#define statement_number(x)
Definition: ri.h:2452
#define expression_syntax(x)
Definition: ri.h:1247
#define statement_undefined
Definition: ri.h:2419
char * strdup()
Psysteme sc_restricted_to_variables_transitive_closure(Psysteme sc, Pbase variables)
for an improved dependence test (Beatrice Creusillet)
Definition: sc_misc.c:64
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
transformer load_statement_precondition(statement)
void reset_precondition_map(void)
void set_precondition_map(statement_mapping)
#define ifdebug(n)
Definition: sg.c:47
le type des coefficients dans les vecteurs: Value est defini dans le package arithmetique
Definition: vecteur-local.h:89
The structure used to build lists in NewGen.
Definition: newgen_list.h:41
Definition: delay.c:253
void free_value_mappings(void)
Normal call to free the mappings.
Definition: value.c:1212
void * Variable
arithmetique is a requirement for vecteur, but I do not want to inforce it in all pips files....
Definition: vecteur-local.h:60
#define BASE_NULLE
MACROS SUR LES BASES.