PIPS
binary_operators.c
Go to the documentation of this file.
1 /*
2 
3  $Id: binary_operators.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 /* package effect: new version by Beatrice Creusillet
28  *
29  * This File contains several functions to combine effects
30  *
31  *
32  */
33 #include <stdio.h>
34 #include <string.h>
35 
36 #include "genC.h"
37 #include "linear.h"
38 #include "ri.h"
39 #include "effects.h"
40 #include "database.h"
41 
42 #include "ri-util.h"
43 #include "prettyprint.h"
44 #include "effects-util.h"
45 #include "constants.h"
46 #include "misc.h"
47 #include "text-util.h"
48 #include "text.h"
49 
50 
51 
52 
53 #include "effects-generic.h"
54 #include "effects-simple.h"
55 
56 #include "resources.h"
57 
58 
59 list
61  bool (*union_combinable_p)(effect, effect) __attribute__ ((unused)))
62 {
63  return gen_nconc(l1,l2);
64 }
65 
66 list
68  bool (*union_combinable_p)(effect, effect) __attribute__ ((unused)))
69 {
70  list l_res;
71 
72  /* somthing more clever should be done here - bc. */
73  l_res = gen_nconc(l1,l2);
75  return l_res;
76 }
77 
78 
79 
80 /* list EffectsMayUnion(list l1, list l2, union_combinable_p)
81  * input : two lists of effects
82  * output : a list of effects, may union of the two initial lists
83  * modifies : l1 and l2 and their effects. Effects that are not reused in
84  * the output list of effects are freed.nothing (no sharing introduced).
85  */
86 list
88  bool (*union_combinable_p)(effect, effect))
89 {
90  list lr;
91 
93  union_combinable_p,
96  return(lr);
97 }
98 
99 
100 /* list EffectsMustUnion(list l1, list l2, union_combinable_p)
101  * input : two lists of effects
102  * output : a list of effects, must union of the two initial lists
103  * modifies : l1 and l2 and their effects. Effects that are not reused in
104  * the output list of effects are freed.
105  */
106 list
108  bool (*union_combinable_p)(effect, effect))
109 {
110  list lr;
111 
113  union_combinable_p,
116  return(lr);
117 }
118 
119 /* list EffectsMustUnion(list l1, list l2, union_combinable_p)
120  * input : two lists of effects
121  * output : a list of effects, must union of the two initial lists
122  * modifies : l1 and l2 and their effects. Effects that are not reused in
123  * the output list of effects are freed.
124  */
125 list
127  bool (*union_combinable_p)(effect, effect))
128 {
129  list lr;
130 
132  union_combinable_p,
135  return(lr);
136 }
137 
139 {
140  list l_res = NIL;
141  l_res = CONS(EFFECT, effect_may_union(eff1,eff2), NIL);
142  return(l_res);
143 }
144 
146 {
147  list l_res = NIL;
148  l_res = CONS(EFFECT, effect_must_union(eff1,eff2), NIL);
149  return(l_res);
150 }
151 
152 /* Preserve store independent information as long as you can. I should
153  have some order on references to absorb, for instance, x[1] by
154  x[*]. */
155 
156 /**
157  @brief computes the may union of two combinable effects
158  @param[in] eff1 effect
159  @param[in] eff2
160  @see effects_combinable_p
161  @return a new effect with no sharing with the input effects
162  */
164 {
165  effect eff;
166  tag app1 = effect_approximation_tag(eff1);
167  tag app2 = effect_approximation_tag(eff2);
168 
169  bool al1_p = effect_abstract_location_p(eff1);
170  bool al2_p = effect_abstract_location_p(eff2);
171 
172  /* Abstract locations cases */
173  /* In fact, we could have :
174  if (al1_p || al_2_p)
175  {
176  entity e1 = effect_entity(e1);
177  entity e2 = effect_entity(e2);
178 
179  new_ent = entity_locations_max(e1, e2);
180 
181  eff = make_simple_effect(make_reference(new_ent, NIL),
182  copy_action(effect_action(eff1)),
183  make_approximation(approximation_and(app1,app2), UU));
184  }
185 
186  but entity_locations_max involves string manipulations, which are always costly.
187  So we treat apart the cases where (al1_p and ! al2_p) and (al2_p and ! al1_p) because
188  we already know that the abstract location is the max of both locations
189  (because they are combinable (see effects_combinable_p))
190 
191  */
192  if (al1_p && al2_p)
193  {
194  entity e1 = effect_entity(eff1);
195  entity e2 = effect_entity(eff2);
196 
197  entity new_ent = entity_locations_max(e1, e2);
198 
199  eff = make_simple_effect(make_reference(new_ent, NIL),
200  copy_action(effect_action(eff1)),
202  }
203  else if (al1_p) {
204  // functions that can be pointed by effect_dup_func:
205  // simple_effect_dup
206  // region_dup
207  // copy_effect
208  eff = (*effect_dup_func)(eff1);
209  }
210  else if (al2_p) {
211  // functions that can be pointed by effect_dup_func:
212  // simple_effect_dup
213  // region_dup
214  // copy_effect
215  eff = (*effect_dup_func)(eff2);
216  }
217 
218  /* concrete locations cases */
219  else if (effect_scalar_p(eff1))
220  {
222  copy_action(effect_action(eff1)),
224  }
225  else
226  {
227  // functions that can be pointed by effect_dup_func:
228  // simple_effect_dup
229  // region_dup
230  // copy_effect
231  eff = (*effect_dup_func)(eff1);
232  cell eff_c = effect_cell(eff);
233 
234  if (cell_preference_p(eff_c))
235  {
236  /* it's a preference : we change for a reference cell */
237  pips_debug(8, "It's a preference\n");
239  free_cell(eff_c);
241  }
242 
243  /* let us check the indices */
246 
247  tag app_tag = approximation_and(app1,app2);
248 
249  for(; !ENDP(l1); POP(l1), POP(l2))
250  {
251  expression exp1 = EXPRESSION(CAR(l1));
252  expression exp2 = EXPRESSION(CAR(l2));
253  if (!expression_equal_p(exp1, exp2))
254  {
256  app_tag = is_approximation_may;
257  }
258  }
259 
260  approximation_tag(effect_approximation(eff)) = app_tag;
261  }
262  return(eff);
263 }
264 
265 /**
266  @brief computes the must union of two combinable effects
267  @param[in] eff1 effect
268  @param[in] eff2
269  @see effects_combinable_p
270  @return a new effect with no sharing with the input effects
271  */
273 {
274  effect eff;
275  tag app1 = effect_approximation_tag(eff1);
276  tag app2 = effect_approximation_tag(eff2);
277 
278  bool al1_p = effect_abstract_location_p(eff1);
279  bool al2_p = effect_abstract_location_p(eff2);
280 
281  /* Abstract locations cases */
282  /* In fact, we could have :
283  if (al1_p || al_2_p)
284  {
285  entity e1 = effect_entity(e1);
286  entity e2 = effect_entity(e2);
287 
288  new_ent = entity_locations_max(e1, e2);
289 
290  eff = make_simple_effect(make_reference(new_ent, NIL),
291  copy_action(effect_action(eff1)),
292  make_approximation(approximation_and(app1,app2), UU));
293  }
294 
295  but entity_locations_max involves string manipulations, which are always costly.
296  So we treat apart the cases where (al1_p and ! al2_p) and (al2_p and ! al1_p) because
297  we already know that the abstract location is the max of both locations
298  (because they are combinable (see effects_combinable_p))
299 
300  */
301  if (al1_p && al2_p)
302  {
303  entity e1 = effect_entity(eff1);
304  entity e2 = effect_entity(eff2);
305 
306  entity new_ent = entity_locations_max(e1, e2);
307 
308  eff = make_simple_effect(make_reference(new_ent, NIL),
309  copy_action(effect_action(eff1)),
311  }
312  else if (al1_p) {
313  // functions that can be pointed by effect_dup_func:
314  // simple_effect_dup
315  // region_dup
316  // copy_effect
317  eff = (*effect_dup_func)(eff1);
318  }
319  else if (al2_p) {
320  // functions that can be pointed by effect_dup_func:
321  // simple_effect_dup
322  // region_dup
323  // copy_effect
324  eff = (*effect_dup_func)(eff2);
325  }
326 
327  /* concrete locations cases */
328  else if (effect_scalar_p(eff1))
329  {
331  copy_action(effect_action(eff1)),
332  make_approximation(approximation_or(app1,app2), UU));
333  }
334  else
335  {
336  // functions that can be pointed by effect_dup_func:
337  // simple_effect_dup
338  // region_dup
339  // copy_effect
340  eff = (*effect_dup_func)(eff1);
341  cell eff_c = effect_cell(eff);
342  if (cell_preference_p(eff_c))
343  {
344  /* it's a preference : we change for a reference cell */
345  pips_debug(8, "It's a preference\n");
347  free_cell(eff_c);
349  }
350 
351  /* let us check the indices */
354 
355  tag app_tag = approximation_or(app1,app2);
356 
357  for(; !ENDP(l1); POP(l1), POP(l2))
358  {
359  expression exp1 = EXPRESSION(CAR(l1));
360  expression exp2 = EXPRESSION(CAR(l2));
361  if (!expression_equal_p(exp1, exp2))
362  {
364  app_tag = is_approximation_may;
365  }
366  }
367 
368  effect_approximation_tag(eff) = app_tag;
369  }
370  return(eff);
371 }
372 
373 
374 static list
375 effect_sup_difference(/* const */ effect eff1, /* const */ effect eff2)
376 {
377  list l_res = NIL;
378  reference ref1 = effect_any_reference(eff1);
379  reference ref2 = effect_any_reference(eff2);
380 
381  /* We already know that effects are combinable and they are not abstract locations
382  * (or they are context_sensitive heap locations)
383  */
384  if (reference_equal_p(ref1, ref2)) // a[1] - a[1] or a[*] - a[*]_may
385  {
386  if (effect_may_p(eff2)) {
387  // functions that can be pointed by effect_dup_func:
388  // simple_effect_dup
389  // region_dup
390  // copy_effect
391  l_res = effect_to_may_effect_list((*effect_dup_func)(eff1));
392  }
393  // else: empty list
394  }
395  else
396  {
397  if (effect_exact_p(eff1) && effect_exact_p(eff2)) {// a[1] - a[2]
398  // functions that can be pointed by effect_dup_func:
399  // simple_effect_dup
400  // region_dup
401  // copy_effect
402  l_res = effect_to_list((*effect_dup_func)(eff1));
403  }
404  else
405  {
406  // a[*] - a[1] or a[1] - a[*]_may for instance
407  // functions that can be pointed by effect_dup_func:
408  // simple_effect_dup
409  // region_dup
410  // copy_effect
411  l_res = effect_to_may_effect_list((*effect_dup_func)(eff1));
412  }
413  }
414 
415  return(l_res);
416 }
417 
418 static list
420  effect eff2 __attribute__ ((unused)))
421 {
422  list l_res = NIL;
423  return(l_res);
424 }
425 
426 
427 
428 /* list EffectsSupDifference(list l1, l2)
429  * input : two lists of effects
430  * output : a list of effect, representing the sup_difference of the
431  * initial effects.
432  * modifies : the effects of l2 may be freed.
433  * comment : we keep the effects of l1 that are not combinable with those
434  * of l2, but we don't keep the effects of l2 that are not
435  * combinable with those of l_reg1.
436  */
437 list
439  bool (*difference_combinable_p)(effect, effect))
440 {
441  list l_res = NIL;
442 
443  debug(3, "EffectsSupDifference", "begin\n");
445  difference_combinable_p,
447  debug(3, "EffectsSupDifference", "end\n");
448 
449  return l_res;
450 }
451 
452 /* list EffectsInfDifference(list l1, l2)
453  * input : two lists of effects
454  * output : a list of effect, representing the inf_difference of the
455  * initial effects.
456  * modifies : the effects of l2 may be freed.
457  * comment : we keep the effects of l1 that are not combinable with those
458  * of l2, but we don't keep the effects of l2 that are not
459  * combinable with those of l_reg1.
460  */
461 list
463  bool (*difference_combinable_p)(effect, effect))
464 {
465  list l_res = NIL;
466 
467  debug(3, "EffectsInfDifference", "begin\n");
469  difference_combinable_p,
471  debug(3, "EffectsInfDifference", "end\n");
472 
473  return l_res;
474 }
475 
476 /* FI: the goal is to get rid of array subscripts to handle the arrays
477  * atomically.
478  *
479  * This is not possible with pointer indexing. For instance, p[0] is
480  * reduced the Fortran way into p, which is wrong. It could be reduced
481  * to p[*] and lead to an anywhere effects. Or we must preserve
482  * constant indices (store independent), which is the way to go with C
483  * since we transform lots of scalar accesses into array accesses.
484  *
485  * FI: I do not understand the mix of side effects on eff, free and
486  * alloc conditionnaly for some fields. To be checked.
487  */
489 {
490  if (!effect_scalar_p(eff)) {
491  cell eff_c = effect_cell(eff);
492  bool may_p = false;
494 
495  if (cell_preference_p(eff_c))
496  {
497  /* it's a preference : we change for a reference cell */
498  pips_debug(8, "It's a preference\n");
500  free_cell(eff_c);
502  }
503  else
504  {
505  /* it's a reference : let'us modify it */
506  ref = cell_reference(eff_c);
507  }
508 
509  ifdebug(8) {
510  pips_debug(8, "Proper effect %p with reference %p: %s\n", eff, ref,
512  }
513 
514  list inds = reference_indices(ref);
515  list cind = list_undefined;
516  for(cind = inds; !ENDP(cind); POP(cind)) {
517  expression se = EXPRESSION(CAR(cind));
518 
519  ifdebug(8) {
520  pips_debug(8, "Subscript expression :\n");
521  print_expression(se);
522  }
523 
525  if(!unbounded_expression_p(se))
526  {
527  /* it may still be a field entity */
528  if (!(expression_reference_p(se) &&
530  {
531  may_p = true;
532  free_expression(se);
534  }
535  }
536  }
537  }
538 
539  if(may_p)
541 
542  ifdebug(8) {
543  pips_debug(8, "Summary simple effect %p with reference %p: %s\n", eff, ref,
545  }
546 
547  /*
548  if(!reference_with_constant_indices_p(r)) {
549  reference nr = pointer_type_p(ut)?
550  make_reference(e, CONS(EXPRESSION, make_unbounded_expression(), NIL))
551  : make_reference(e, NIL);
552  free_reference(effect_any_reference(eff));
553  if(cell_preference_p(c)) {
554  preference p = cell_preference(c);
555  preference_reference(p) = nr;
556  }
557  else {
558  cell_reference(c) = nr;
559  }
560  }
561  */
562  }
563  return(eff);
564 }
565 
566 
568  cell c2, descriptor __attribute__ ((__unused__)) d2,
569  bool * exact_p)
570 {
571  bool res = true; /* default safe result */
572  bool concrete_locations_p = true;
573 
574  if (cells_combinable_p(c1, c2))
575  {
576  bool c1_abstract_location_p = cell_abstract_location_p(c1);
577  bool c2_abstract_location_p = cell_abstract_location_p(c2);
578 
579  if (c1_abstract_location_p || c2_abstract_location_p)
580  {
581  entity e1 = cell_entity(c1);
582  entity e2 = cell_entity(c2);
583  bool heap1_context_sensitive_p = c1_abstract_location_p && entity_flow_or_context_sentitive_heap_location_p(e1);
584  bool heap2_context_sensitive_p = c2_abstract_location_p && entity_flow_or_context_sentitive_heap_location_p(e2);
585 
586  if (heap1_context_sensitive_p && heap2_context_sensitive_p)
587  {
588  concrete_locations_p = true;
589  }
590  else
591  {
592  concrete_locations_p = false;
593 
594  res = true;
595  *exact_p = true;
596  }
597  }
598 
599  if (concrete_locations_p)
600  {
601  /* we have combinable concrete locations or assimilated (context sensitive heap locations) */
602  list l1 = cell_indices(c1);
603  list l2 = cell_indices(c2);
604 
605  /* they intersect if their corresponding indices are unbounded or equal */
606  res = true; *exact_p = true;
607  while(res && !ENDP(l1))
608  {
609  expression exp1 = EXPRESSION(CAR(l1));
610  expression exp2 = EXPRESSION(CAR(l2));
611 
613  *exact_p = false;
614  else if (!expression_equal_p(exp1, exp2))
615  {
616  res = false;
617  *exact_p = true;
618  }
619  POP(l1);
620  POP(l2);
621  }
622  }
623  }
624  else
625  {
626  res = false;
627  *exact_p = true;
628  }
629  return res;
630 }
631 
632 /* Inclusion test :
633  */
634 
635 /**
636  returns true if c1 is included into c2, false otherwise.
637  returns false if c1 may only be included into c2.
638 
639  @param exact_p target is set to true if the result is exact, false otherwise.
640 
641  In fact, this parameter would be useful only if there are overflows during
642  the systems inclusion test. But it is not currently used.
643  */
645  cell c2, __attribute__ ((__unused__)) descriptor d2,
646  bool * exact_p)
647 {
648  bool res = true; /* default result */
649  *exact_p = true;
650 
651  bool concrete_locations_p = true;
652 
653  if (cells_combinable_p(c1, c2))
654  {
655  bool c1_abstract_location_p = cell_abstract_location_p(c1);
656  bool c2_abstract_location_p = cell_abstract_location_p(c2);
657 
658  if (c1_abstract_location_p || c2_abstract_location_p)
659  {
660  entity e1 = cell_entity(c1);
661  entity e2 = cell_entity(c2);
662  bool heap1_context_sensitive_p = c1_abstract_location_p && entity_flow_or_context_sentitive_heap_location_p(e1);
663  bool heap2_context_sensitive_p = c2_abstract_location_p && entity_flow_or_context_sentitive_heap_location_p(e2);
664 
665  if (heap1_context_sensitive_p && heap2_context_sensitive_p)
666  {
667  concrete_locations_p = true;
668  }
669  else
670  {
671  entity al_max = abstract_locations_max(e1, e2);
672  res = same_entity_p(e2, al_max);
673  concrete_locations_p = false;
674  }
675  }
676 
677  if (concrete_locations_p)
678  {
679  /* we have combinable concrete locations or assimilated (context sensitive heap locations) */
680  list inds1 = cell_indices(c1);
681  list inds2 = cell_indices(c2);
682 
683 
684  for(;!ENDP(inds1) && res == true; POP(inds1), POP(inds2))
685  {
686  expression exp1 = EXPRESSION(CAR(inds1));
687  expression exp2 = EXPRESSION(CAR(inds2));
688 
689  if (unbounded_expression_p(exp1))
690  {
691  pips_debug(8, "case 4.1\n");
692  if (!unbounded_expression_p(exp2))
693  {
694  pips_debug(8, "case 4.2\n");
695  res = false;
696  }
697  }
698  else if (!unbounded_expression_p(exp2) && !expression_equal_p(exp1, exp2) )
699  {
700  pips_debug(8, "case 4.3\n");
701  res = false;
702  }
703  }
704  }
705  }
706  else
707  {
708  res = false;
709  }
710  return res;
711 }
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
cell make_cell_reference(reference _field_)
Definition: effects.c:293
action copy_action(action p)
ACTION.
Definition: effects.c:77
void free_cell(cell p)
Definition: effects.c:249
approximation make_approximation(enum approximation_utype tag, void *val)
Definition: effects.c:176
reference make_reference(entity a1, list a2)
Definition: ri.c:2083
void free_expression(expression p)
Definition: ri.c:853
reference copy_reference(reference p)
REFERENCE.
Definition: ri.c:2047
bool entity_flow_or_context_sentitive_heap_location_p(entity e)
static reference ref
Current stmt (an integer)
Definition: adg_read_paf.c:163
entity abstract_locations_max(entity al1, entity al2)
eturns the smallest abstract location set greater than or equalt to al1 and al2.
entity entity_locations_max(entity al1, entity al2)
Here, entity al1 and entity al2 can be program variables.
list list_of_effects_generic_sup_difference_op(list, list, bool(*)(effect, effect), list(*)(effect, effect))
list effect_to_may_effect_list(effect)
void effects_to_may_effects(list)
list list_of_effects_generic_union_op(list, list, bool(*)(effect, effect), list(*)(effect, effect), list(*)(effect))
list list_of_effects_generic_inf_difference_op(list, list, bool(*)(effect, effect), list(*)(effect, effect))
effect(* effect_dup_func)(effect eff)
list effect_to_list(effect)
bool cells_combinable_p(cell, cell)
list EffectsMustUnion(list l1, list l2, bool(*union_combinable_p)(effect, effect))
list EffectsMustUnion(list l1, list l2, union_combinable_p) input : two lists of effects output : a l...
list EffectsMayUnion(list l1, list l2, bool(*union_combinable_p)(effect, effect))
list EffectsMayUnion(list l1, list l2, union_combinable_p) input : two lists of effects output : a li...
static list effect_sup_difference(effect eff1, effect eff2)
effect effect_may_union(effect eff1, effect eff2)
Preserve store independent information as long as you can.
list effects_may_union(effect eff1, effect eff2)
list ReferenceTestUnion(list l1, list l2, bool(*union_combinable_p)(effect, effect) __attribute__((unused)))
list ReferenceUnion(list l1, list l2, bool(*union_combinable_p)(effect, effect) __attribute__((unused)))
package effect: new version by Beatrice Creusillet
bool simple_cells_inclusion_p(cell c1, __attribute__((__unused__)) descriptor d1, cell c2, __attribute__((__unused__)) descriptor d2, bool *exact_p)
Inclusion test :
list effects_must_union(effect eff1, effect eff2)
list ProperEffectsMustUnion(list l1, list l2, bool(*union_combinable_p)(effect, effect))
list EffectsMustUnion(list l1, list l2, union_combinable_p) input : two lists of effects output : a l...
bool simple_cells_intersection_p(cell c1, descriptor __attribute__((__unused__)) d1, cell c2, descriptor __attribute__((__unused__)) d2, bool *exact_p)
static list effect_inf_difference(effect eff1 __attribute__((unused)), effect eff2 __attribute__((unused)))
list EffectsInfDifference(list l1, list l2, bool(*difference_combinable_p)(effect, effect))
list EffectsInfDifference(list l1, l2) input : two lists of effects output : a list of effect,...
list EffectsSupDifference(list l1, list l2, bool(*difference_combinable_p)(effect, effect))
list EffectsSupDifference(list l1, l2) input : two lists of effects output : a list of effect,...
effect effect_must_union(effect eff1, effect eff2)
computes the must union of two combinable effects
effect proper_to_summary_simple_effect(effect eff)
FI: the goal is to get rid of array subscripts to handle the arrays atomically.
list effect_to_sdfi_list(effect)
list effect_to_may_sdfi_list(effect)
list words_effect(effect)
#define effect_may_p(eff)
#define effect_any_reference(e)
FI: cannot be used as a left hand side.
#define effect_approximation_tag(eff)
#define effect_exact_p(eff)
#define make_simple_effect(reference, action, approximation)
tag approximation_and(tag, tag)
tag approximation_and(tag t1, tag t2) input : two approximation tags.
Definition: effects.c:1198
bool effect_abstract_location_p(effect)
Definition: effects.c:280
list cell_indices(cell)
Definition: effects.c:64
entity effect_entity(effect)
cproto-generated files
Definition: effects.c:52
bool effect_scalar_p(effect)
Definition: effects.c:567
tag approximation_or(tag, tag)
tag approximation_or(tag t1, tag t2) input : two approximation tags.
Definition: effects.c:1213
bool cell_abstract_location_p(cell)
Definition: effects.c:273
entity cell_entity(cell)
Definition: effects.c:57
#define cell_reference(x)
Definition: effects.h:469
#define cell_preference(x)
Definition: effects.h:472
#define approximation_tag(x)
Definition: effects.h:362
#define effect_action(x)
Definition: effects.h:642
#define cell_preference_p(x)
Definition: effects.h:470
@ is_approximation_may
Definition: effects.h:341
#define effect_approximation(x)
Definition: effects.h:644
#define EFFECT(x)
EFFECT.
Definition: effects.h:608
#define effect_cell(x)
Definition: effects.h:640
#define ENDP(l)
Test if a list is empty.
Definition: newgen_list.h:66
#define POP(l)
Modify a list pointer to point on the next element of the list.
Definition: newgen_list.h:59
#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
list gen_nconc(list cp1, list cp2)
physically concatenates CP1 and CP2 but do not duplicates the elements
Definition: list.c:344
#define CAR(pcons)
Get the value of the first element of a list.
Definition: newgen_list.h:92
#define list_undefined
Undefined list definition :-)
Definition: newgen_list.h:69
#define pips_debug
these macros use the GNU extensions that allow variadic macros, including with an empty list.
Definition: misc-local.h:145
void debug(const int the_expected_debug_level, const char *calling_function_name, const char *a_message_format,...)
ARARGS0.
Definition: debug.c:189
int tag
TAG.
Definition: newgen_types.h:92
#define UU
Definition: newgen_types.h:98
void print_expression(expression e)
no file descriptor is passed to make is easier to use in a debugging stage.
Definition: expression.c:58
bool same_entity_p(entity e1, entity e2)
predicates on entities
Definition: entity.c:1321
bool entity_field_p(entity e)
e is the field of a structure
Definition: entity.c:857
bool extended_integer_constant_expression_p(expression e)
More extensive than next function.
Definition: expression.c:858
expression make_unbounded_expression()
Definition: expression.c:4339
bool expression_equal_p(expression e1, expression e2)
Syntactic equality e1==e2.
Definition: expression.c:1347
bool reference_equal_p(reference r1, reference r2)
Definition: expression.c:1500
bool expression_reference_p(expression e)
Test if an expression is a reference.
Definition: expression.c:528
bool unbounded_expression_p(expression e)
Definition: expression.c:4329
entity expression_variable(expression e)
Definition: expression.c:532
#define reference_undefined
Definition: ri.h:2302
#define EXPRESSION_(x)
Definition: ri.h:1220
#define EXPRESSION(x)
EXPRESSION.
Definition: ri.h:1217
#define reference_indices(x)
Definition: ri.h:2328
#define preference_reference(x)
Definition: ri.h:2102
#define ifdebug(n)
Definition: sg.c:47
The structure used to build lists in NewGen.
Definition: newgen_list.h:41
string words_to_string(cons *lw)
Definition: print.c:211