OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [gcc/] [lambda.h] - Blame information for rev 16

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 12 jlechner
/* Lambda matrix and vector interface.
2
   Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
3
   Contributed by Daniel Berlin <dberlin@dberlin.org>
4
 
5
This file is part of GCC.
6
 
7
GCC is free software; you can redistribute it and/or modify it under
8
the terms of the GNU General Public License as published by the Free
9
Software Foundation; either version 2, or (at your option) any later
10
version.
11
 
12
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13
WARRANTY; without even the implied warranty of MERCHANTABILITY or
14
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15
for more details.
16
 
17
You should have received a copy of the GNU General Public License
18
along with GCC; see the file COPYING.  If not, write to the Free
19
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20
02110-1301, USA.  */
21
 
22
#ifndef LAMBDA_H
23
#define LAMBDA_H
24
 
25
#include "vec.h"
26
 
27
/* An integer vector.  A vector formally consists of an element of a vector
28
   space. A vector space is a set that is closed under vector addition
29
   and scalar multiplication.  In this vector space, an element is a list of
30
   integers.  */
31
typedef int *lambda_vector;
32
 
33
DEF_VEC_P(lambda_vector);
34
DEF_VEC_ALLOC_P(lambda_vector,heap);
35
 
36
/* An integer matrix.  A matrix consists of m vectors of length n (IE
37
   all vectors are the same length).  */
38
typedef lambda_vector *lambda_matrix;
39
 
40
/* A transformation matrix, which is a self-contained ROWSIZE x COLSIZE
41
   matrix.  Rather than use floats, we simply keep a single DENOMINATOR that
42
   represents the denominator for every element in the matrix.  */
43
typedef struct
44
{
45
  lambda_matrix matrix;
46
  int rowsize;
47
  int colsize;
48
  int denominator;
49
} *lambda_trans_matrix;
50
#define LTM_MATRIX(T) ((T)->matrix)
51
#define LTM_ROWSIZE(T) ((T)->rowsize)
52
#define LTM_COLSIZE(T) ((T)->colsize)
53
#define LTM_DENOMINATOR(T) ((T)->denominator)
54
 
55
/* A vector representing a statement in the body of a loop.
56
   The COEFFICIENTS vector contains a coefficient for each induction variable
57
   in the loop nest containing the statement.
58
   The DENOMINATOR represents the denominator for each coefficient in the
59
   COEFFICIENT vector.
60
 
61
   This structure is used during code generation in order to rewrite the old
62
   induction variable uses in a statement in terms of the newly created
63
   induction variables.  */
64
typedef struct
65
{
66
  lambda_vector coefficients;
67
  int size;
68
  int denominator;
69
} *lambda_body_vector;
70
#define LBV_COEFFICIENTS(T) ((T)->coefficients)
71
#define LBV_SIZE(T) ((T)->size)
72
#define LBV_DENOMINATOR(T) ((T)->denominator)
73
 
74
/* Piecewise linear expression.
75
   This structure represents a linear expression with terms for the invariants
76
   and induction variables of a loop.
77
   COEFFICIENTS is a vector of coefficients for the induction variables, one
78
   per loop in the loop nest.
79
   CONSTANT is the constant portion of the linear expression
80
   INVARIANT_COEFFICIENTS is a vector of coefficients for the loop invariants,
81
   one per invariant.
82
   DENOMINATOR is the denominator for all of the coefficients and constants in
83
   the expression.
84
   The linear expressions can be linked together using the NEXT field, in
85
   order to represent MAX or MIN of a group of linear expressions.  */
86
typedef struct lambda_linear_expression_s
87
{
88
  lambda_vector coefficients;
89
  int constant;
90
  lambda_vector invariant_coefficients;
91
  int denominator;
92
  struct lambda_linear_expression_s *next;
93
} *lambda_linear_expression;
94
 
95
#define LLE_COEFFICIENTS(T) ((T)->coefficients)
96
#define LLE_CONSTANT(T) ((T)->constant)
97
#define LLE_INVARIANT_COEFFICIENTS(T) ((T)->invariant_coefficients)
98
#define LLE_DENOMINATOR(T) ((T)->denominator)
99
#define LLE_NEXT(T) ((T)->next)
100
 
101
lambda_linear_expression lambda_linear_expression_new (int, int);
102
void print_lambda_linear_expression (FILE *, lambda_linear_expression, int,
103
                                     int, char);
