OSDN Git Service

* tree-ssa-loop-ivopts.c: New file.
[pf3gnuchains/gcc-fork.git] / gcc / lambda.h
1 /* Lambda matrix and vector interface.
2    Copyright (C) 2003, 2004 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, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, 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 /* An integer matrix.  A matrix consists of m vectors of length n (IE
33    all vectors are the same length).  */
34 typedef lambda_vector *lambda_matrix;
35
36 /* A transformation matrix.  */
37 typedef struct
38 {
39   lambda_matrix matrix;
40   int rowsize;
41   int colsize;
42   int denominator;
43 } *lambda_trans_matrix;
44 #define LTM_MATRIX(T) ((T)->matrix)
45 #define LTM_ROWSIZE(T) ((T)->rowsize)
46 #define LTM_COLSIZE(T) ((T)->colsize)
47 #define LTM_DENOMINATOR(T) ((T)->denominator)
48
49 /* A vector representing a statement in the body of a loop.  */
50 typedef struct
51 {
52   lambda_vector coefficients;
53   int size;
54   int denominator;
55 } *lambda_body_vector;
56 #define LBV_COEFFICIENTS(T) ((T)->coefficients)
57 #define LBV_SIZE(T) ((T)->size)
58 #define LBV_DENOMINATOR(T) ((T)->denominator)
59
60 /* Piecewise linear expression.  */
61 typedef struct lambda_linear_expression_s
62 {
63   lambda_vector coefficients;
64   int constant;
65   lambda_vector invariant_coefficients;
66   int denominator;
67   struct lambda_linear_expression_s *next;
68 } *lambda_linear_expression;
69
70 #define LLE_COEFFICIENTS(T) ((T)->coefficients)
71 #define LLE_CONSTANT(T) ((T)->constant)
72 #define LLE_INVARIANT_COEFFICIENTS(T) ((T)->invariant_coefficients)
73 #define LLE_DENOMINATOR(T) ((T)->denominator)
74 #define LLE_NEXT(T) ((T)->next)
75
76 lambda_linear_expression lambda_linear_expression_new (int, int);
77 void print_lambda_linear_expression (FILE *, lambda_linear_expression, int,
78                                      int, char);
79
80 /* Loop structure.  */
81 typedef struct lambda_loop_s
82 {
83   lambda_linear_expression lower_bound;
84   lambda_linear_expression upper_bound;
85   lambda_linear_expression linear_offset;
86   int step;
87 } *lambda_loop;
88
89 #define LL_LOWER_BOUND(T) ((T)->lower_bound)
90 #define LL_UPPER_BOUND(T) ((T)->upper_bound)
91 #define LL_LINEAR_OFFSET(T) ((T)->linear_offset)
92 #define LL_STEP(T)   ((T)->step)
93
94 /* Loop nest structure.  */
95 typedef struct
96 {
97   lambda_loop *loops;
98   int depth;
99   int invariants;
100 } *lambda_loopnest;
101
102 #define LN_LOOPS(T) ((T)->loops)
103 #define LN_DEPTH(T) ((T)->depth)
104 #define LN_INVARIANTS(T) ((T)->invariants)
105
106 lambda_loopnest lambda_loopnest_new (int, int);
107 lambda_loopnest lambda_loopnest_transform (lambda_loopnest, lambda_trans_matrix);
108
109 bool lambda_transform_legal_p (lambda_trans_matrix, int, varray_type);
110 void print_lambda_loopnest (FILE *, lambda_loopnest, char);
111
112 #define lambda_loop_new() (lambda_loop) ggc_alloc_cleared (sizeof (struct lambda_loop_s))
113
114 void print_lambda_loop (FILE *, lambda_loop, int, int, char);
115
116 lambda_matrix lambda_matrix_new (int, int);
117
118 void lambda_matrix_id (lambda_matrix, int);
119 void lambda_matrix_copy (lambda_matrix, lambda_matrix, int, int);
120 void lambda_matrix_negate (lambda_matrix, lambda_matrix, int, int);
121 void lambda_matrix_transpose (lambda_matrix, lambda_matrix, int, int);
122 void lambda_matrix_add (lambda_matrix, lambda_matrix, lambda_matrix, int,
123                         int);
124 void lambda_matrix_add_mc (lambda_matrix, int, lambda_matrix, int,
125                            lambda_matrix, int, int);
126 void lambda_matrix_mult (lambda_matrix, lambda_matrix, lambda_matrix,
127                          int, int, int);
128 void lambda_matrix_delete_rows (lambda_matrix, int, int, int);
129 void lambda_matrix_row_exchange (lambda_matrix, int, int);
130 void lambda_matrix_row_add (lambda_matrix, int, int, int, int);
131 void lambda_matrix_row_negate (lambda_matrix mat, int, int);
132 void lambda_matrix_row_mc (lambda_matrix, int, int, int);
133 void lambda_matrix_col_exchange (lambda_matrix, int, int, int);
134 void lambda_matrix_col_add (lambda_matrix, int, int, int, int);
135 void lambda_matrix_col_negate (lambda_matrix, int, int);
136 void lambda_matrix_col_mc (lambda_matrix, int, int, int);
137 int lambda_matrix_inverse (lambda_matrix, lambda_matrix, int);
138 void lambda_matrix_hermite (lambda_matrix, int, lambda_matrix, lambda_matrix);
139 void lambda_matrix_left_hermite (lambda_matrix, int, int, lambda_matrix, lambda_matrix);
140 void lambda_matrix_right_hermite (lambda_matrix, int, int, lambda_matrix, lambda_matrix);
141 int lambda_matrix_first_nz_vec (lambda_matrix, int, int, int);
142 void lambda_matrix_project_to_null (lambda_matrix, int, int, int, 
143                                     lambda_vector);
144 void print_lambda_matrix (FILE *, lambda_matrix, int, int);
145
146 lambda_trans_matrix lambda_trans_matrix_new (int, int);
147 bool lambda_trans_matrix_nonsingular_p (lambda_trans_matrix);
148 bool lambda_trans_matrix_fullrank_p (lambda_trans_matrix);
149 int lambda_trans_matrix_rank (lambda_trans_matrix);
150 lambda_trans_matrix lambda_trans_matrix_basis (lambda_trans_matrix);
151 lambda_trans_matrix lambda_trans_matrix_padding (lambda_trans_matrix);
152 lambda_trans_matrix lambda_trans_matrix_inverse (lambda_trans_matrix);
153 void print_lambda_trans_matrix (FILE *, lambda_trans_matrix);
154 void lambda_matrix_vector_mult (lambda_matrix, int, int, lambda_vector, 
155                                 lambda_vector);
156
157 lambda_body_vector lambda_body_vector_new (int);
158 lambda_body_vector lambda_body_vector_compute_new (lambda_trans_matrix, 
159                                                    lambda_body_vector);
160 void print_lambda_body_vector (FILE *, lambda_body_vector);
161 struct loop;
162
163 lambda_loopnest gcc_loopnest_to_lambda_loopnest (struct loop *,
164                                                  VEC(tree) **,
165                                                  VEC(tree) **);
166 void lambda_loopnest_to_gcc_loopnest (struct loop *, VEC(tree) *,
167                                       VEC(tree) *,
168                                       lambda_loopnest, 
169                                       lambda_trans_matrix);
170
171
172 static inline void lambda_vector_negate (lambda_vector, lambda_vector, int);
173 static inline void lambda_vector_mult_const (lambda_vector, lambda_vector, int, int);
174 static inline void lambda_vector_add (lambda_vector, lambda_vector,
175                                       lambda_vector, int);
176 static inline void lambda_vector_add_mc (lambda_vector, int, lambda_vector, int,
177                                          lambda_vector, int);
178 static inline void lambda_vector_copy (lambda_vector, lambda_vector, int);
179 static inline bool lambda_vector_zerop (lambda_vector, int);
180 static inline void lambda_vector_clear (lambda_vector, int);
181 static inline bool lambda_vector_equal (lambda_vector, lambda_vector, int);
182 static inline int lambda_vector_min_nz (lambda_vector, int, int);
183 static inline int lambda_vector_first_nz (lambda_vector, int, int);
184 static inline void print_lambda_vector (FILE *, lambda_vector, int);
185
186 /* Allocate a new vector of given SIZE.  */
187
188 static inline lambda_vector
189 lambda_vector_new (int size)
190 {
191   return ggc_alloc_cleared (size * sizeof(int));
192 }
193
194
195
196 /* Multiply vector VEC1 of length SIZE by a constant CONST1,
197    and store the result in VEC2.  */
198
199 static inline void
200 lambda_vector_mult_const (lambda_vector vec1, lambda_vector vec2,
201                           int size, int const1)
202 {
203   int i;
204
205   if (const1 == 0)
206     lambda_vector_clear (vec2, size);
207   else
208     for (i = 0; i < size; i++)
209       vec2[i] = const1 * vec1[i];
210 }
211
212 /* Negate vector VEC1 with length SIZE and store it in VEC2.  */
213
214 static inline void 
215 lambda_vector_negate (lambda_vector vec1, lambda_vector vec2,
216                       int size)
217 {
218   lambda_vector_mult_const (vec1, vec2, size, -1);
219 }
220
221 /* VEC3 = VEC1+VEC2, where all three the vectors are of length SIZE.  */
222
223 static inline void
224 lambda_vector_add (lambda_vector vec1, lambda_vector vec2,
225                    lambda_vector vec3, int size)
226 {
227   int i;
228   for (i = 0; i < size; i++)
229     vec3[i] = vec1[i] + vec2[i];
230 }
231
232 /* VEC3 = CONSTANT1*VEC1 + CONSTANT2*VEC2.  All vectors have length SIZE.  */
233
234 static inline void
235 lambda_vector_add_mc (lambda_vector vec1, int const1,
236                       lambda_vector vec2, int const2,
237                       lambda_vector vec3, int size)
238 {
239   int i;
240   for (i = 0; i < size; i++)
241     vec3[i] = const1 * vec1[i] + const2 * vec2[i];
242 }
243
244 /* Copy the elements of vector VEC1 with length SIZE to VEC2.  */
245
246 static inline void
247 lambda_vector_copy (lambda_vector vec1, lambda_vector vec2,
248                     int size)
249 {
250   memcpy (vec2, vec1, size * sizeof (*vec1));
251 }
252
253 /* Return true if vector VEC1 of length SIZE is the zero vector.  */
254
255 static inline bool 
256 lambda_vector_zerop (lambda_vector vec1, int size)
257 {
258   int i;
259   for (i = 0; i < size; i++)
260     if (vec1[i] != 0)
261       return false;
262   return true;
263 }
264
265 /* Clear out vector VEC1 of length SIZE.  */
266
267 static inline void
268 lambda_vector_clear (lambda_vector vec1, int size)
269 {
270   memset (vec1, 0, size * sizeof (*vec1));
271 }
272
273 /* Return true if two vectors are equal.  */
274  
275 static inline bool
276 lambda_vector_equal (lambda_vector vec1, lambda_vector vec2, int size)
277 {
278   int i;
279   for (i = 0; i < size; i++)
280     if (vec1[i] != vec2[i])
281       return false;
282   return true;
283 }
284
285 /* Return the minimum non-zero element in vector VEC1 between START and N.
286    We must have START <= N.  */
287
288 static inline int
289 lambda_vector_min_nz (lambda_vector vec1, int n, int start)
290 {
291   int j;
292   int min = -1;
293 #ifdef ENABLE_CHECKING 
294   if (start > n)
295     abort ();
296 #endif
297   for (j = start; j < n; j++)
298     {
299       if (vec1[j])
300         if (min < 0 || vec1[j] < vec1[min])
301           min = j;
302     }
303
304   if (min < 0)
305     abort ();
306
307   return min;
308 }
309
310 /* Return the first nonzero element of vector VEC1 between START and N.
311    We must have START <= N.   Returns N if VEC1 is the zero vector.  */
312
313 static inline int
314 lambda_vector_first_nz (lambda_vector vec1, int n, int start)
315 {
316   int j = start;
317   while (j < n && vec1[j] == 0)
318     j++;
319   return j;
320 }
321
322
323 /* Multiply a vector by a matrix.  */
324
325 static inline void
326 lambda_vector_matrix_mult (lambda_vector vect, int m, lambda_matrix mat, 
327                            int n, lambda_vector dest)
328 {
329   int i, j;
330   lambda_vector_clear (dest, n);
331   for (i = 0; i < n; i++)
332     for (j = 0; j < m; j++)
333       dest[i] += mat[j][i] * vect[j];
334 }
335
336
337 /* Print out a vector VEC of length N to OUTFILE.  */
338
339 static inline void
340 print_lambda_vector (FILE * outfile, lambda_vector vector, int n)
341 {
342   int i;
343
344   for (i = 0; i < n; i++)
345     fprintf (outfile, "%3d ", vector[i]);
346   fprintf (outfile, "\n");
347 }
348 #endif /* LAMBDA_H  */
349