25 #include "pips_config.h"
30 #include "resources.h"
38 #define DEFAULT_INT_PREFIX "I_"
39 #define DEFAULT_FLOAT_PREFIX "F_"
40 #define DEFAULT_LOGICAL_PREFIX "L_"
41 #define DEFAULT_COMPLEX_PREFIX "C_"
42 #define DEFAULT_STRING_PREFIX "S_"
220 if (depth2 >
max)
max=depth2;
276 if (i==0) gauche=
exp;
277 if (i==1) droite=
exp;
380 for (i=1;i<=
depth;i++)
397 for (i=0;i<=length-2;i++)
398 for(j=i+1;j<=length-1;j++)
402 for (k=1;k<=
depth;k++)
417 for (i=
k1-1;i>=0;i--)
433 for (i=
k1-1;i>=0;i--)
439 for(k=0;k<=
depth-1;k++)
465 for(j=0;j<=
depth-1;j++)
469 for (i=1;i<=
k1-1;i++)
483 for(j=0;j<=
depth-1;j++)
488 for (i=1;i<=
k1-1;i++)
498 for (i=0;i<=
k1-1;i++)
522 for (i=
k1-1;i>=0;i--)
524 expression e1,e2,e,gauche=NULL,droite=NULL,delai_plus;
552 for(j=0;j<=
depth-1;j++)
597 if (m==0) gauche=
exp;
598 if (m==1) droite=
exp;
622 for(j=0;j<=
depth-1;j++)
642 for(i=
depth;i>=1 ;i--)
661 for(j=0;j<=
depth-1;j++)
690 list lis,lis3,lisi=NULL;
763 for(j=1;j<=
depth-1;j++)
815 if (m==0) gauche=
exp;
816 if (m==1) droite=
exp;
823 for(j=0;j<=
depth-1;j++)
867 for(j=0;j<=
depth-1;j++)
895 char *new_name = (
char*)
malloc(33);
898 for (sprintf(new_name,
"%s%s",
old_name, su);
902 sprintf(new_name,
"%s%s",
old_name, su);
903 pips_assert(
"Variable name cannot be longer than 32 characters",
904 strlen(new_name)<33);
921 for (pb=base_oldindex; pb!=NULL; pb=pb->
succ)
924 new_name = new_entity((
entity) pb->
var,a);
927 new_name = new_entity((
entity) pb->
var,a);
930 new_name = new_entity((
entity) pb->
var,a);
942 for (pb=base_oldindex; pb!=NULL; pb=pb->
succ)
945 new_name = new_entity((
entity) pb->
var,a);
948 new_name = new_entity((
entity) pb->
var,a);
967 for(i=1;i<=3*
depth;i++)
972 while ((j<=3*
depth)&& !found)
999 for(i=1;i<=2*
depth;i++)
1004 while ((j<=2*
depth)&& !found)
1033 Pbase base_oldindex = NULL;
1034 Pbase base_newindex = NULL;
1038 Value elem_mat1,elem_mat2;
1040 name_file =
user_request(
"nom du fichier pour la matrice A ");
1043 name_file =
user_request(
"nom du fichier pour la matrice P ");
1051 for(j=0;j<=
depth-1;j++)
1069 for (pb =base_newindex; pb!=NULL; pb=pb->
succ) {
1111 printf(
" azuuuul lalallalalal \n"); getchar();
1114 for (i=
k1-1;i>=0;i--)
1116 expression e1,e2,e,gauche=NULL,droite=NULL,delai_plus;
1148 for(j=0;j<=
depth-1;j++)
1204 if (m==0) gauche=
exp;
1205 if (m==1) droite=
exp;
1223 for(j=0;j<=3*
depth-1;j++)
1235 for (j=1;j<=
depth;j++)
1246 Pmatrix A,P,ATE,ATEP,ATEPP,P1,P2,N[
nid_nbr],
NP[
nid_nbr],G_PRO[
nid_nbr], G_PROP[
nid_nbr],G_PROPP[
nid_nbr];
1247 int rw,cl,i,j,k,pos;
1248 list lis=NULL,lis1=NULL,lis2=NULL;
1255 Pbase base_oldindex = NULL;
1256 Pbase base_newindex = NULL;
1260 Value elem_mat1,elem_mat2;
1266 name_file =
user_request(
"nom du fichier pour la matrice A ");
1269 name_file =
user_request(
"nom du fichier pour la matrice P ");
1276 for(i=1;i<=
depth;i++)
1277 for(j=1;j<=2*
depth;j=j+2)
1288 for(j=2;j<=2*
depth;j=j+2)
1297 for(i=0;i<=
depth-1;i++)
1320 for (pb =base_newindex; pb!=NULL; pb=pb->
succ) {
1321 if (i%2==1) iter[i/2]=(pb->
var);
1322 else itert[i/2]=(pb->
var);
1327 for(i=0;i<=
k1-1;i++)
1342 for (j=1;j<=
depth;j++)
1353 for(j=1;j<=
depth;j++)
1375 for(j=1;j<=
depth;j++)
1390 for (k=1;k<=j-1;k++)
1429 for (k=j+1;k<=
depth;k++)
1491 for (k=2;k<=
depth;k++)
1512 if (m==0) gauche=
exp;
1524 for(i=1;i<=
k1-2;i++)
1532 for(j=1;j<=
depth;j++)
1552 sprintf(
buffer,
"%s%d_%d",
"R",i+1,k);
1557 for(j=0;j<=
depth;j++)
1572 if (m==1) droite=
exp;
1581 for(l=0;l<=
depth-1;l++)
1598 for(l=0;l<=
depth;l++)
1606 for (r=0;r<=
depth-1;r++)
1653 for(l=
depth-1;l>=0;l--)
1674 if (m==1) droite=
exp;
1726 for(i=
k1-1 ;i<=
k1-1;i++)
1746 for(j=1;j<=
depth;j++)
1778 sprintf(
buffer,
"%s%d_%d",
"R",i+1,k);
1793 if (m==1) droite=
exp;
1802 for(l=0;l<=
depth-1;l++)
1819 for(l=0;l<=
depth;l++)
1829 for (r=0;r<=
depth-1;r++)
1879 for(l=
depth-1;l>=0;l--)
1900 if (m==1) droite=
exp;
1937 for(j=0;j<=
depth-1;j++)
1948 for (pb =base_newindex; pb!=NULL; pb=pb->
succ) {
2000 for (i=
k1-1;i>=0;i--)
2034 for(j=0;j<=
depth-1;j++)
2087 for(j=0;j<
depth+1;j++)
2092 if (m==1) droite=
exp;
2095 for(l=0;l<=
depth-1;l++)
2117 if (m==0) gauche=
exp;
2120 for(j=0;j<=
depth-1;j++)
2129 if (m==0) gauche=
exp;
2132 for(j=0;j<=
depth-1;j++)
2154 for(j=0;j<=2*
depth-1;j++)
2176 for(i=0;i<=
k1-1;i++)
2228 for(k=0;k<=
depth-1;k++)
2277 Pbase base_oldindex = NULL;
2278 Pbase base_newindex = NULL;
2282 Value elem_mat1,elem_mat2;
2285 name_file =
user_request(
"nom du fichier pour la matrice A ");
2288 name_file =
user_request(
"nom du fichier pour la matrice P ");
2294 for(i=1;i<=
depth;i++)
2295 for(j=1;j<=3*
depth;j=j+3)
2305 for(j=2;j<=3*
depth;j=j+3)
2315 for(j=3;j<=3*
depth;j=j+3)
2325 for(i=0;i<=
depth-1;i++)
2329 for(i=0;i<=
depth-1;i++)
2346 for(j=0;j<=
depth-1;j++)
2364 for (pb =base_newindex; pb!=NULL; pb=pb->
succ) {
2409 for (i=
k1-1;i>=0;i--)
2411 expression e1,e2,e,gauche=NULL,droite=NULL,delai_plus;
2442 for(j=0;j<=
depth-1;j++)
2488 if (m==0) gauche=
exp;
2489 if (m==1) droite=
exp;
2507 for(j=0;j<=3*
depth-1;j++)
2540 debug_on(
"STATISTICS_DEBUG_LEVEL");
2566 printf(
" Le programme ne repond pas aux hypotheses \n");
2574 printf(
"--------------Choix de la transformation-------\n");
2576 printf(
" 2: Fusion avec allocation des tampons \n");
2578 printf(
" 4: Tiling a seul niveau avec allocation des tampons \n");
2579 printf(
" 5: Tiling a deux niveaux avec allocation des tampons \n");
2581 if(scanf(
"%d", &choix)!=1)
execution make_execution(enum execution_utype tag, void *val)
loop copy_loop(loop p)
LOOP.
loop make_loop(entity a1, range a2, statement a3, entity a4, execution a5, list a6)
basic make_basic(enum basic_utype tag, void *val)
type copy_type(type p)
TYPE.
expression copy_expression(expression p)
EXPRESSION.
statement copy_statement(statement p)
STATEMENT.
reference make_reference(entity a1, list a2)
test make_test(expression a1, statement a2, statement a3)
dimension make_dimension(expression a1, expression a2, list a3)
instruction make_instruction_sequence(sequence _field_)
value copy_value(value p)
VALUE.
storage copy_storage(storage p)
STORAGE.
instruction make_instruction(enum instruction_utype tag, void *val)
reference copy_reference(reference p)
REFERENCE.
sequence make_sequence(list a)
range make_range(expression a1, expression a2, expression a3)
struct _newgen_struct_entity_ * entity
static reference ref
Current stmt (an integer)
#define value_minus(v1, v2)
#define value_uminus(val)
unary operators on values
#define value_direct_multiply(v1, v2)
#define value_eq(v1, v2)
bool operators on values
#define value_plus(v1, v2)
binary operators on values
#define value_mod(v1, v2)
#define value_div(v1, v2)
struct _newgen_struct_statement_ * statement
#define A(i, j)
comp_matrice.c
struct _newgen_struct_reference_ * reference
Psysteme loop_iteration_domaine_to_sc(list, Pbase *)
loop_iteration_domaine_to_sc.c
FILE * safe_fopen(const char *filename, const char *what)
statement make_block_statement(list)
Make a block statement from a list of statement.
statement instruction_to_statement(instruction)
Build a statement from a give instruction.
void reset_current_module_entity(void)
Reset the current module entity.
entity set_current_module_entity(entity)
static.c
entity get_current_module_entity(void)
Get the entity of the current module.
void replace_entity_by_expression(void *s, entity ent, expression exp)
replace all reference to entity ent by expression exp in s.
void gen_context_multi_recurse(void *o, void *context,...)
Multi-recursion with context function visitor.
bool gen_false(__attribute__((unused)) gen_chunk *unused)
Return false and ignore the argument.
void gen_null(__attribute__((unused)) void *unused)
Ignore the argument.
bool gen_true(__attribute__((unused)) gen_chunk *unused)
Return true and ignore the argument.
list gen_nreverse(list cp)
reverse a list in place
#define NIL
The empty list (nil in Lisp)
#define CONS(_t_, _i_, _l_)
List element cell constructor (insert an element at the beginning of a list)
list gen_nconc(list cp1, list cp2)
physically concatenates CP1 and CP2 but do not duplicates the elements
#define CAR(pcons)
Get the value of the first element of a list.
#define FOREACH(_fe_CASTER, _fe_item, _fe_list)
Apply/map an instruction block on all the elements of a list.
#define CDR(pcons)
Get the list less its first element.
#define MAP(_map_CASTER, _map_item, _map_code, _map_list)
Apply/map an instruction block on all the elements of a list (old fashioned)
string db_get_memory_resource(const char *rname, const char *oname, bool pure)
Return the pointer to the resource, whatever it is.
#define DB_PUT_MEMORY_RESOURCE(res_name, own_name, res_val)
conform to old interface.
statement make_assign_statement(expression, expression)
hash_table hash_table_make(hash_key_type key_type, size_t size)
void * hash_get(const hash_table htp, const void *key)
this function retrieves in the hash table pointed to by htp the couple whose key is equal to key.
void hash_put(hash_table htp, const void *key, const void *val)
This functions stores a couple (key,val) in the hash table pointed to by htp.
static const char * old_name(entity module, entity obj)
old name of obj while in module now.
void vect_dump(Pvecteur v)
void vect_dump(Pvecteur v): print sparse vector v on stderr.
bool vect_equal(Pvecteur v1, Pvecteur v2)
bool vect_equal(Pvecteur v1, Pvecteur v2): test a egalite de deux vecteurs
void full_loop_unroll(statement loop_statement)
get rid of the loop by body replication;
#define MATRIX_ELEM(matrix, i, j)
Macros d'acces aux elements d'une matrice.
Pmatrix matrix_new(int m, int n)
package matrix
void matrix_nulle(Pmatrix Z)
void matrix_nulle(Pmatrix Z): Initialisation de la matrice Z a la valeur matrice nulle
void matrix_substract(Pmatrix a, Pmatrix b, Pmatrix c)
void matrix_substract(Pmatrix a, Pmatrix b, Pmatrix c): substract rational matrix c from rational mat...
void matrix_multiply(const Pmatrix a, const Pmatrix b, Pmatrix c)
void matrix_multiply(Pmatrix a, Pmatrix b, Pmatrix c): multiply rational matrix a by rational matrix ...
void matrix_print(Pmatrix)
void matrix_print(matrice a): print an (nxm) rational matrix
void matrix_fscan(FILE *, Pmatrix *, int *, int *)
void matrix_fscan(FILE * f, matrice * a, int * n, int * m): read an (nxm) rational matrix in an ASCII...
#define pips_debug
these macros use the GNU extensions that allow variadic macros, including with an empty list.
#define pips_assert(what, predicate)
common macros, two flavors depending on NDEBUG
#define pips_internal_error
string user_request(const char *,...)
void * gen_find_tabulated(const char *, int)
void * stack_head(const stack)
returns the item on top of stack s
void stack_push(void *, stack)
stack use
stack stack_make(int, int, int)
allocation
void * stack_pop(stack)
POPs one item from stack s.
void normalize_all_expressions_of(void *obj)
void print_expression(expression e)
no file descriptor is passed to make is easier to use in a debugging stage.
void print_statement(statement)
Print a statement on stderr.
static void norm(struct rproblem *RR)
cette procedure normalise la fonction cout, calcule les valeurs des seconds membres resultant d'une n...
bool module_reorder(statement body)
Reorder a module and recompute order to statement if any.
#define loop_to_statement(l)
#define make_entity(n, t, s, i)
#define test_to_statement(t)
#define and_expression(e1, e2)
#define binary_intrinsic_expression(name, e1, e2)
#define ge_expression(e1, e2)
#define le_expression(e1, e2)
#define lt_expression(e1, e2)
entity local_name_to_top_level_entity(const char *n)
This function try to find a top-level entity from a local name.
entity entity_empty_label(void)
const char * module_local_name(entity e)
Returns the module local user name.
expression reference_to_expression(reference r)
expression Pvecteur_to_expression(Pvecteur vect)
AP, sep 25th 95 : some usefull functions moved from static_controlize/utils.c.
expression entity_to_expression(entity e)
if v is a constant, returns a constant call.
expression int_to_expression(_int i)
transform an int into an expression and generate the corresponding entity if necessary; it is not cle...
expression Value_to_expression(Value v)
added interface for linear stuff.
reference expression_reference(expression e)
Short cut, meaningful only if expression_reference_p(e) holds.
entity make_scalar_entity(const char *, const char *, basic)
entity make_scalar_entity(name, module_name, base)
entity make_new_array_variable_with_prefix(const char *, entity, basic, list)
J'ai ameliore la fonction make_new_scalar_variable_with_prefix
#define test_domain
newgen_entity_domain_defined
#define syntax_reference_p(x)
#define expression_domain
newgen_execution_domain_defined
#define unstructured_domain
newgen_type_domain_defined
#define syntax_reference(x)
#define normalized_linear_p(x)
#define instruction_loop_p(x)
#define reference_variable(x)
#define loop_domain
newgen_language_domain_defined
#define instruction_loop(x)
#define dimension_lower(x)
#define entity_storage(x)
#define statement_domain
newgen_sizeofexpression_domain_defined
#define call_domain
newgen_callees_domain_defined
#define EXPRESSION(x)
EXPRESSION.
#define expression_undefined
#define expression_normalized(x)
#define sequence_statements(x)
#define dimension_upper(x)
#define reference_indices(x)
#define instruction_sequence(x)
#define variable_dimensions(x)
#define whileloop_domain
newgen_variable_domain_defined
#define statement_instruction(x)
#define instruction_call(x)
@ is_execution_sequential
#define call_arguments(x)
#define instruction_test(x)
#define normalized_linear(x)
#define expression_syntax(x)
#define sequence_domain
newgen_reference_domain_defined
#define entity_domain
newgen_syntax_domain_defined
#define statement_undefined
#define STATEMENT(x)
STATEMENT.
#define entity_initial(x)
La structure d'une boucle : son index et ces deux bornes.
Pmatrix delai
nombre de stencils
Pmatrix * st
le tableau en ecriture
info_loop * nd
les stencils
Pmatrix coef
le volume memoire du tableau en ecriture de ce nid
int nbr_stencil
les boucles
statement s
le delai qu'on doit ajouter a ce nid
Value surface
le corps de ce nid
Pvecteur pv_acces
le coefficient des fonctions d'acces
le type des coefficients dans les vecteurs: Value est defini dans le package arithmetique
The structure used to build lists in NewGen.
cette structure contient une pile.
static bool stmt_flt(statement s, context_p context)
static Pvecteur buffer_acces(int nid)
On construit la foction d'acces
struct INFO_LOOP info_loop
La structure d'une boucle : son index et ces deux bornes.
static statement fusion()
cette fonction donne le code fusionne
statement Tiling_buffer_allocation()
static entity make_tile_index_entity_n(entity old_index, char *su)
entity first_array
une copie de l'un des nids de la sequence
static bool array_overflow()
statement permutation(statement s, Pmatrix P)
statement Hierarchical_tiling()
contenu_t
pour marquer si la sequence repond a nos hypotheses
bool tiling_sequence(string module)
static void compute_bound_merged_nest()
Cette fonction calcule les bornes du nid fusionne.
struct NID nid
La structure d'un nid.
loop loop1
le nid fusionne
static Pvecteur * tiling_indice
static nid sequen[nid_nbr]
k1 represente le nombre de nid et k2 leur profondeur
static void stmt_rwt(statement s, context_p context)
static void call_rwt(call ca, context_p context)
statement permutation2(statement s, Pmatrix P)
static entity internal_make_new_array_variable(int i, int j, entity module, basic b, list lis)
le tableau en entree
static void loop_rwt(loop l, context_p context)
static bool loop_flt(loop l)
static void seq_rwt(sequence sq, context_p context)
statement Tiling2_buffer()
static void wl_rwt(context_p context)
static bool first_turn
Compteurs des suffixes de nouvelles references.
static void compute_bound_tiled_nest()
static statement fusion_buffer()
Cette fonction donne le code fusionne avec allocation des tampons.
static info_loop * tiled_nest
static void compute_delay_merged_nest()
Cette fonction calcule les delais qu'on doit ajouter aux differents nids.
static bool lexi_sup(Pmatrix a, Pmatrix b)
Cette fonction retourne true si le vecteur 'a' est lexicographiquement superieur au vecteur 'b'.
static void test_rwt(context_p context)
static int depth
la sequence de nids
int position_one_element(Pmatrix P, int i)
static void unroll_recursive(statement s, int n)
static void compute_delay_tiled_nest()
static void trier(Pmatrix *st, int length)
Cette fonction trie un tableau de stencil d'un nid donne.
static void derive_new_basis_deux(Pbase base_oldindex, Pbase *base_newindex, entity(*new_entity)(entity, char *))
static void derive_new_basis_une(Pbase base_oldindex, Pbase *base_newindex, entity(*new_entity)(entity, char *))
static void uns_rwt(context_p context)
static void cons_coef(Pmatrix p, int nid)
N construit la coifficients des fonctions d'acces.
static info_loop * merged_nest
la pronfondeur des nids
A gen_chunk is used to store every object.
#define exp
Avoid some warnings from "gcc -Wshadow".
#define TCST
VARIABLE REPRESENTANT LE TERME CONSTANT.
#define VECTEUR_NUL
DEFINITION DU VECTEUR NUL.
void * Variable
arithmetique is a requirement for vecteur, but I do not want to inforce it in all pips files....
#define base_add_dimension(b, v)
Pvecteur vect_make(Pvecteur v, Variable var, Value val,...)
Pvecteur vect_make(v, [var, val,]* 0, val) Pvecteur v; // may be NULL, use assigne anyway Variable va...
Pvecteur vect_dup(Pvecteur v_in)
Pvecteur vect_dup(Pvecteur v_in): duplication du vecteur v_in; allocation de et copie dans v_out;.
Value vect_coeff(Variable var, Pvecteur vect)
Variable vect_coeff(Variable var, Pvecteur vect): coefficient de coordonnee var du vecteur vect —> So...