PIPS
coarse_grain_parallelization.c
Go to the documentation of this file.
1 /*
2 
3  $Id: coarse_grain_parallelization.c 23495 2018-10-24 09:19:47Z 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 unless required
26 #include "phases.h"
27 #if defined(BUILDER_COARSE_GRAIN_PARALLELIZATION) || \
28  defined(BUILDER_COARSE_GRAIN_PARALLELIZATION_WITH_REDUCTION)
29 
30 #ifdef HAVE_CONFIG_H
31  #include "pips_config.h"
32 #endif
33 
34 /*
35  transformations package
36 
37  coarse_grain_parallelization.c : Beatrice Creusillet, october 1996
38  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
39 
40  This file contains the functions to parallelize loops by using the
41  regions of their bodies. This enables the parallelization of loops
42  containing "if" constructs and unstructured parts of code. But it may
43  be less aggressive that Allen and Kennedy on other loop nests, because
44  the regions of the loop bodies may be imprecise.
45 */
46 
47 #include <stdio.h>
48 #include <string.h>
49 
50 #include "genC.h"
51 #include "linear.h"
52 
53 #include "misc.h"
54 #include "properties.h"
55 #include "pipsdbm.h"
56 
57 #include "ri.h"
58 #include "effects.h"
59 #include "ri-util.h"
60 #include "effects-util.h"
61 
62 #include "transformer.h" // transformer_empty_p, free_value_mappings
63 #include "semantics.h" // used
64 
65 #include "effects-generic.h" // used
66 #include "effects-simple.h" // update_loop_locals
67 #include "effects-convex.h" // used
68 
69 #include "pips-libs.h"
70 
71 #include "dg.h"
72 typedef dg_arc_label arc_label;
74 #include "graph.h"
75 #include "ricedg.h" // dependency tests...
76 
77 #ifdef HAVE_PIPS_reductions_LIBRARY
78 #include "reduction.h"
79 #include "reductions.h"
80 
81 GENERIC_LOCAL_FUNCTION(statement_reductions, pstatement_reductions)
82 
83 #else
84 // Hmmm... allow to skip warning on -Werror compilation
85 #ifndef PIPS_WERROR_COMPILATION
86 #warning "compiling coarse_grain_parallelization without reductions"
87 #endif // PIPS_WERROR_COMPILATION
88 #endif // HAVE_PIPS_reductions_LIBRARY
89 
90 /**
91  * Reduction context
92  * Carry the depth of the loop nest and the reduced loop (if applicable)
93  */
94 typedef struct coarse_grain_ctx {
95  int depth;
97  bool parallelized_at_least_one_loop;
98  bool use_reductions_p;
99 } coarse_grain_ctx;
100 
101 
102 /** Parallelize a loop by using region informations to prove iteration
103  independance.
104 
105  @param l is the loop to parallelize
106 
107  @return true to ask the calling NewGen iterator to go on recursion on
108  further loops in this loop.
109  */
110 static bool whole_loop_parallelize(loop l, coarse_grain_ctx *ctx)
111 {
112  // Get the statement owning this loop
114  statement inner_stat = loop_body(l);
115 
116  if (!get_bool_property("PARALLELIZE_AGAIN_PARALLEL_CODE")
117  && loop_parallel_p(l)) {
118  return false;
119  }
120 
122  return false;
123 
124  // get the loop body preconditions
125  transformer body_prec = load_statement_precondition(inner_stat);
126 
127  // do not declare as parallel a loop which is never executed
128  if (transformer_empty_p(body_prec)) {
129  pips_debug(1, "non feasible inner statement -> SEQUENTIAL LOOP\n");
131  return false;
132  }
133 
134  // ...needed by TestCoupleOfReferences():
135  list l_enclosing_loops = CONS(STATEMENT, loop_stat, NIL);
136 
137  // Get the loop invariant regions for the loop body:
138  list l_reg = load_invariant_rw_effects_list(inner_stat);
139 
140  // To store potential conflicts to study:
141  list l_conflicts = NIL;
142 
143  // To keep track of a current conflict disabling the parallelization:
144  bool may_conflicts_p = false;
145 
146  // Can we discard conflicts due to thread-safe variables?
147  bool thread_safe_p =
148  get_bool_property("PARALLELIZATION_IGNORE_THREAD_SAFE_VARIABLES");
149 
150  pips_debug(1,"begin\n");
151 
152  // Reduction handling, if a reference is present in the summary it means
153  // that we can safely ignore conflict that involved it
154  // MA: seems buggy since it relies here on entity instead of reference
155  set lreductions = set_undefined;
156  if (ctx->use_reductions_p) {
157 #ifdef HAVE_PIPS_reductions_LIBRARY
158  lreductions = set_make(set_pointer);
159  pips_debug(1,"Fetching reductions for this loop\n");
160  reductions rs = (reductions)load_statement_reductions(loop_stat);
163  pips_debug(1,"Ignoring dependences on %s for this loop\n",
164  entity_local_name(e));
165  set_add_element(lreductions, lreductions, e);
166  }
167 #else
168  pips_internal_error("reductions are not available");
169 #endif // HAVE_PIPS_reductions_LIBRARY
170  }
171 
172  pips_debug(1,"building conflicts\n");
173  ifdebug(2) {
174  fprintf(stderr, "original invariant regions:\n");
175  print_regions(l_reg);
176  }
177 
178  // First, builds list of conflicts
179  FOREACH(EFFECT, reg, l_reg)
180  {
181  entity e = region_entity(reg);
182 
183  if (region_write_p(reg)
184  && store_effect_p(reg)
186  && !(thread_safe_p && thread_safe_variable_p(e))
187  && !(ctx->use_reductions_p && set_belong_p(lreductions,e))
188  ) {
190  int d = gen_length(reference_indices(r));
192 
193  // Add a write-write conflict to the list:
194  conf = make_conflict(reg, reg, cone_undefined);
195  l_conflicts = gen_nconc(l_conflicts, CONS(CONFLICT, conf, NIL));
196 
197  // Search for a write-read/read-write conflict
198  FOREACH(EFFECT, reg2, l_reg) {
199  reference r2 = effect_any_reference(reg2);
200  int d2 = gen_length(reference_indices(r2));
201 
202  // FI->RK: Careful, you are replicating code of chains.c,
203  // add_conflicts(). Why cannot you use region_chains?
204  //
205  // The test below must evolve with Beatrice's work on memory access
206  // paths. d<=d2 is a very preliminary test for memory access paths.
207  if (d<=d2
208  && store_effect_p(reg2)
209  && region_read_p(reg2)
210  && same_entity_p(e,region_entity(reg2))) {
211  // Add a write-read conflict
212  conf = make_conflict(reg, reg2, cone_undefined);
213  l_conflicts = gen_nconc(l_conflicts, CONS(CONFLICT, conf, NIL));
214  // There is at most one read region for entity e by definition
215  // of the regions, so it's useless to go on interating:
216  break;
217  }
218  }
219  }
220  }
221 
222  // THEN, TESTS CONFLICTS
223  pips_debug(1,"testing conflicts\n");
224  // We want to test for write/read and read/write dependences at the same time
225  Finds2s1 = true;
226  FOREACH(CONFLICT, conf, l_conflicts) {
227  effect reg1 = conflict_source(conf);
228  effect reg2 = conflict_sink(conf);
229  list levels = NIL;
230  list levelsop = NIL;
231  Ptsg gs = SG_UNDEFINED;
232  Ptsg gsop = SG_UNDEFINED;
233 
234  ifdebug(2) {
235  fprintf(stderr, "testing conflict from:\n");
236  print_region(reg1);
237  fprintf(stderr, "\tto:\n");
238  print_region(reg2);
239  }
240 
241  // Use the function TestCoupleOfReferences from ricedg.
242  /* We only consider one loop at a time, disconnected from
243  * the other enclosing and inner loops. Thus l_enclosing_loops
244  * only contains the current loop statement.
245  * The list of loop variants is empty, because we use loop invariant
246  * regions (they have been composed by the loop transformer).
247  */
248  levels = TestCoupleOfReferences(
249  l_enclosing_loops, region_system(reg1),
250  inner_stat, reg1, effect_any_reference(reg1),
251  l_enclosing_loops, region_system(reg2),
252  inner_stat, reg2, effect_any_reference(reg2),
253  NIL, &gs, &levelsop, &gsop);
254 
255  ifdebug(2) {
256  fprintf(stderr, "result:\n");
257  if (ENDP(levels) && ENDP(levelsop))
258  fprintf(stderr, "\tno dependence\n");
259 
260  if (!ENDP(levels)) {
261  fprintf(stderr, "\tdependence at levels: ");
262  FOREACH(INT, l, levels)
263  fprintf(stderr, " %d", l);
264  fprintf(stderr, "\n");
265 
266  if (!SG_UNDEFINED_P(gs)) {
267  Psysteme sc = SC_UNDEFINED;
268  fprintf(stderr, "\tdependence cone:\n");
269  sg_fprint_as_dense(stderr, gs, gs->base);
270  sc = sg_to_sc_chernikova(gs);
271  fprintf(stderr,"\tcorresponding linear system:\n");
273  sc_rm(sc);
274  }
275  }
276  if (!ENDP(levelsop)) {
277  fprintf(stderr, "\topposite dependence at levels: ");
278  FOREACH(INT, l, levelsop)
279  fprintf(stderr, " %d", l);
280  fprintf(stderr, "\n");
281 
282  if (!SG_UNDEFINED_P(gsop)) {
283  Psysteme sc = SC_UNDEFINED;
284  fprintf(stderr, "\tdependence cone:\n");
285  sg_fprint_as_dense(stderr, gsop, gsop->base);
286  sc = sg_to_sc_chernikova(gsop);
287  fprintf(stderr,"\tcorresponding linear system:\n");
289  sc_rm(sc);
290  }
291  }
292  }
293  /* If the dependence cannot be disproved, abort the parallelization. */
294  if (!ENDP(levels) || !ENDP(levelsop)) {
295  may_conflicts_p = true;
296  }
297 
298  gen_free_list(levels);
299  gen_free_list(levelsop);
300  if (!SG_UNDEFINED_P(gs))
301  sg_rm(gs);
302  if (!SG_UNDEFINED_P(gsop))
303  sg_rm(gsop);
304 
305  // the dependence was blocking the parallelization, abort here!
306  if(may_conflicts_p)
307  break;
308  }
309 
310  // Was there any conflict?
311  if (may_conflicts_p)
312  // Do not change the loop since it is sequential
313  pips_debug(1, "SEQUENTIAL LOOP\n");
314  else {
315  // Mark the loop as parallel since we did not notice any conflict:
316  if(ctx->use_reductions_p) {
317 #ifdef HAVE_PIPS_reductions_LIBRARY
318  pips_debug(1, "PARALLEL LOOP WITH REDUCTIONS\n");
319  ctx->reduced_loops =
320  CONS(int, statement_ordering(loop_stat), ctx->reduced_loops);
321 #else
322  pips_internal_error("reductions are not available");
323 #endif // HAVE_PIPS_reductions_LIBRARY
324  } else {
325  pips_debug(1, "PARALLEL LOOP\n");
326  // If the loop was sequential, we mark it as parallel and register
327  // that we parallelized at least one loop
328  if(loop_sequential_p(l)) {
329  ctx->parallelized_at_least_one_loop = true;
331  }
332  }
333  }
334 
335  // Finally, free conflicts
336  pips_debug(1,"freeing conflicts\n");
337  FOREACH(CONFLICT, c, l_conflicts) {
340  free_conflict(c);
341  }
342  gen_free_list(l_conflicts);
343  gen_free_list(l_enclosing_loops);
344 
345  if (ctx->use_reductions_p) {
346  set_free(lreductions);
347  }
348 
349  pips_debug(1, "end\n");
350 
351  return true;
352 }
353 
354 
355 /** Parallelize a code statement by using region informations to prove
356  iteration independance.
357 
358  @param module_stat is the module statement to parallelize as a code
359  reference
360 
361  @param ctx is the context for keeping informations about what was done
362  */
363 static void coarse_grain_loop_parallelization(
364  statement module_stat,
365  coarse_grain_ctx *ctx)
366 {
367  pips_debug(1,"begin\n");
368 
369  // Iterate on the loops to try parallelizing them:
370  gen_context_recurse(module_stat, ctx,
371  loop_domain, whole_loop_parallelize, gen_null2);
372 
373  pips_debug(1,"end\n");
374 }
375 
376 
377 /** Parallelize code by using region informations to prove iteration
378  independence.
379 
380  @param module_name is the name of the module to parallelize
381  @return true in case of success. Indeed, return alway true. :-)
382  */
383 static bool
384 coarse_grain_parallelization_main(
385  const string module_name,
386  bool use_reductions_p)
387 {
388  statement module_stat;
389  entity module;
390 
391  // Warn everybody here if we use or not reductions:
392  if(use_reductions_p) {
393 #ifdef HAVE_PIPS_reductions_LIBRARY
394  set_statement_reductions((pstatement_reductions)
395  db_get_memory_resource(DBR_CUMULATED_REDUCTIONS, module_name, true));
396 #else
397  pips_internal_error("reductions are not available");
398 #endif // HAVE_PIPS_reductions_LIBRARY
399  }
400 
401  // Get the code of the module.
402  // Build a copy of the CODE since we rewrite it on the fly to build a
403  // PARALLELIZED_CODE with it. Do not use
404  // db_get_memory_resource(,,false) since it is more efficient to use a
405  // gen_copy_statement() and it has nasty effects on informations
406  // attached on the DBR_CODE with the statement addresses (see Trac
407  // ticket #159 in 2009).
408  // Well, indeed even this does not work. So this phase changes the code
409  // resource...
410  module_stat = (statement)
411  db_get_memory_resource(DBR_CODE, module_name, true);
412 
413  set_current_module_statement(module_stat);
416 
417  // Get and use cumulated_effects:
419  db_get_memory_resource(DBR_CUMULATED_EFFECTS, module_name, true));
421  db_get_memory_resource(DBR_PROPER_EFFECTS, module_name, true));
422 
423  // Build mapping between variables and semantics informations:
425 
426  // use preconditions to check that loop bodies are not dead code
428  db_get_memory_resource(DBR_PRECONDITIONS, module_name, true));
429 
430  // Get and use invariant read/write regions
432  db_get_memory_resource(DBR_INV_REGIONS, module_name, true));
433 
434  print_parallelization_statistics(module_name, "ante", module_stat);
435 
437 
438  debug_on("COARSE_GRAIN_PARALLELIZATION_DEBUG_LEVEL");
439 
440  // Initialize a context to keep track of what is done
441  coarse_grain_ctx ctx = { 0, NIL, false, use_reductions_p };
442  coarse_grain_loop_parallelization(module_stat, &ctx);
443 
444  debug_off();
445 
446  print_parallelization_statistics(module_name, "post", module_stat);
454 
455  if(use_reductions_p) {
456 #ifdef HAVE_PIPS_reductions_LIBRARY
457  reset_statement_reductions();
458  DB_PUT_MEMORY_RESOURCE(DBR_REDUCTION_PARALLEL_LOOPS, module_name,
459  (void*) make_reduced_loops(ctx.reduced_loops));
460 #else
461  pips_internal_error("reductions are not available");
462 #endif // HAVE_PIPS_reductions_LIBRARY
463  } else {
464  // update loop_locals according to exhibited parallel loops
465  // this require recomputing effects */
466  // This is only one strategy among others, and has been discussed
467  // in ticket #538
468  // The advantage of this one is to be compatible with Fortran 77 and C
469  // To declare private variables at innermost levels even when loops are
470  // not parallel, use another phase prior to this one. BC - 07/2011
471  bool locals_changed = update_loops_locals(module_name, module_stat);
472  if(ctx.parallelized_at_least_one_loop || locals_changed) {
473  DB_PUT_MEMORY_RESOURCE(DBR_CODE, module_name, (void*) module_stat);
474  }
475  }
476 
477  return true;
478 }
479 
480 /** Parallelize code by using region informations to prove iteration
481  independance.
482 
483  @param module_name is the name of the module to parallelize
484  @return true in case of success. Indeed, return always true. :-)
485  */
486 bool coarse_grain_parallelization(const string module_name) {
487  // without reductions
488  return coarse_grain_parallelization_main(module_name, false);
489 }
490 
491 #ifdef HAVE_PIPS_reductions_LIBRARY
492 
493 /** Parallelize code by using region informations to prove iteration
494  independence. Use reduction information to filter out false
495  dependencies.
496 
497  This is an independent phase and not only a property since we need
498  more resources.
499 
500  @param module_name is the name of the module to parallelize
501  @return true in case of success. Indeed, return always true. :-)
502  */
504  // with reductions
505  return coarse_grain_parallelization_main(module_name, true);
506 }
507 
508 #endif // HAVE_PIPS_reductions_LIBRARY
509 
510 #endif // BUILDER_COARSE_GRAIN_PARALLELIZATION*
void free_conflict(conflict p)
Definition: dg.c:63
conflict make_conflict(effect a1, effect a2, cone a3)
Definition: dg.c:96
reduced_loops make_reduced_loops(list a)
Definition: reduction.c:136
dg_vertex_label vertex_label
Definition: delay.c:64
dg_arc_label arc_label
Definition: delay.c:63
@ INT
Definition: atomic.c:48
Psysteme sg_to_sc_chernikova(Ptsg sg)
Definition: chernikova.c:58
struct _newgen_struct_statement_ * statement
Definition: cloning.h:21
#define conflict_sink(x)
Definition: dg.h:167
#define CONFLICT(x)
CONFLICT.
Definition: dg.h:134
#define conflict_source(x)
Definition: dg.h:165
#define cone_undefined
Definition: dg.h:104
#define conflict_undefined
Definition: dg.h:140
#define region_write_p(reg)
#define region_entity(reg)
#define region_system(reg)
#define region_read_p(reg)
useful region macros
void print_regions(list)
list load_invariant_rw_effects_list(statement)
void reset_proper_rw_effects(void)
void set_proper_rw_effects(statement_effects)
void set_cumulated_rw_effects(statement_effects)
void reset_invariant_rw_effects(void)
void set_invariant_rw_effects(statement_effects)
void reset_cumulated_rw_effects(void)
bool update_loops_locals(const char *, statement)
#define effect_any_reference(e)
FI: cannot be used as a left hand side.
entity effect_entity(effect)
cproto-generated files
Definition: effects.c:52
bool store_effect_p(effect)
Definition: effects.c:1062
#define effect_undefined
Definition: effects.h:614
#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
bool get_bool_property(const string)
FC 2015-07-20: yuk, moved out to prevent an include cycle dependency include "properties....
#define gen_chunk_undefined_p(c)
Definition: genC.h:75
#define gen_context_recurse(start, ctxt, domain_number, flt, rwt)
Definition: genC.h:285
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
entity set_current_module_entity(entity)
static.c
Definition: static.c:66
gen_chunk * gen_get_ancestor(int, const void *)
return the first ancestor object found of the given type.
Definition: genClib.c:3560
void gen_null2(__attribute__((unused)) void *u1, __attribute__((unused)) void *u2)
idem with 2 args, to please overpeaky compiler checks
Definition: genClib.c:2758
bool loop_sequential_p(loop l)
Test if a loop is sequential.
Definition: loop.c:404
bool loop_parallel_p(loop l)
Test if a loop is parallel.
Definition: loop.c:393
void print_parallelization_statistics(const char *module, const char *msg, statement s)
Print out the number of sequential versus parallel loops.
Definition: loop.c:814
#define ENDP(l)
Test if a list is empty.
Definition: newgen_list.h:66
#define NIL
The empty list (nil in Lisp)
Definition: newgen_list.h:47
size_t gen_length(const list l)
Definition: list.c:150
#define CONS(_t_, _i_, _l_)
List element cell constructor (insert an element at the beginning of a list)
Definition: newgen_list.h:150
list gen_nconc(list cp1, list cp2)
physically concatenates CP1 and CP2 but do not duplicates the elements
Definition: list.c:344
void gen_free_list(list l)
free the spine of the list
Definition: list.c:327
#define FOREACH(_fe_CASTER, _fe_item, _fe_list)
Apply/map an instruction block on all the elements of a list.
Definition: newgen_list.h:179
void * gen_find_eq(const void *item, const list seq)
Definition: list.c:422
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
bool statement_may_contain_exiting_intrinsic_call_p(statement)
Definition: statement.c:4022
#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 pips_internal_error
Definition: misc-local.h:149
#define debug_off()
Definition: misc-local.h:160
#define set_undefined
Definition: newgen_set.h:48
void set_free(set)
Definition: set.c:332
bool set_belong_p(const set, const void *)
Definition: set.c:194
@ set_pointer
Definition: newgen_set.h:44
set set_make(set_type)
Create an empty set of any type but hash_private.
Definition: set.c:102
set set_add_element(set, const set, const void *)
Definition: set.c:152
static char * module
Definition: pips.c:74
#define print_region(x)
Definition: print.c:343
struct _newgen_struct_reduced_loops_ * reduced_loops
Definition: reduction.h:45
struct _newgen_struct_reductions_ * reductions
#define REDUCTION(x)
REDUCTION.
#define reduction_reference(x)
#define reductions_list(x)
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
bool same_entity_p(entity e1, entity e2)
predicates on entities
Definition: entity.c:1321
entity module_name_to_entity(const char *mn)
This is an alias for local_name_to_top_level_entity.
Definition: entity.c:1479
bool thread_safe_variable_p(entity v)
Definition: entity.c:2539
#define execution_tag(x)
Definition: ri.h:1207
#define loop_body(x)
Definition: ri.h:1644
#define loop_execution(x)
Definition: ri.h:1648
#define reference_variable(x)
Definition: ri.h:2326
#define loop_domain
newgen_language_domain_defined
Definition: ri.h:218
#define statement_ordering(x)
Definition: ri.h:2454
#define statement_domain
newgen_sizeofexpression_domain_defined
Definition: ri.h:362
#define reference_indices(x)
Definition: ri.h:2328
#define loop_locals(x)
Definition: ri.h:1650
@ is_execution_parallel
Definition: ri.h:1190
@ is_execution_sequential
Definition: ri.h:1189
#define STATEMENT(x)
STATEMENT.
Definition: ri.h:2413
bool Finds2s1
Definition: ricedg.h:160
list TestCoupleOfReferences(list n1, Psysteme sc1 __attribute__((unused)), statement s1, effect ef1, reference r1, list n2, Psysteme sc2 __attribute__((unused)), statement s2, effect ef2, reference r2, list llv, Ptsg *gs __attribute__((unused)), list *levelsop __attribute__((unused)), Ptsg *gsop __attribute__((unused)))
Definition: ricedg.c:905
void ResetLoopCounter(void)
Definition: testdep_util.c:329
void sc_rm(Psysteme ps)
void sc_rm(Psysteme ps): liberation de l'espace memoire occupe par le systeme de contraintes ps;
Definition: sc_alloc.c:277
void sc_fprint(FILE *fp, Psysteme ps, get_variable_name_t nom_var)
void sc_fprint(FILE * f, Psysteme ps, char * (*nom_var)()): cette fonction imprime dans le fichier po...
Definition: sc_io.c:220
int fprintf()
test sc_min : ce test s'appelle par : programme fichier1.data fichier2.data ...
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 SG_UNDEFINED
Definition: sg-local.h:73
#define SG_UNDEFINED_P(sg)
Definition: sg-local.h:74
#define ifdebug(n)
Definition: sg.c:47
void sg_rm(Ptsg sg)
void sg_rm(Ptsg sg): liberation de l'espace memoire occupe par un systeme generateur
Definition: sg.c:249
void sg_fprint_as_dense(FILE *f, Ptsg sg, Pbase b)
void sg_fprint_as_dense(FILE * f, Ptsg sg): impression d'un systeme generateur
Definition: sg.c:298
GENERIC_LOCAL_FUNCTION(directives, step_directives)
Copyright 2007, 2008, 2009 Alain Muller, Frederique Silber-Chaussumier.
FI: I do not understand why the type is duplicated at the set level.
Definition: set.c:59
The structure used to build lists in NewGen.
Definition: newgen_list.h:41
Representation d'un systeme generateur par trois ensembles de sommets de rayons et de droites.
Definition: sg-local.h:66
Pbase base
Definition: sg-local.h:70
static int depth
la sequence de nids
bool coarse_grain_parallelization_with_reduction(const string)
bool coarse_grain_parallelization(const string)
coarse_grain_parallelization.c
bool transformer_empty_p(transformer t)
If true is returned, the transformer certainly is empty.
Definition: transformer.c:2455
void free_value_mappings(void)
Normal call to free the mappings.
Definition: value.c:1212
char *(* get_variable_name_t)(Variable)
Definition: vecteur-local.h:62