OSDN Git Service

gcc:
[pf3gnuchains/gcc-fork.git] / gcc / lambda.h
index ec48ea4..98fe6bd 100644 (file)
@@ -29,11 +29,14 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
    and scalar multiplication.  In this vector space, an element is a list of
    integers.  */
 typedef int *lambda_vector;
+
 /* An integer matrix.  A matrix consists of m vectors of length n (IE
    all vectors are the same length).  */
 typedef lambda_vector *lambda_matrix;
 
-/* A transformation matrix.  */
+/* A transformation matrix, which is a self-contained ROWSIZE x COLSIZE
+   matrix.  Rather than use floats, we simply keep a single DENOMINATOR that
+   represents the denominator for every element in the matrix.  */
 typedef struct
 {
   lambda_matrix matrix;
@@ -46,7 +49,15 @@ typedef struct
 #define LTM_COLSIZE(T) ((T)->colsize)
 #define LTM_DENOMINATOR(T) ((T)->denominator)
 
-/* A vector representing a statement in the body of a loop.  */
+/* A vector representing a statement in the body of a loop.
+   The COEFFICIENTS vector contains a coefficient for each induction variable
+   in the loop nest containing the statement.
+   The DENOMINATOR represents the denominator for each coefficient in the
+   COEFFICIENT vector.
+
+   This structure is used during code generation in order to rewrite the old
+   induction variable uses in a statement in terms of the newly created
+   induction variables.  */
 typedef struct
 {
   lambda_vector coefficients;
@@ -57,7 +68,18 @@ typedef struct
 #define LBV_SIZE(T) ((T)->size)
 #define LBV_DENOMINATOR(T) ((T)->denominator)
 
-/* Piecewise linear expression.  */
+/* Piecewise linear expression.  
+   This structure represents a linear expression with terms for the invariants
+   and induction variables of a loop. 
+   COEFFICIENTS is a vector of coefficients for the induction variables, one
+   per loop in the loop nest.
+   CONSTANT is the constant portion of the linear expression
+   INVARIANT_COEFFICIENTS is a vector of coefficients for the loop invariants,
+   one per invariant.
+   DENOMINATOR is the denominator for all of the coefficients and constants in
+   the expression.  
+   The linear expressions can be linked together using the NEXT field, in
+   order to represent MAX or MIN of a group of linear expressions.  */
 typedef struct lambda_linear_expression_s
 {
   lambda_vector coefficients;
@@ -77,7 +99,12 @@ lambda_linear_expression lambda_linear_expression_new (int, int);
 void print_lambda_linear_expression (FILE *, lambda_linear_expression, int,
                                     int, char);
 
-/* Loop structure.  */
+/* Loop structure.  Our loop structure consists of a constant representing the
+   STEP of the loop, a set of linear expressions representing the LOWER_BOUND
+   of the loop, a set of linear expressions representing the UPPER_BOUND of
+   the loop, and a set of linear expressions representing the LINEAR_OFFSET of
+   the loop.  The linear offset is a set of linear expressions that are
+   applied to *both* the lower bound, and the upper bound.  */
 typedef struct lambda_loop_s
 {
   lambda_linear_expression lower_bound;
@@ -91,7 +118,12 @@ typedef struct lambda_loop_s
 #define LL_LINEAR_OFFSET(T) ((T)->linear_offset)
 #define LL_STEP(T)   ((T)->step)
 
-/* Loop nest structure.  */
+/* Loop nest structure.  
+   The loop nest structure consists of a set of loop structures (defined
+   above) in LOOPS, along with an integer representing the DEPTH of the loop,
+   and an integer representing the number of INVARIANTS in the loop.  Both of
+   these integers are used to size the associated coefficient vectors in the
+   linear expression structures.  */
 typedef struct
 {
   lambda_loop *loops;
@@ -105,7 +137,9 @@ typedef struct
 
 lambda_loopnest lambda_loopnest_new (int, int);
 lambda_loopnest lambda_loopnest_transform (lambda_loopnest, lambda_trans_matrix);
-
+struct loop;
+struct loops;
+bool perfect_nest_p (struct loop *);
 bool lambda_transform_legal_p (lambda_trans_matrix, int, varray_type);
 void print_lambda_loopnest (FILE *, lambda_loopnest, char);
 
@@ -116,6 +150,7 @@ void print_lambda_loop (FILE *, lambda_loop, int, int, char);
 lambda_matrix lambda_matrix_new (int, int);
 
 void lambda_matrix_id (lambda_matrix, int);
+bool lambda_matrix_id_p (lambda_matrix, int);
 void lambda_matrix_copy (lambda_matrix, lambda_matrix, int, int);
 void lambda_matrix_negate (lambda_matrix, lambda_matrix, int, int);
 void lambda_matrix_transpose (lambda_matrix, lambda_matrix, int, int);
@@ -153,16 +188,17 @@ lambda_trans_matrix lambda_trans_matrix_inverse (lambda_trans_matrix);
 void print_lambda_trans_matrix (FILE *, lambda_trans_matrix);
 void lambda_matrix_vector_mult (lambda_matrix, int, int, lambda_vector, 
                                lambda_vector);
+bool lambda_trans_matrix_id_p (lambda_trans_matrix);
 
 lambda_body_vector lambda_body_vector_new (int);
 lambda_body_vector lambda_body_vector_compute_new (lambda_trans_matrix, 
                                                   lambda_body_vector);
 void print_lambda_body_vector (FILE *, lambda_body_vector);
-struct loop;
-
-lambda_loopnest gcc_loopnest_to_lambda_loopnest (struct loop *,
+lambda_loopnest gcc_loopnest_to_lambda_loopnest (struct loops *,
+                                                struct loop *,
+                                                VEC(tree) **,
                                                 VEC(tree) **,
-                                                VEC(tree) **);
+                                                bool);
 void lambda_loopnest_to_gcc_loopnest (struct loop *, VEC(tree) *,
                                      VEC(tree) *,
                                      lambda_loopnest, 
@@ -282,7 +318,7 @@ lambda_vector_equal (lambda_vector vec1, lambda_vector vec2, int size)
   return true;
 }
 
-/* Return the minimum non-zero element in vector VEC1 between START and N.
+/* Return the minimum nonzero element in vector VEC1 between START and N.
    We must have START <= N.  */
 
 static inline int