104
 
105
/* Loop structure.  Our loop structure consists of a constant representing the
106
   STEP of the loop, a set of linear expressions representing the LOWER_BOUND
107
   of the loop, a set of linear expressions representing the UPPER_BOUND of
108
   the loop, and a set of linear expressions representing the LINEAR_OFFSET of
109
   the loop.  The linear offset is a set of linear expressions that are
110
   applied to *both* the lower bound, and the upper bound.  */
111
typedef struct lambda_loop_s
112
{
113
  lambda_linear_expression lower_bound;
114
  lambda_linear_expression upper_bound;
115
  lambda_linear_expression linear_offset;
116
  int step;
117
} *lambda_loop;
118
 
119
#define LL_LOWER_BOUND(T) ((T)->lower_bound)
120
#define LL_UPPER_BOUND(T) ((T)->upper_bound)
121
#define LL_LINEAR_OFFSET(T) ((T)->linear_offset)
122
#define LL_STEP(T)   ((T)->step)
123
 
124
/* Loop nest structure.
125
   The loop nest structure consists of a set of loop structures (defined
126
   above) in LOOPS, along with an integer representing the DEPTH of the loop,
127
   and an integer representing the number of INVARIANTS in the loop.  Both of
128
   these integers are used to size the associated coefficient vectors in the
129
   linear expression structures.  */
130
typedef struct
131
{
132
  lambda_loop *loops;
133
  int depth;
134
  int invariants;
135
} *lambda_loopnest;
136
 
137
#define LN_LOOPS(T) ((T)->loops)
138
#define LN_DEPTH(T) ((T)->depth)
139
#define LN_INVARIANTS(T) ((T)->invariants)
140
 
141
lambda_loopnest lambda_loopnest_new (int, int);
142
lambda_loopnest lambda_loopnest_transform (lambda_loopnest, lambda_trans_matrix);
143
struct loop;
144
struct loops;
145
bool perfect_nest_p (struct loop *);
146
bool lambda_transform_legal_p (lambda_trans_matrix, int, varray_type);
147
void print_lambda_loopnest (FILE *, lambda_loopnest, char);
148
 
149
#define lambda_loop_new() (lambda_loop) ggc_alloc_cleared (sizeof (struct lambda_loop_s))
150
 
151
void print_lambda_loop (FILE *, lambda_loop, int, int, char);
152
 
153
lambda_matrix lambda_matrix_new (int, int);
154
 
155
void lambda_matrix_id (lambda_matrix, int);
156
bool lambda_matrix_id_p (lambda_matrix, int);
157
void lambda_matrix_copy (lambda_matrix, lambda_matrix, int, int);
158
void lambda_matrix_negate (lambda_matrix, lambda_matrix, int, int);
159
void lambda_matrix_transpose (lambda_matrix, lambda_matrix, int, int);
160
void lambda_matrix_add (lambda_matrix, lambda_matrix, lambda_matrix, int,
161
                        int);
162
void lambda_matrix_add_mc (lambda_matrix, int, lambda_matrix, int,
163
                           lambda_matrix, int, int);
164
void lambda_matrix_mult (lambda_matrix, lambda_matrix, lambda_matrix,
165
                         int, int, int);
166
void lambda_matrix_delete_rows (lambda_matrix, int, int, int);
167
void lambda_matrix_row_exchange (lambda_matrix, int, int);
168
void lambda_matrix_row_add (lambda_matrix, int, int, int, int);
169
void lambda_matrix_row_negate (lambda_matrix mat, int, int);
170
void lambda_matrix_row_mc (lambda_matrix, int, int, int);
171
void lambda_matrix_col_exchange (lambda_matrix, int, int, int);
172
void lambda_matrix_col_add (lambda_matrix, int, int, int, int);
173
void lambda_matrix_col_negate (lambda_matrix, int, int);
174
void lambda_matrix_col_mc (lambda_matrix, int, int, int);
175
int lambda_matrix_inverse (lambda_matrix, lambda_matrix, int);
176
void lambda_matrix_hermite (lambda_matrix, int, lambda_matrix, lambda_matrix);
177
void lambda_matrix_left_hermite (lambda_matrix, int, int, lambda_matrix, lambda_matrix);
178
void lambda_matrix_right_hermite (lambda_matrix, int, int, lambda_matrix, lambda_matrix);
179
int lambda_matrix_first_nz_vec (lambda_matrix, int, int, int);
180
void lambda_matrix_project_to_null (lambda_matrix, int, int, int,
181
                                    lambda_vector);
