PIPS
generate-util.c
Go to the documentation of this file.
1 /*
2 
3  $Id: generate-util.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 /* HPFC module by Fabien COELHO
28  */
29 
30 #include "defines-local.h"
31 
32 static expression
34 {
35  static const string option[] =
36  {
37  "PvmDataDefault",
38  "PvmDataRaw",
39  "PvmDataInPlace"
40  };
41 
42  return MakeCharacterConstantExpression(option[n]);
43 }
44 
45 /* builds a statement
46  * VAR_i = MYPOS(i, proc_number) // i=1 to proc dimension
47  */
48 statement
50  entity proc,
51  entity (*creation)(int))
52 {
53  int i, procn = load_hpf_number(proc);
54  list /* of expression */ mypos_indices,
55  /* of statement */ ls = NIL;
56  reference mypos;
57  entity dummy;
58 
59  for(i=NumberOfDimension(proc); i>0; i--)
60  {
61  dummy = creation(i);
62  mypos_indices = CONS(EXPRESSION, int_to_expression(i),
64  NIL));
65  mypos = make_reference(hpfc_name_to_entity(MYPOS), mypos_indices);
66  ls = CONS(STATEMENT,
69  ls);
70  }
71 
72  return make_block_statement(ls);
73 }
74 
75 /* statement generate_deducables(list le)
76  *
77  * the le list of expression is used to generate the deducables.
78  * The fields of interest are the variable which is referenced and
79  * the normalized field which is the expression that is going to
80  * be used to define the variable.
81  */
82 statement
84  list /* of expression */ le)
85 {
86  list rev = gen_nreverse(gen_copy_seq(le)), ls = NIL;
87 
88  MAP(EXPRESSION, e,
89  {
92 
93  ls = CONS(STATEMENT, Pvecteur_to_assign_statement(var, v), ls);
94  },
95  rev);
96 
97  gen_free_list(rev);
98  return make_block_statement(ls);
99 }
100 
101 list /* of expression */
103  entity (*creation)(),
104  int number)
105 {
106  list result = NIL;
107  pips_assert("valid dimension number", number>=0 && number<=7);
108 
109  for(; number>0; number--)
110  result = CONS(EXPRESSION, entity_to_expression(creation(number)),
111  result);
112 
113  return result;
114 }
115 
116 expression
118  entity e,
119  entity (*creation)())
120 {
122  hpfc_gen_n_vars_expr(creation, NumberOfDimension(e))));
123 }
124 
125 /* returns statement VAR = VAR + N
126  */
127 statement
129  entity var, /* integer scalar variable */
130  int n) /* added value */
131 {
132  return make_assign_statement
133  (entity_to_expression(var),
136 }
137 
138 /* expr = expr + 2
139  */
140 statement
142  expression exp)
143 {
145  return(make_assign_statement
146  (copy_expression(exp),
147  MakeBinaryCall(plus, exp, int_to_expression(2))));
148 
149 }
150 
151 statement
153  expression tid,
154  expression channel,
155  bool send)
156 {
157  expression third;
158  entity pvmf;
159 
161  pvmf = hpfc_name_to_entity(send ? PVM_SEND : PVM_RECV);
162 
163  return make_block_statement
165  CONS(EXPRESSION, tid,
166  CONS(EXPRESSION, channel,
167  CONS(EXPRESSION, third,
168  NIL)))),
170  NIL)));
171 }
172 
173 /* returns if (LAZY_{SEND,RECV}) then
174  */
175 statement
177  bool snd,
178  statement then)
179 {
180  entity decision = hpfc_name_to_entity(snd ? LAZY_SEND : LAZY_RECV);
181  return test_to_statement
183 }
184 
185 /* IF (LAZY_snd) THEN
186  * PVMFsnd()
187  * LAZY_snd = false // if receive
188  * ENDIF
189  */
190 static statement
192  expression tid,
193  expression channel,
194  bool snd)
195 {
196  entity decision = hpfc_name_to_entity(snd ? LAZY_SEND : LAZY_RECV);
197  statement
198  comm = hpfc_message(tid, channel, snd),
199  then = snd ? comm :
201  CONS(STATEMENT, set_logical(decision, false),
202  NIL))) ;
203 
204  return hpfc_lazy_guard(snd, then);
205 }
206 
207 statement
209  entity ld,
210  bool send,
211  bool lazy)
212 {
213  entity nc, nt;
214  expression lid, tid, chn;
215 
218  lid = entity_to_expression(ld);
220  (make_reference(nt, CONS(EXPRESSION, lid, NIL)));
223 
224  return lazy ? hpfc_lazy_message(tid, chn, send) :
225  hpfc_message(tid, chn, send);
226 }
227 
228 statement
230  bool lazy)
231 {
232  statement init;
233 
234  /* 2 args to pvmfinitsend
235  */
240  NIL)));
241 
242  return lazy ? make_block_statement
243  (CONS(STATEMENT, init,
245  NIL))) :
246  init ;
247 }
248 
249 /****************************************************************** PACKING */
250 
251 /* returns the buffer entity for array
252  */
253 static entity
255  entity array,
256  string suffix)
257 {
260  suffix, NULL));
261 }
262 
263 /* returns a reference to the typed common hpfc_buffer buffer,
264  * that suits array basic type and with index as an index.
265  */
268  entity array, /* array to select the right typed buffer */
269  entity index) /* index variable */
270 {
274  NIL)));
275 }
276 
277 /* generates the condition for testing the buffer state:
278  * returns (BUFFER_INDEX.[eq|ne].BUFFER_[|RCV]SIZE) depending on swtiches.
279  */
280 static expression
282  entity array, /* array for the typed buffer size */
283  bool is_send, /* while sending or receiving */
284  bool is_full) /* TRUE: is full, FALSE: is not empty */
285 {
286  entity opera, bsize, index;
287 
289  opera = is_full ?
292  bsize = is_send ? is_full ?
294  MakeConstant("0", is_basic_int) :
296 
297  return MakeBinaryCall(opera,
298  entity_to_expression(index),
299  entity_to_expression(bsize));
300 }
301 
302 /* array(creation) = buffer(current++) or reverse assignment...
303  */
304 statement
306  entity array,
307  entity (*creation)(),
308  bool pack)
309 {
310  entity index;
311  expression array_ref, buffer_ref;
312  statement increment, assignment;
313 
315  array_ref = make_reference_expression(array, creation);
316  buffer_ref = hpfc_buffer_reference(array, index);
317  increment = hpfc_add_n(index, 1);
318  assignment = make_assign_statement(pack ? buffer_ref : array_ref,
319  pack ? array_ref : buffer_ref);
320 
321  return make_block_statement(CONS(STATEMENT, increment,
323  NIL)));
324 }
325 
326 static entity
328  int dim, /* number of dimensions of the broadcast */
329  bool special) /* whether to use the special version */
330 {
331  char *buffer; /* ??? static buffer size */
332  asprintf(&buffer, "%s%d", special? GUARDED_BRD: BROADCAST, dim);
334  free(buffer);
335  return e;
336 }
337 
338 /* send the buffer, possibly a broadcast.
339  * unconditional ? if non empty ?
340  * generates hpfc_broadcast_x as required.
341  * ??? hardwired for remappings...
342  */
343 static statement
345  entity src, /* source array */
346  entity trg, /* should be the target array */
347  entity lid, /* broadcast base, maybe partial?! */
348  entity proc) /* processor related to the array... (redundant!?) */
349 {
350  Pcontrainte c;
351  int size, npdim, nreplicated;
352  list /* of expression */ args = NIL;
353  bool avoid_twins =
354  get_bool_property("HPFC_GUARDED_TWINS") && replicated_p(src);
355 
356  c = full_linearization(proc, (entity) NULL, &size,
357  get_ith_temporary_dummy, false, 0);
358 
359  npdim = NumberOfDimension(proc);
360 
361  for (nreplicated=0; npdim; npdim--)
362  {
363  if (processors_dim_replicated_p(proc, trg, npdim))
364  {
365  /* ??? possible replication on sections overlooked here */
366  entity v;
367  Value step;
368  int number;
369 
370  nreplicated++;
371  v = get_ith_temporary_dummy(npdim);
372  step = vect_coeff((Variable) v, contrainte_vecteur(c));
373  number = SizeOfIthDimension(proc, npdim);
374 
375  args = CONS(EXPRESSION, int_to_expression(number),
377  args));
378  }
379  }
380 
381  args = CONS(EXPRESSION, entity_to_expression(lid), args);
382 
383  /* an argument needed by the special function */
384  if (avoid_twins)
386  contraintes_free(c);
387 
388  return call_to_statement
389  (make_call(hpfc_ith_broadcast_function(nreplicated, avoid_twins), args));
390 }
391 
392 /* CALL (pvmtype) HPFC {,UN}PACK
393  */
394 statement
396  entity array,
397  bool pack)
398 {
401 }
402 
403 statement
405  entity array, /* remapped source array */
406  entity trg, /* remapped target array */
407  entity lid, /* lid for target processor(s) */
408  entity proc, /* target processor */
409  bool is_lazy) /* lazy or not... */
410 {
411  expression not_empty;
412  statement send, pack;
413 
414  not_empty = buffer_full_condition(array, true, false);
415  send = hpfc_broadcast_buffers(array, trg, lid, proc);
417 
418  if (is_lazy)
419  return test_to_statement
420  (make_test(not_empty,
422  CONS(STATEMENT, send, NIL))),
424  else
425  return make_block_statement
426  (CONS(STATEMENT, test_to_statement(make_test(not_empty, pack,
431  NIL)));
432 }
433 
434 /* lazy in actually sending or not the packed buffer immediatly...
435  */
436 statement
438  entity src, /* source array */
439  entity trg, /* target array */
440  entity lid, /* local id for base target */
441  entity proc, /* the processors, needed for broadcasts */
442  entity (*array_dim)(), /* variables for array dimensions */
443  bool is_send, /* send or receive ? */
444  bool is_lazy) /* means you send the buffer directly, without packing... */
445 {
446  statement packing, realpack, indexeq0, ifcond, optional;
447  expression condition;
448  list /* of statement */ l;
449  entity array; /* array being manipulated */
450 
451  array = is_send ? src : trg;
452  packing = hpfc_buffer_packing(array, array_dim, is_send);
453  condition = buffer_full_condition(array, is_send, true);
454 
455  /* CALL HPFC PACK/UNPACK
456  */
457  realpack = call_to_statement
459  is_send ? NIL : CONS(EXPRESSION, entity_to_expression(lid), NIL)));
460 
461  /* BUF INDEX=0
462  */
464  optional = is_lazy ?
465  is_send ? hpfc_broadcast_buffers(array, trg, lid, proc) :
468 
469  if (is_send)
470  l = CONS(STATEMENT, realpack,
471  CONS(STATEMENT, optional,
472  CONS(STATEMENT, indexeq0,
473  is_lazy?
475  true), NIL): NIL)));
476  else
477  l = CONS(STATEMENT, optional,
478  CONS(STATEMENT, realpack,
479  CONS(STATEMENT, indexeq0, NIL)));
480 
481  ifcond = test_to_statement
482  (make_test(condition,
485 
486  return make_block_statement
487  (is_send ? CONS(STATEMENT, packing, CONS(STATEMENT, ifcond, NIL)) :
488  CONS(STATEMENT, ifcond, CONS(STATEMENT, packing, NIL)));
489 }
490 
491 statement
493  bool is_send,
494  _UNUSED_ bool is_lazy,
495  bool job_was_done)
496 {
497  statement buffindex, msgstate, other;
498  list /* of statement */ l;
499 
502  (is_send ? SND_NOT_INIT : RCV_NOT_PRF), job_was_done);
503  if (is_send)
505  /* set_expression(hpfc_name_to_entity(BUFFER_ENCODING),
506  pvm_encoding_option(2)) */
507  else
508  other = set_expression
510 
511  l = CONS(STATEMENT, buffindex,
512  CONS(STATEMENT, msgstate,
513  CONS(STATEMENT, other,
514  NIL)));
515 
516  return make_block_statement(l);
517 }
518 
519 /* the lazy issues.
520  * note that target processors should be known
521  * to generate the appropriate broadcast?
522  */
523 statement
525  entity array,
526  entity lid,
527  entity (*creation)(),
528  bool pack,
529  bool lazy)
530 {
531  statement pack_stmt = hpfc_buffer_packing(array, creation, pack);
532 
533  return lazy ? (pack ? make_block_statement
534  (CONS(STATEMENT, pack_stmt,
536  NIL))) :
538  (CONS(STATEMENT, hpfc_generate_message(lid, false, true),
539  CONS(STATEMENT, pack_stmt,
540  NIL)))) : pack_stmt ;
541 }
542 
543 
544 /* statement st_compute_lid(proc)
545  *
546  * T_LID=CMP_LID(pn, pi...)
547  *
548  * if array is not NULL, partial according to array.
549  * the offset is shifted as if proc dimensions were normalized,
550  * in order to match the runtime library hpfc_broadcast_* expectations.
551  */
552 statement
554  entity lid, /* variable to be assigned to */
555  entity proc, /* processor arrangement */
556  entity (*creation)(), /* individual variables */
557  entity array) /* to be used for partial (broadcasts...) */
558 {
559  if (!get_bool_property("HPFC_EXPAND_CMPLID"))
560  {
561  int ndim = NumberOfDimension(proc);
563 
564  pips_assert("implemented", !array);
565 
569  gen_nconc(hpfc_gen_n_vars_expr(creation, ndim),
570  make_list_of_constant(0, 7-ndim)))));
571  }
572  else
573  {
574  int size;
575  Pcontrainte c;
576  Pvecteur v;
577  statement result;
578 
579  c = full_linearization(proc, lid, &size, creation, false, 1);
580  v = contrainte_vecteur(c);
581 
582  if (array)
583  {
584  /* remove distributed dimensions from the constraint
585  * and normalize the partial system so that dims are 0:...
586  */
587  int npdim;
588  pips_assert("defined", array && !entity_undefined_p(array));
589 
590  for(npdim = NumberOfDimension(proc); npdim; npdim--)
591  if (processors_dim_replicated_p(proc, array, npdim))
592  {
593  Variable var = (Variable) creation(npdim);
594  int low, up;
595  Value cf, vlow;
596 
597  get_entity_dimensions(proc, npdim, &low, &up);
598  cf = vect_coeff(var, v);
599  vlow = int_to_value(low);
601  value_uminus(cf));
603  value_mult(cf,vlow));
604  }
605  }
606 
608  contraintes_free(c);
609 
610  return result;
611  }
612 }
613 
614 /* that is all
615  */
call make_call(entity a1, list a2)
Definition: ri.c:269
expression copy_expression(expression p)
EXPRESSION.
Definition: ri.c:850
reference make_reference(entity a1, list a2)
Definition: ri.c:2083
test make_test(expression a1, statement a2, statement a3)
Definition: ri.c:2607
#define int_to_value(i)
end LINEAR_VALUE_IS_INT
#define value_uminus(val)
unary operators on values
int Value
#define value_mult(v, w)
whether the default is protected or not this define makes no sense any more...
expression MakeCharacterConstantExpression(string s)
END_EOLE.
Definition: constant.c:573
entity MakeConstant(string name, tag bt)
Make a Fortran constant.
Definition: constant.c:351
#define contrainte_vecteur(c)
passage au champ vecteur d'une contrainte "a la Newgen"
Pcontrainte contraintes_free(Pcontrainte pc)
Pcontrainte contraintes_free(Pcontrainte pc): desallocation de toutes les contraintes de la liste pc.
Definition: alloc.c:226
int dummy
A dummy file, to prevent empty libraries from breaking builds.
Definition: dummy.c:41
struct _newgen_struct_assignment_ * assignment
Definition: eole_private.h:29
bool get_bool_property(const string)
FC 2015-07-20: yuk, moved out to prevent an include cycle dependency include "properties....
statement hpfc_compute_lid(entity lid, entity proc, entity(*creation)(), entity array)
statement st_compute_lid(proc)
static statement hpfc_broadcast_buffers(entity src, entity trg, entity lid, entity proc)
send the buffer, possibly a broadcast.
statement hpfc_lazy_guard(bool snd, statement then)
returns if (LAZY_{SEND,RECV}) then
static expression pvm_encoding_option(int n)
HPFC module by Fabien COELHO.
Definition: generate-util.c:33
statement generate_deducables(list le)
statement generate_deducables(list le)
Definition: generate-util.c:83
statement hpfc_lazy_packing(entity array, entity lid, entity(*creation)(), bool pack, bool lazy)
the lazy issues.
statement define_node_processor_id(entity proc, entity(*creation)(int))
builds a statement VAR_i = MYPOS(i, proc_number) // i=1 to proc dimension
Definition: generate-util.c:49
statement hpfc_add_n(entity var, int n)
returns statement VAR = VAR + N
static expression buffer_full_condition(entity array, bool is_send, bool is_full)
generates the condition for testing the buffer state: returns (BUFFER_INDEX.
statement hpfc_generate_message(entity ld, bool send, bool lazy)
expression make_reference_expression(entity e, entity(*creation)())
statement hpfc_message(expression tid, expression channel, bool send)
static statement hpfc_lazy_message(expression tid, expression channel, bool snd)
IF (LAZY_snd) THEN PVMFsnd() LAZY_snd = false // if receive ENDIF.
statement hpfc_initsend(bool lazy)
statement hpfc_buffer_packing(entity array, entity(*creation)(), bool pack)
array(creation) = buffer(current++) or reverse assignment...
statement hpfc_buffer_initialization(bool is_send, _UNUSED_ bool is_lazy, bool job_was_done)
statement hpfc_add_2(expression exp)
expr = expr + 2
static entity hpfc_buffer_entity(entity array, string suffix)
returns the buffer entity for array
list hpfc_gen_n_vars_expr(entity(*creation)(), int number)
of expression
static entity hpfc_ith_broadcast_function(int dim, bool special)
whether to use the special version
statement hpfc_broadcast_if_necessary(entity array, entity trg, entity lid, entity proc, bool is_lazy)
lazy or not...
expression hpfc_buffer_reference(entity array, entity index)
returns a reference to the typed common hpfc_buffer buffer, that suits array basic type and with inde...
statement hpfc_packing_of_current__buffer(entity array, bool pack)
CALL (pvmtype) HPFC {,UN}PACK.
statement hpfc_lazy_buffer_packing(entity src, entity trg, entity lid, entity proc, entity(*array_dim)(), bool is_send, bool is_lazy)
lazy in actually sending or not the packed buffer immediatly...
void free(void *)
statement make_block_statement(list)
Make a block statement from a list of statement.
Definition: statement.c:616
list gen_nreverse(list cp)
reverse a list in place
Definition: list.c:304
#define NIL
The empty list (nil in Lisp)
Definition: newgen_list.h:47
list gen_copy_seq(list l)
Copy a list structure.
Definition: list.c:501
#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 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
statement make_assign_statement(expression, expression)
Definition: statement.c:583
statement make_continue_statement(entity)
Definition: statement.c:953
void get_entity_dimensions(entity e, int dim, int *plow, int *pup)
Definition: hpfc-util.c:651
bool replicated_p(entity e)
replicated_p
Definition: hpfc-util.c:96
bool processors_dim_replicated_p(_UNUSED_ entity p, entity a, int i)
true if array a is replicated on processors p i-th dimension.
Definition: hpfc-util.c:143
#define src(name, suf)
HPFC by Fabien Coelho, May 1993 and later...
Definition: compile.c:41
#define BUFFER
common /hpfc_buffers/
#define PVM_INITSEND
PVM functions that may be called by the generated code.
#define CMP_LID
#define GUARDED_BRD
#define BUFFER_RCV_SIZE
#define SEND_CHANNELS
#define LAZY_SEND
#define SND_NOT_INIT
#define PVM_RECV
#define BUFPCK
hpfc packing and unpacking
#define BUFUPK
#define NODETIDS
#define RECV_CHANNELS
#define MYPOS
#define set_integer(var, i)
Very Short and very local functions moved to macros, FC 17/05/94.
#define LAZY_RECV
#define RCV_NOT_PRF
#define BUFFER_INDEX
#define BUFSZ
#define BROADCAST
#define PVM_SEND
#define INFO
#define set_expression(var, e)
#define BUFID
#define set_logical(var, b)
entity hpfc_name_to_entity(const char *)
Definition: run-time.c:817
statement hpfc_make_call_statement(entity, list)
statement hpfc_make_call_statement(e, l) generate a call statement to function e, with expression lis...
Definition: run-time.c:318
Pcontrainte full_linearization(entity, entity, int *, entity(*)(int), bool, int)
remapping.c
Definition: remapping.c:80
entity MakeRunTimeSupportSubroutine(string, int)
run-time.c
string pvm_what_options(basic)
string pvm_what_options(b)
Definition: run-time.c:86
entity get_ith_temporary_dummy(int)
intptr_t load_hpf_number(entity)
#define _UNUSED_
Definition: misc-local.h:232
#define asprintf
Definition: misc-local.h:225
#define pips_assert(what, predicate)
common macros, two flavors depending on NDEBUG
Definition: misc-local.h:172
string concatenate(const char *,...)
Return the concatenation of the given strings.
Definition: string.c:183
#define PLUS_OPERATOR_NAME
#define EQUAL_OPERATOR_NAME
#define test_to_statement(t)
#define call_to_statement(c)
#define not_expression(e)
#define NON_EQUAL_OPERATOR_NAME
#define make_empty_statement
An alias for make_empty_block_statement.
basic entity_basic(entity e)
return the basic associated to entity e if it's a function/variable/constant basic_undefined otherwis...
Definition: entity.c:1380
static int init
Maximal value set for Fortran 77.
Definition: entity.c:320
entity entity_intrinsic(const char *name)
FI: I do not understand this function name (see next one!).
Definition: entity.c:1292
expression reference_to_expression(reference r)
Definition: expression.c:196
expression make_call_expression(entity e, list l)
Build an expression that call an function entity with an argument list.
Definition: expression.c:321
expression entity_to_expression(entity e)
if v is a constant, returns a constant call.
Definition: expression.c:165
statement Pvecteur_to_assign_statement(entity var, Pvecteur v)
generates var = linear expression from the Pvecteur.
Definition: expression.c:1720
expression MakeBinaryCall(entity f, expression eg, expression ed)
Creates a call expression to a function with 2 arguments.
Definition: expression.c:354
expression int_to_expression(_int i)
transform an int into an expression and generate the corresponding entity if necessary; it is not cle...
Definition: expression.c:1188
expression Value_to_expression(Value v)
added interface for linear stuff.
Definition: expression.c:1251
list make_list_of_constant(int val, int number)
of expression
Definition: expression.c:3369
reference expression_reference(expression e)
Short cut, meaningful only if expression_reference_p(e) holds.
Definition: expression.c:1832
int SizeOfIthDimension(entity, int)
this function returns the size of the ith dimension of a variable e.
Definition: size.c:453
int NumberOfDimension(entity)
Definition: size.c:588
@ is_basic_int
Definition: ri.h:571
#define reference_variable(x)
Definition: ri.h:2326
#define EXPRESSION(x)
EXPRESSION.
Definition: ri.h:1217
#define entity_undefined_p(x)
Definition: ri.h:2762
#define entity_undefined
Definition: ri.h:2761
#define expression_normalized(x)
Definition: ri.h:1249
#define normalized_linear(x)
Definition: ri.h:1781
#define STATEMENT(x)
STATEMENT.
Definition: ri.h:2413
static entity array
static string buffer
Definition: string.c:113
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
#define exp
Avoid some warnings from "gcc -Wshadow".
Definition: vasnprintf.c:207
#define TCST
VARIABLE REPRESENTANT LE TERME CONSTANT.
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
void vect_add_elem(Pvecteur *pvect, Variable var, Value val)
void vect_add_elem(Pvecteur * pvect, Variable var, Value val): addition d'un vecteur colineaire au ve...
Definition: unaires.c:72
Value vect_coeff(Variable var, Pvecteur vect)
Variable vect_coeff(Variable var, Pvecteur vect): coefficient de coordonnee var du vecteur vect —> So...
Definition: unaires.c:228