PIPS
reductions.c
Go to the documentation of this file.
1 /*
2 
3  $Id: reductions.c 23065 2016-03-02 09:05:50Z 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 #ifdef HAVE_CONFIG_H
25  #include "pips_config.h"
26 #endif
27 /*
28  * detection of simple reductions.
29  * debug driven by REDUCTIONS_DEBUG_LEVEL
30  *
31  * FC, June 1996.
32  */
33 
34 #include "local-header.h"
35 #include "control.h" /* for CONTROL_MAP() */
36 #include "semantics.h" /* for load_summary_effects() */
37 
38 /******************************************** SETTINGS IN GENERIC EFFECTS */
39 
40 static void
42 {
44 }
45 
46 /****************************************************** SUMMARY REDUCTIONS */
47 
48 /* Fortran 77 anti aliasing rules implies that sg that
49  * looks like a reduction within a subroutine can be perceived as so
50  * from outside because no aliasing may cause the accumulator to be
51  * linked to the rhs of the accumulation...
52  * thus summary reductions can be propagated with no harm...
53  * just the usual conditions must be checked (no other effect on the variable)
54  */
56 {
57  pips_assert("is a module", entity_module_p(f));
59  (DBR_SUMMARY_REDUCTIONS, module_local_name(f), true);
60 }
61 
62 static reduction
63 compute_one_summary_reduction(reduction model, list /* of effect */ le)
64 {
65  reduction r = copy_reduction(model);
66 
67  /* keep the entities that are exported... */
71  }
72 
75 
76  DEBUG_REDUCTION(3, "result\n", r);
77  return r;
78 }
79 
80 static reductions
82 {
83  list /* of effect */ le = load_summary_effects(f);
84  list /* of reduction */ lr = NIL, lc;
85 
86  lc = reductions_list
88 
89  pips_debug(3, "module %s: %td cumulated reductions\n",
90  entity_name(f), gen_length(lc));
91 
92  FOREACH(REDUCTION, r,lc) {
93  DEBUG_REDUCTION(4, "considering\n", r);
96  }
97 
98  return make_reductions(lr);
99 }
100 
101 /* handler for pipsmake
102  * input: module name
103  * output: TRUE
104  * side effects: stores the summary reductions to pipsdbm
105  */
107 {
108  reductions red;
109 
110  debug_on("REDUCTIONS_DEBUG_LEVEL");
111  pips_debug(1, "considering module %s\n", module_name);
112 
116  db_get_memory_resource(DBR_CODE, module_name, true));
118  db_get_memory_resource(DBR_CUMULATED_REDUCTIONS, module_name, true));
119 
121 
122  DB_PUT_MEMORY_RESOURCE(DBR_SUMMARY_REDUCTIONS, module_name, red);
123 
128 
129  debug_off();
130  return true;
131 }
132 
133 /******************************************************* PROPER REDUCTIONS */
134 
135 /* Function storing Proper Reductions
136  */
138 
139 /************************************************ LIST OF REDUCED ENTITIES */
140 
141 /* list of entities that may be reduced
142  */
143 static list /* of entity */
145  list /* of entity */ le,
146  reductions rs)
147 {
148  FOREACH (REDUCTION, r, reductions_list(rs)) {
149  le = gen_once(reduction_variable(r), le);
150  }
151  return le;
152 }
153 
154 static list /* of entity */
156  statement node,
157  list /* of statement */ls)
158 {
159  list /* of entity */ le = NIL;
161  FOREACH (STATEMENT, s, ls) {
164  else {
165  pips_debug(5, "stat %s %p\n", note_for_statement(s), s);
166  pips_assert ("should not happen, all statements should have been visited for reduction", false);
167  }
168  }
169  return le;
170 }
171 
172 /*********************************************************** CHECK PROPERS */
173 /* Returns NULL if not ok */
175  reduction rnew = make_none_reduction(var);
176 
178  if (!update_compatible_reduction_with(&rnew, var, r)) {
179  free_reduction(rnew);
180  return NULL;
181  }
182  }
183  return rnew;
184 }
185 
186 /* returns NIL on any problem */
188  list lnr=NIL, le = add_reduced_variables(NIL, rs);
189 
190  FOREACH(ENTITY, var,le) {
192  if (r) {
193  lnr = CONS(REDUCTION, r, lnr);
194  } else {
195  gen_free_list(le);
196  gen_full_free_list(lnr);
197  return NIL;
198  }
199  }
200  gen_free_list(le);
201 
202  return lnr;
203 }
204 
206  list lr = NIL;
209  lr = CONS(REFERENCE, preference_reference(p), lr);
210  }
211  lr = CONS(REFERENCE, reduction_reference(r), lr); /* ??? */
212  }
213  return lr;
214 }
215 
216 /* argh... what about side effect related reductions ???
217  * There are no relevant pointer to trust in such a case...
218  * What I can do as a (temporary) fix is not to check
219  * direct side effects (that is "call foo" ones) because
220  * they do not need to be checked...
221  */
223  list /* of effect */ le = effects_effects(load_proper_references(s)),
224  /* of reference */ lr = list_of_trusted_references(rs);
225 
226  FOREACH(EFFECT, e,le) {
229  pips_debug(8, "effect on %s (ref %p) not trusted\n",
232 
233  gen_free_list(lr);
234  return false;
235  }
236  }
237 
238  gen_free_list(lr);
239  return true;
240 }
241 
242 /* must check that the found reductions are
243  * (1) without side effects (no W on any other than accumulators),
244  * MA: why? If the W doesn't conflict with the accumulators it should be
245  * safe ! safe_effects_for_reductions seems overkill to me
246  * (2) compatible one with respect to the other.
247  * (3) not killed by other proper effects on accumulators.
248  * to avoid these checks, I can stop on expressions...
249  */
252  list /* of reduction */ lr = reductions_list(rs), lnr;
253  if(ENDP(lr))
254  return;
255 
256  /* all must be compatible, otherwise some side effect!
257  */
258  lnr = list_of_compatible_reductions(rs); /* checks (2) */
259 
260  /* now lnr is the new list of reductions.
261  */
262  if(lnr && !safe_effects_for_reductions(s, rs)) { /* checks (1) and (3) */
263  gen_full_free_list(lnr);
264  lnr = NIL;
265  }
266 
267  gen_full_free_list(lr);
268  // update the reduction list
269  reductions_list(rs) = lnr;
270 }
271 
272 DEFINE_LOCAL_STACK(crt_stat, statement)
273 
274 /* hack: no check for direct translations ("call foo")
275  * thus in this case effects reductions will be okay...
276  * the reason for the patch is that I do not know how to preserve easily
277  * such "invisible" reductions against proper effects. FC.
278  */
280 
281 /*
282  * This function simply add statement to the newgen struct generated by
283  * GENERIC_GLOBAL_FUNCTION macro.
284  * @return TRUE
285  * @param s, the statement to add to the generic map with the default reductions
286  *
287  */
289 {
291  // crt_stat_filter simply push on the stack and return true
292  return crt_stat_filter(s);
293 }
294 
295 /*
296  *@param s, the statement to check for reductions
297  */
299 {
301  if (instruction_call_p(i) &&
304  // crt_stat_rewrite pops from the stack and chek that s
305  // was the latest pushed object
306  crt_stat_rewrite(s);
307 }
308 
309 static bool pr_call_flt(call c)
310 {
311  statement head = crt_stat_head();
312  reductions reds = load_proper_reductions(head);
313  reduction red;
314 
315  pips_debug(9, "considering call to %s\n", entity_name(call_function(c)));
316 
317  if (call_proper_reduction_p(head, c, &red)) {
318  // direct proper reduction
319  reductions_list(reds) =
320  CONS(REDUCTION, red, reductions_list(reds));
321  }
322  else if (entity_module_p(call_function(c)))
323  {
325  reductions_list(reds) =
327  } else {
328  ifdebug(4) {
329  pips_debug(4,"Reductions for statement are:\n");
330  FOREACH(REDUCTION, r,reductions_list(reds)) {
331  DEBUG_REDUCTION(0, "considering\n", r);
332  }
333  }
334  }
335 
336  return true;
337 }
338 
339 /* performs the computation of proper reductions for statement s.
340  * this is a direct computation, throught gen_multi_recurse.
341  */
343 {
344  make_crt_stat_stack();
348  NULL);
349  free_crt_stat_stack();
350 }
351 
352 /* handler for pipsmake
353  * input: module name
354  * output: TRUE
355  * side effects: some
356  * - requires CODE PROPER_EFFECTS and callees' SUMMARY_{EFFECTS,REDUCTIONS}
357  * - returns PROPER_REDUCTIONS to pips dbm
358  */
360 {
361  entity module;
362 
363  debug_on("REDUCTIONS_DEBUG_LEVEL");
364  pips_debug(1, "considering module %s\n", module_name);
365 
368 
369  /* gets what is needed from PIPS DBM
370  */
374  ((statement) db_get_memory_resource(DBR_CODE, module_name, true));
376  db_get_memory_resource(DBR_PROPER_REFERENCES, module_name, true));
377 
378  /* do the job
379  */
381 
382  /* returns the result to the DBM...
383  */
385  (DBR_PROPER_REDUCTIONS, module_name, get_proper_reductions());
386 
392 
393  debug_off();
394  return true;
395 }
396 
397 /**************************************************** CUMULATED REDUCTIONS */
398 
399 /* Function storing Cumulated Reductions
400  */
402 
403 /************************************** CUMULATED REDUCTIONS OF STATEMENT */
404 
405 /* returns a r reduction of any compatible with { node } u ls
406  * input: var, node and ls
407  * output: true and some *pr, or FALSE
408  */
409 static bool
411  entity var,
412  statement node,
413  list /* of statement */ ls,
414  reduction *pr)
415 {
416  *pr = make_reduction
419  NIL, NIL);
420 
424  {
425  free_reduction(*pr);
426  return false;
427  }
428 
429  FOREACH (STATEMENT, s, ls) {
433  {
434  free_reduction(*pr);
435  return false;
436  }
437  }
438  else {
439  pips_debug(5, "stat %s %p\n", note_for_statement(s), s);
440  pips_assert ("should not happen, all statements should have been visited for reduction", false);
441  }
442  }
443 
444  return true;
445 }
446 
447 /* builds cumulated reductions for node, depending on node and
448  * list of statement ls.
449  */
450 static void
452  statement node,
453  list /* of statement */ ls)
454 {
455  list /* of entity */ le;
456  list /* of reduction */ lr=NIL;
457  reduction r;
458 
459  /* list of candidate entities */
461 
462  pips_debug(5, "stat %s %p: %td candidate(s)\n",
464 
465  /* for each candidate, extract the reduction if any */
466  FOREACH (ENTITY, var, le)
467  if (build_reduction_of_variable(var, node, ls, &r))
468  lr = CONS(REDUCTION, r, lr);
469 
470  /* store the result */
471  pips_debug(5, "stat %s %p -> %td reductions\n",
473 
475  gen_free_list(le);
476 }
477 
478 /* Cumulated Reduction propagation functions for each possible instructions.
479  * Statement s cumulated reduction computation involves :
480  * - its own proper reductions and effects
481  * - the cumulated reductions and effects of its sons
482  * the computation is performed by build_reductions_of_statement.
483  * the current statement is retrieved thru the crt_stat stack.
484  * Perform the bottom-up propagation of cumulated reductions
485  */
487 {
489  list l = NIL;
490  bool tofree = true;
491  switch(instruction_tag(i)) {
493  tofree=false;
494  l=instruction_block(i);break;
495  case is_instruction_loop:
501  case is_instruction_test:
504  {
505  list /* of control */ lc = NIL;
508  gen_free_list(lc);
509  } ; break ;
510  case is_instruction_call:
513  pips_debug(5, "stat %s %p\n", note_for_statement(parent), parent);
514  return ; /* it is important to return here */
515  default:
516  pips_internal_error("should not happen");
517  };
519  if(tofree) gen_free_list(l);
520 }
521 
522 /* handler for pipsmake
523  * input: the module name
524  * output: TRUE
525  * side effects: some
526  * - requires CODE, PROPER_{EFFECTS,REDUCTIONS} and CUMULATED_EFFECTS
527  * - returns CUMULATED_REDUCTIONS to pips dbm
528  */
530 {
531  debug_on("REDUCTIONS_DEBUG_LEVEL");
532  pips_debug(1, "considering module %s\n", module_name);
533 
536 
537  /* gets what is needed from PIPS DBM
538  */
541  db_get_memory_resource(DBR_CODE, module_name, true));
543  db_get_memory_resource(DBR_PROPER_REFERENCES, module_name, true));
545  db_get_memory_resource(DBR_CUMULATED_EFFECTS, module_name, true));
547  db_get_memory_resource(DBR_PROPER_REDUCTIONS, module_name, true));
548 
549  /* do the job here
550  */
552 
553  /* returns the result to the DBM...
554  */
556  (DBR_CUMULATED_REDUCTIONS, module_name, get_cumulated_reductions());
557 
565 
566  debug_off();
567  return true;
568 }
569 
570 /**
571  * match a reduction operator against operator entity
572  *
573  * @param op reduction operator
574  *
575  * @return entity representing corresponding operator
576  */
578 {
579  string opname = string_undefined;
580  switch( reduction_operator_tag(op) ) {
602  opname=OR_OPERATOR_NAME;break;
605  default:
606  pips_internal_error("unhandled case");
607  }
608  return entity_intrinsic(opname);
609 }
610 
612 {
615 }
616 
617 /* end of it!
618  */
static void node(FILE *out, string name)
Build for module name a node and link to its successors.
Definition: graph.c:56
reduction copy_reduction(reduction p)
REDUCTION.
void free_reduction(reduction p)
reductions copy_reductions(reductions p)
REDUCTIONS.
reduction make_reduction(reference a1, reduction_operator a2, list a3, list a4)
reduction_operator make_reduction_operator_none(void)
reductions make_reductions(list a)
list translate_reductions(call c)
of reduction
Definition: call.c:112
struct _newgen_struct_statement_ * statement
Definition: cloning.h:21
list control_list_to_statement_list(list)
of statement
Definition: graph.c:103
list load_summary_effects(entity e)
FI->FI, FI->BC: these two functions should be moved into effects-util or effects-simple.
void set_rw_effects(statement_effects)
void set_proper_references(statement_effects)
void reset_proper_references(void)
effects load_proper_references(statement)
list load_rw_effects_list(statement)
effect(* effect_dup_func)(effect eff)
void generic_effects_reset_all_methods(void)
void reset_rw_effects(void)
effect simple_effect_dup(effect)
#define effect_any_reference(e)
FI: cannot be used as a left hand side.
#define effect_write_p(eff)
#define effect_variable(e)
For COMPATIBILITY purpose only - DO NOT USE anymore.
bool store_effect_p(effect)
Definition: effects.c:1062
bool io_effect_entity_p(entity)
Definition: effects.c:496
#define effects_effects(x)
Definition: effects.h:710
#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 gen_recurse(start, domain_number, flt, rwt)
Definition: genC.h:283
void gen_full_free_list(list l)
Definition: genClib.c:1023
bool effects_may_read_or_write_memory_paths_from_entity_p(list l_eff, entity e)
tests whether the input effects list may contain effects with a memory path from the input entity e; ...
Definition: conflicts.c:1130
#define CONTROL_MAP(ctl, code, c, list)
Macro to walk through all the controls reachable from a given control node of an unstructured.
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
gen_chunk * gen_get_ancestor(int, const void *)
return the first ancestor object found of the given type.
Definition: genClib.c:3560
void gen_null(__attribute__((unused)) void *unused)
Ignore the argument.
Definition: genClib.c:2752
bool gen_true(__attribute__((unused)) gen_chunk *unused)
Return true and ignore the argument.
Definition: genClib.c:2780
#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
list gen_once(const void *vo, list l)
Prepend an item to a list only if it is not already in the list.
Definition: list.c:722
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
bool gen_in_list_p(const void *vo, const list lx)
tell whether vo belongs to lx
Definition: list.c:734
#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
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
#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_assert(what, predicate)
common macros, two flavors depending on NDEBUG
Definition: misc-local.h:172
#define pips_internal_error
Definition: misc-local.h:149
#define debug_off()
Definition: misc-local.h:160
#define GENERIC_GLOBAL_FUNCTION(name, type)
#define DEFINE_LOCAL_STACK(name, type)
#define string_undefined
Definition: newgen_types.h:40
int f(int off1, int off2, int n, float r[n], float a[n], float b[n])
Definition: offsets.c:15
bool same_reduction_p(reduction r1, reduction r2)
Definition: reductions.c:611
static void check_proper_reductions(statement s)
must check that the found reductions are (1) without side effects (no W on any other than accumulator...
Definition: reductions.c:250
bool cumulated_reductions(const char *module_name)
handler for pipsmake input: the module name output: TRUE side effects: some
Definition: reductions.c:529
static call last_translated_module_call
hack: no check for direct translations ("call foo") thus in this case effects reductions will be okay...
Definition: reductions.c:279
static void compute_cumulated_reductions(instruction i)
Cumulated Reduction propagation functions for each possible instructions.
Definition: reductions.c:486
reductions load_summary_reductions(entity f)
Fortran 77 anti aliasing rules implies that sg that looks like a reduction within a subroutine can be...
Definition: reductions.c:55
static void set_generic_effects_as_needed(void)
for CONTROL_MAP()
Definition: reductions.c:41
static list list_of_compatible_reductions(reductions rs)
returns NIL on any problem
Definition: reductions.c:187
static void compute_proper_reductions(statement s)
performs the computation of proper reductions for statement s.
Definition: reductions.c:342
bool proper_reductions(const char *module_name)
handler for pipsmake input: module name output: TRUE side effects: some
Definition: reductions.c:359
static reduction compute_one_summary_reduction(reduction model, list le)
Definition: reductions.c:63
static list add_reduced_variables(list le, reductions rs)
Function storing Proper Reductions.
Definition: reductions.c:144
static bool pr_call_flt(call c)
Definition: reductions.c:309
static bool build_reduction_of_variable(entity var, statement node, list ls, reduction *pr)
Function storing Cumulated Reductions.
Definition: reductions.c:410
static void pr_statement_wrt(statement s)
Definition: reductions.c:298
static void build_creductions_of_statement(statement node, list ls)
builds cumulated reductions for node, depending on node and list of statement ls.
Definition: reductions.c:451
static reduction compatible_reduction_of_var(entity var, reductions rs)
Returns NULL if not ok.
Definition: reductions.c:174
static bool safe_effects_for_reductions(statement s, reductions rs)
argh...
Definition: reductions.c:222
bool summary_reductions(const char *module_name)
handler for pipsmake input: module name output: TRUE side effects: stores the summary reductions to p...
Definition: reductions.c:106
static list list_of_trusted_references(reductions rs)
Definition: reductions.c:205
static list list_of_reduced_variables(statement node, list ls)
of entity
Definition: reductions.c:155
static bool pr_statement_flt(statement s)
Definition: reductions.c:288
entity reduction_operator_entity(reduction_operator op)
match a reduction operator against operator entity
Definition: reductions.c:577
static reductions compute_summary_reductions(entity f)
Definition: reductions.c:81
static char * module
Definition: pips.c:74
#define reduction_variable(r)
shorthands for REDUCTION:
#define make_none_reduction(var)
#define DEBUG_REDUCTION(level, msg, red)
quick debug macros
string note_for_statement(statement s)
generates a short note to tell about the type of the statement being decorated.
Definition: prettyprint.c:55
void reset_cumulated_reductions(void)
void init_proper_reductions(void)
void remove_variable_from_reduction(reduction, entity)
Definition: utils.c:130
void set_cumulated_reductions(pstatement_reductions)
void init_cumulated_reductions(void)
bool update_compatible_reduction(reduction *, entity, list, reductions)
what to do with reduction *pr for variable var under effects le and reductions reds.
Definition: utils.c:285
pstatement_reductions get_proper_reductions(void)
bool bound_cumulated_reductions_p(statement)
bool call_proper_reduction_p(statement, call, reduction *)
This function look for a reduction and return it if found mallocs are avoided if nothing is found....
Definition: utils.c:633
reductions load_cumulated_reductions(statement)
reductions load_proper_reductions(statement)
void reset_proper_reductions(void)
pstatement_reductions get_cumulated_reductions(void)
void store_proper_reductions(statement, reductions)
bool update_compatible_reduction_with(reduction *, entity, reduction)
update *pr according to r for variable var r is not touched.
Definition: utils.c:260
void set_proper_reductions(pstatement_reductions)
void store_cumulated_reductions(statement, reductions)
@ is_reduction_operator_bitwise_xor
@ is_reduction_operator_min
@ is_reduction_operator_bitwise_and
@ is_reduction_operator_neqv
@ is_reduction_operator_max
@ is_reduction_operator_bitwise_or
@ is_reduction_operator_csum
@ is_reduction_operator_eqv
@ is_reduction_operator_prod
@ is_reduction_operator_or
@ is_reduction_operator_and
@ is_reduction_operator_sum
#define REDUCTION(x)
REDUCTION.
#define reduction_operator_tag(x)
#define reduction_op(x)
#define reduction_dependences(x)
#define reduction_reference(x)
#define reduction_trusted(x)
#define reductions_list(x)
static const char * opname(const char *s)
#define BITWISE_OR_OPERATOR_NAME
#define MAX_OPERATOR_NAME
#define BITWISE_XOR_OPERATOR_NAME
#define EQUIV_OPERATOR_NAME
#define PLUS_OPERATOR_NAME
#define NON_EQUIV_OPERATOR_NAME
#define unstructured_control
After the modification in Newgen: unstructured = entry:control x exit:control we have create a macro ...
#define AND_OPERATOR_NAME
FI: intrinsics are defined at a third place after bootstrap and effects! I guess the name should be d...
#define instruction_block(i)
#define make_statement_list(stats...)
easy list constructor
#define MULTIPLY_OPERATOR_NAME
#define BITWISE_AND_OPERATOR_NAME
#define OR_OPERATOR_NAME
#define PLUS_C_OPERATOR_NAME
#define MIN_OPERATOR_NAME
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 entity_module_p(entity e)
Definition: entity.c:683
entity entity_intrinsic(const char *name)
FI: I do not understand this function name (see next one!).
Definition: entity.c:1292
bool reference_equal_p(reference r1, reference r2)
Definition: expression.c:1500
#define PREFERENCE(x)
PREFERENCE.
Definition: ri.h:2073
#define loop_body(x)
Definition: ri.h:1644
#define REFERENCE(x)
REFERENCE.
Definition: ri.h:2296
#define reference_undefined
Definition: ri.h:2302
#define call_function(x)
Definition: ri.h:709
#define ENTITY(x)
ENTITY.
Definition: ri.h:2755
#define instruction_loop(x)
Definition: ri.h:1520
#define test_false(x)
Definition: ri.h:2837
#define statement_domain
newgen_sizeofexpression_domain_defined
Definition: ri.h:362
#define CONTROL(x)
CONTROL.
Definition: ri.h:910
#define instruction_domain
newgen_functional_domain_defined
Definition: ri.h:202
#define call_domain
newgen_callees_domain_defined
Definition: ri.h:58
@ is_instruction_unstructured
Definition: ri.h:1475
@ is_instruction_whileloop
Definition: ri.h:1472
@ is_instruction_expression
Definition: ri.h:1478
@ is_instruction_test
Definition: ri.h:1470
@ is_instruction_call
Definition: ri.h:1474
@ is_instruction_sequence
Definition: ri.h:1469
@ is_instruction_forloop
Definition: ri.h:1477
@ is_instruction_loop
Definition: ri.h:1471
#define instruction_tag(x)
Definition: ri.h:1511
#define entity_name(x)
Definition: ri.h:2790
#define test_true(x)
Definition: ri.h:2835
#define instruction_forloop(x)
Definition: ri.h:1538
#define preference_reference(x)
Definition: ri.h:2102
#define instruction_call_p(x)
Definition: ri.h:1527
#define instruction_whileloop(x)
Definition: ri.h:1523
#define whileloop_body(x)
Definition: ri.h:3162
#define statement_instruction(x)
Definition: ri.h:2458
#define instruction_call(x)
Definition: ri.h:1529
#define instruction_test(x)
Definition: ri.h:1517
#define call_undefined
Definition: ri.h:685
#define forloop_body(x)
Definition: ri.h:1372
#define instruction_unstructured(x)
Definition: ri.h:1532
#define STATEMENT(x)
STATEMENT.
Definition: ri.h:2413
return(s1)
#define ifdebug(n)
Definition: sg.c:47
The structure used to build lists in NewGen.
Definition: newgen_list.h:41