182
void print_lambda_matrix (FILE *, lambda_matrix, int, int);
183
 
184
lambda_trans_matrix lambda_trans_matrix_new (int, int);
185
bool lambda_trans_matrix_nonsingular_p (lambda_trans_matrix);
186
bool lambda_trans_matrix_fullrank_p (lambda_trans_matrix);
187
int lambda_trans_matrix_rank (lambda_trans_matrix);
188
lambda_trans_matrix lambda_trans_matrix_basis (lambda_trans_matrix);
189
lambda_trans_matrix lambda_trans_matrix_padding (lambda_trans_matrix);
190
lambda_trans_matrix lambda_trans_matrix_inverse (lambda_trans_matrix);
191
void print_lambda_trans_matrix (FILE *, lambda_trans_matrix);
192
void lambda_matrix_vector_mult (lambda_matrix, int, int, lambda_vector,
193
                                lambda_vector);
194
bool lambda_trans_matrix_id_p (lambda_trans_matrix);
195
 
196
lambda_body_vector lambda_body_vector_new (int);
197
lambda_body_vector lambda_body_vector_compute_new (lambda_trans_matrix,
198
                                                   lambda_body_vector);
199
void print_lambda_body_vector (FILE *, lambda_body_vector);
200
lambda_loopnest gcc_loopnest_to_lambda_loopnest (struct loops *,
201
                                                 struct loop *,
202
                                                 VEC(tree,heap) **,
203
                                                 VEC(tree,heap) **,
204
                                                 bool);
205
void lambda_loopnest_to_gcc_loopnest (struct loop *,
206
                                      VEC(tree,heap) *, VEC(tree,heap) *,
207
                                      lambda_loopnest, lambda_trans_matrix);
208
 
209
 
210
static inline void lambda_vector_negate (lambda_vector, lambda_vector, int);
211
static inline void lambda_vector_mult_const (lambda_vector, lambda_vector, int, int);
212
static inline void lambda_vector_add (lambda_vector, lambda_vector,
213
                                      lambda_vector, int);
214
static inline void lambda_vector_add_mc (lambda_vector, int, lambda_vector, int,
215
                                         lambda_vector, int);
216
static inline void lambda_vector_copy (lambda_vector, lambda_vector, int);
217
static inline bool lambda_vector_zerop (lambda_vector, int);
218
static inline void lambda_vector_clear (lambda_vector, int);
219
static inline bool lambda_vector_equal (lambda_vector, lambda_vector, int);
220
static inline int lambda_vector_min_nz (lambda_vector, int, int);
221
static inline int lambda_vector_first_nz (lambda_vector, int, int);
222
static inline void print_lambda_vector (FILE *, lambda_vector, int);
223
 
224
/* Allocate a new vector of given SIZE.  */
225
 
226
static inline lambda_vector
227
lambda_vector_new (int size)
228
{
229
  return ggc_alloc_cleared (size * sizeof(int));
230
}
231
 
232
 
233
 
234
/* Multiply vector VEC1 of length SIZE by a constant CONST1,
235
   and store the result in VEC2.  */
236
 
237
static inline void
238
lambda_vector_mult_const (lambda_vector vec1, lambda_vector vec2,
239
                          int size, int const1)
240
{
241
  int i;
242
 
243
  if (const1 == 0)
244
    lambda_vector_clear (vec2, size);
245
  else
246
    for (i = 0; i < size; i++)
247
      vec2[i] = const1 * vec1[i];
248
}
249
 
250
/* Negate vector VEC1 with length SIZE and store it in VEC2.  */
251
 
252
static inline void
253
lambda_vector_negate (lambda_vector vec1, lambda_vector vec2,
254
                      int size)
255
{
256
  lambda_vector_mult_const (vec1, vec2, size, -1);
257
}
258
 
259
/* VEC3 = VEC1+VEC2, where all three the vectors are of length SIZE.  */
260
 
261
static inline void
262
lambda_vector_add (lambda_vector vec1, lambda_vector vec2,
263
                   lambda_vector vec3, int size)
264
{
265
  int i;
266
  for (i = 0; i < size; i++)
267
    vec3[i] = vec1[i] + vec2[i];
268
}
269
 
270
/* VEC3 = CONSTANT1*VEC1 + CONSTANT2*VEC2.  All vectors have length SIZE.  */
271
 
272
static inline void
273
lambda_vector_add_mc (lambda_vector vec1, int const1,
274
                      lambda_vector vec2, int const2,
275
                      lambda_vector vec3, int size)
276
{
277
  int i;
278
  for (i = 0; i < size; i++)
279
    vec3[i] = const1 * vec1[i] + const2 * vec2[i];
280
}
281
 
282
/* Copy the elements of vector VEC1 with length SIZE to VEC2.  */
283
 
284
static inline void
285
lambda_vector_copy (lambda_vector vec1, lambda_vector vec2,
286
                    int size)
287
{
288
  memcpy (vec2, vec1, size * sizeof (*vec1));
289
}
290
 
291
/* Return true if vector VEC1 of length SIZE is the zero vector.  */
292
 
293
static inline bool
294
lambda_vector_zerop (lambda_vector vec1, int size)
295
{
296
  int i;
297
  for (i = 0; i < size; i++)
298
    if (vec1[i] != 0)
299
      return false;
300
  return true;
301
}
302
 
303
/* Clear out vector VEC1 of length SIZE.  */
304
 
305
static inline void
306
lambda_vector_clear (lambda_vector vec1, int size)
307
{
308
  memset (vec1, 0, size * sizeof (*vec1));
309
}
310
 
311
/* Return true if two vectors are equal.  */
312
 
313
static inline bool
314
lambda_vector_equal (lambda_vector vec1, lambda_vector vec2, int size)
315
{
316
  int i;
317
  for (i = 0; i < size; i++)
318
    if (vec1[i] != vec2[i])
319
      return false;
320
  return true;
321
}
322
 
323
/* Return the minimum nonzero element in vector VEC1 between START and N.
324
   We must have START <= N.  */
325
 
326
static inline int
327
lambda_vector_min_nz (lambda_vector vec1, int n, int start)
328
{
329
  int j;
330
  int min = -1;
331
 
332
  gcc_assert (start <= n);
333
  for (j = start; j < n; j++)
334
    {
335
      if (vec1[j])
336
        if (min < 0 || vec1[j] < vec1[min])
337
          min = j;
338
    }
339
  gcc_assert (min >= 0);
340
 
341
  return min;
342
}
343
 
344
/* Return the first nonzero element of vector VEC1 between START and N.
345
   We must have START <= N.   Returns N if VEC1 is the zero vector.  */
346
 
347
static inline int
348
lambda_vector_first_nz (lambda_vector vec1, int n, int start)
349
{
350
  int j = start;
351
  while (j < n && vec1[j] == 0)
352
    j++;
353
  return j;
354
}
355
 
356
 
357
/* Multiply a vector by a matrix.  */
358
 
359
static inline void
360
lambda_vector_matrix_mult (lambda_vector vect, int m, lambda_matrix mat,
361
                           int n, lambda_vector dest)
362
{
363
  int i, j;
364
  lambda_vector_clear (dest, n);
365
  for (i = 0; i < n; i++)
366
    for (j = 0; j < m; j++)
367
      dest[i] += mat[j][i] * vect[j];
368
}
369
 
370
 
371
/* Print out a vector VEC of length N to OUTFILE.  */
372
 
373
static inline void
374
print_lambda_vector (FILE * outfile, lambda_vector vector, int n)
375
{
376
  int i;
377
 
378
  for (i = 0; i < n; i++)
379
    fprintf (outfile, "%3d ", vector[i]);
380
  fprintf (outfile, "\n");
381
}
382
 
383
/* Returns true when the vector V is lexicographically positive, in
384
   other words, when the first nonzero element is positive.  */
385
 
386
static inline bool
387
lambda_vector_lexico_pos (lambda_vector v,
388
                          unsigned n)
389
{
390
  unsigned i;
391
  for (i = 0; i < n; i++)
392
    {
393
      if (v[i] == 0)
394
        continue;
395
      if (v[i] < 0)
396
        return false;
397
      if (v[i] > 0)
398
        return true;
399
    }
400
  return true;
401
}
402
 
403
#endif /* LAMBDA_H  */
404
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.