tree-loop-linear.c: Include obstack.h.
authorLaurynas Biveinis <laurynas.biveinis@gmail.com>
Fri, 7 Sep 2007 01:33:41 +0000 (01:33 +0000)
committerLaurynas Biveinis <lauras@gcc.gnu.org>
Fri, 7 Sep 2007 01:33:41 +0000 (01:33 +0000)
2007-09-06  Laurynas Biveinis  <laurynas.biveinis@gmail.com>

* tree-loop-linear.c: Include obstack.h.
(linear_transform_loops): New obstack lambda_obstack.
Initialize it, pass it to gcc_loopnest_to_lambda_loopnest,
lambda_loopnest_transform, lambda_loopnest_to_gcc_loopnest calls
and free afterwards.
* lambda.h (struct obstack): New forward declaration.
(lambda_linear_expression_new): New parameter of type struct
obstack *.
(lambda_loopnest_new): Likewise.
(lambda_loopnest_transform): Likewise.
(lambda_body_vector_new): Likewise.
(lambda_body_vector_compute_new): Likewise.
(gcc_loopnest_to_lambda_loopnest): Likewise.
(lambda_loopnest_to_gcc_loopnest): Likewise.
* lambda-code.c: Include obstack.h.
(lambda_lattice_new): New parameter lambda_obstack.  Use it for
allocation of ret.
(lambda_body_vector_new): Likewise.
(lambda_linear_expression_new): Likewise.
(lambda_lattice_new): Likewise.
(lambda_loopnest_new): Likewise.  Additionally use obstack to
allocate LN_LOOPS(ret).
(lambda_lattice_compute_base): New parameter lambda_obstack.  Pass
it to lambda_lattice_new.
(lambda_body_vector_compute_new): New parameter lambda_obstack.
Pass it to lambda_body_vector_new.
(lambda_lattice_compute_base): New paramater lambda_obstack.  Pass
it to lambda_lattice_new.
(compute_nest_using_fourier_motzkin): New parameter lambda_obstack.
Pass it to lambda_loopnest_new, lambda_linear_expression_new.
(lambda_compute_target_space): Likewise.
(lambda_compute_auxillary_space): New parameter lambda_obstack.
Pass it to lambda_lattice_compute_base and
compute_nest_using_fourieer_motzkin.
(lambda_loopnest_transform): New parameter lambda_obstack.  Pass
it to lambda_lattice_compute_base, lambda_lattice_auxillary_space
and lambda_lattice_compute_target_space.
(gcc_tree_to_linear_expression): Nex parameter lambda_obstack.
Pass it to lambda_linear_expression_new.
(gcc_loop_to_lambda_loop): New parameter lambda_obstack.  Pass it
to gcc_tree_to_linear_expression.
(gcc_loopnest_to_lambda_loopnest): New parameter lambda_obstack.
Pass it to gcc_loop_to_lambda_loop and lambda_loopnest_new.
(lambda_loopnest_to_gcc_loopnest): New parameter lambda_obstack.
Pass it to lambda_body_vector_new and
lambda_body_vector_compute_new.
* Makefile.in (tree-loop-linear.o): Add $(OBSTACK_H) dependency.
(lambda-code.o): Likewise.

From-SVN: r128219

gcc/ChangeLog
gcc/Makefile.in
gcc/lambda-code.c
gcc/lambda.h
gcc/tree-loop-linear.c

index b93723adf6ac804bbf63e830b36f4f5bb587eed9..7b0c48390f21b3436877e3bd1b79a0f36b868f64 100644 (file)
@@ -1,3 +1,54 @@
+2007-09-06  Laurynas Biveinis  <laurynas.biveinis@gmail.com>
+
+       * tree-loop-linear.c: Include obstack.h.
+       (linear_transform_loops): New obstack lambda_obstack.
+       Initialize it, pass it to gcc_loopnest_to_lambda_loopnest,
+       lambda_loopnest_transform, lambda_loopnest_to_gcc_loopnest calls
+       and free afterwards.
+       * lambda.h (struct obstack): New forward declaration.
+       (lambda_linear_expression_new): New parameter of type struct
+       obstack *.
+       (lambda_loopnest_new): Likewise.
+       (lambda_loopnest_transform): Likewise.
+       (lambda_body_vector_new): Likewise.
+       (lambda_body_vector_compute_new): Likewise.
+       (gcc_loopnest_to_lambda_loopnest): Likewise.
+       (lambda_loopnest_to_gcc_loopnest): Likewise.
+       * lambda-code.c: Include obstack.h.
+       (lambda_lattice_new): New parameter lambda_obstack.  Use it for
+       allocation of ret.
+       (lambda_body_vector_new): Likewise.
+       (lambda_linear_expression_new): Likewise.
+       (lambda_lattice_new): Likewise.
+       (lambda_loopnest_new): Likewise.  Additionally use obstack to
+       allocate LN_LOOPS(ret).
+       (lambda_lattice_compute_base): New parameter lambda_obstack.  Pass
+       it to lambda_lattice_new.
+       (lambda_body_vector_compute_new): New parameter lambda_obstack.
+       Pass it to lambda_body_vector_new.
+       (lambda_lattice_compute_base): New paramater lambda_obstack.  Pass
+       it to lambda_lattice_new.
+       (compute_nest_using_fourier_motzkin): New parameter lambda_obstack.
+       Pass it to lambda_loopnest_new, lambda_linear_expression_new.
+       (lambda_compute_target_space): Likewise.
+       (lambda_compute_auxillary_space): New parameter lambda_obstack.
+       Pass it to lambda_lattice_compute_base and
+       compute_nest_using_fourieer_motzkin.
+       (lambda_loopnest_transform): New parameter lambda_obstack.  Pass
+       it to lambda_lattice_compute_base, lambda_lattice_auxillary_space
+       and lambda_lattice_compute_target_space.
+       (gcc_tree_to_linear_expression): Nex parameter lambda_obstack.
+       Pass it to lambda_linear_expression_new.
+       (gcc_loop_to_lambda_loop): New parameter lambda_obstack.  Pass it
+       to gcc_tree_to_linear_expression.
+       (gcc_loopnest_to_lambda_loopnest): New parameter lambda_obstack.
+       Pass it to gcc_loop_to_lambda_loop and lambda_loopnest_new.
+       (lambda_loopnest_to_gcc_loopnest): New parameter lambda_obstack.
+       Pass it to lambda_body_vector_new and
+       lambda_body_vector_compute_new.
+       * Makefile.in (tree-loop-linear.o): Add $(OBSTACK_H) dependency.
+       (lambda-code.o): Likewise.
+
 2007-09-06  Chao-ying Fu  <fu@mips.com>
 
        * ginclude/stdfix.h: New file.
index 1030d8eb1e10ac98448f69f3db743f2ce3ab7403..93f277a3ac0b21b404af5aa1c84a7cacfd265c42 100644 (file)
@@ -2268,7 +2268,7 @@ tree-loop-linear.o: tree-loop-linear.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
    $(TM_H) $(GGC_H) $(OPTABS_H) $(TREE_H) $(RTL_H) $(BASIC_BLOCK_H) \
    $(DIAGNOSTIC_H) $(TREE_FLOW_H) $(TREE_DUMP_H) $(TIMEVAR_H) $(CFGLOOP_H) \
    tree-pass.h $(TREE_DATA_REF_H) $(SCEV_H) $(EXPR_H) $(LAMBDA_H) \
-   $(TARGET_H) tree-chrec.h
+   $(TARGET_H) tree-chrec.h $(OBSTACK_H)
 tree-stdarg.o: tree-stdarg.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
    $(TREE_H) $(FUNCTION_H) $(DIAGNOSTIC_H) $(TREE_FLOW_H) tree-pass.h \
    tree-stdarg.h $(TARGET_H) langhooks.h
@@ -2842,7 +2842,7 @@ lambda-code.o: lambda-code.c $(LAMBDA_H) $(GGC_H) $(SYSTEM_H) $(CONFIG_H) \
    $(TM_H) $(OPTABS_H) $(TREE_H) $(RTL_H) $(BASIC_BLOCK_H) \
    $(DIAGNOSTIC_H) $(TREE_FLOW_H) $(TREE_DUMP_H) $(TIMEVAR_H) $(CFGLOOP_H) \
    $(TREE_DATA_REF_H) $(SCEV_H) $(EXPR_H) coretypes.h $(TARGET_H) \
-   tree-chrec.h tree-pass.h vec.h vecprim.h
+   tree-chrec.h tree-pass.h vec.h vecprim.h $(OBSTACK_H)
 params.o : params.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(PARAMS_H) toplev.h
 pointer-set.o: pointer-set.c pointer-set.h $(CONFIG_H) $(SYSTEM_H)
 hooks.o: hooks.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(HOOKS_H)
index 0391f19e41ede13db13613ac3884c27becc36651..c5734375c297a88913d0943279b7983e7e318e21 100644 (file)
@@ -28,6 +28,7 @@
 #include "rtl.h"
 #include "basic-block.h"
 #include "diagnostic.h"
+#include "obstack.h"
 #include "tree-flow.h"
 #include "tree-dump.h"
 #include "timevar.h"
@@ -141,8 +142,9 @@ typedef struct lambda_lattice_s
 
 static bool lle_equal (lambda_linear_expression, lambda_linear_expression,
                       int, int);
-static lambda_lattice lambda_lattice_new (int, int);
-static lambda_lattice lambda_lattice_compute_base (lambda_loopnest);
+static lambda_lattice lambda_lattice_new (int, int, struct obstack *);
+static lambda_lattice lambda_lattice_compute_base (lambda_loopnest,
+                                                   struct obstack *);
 
 static tree find_induction_var_from_exit_cond (struct loop *);
 static bool can_convert_to_perfect_nest (struct loop *);
@@ -150,11 +152,11 @@ static bool can_convert_to_perfect_nest (struct loop *);
 /* Create a new lambda body vector.  */
 
 lambda_body_vector
-lambda_body_vector_new (int size)
+lambda_body_vector_new (int size, struct obstack * lambda_obstack)
 {
   lambda_body_vector ret;
 
-  ret = GGC_NEW (struct lambda_body_vector_s);
+  ret = (lambda_body_vector)obstack_alloc (lambda_obstack, sizeof (*ret));
   LBV_COEFFICIENTS (ret) = lambda_vector_new (size);
   LBV_SIZE (ret) = size;
   LBV_DENOMINATOR (ret) = 1;
@@ -166,7 +168,8 @@ lambda_body_vector_new (int size)
 
 lambda_body_vector
 lambda_body_vector_compute_new (lambda_trans_matrix transform,
-                               lambda_body_vector vect)
+                                lambda_body_vector vect,
+                                struct obstack * lambda_obstack)
 {
   lambda_body_vector temp;
   int depth;
@@ -176,7 +179,7 @@ lambda_body_vector_compute_new (lambda_trans_matrix transform,
 
   depth = LTM_ROWSIZE (transform);
 
-  temp = lambda_body_vector_new (depth);
+  temp = lambda_body_vector_new (depth, lambda_obstack);
   LBV_DENOMINATOR (temp) =
     LBV_DENOMINATOR (vect) * LTM_DENOMINATOR (transform);
   lambda_vector_matrix_mult (LBV_COEFFICIENTS (vect), depth,
@@ -222,12 +225,13 @@ lle_equal (lambda_linear_expression lle1, lambda_linear_expression lle2,
    of invariants INVARIANTS.  */
 
 lambda_linear_expression
-lambda_linear_expression_new (int dim, int invariants)
+lambda_linear_expression_new (int dim, int invariants,
+                              struct obstack * lambda_obstack)
 {
   lambda_linear_expression ret;
 
-  ret = GGC_CNEW (struct lambda_linear_expression_s);
-
+  ret = (lambda_linear_expression)obstack_alloc (lambda_obstack,
+                                                 sizeof (*ret));
   LLE_COEFFICIENTS (ret) = lambda_vector_new (dim);
   LLE_CONSTANT (ret) = 0;
   LLE_INVARIANT_COEFFICIENTS (ret) = lambda_vector_new (invariants);
@@ -324,12 +328,14 @@ print_lambda_loop (FILE * outfile, lambda_loop loop, int depth,
    number of invariants.  */
 
 lambda_loopnest
-lambda_loopnest_new (int depth, int invariants)
+lambda_loopnest_new (int depth, int invariants,
+                     struct obstack * lambda_obstack)
 {
   lambda_loopnest ret;
-  ret = GGC_NEW (struct lambda_loopnest_s);
+  ret = (lambda_loopnest)obstack_alloc (lambda_obstack, sizeof (*ret));
 
-  LN_LOOPS (ret) = GGC_CNEWVEC (lambda_loop, depth);
+  LN_LOOPS (ret) = (lambda_loop *)
+      obstack_alloc (lambda_obstack, depth * sizeof(LN_LOOPS(ret)));
   LN_DEPTH (ret) = depth;
   LN_INVARIANTS (ret) = invariants;
 
@@ -356,10 +362,10 @@ print_lambda_loopnest (FILE * outfile, lambda_loopnest nest, char start)
    of invariants.  */
 
 static lambda_lattice
-lambda_lattice_new (int depth, int invariants)
+lambda_lattice_new (int depth, int invariants, struct obstack * lambda_obstack)
 {
-  lambda_lattice ret;
-  ret = GGC_NEW (struct lambda_lattice_s);
+  lambda_lattice ret
+      = (lambda_lattice)obstack_alloc (lambda_obstack, sizeof (*ret));
   LATTICE_BASE (ret) = lambda_matrix_new (depth, depth);
   LATTICE_ORIGIN (ret) = lambda_vector_new (depth);
   LATTICE_ORIGIN_INVARIANTS (ret) = lambda_matrix_new (depth, invariants);
@@ -376,7 +382,8 @@ lambda_lattice_new (int depth, int invariants)
    identity matrix) if NEST is a sparse space.  */
 
 static lambda_lattice
-lambda_lattice_compute_base (lambda_loopnest nest)
+lambda_lattice_compute_base (lambda_loopnest nest,
+                             struct obstack * lambda_obstack)
 {
   lambda_lattice ret;
   int depth, invariants;
@@ -389,7 +396,7 @@ lambda_lattice_compute_base (lambda_loopnest nest)
   depth = LN_DEPTH (nest);
   invariants = LN_INVARIANTS (nest);
 
-  ret = lambda_lattice_new (depth, invariants);
+  ret = lambda_lattice_new (depth, invariants, lambda_obstack);
   base = LATTICE_BASE (ret);
   for (i = 0; i < depth; i++)
     {
@@ -479,7 +486,8 @@ compute_nest_using_fourier_motzkin (int size,
                                    int invariants,
                                    lambda_matrix A,
                                    lambda_matrix B,
-                                   lambda_vector a)
+                                    lambda_vector a,
+                                    struct obstack * lambda_obstack)
 {
 
   int multiple, f1, f2;
@@ -495,7 +503,7 @@ compute_nest_using_fourier_motzkin (int size,
   B1 = lambda_matrix_new (128, invariants);
   a1 = lambda_vector_new (128);
 
-  auxillary_nest = lambda_loopnest_new (depth, invariants);
+  auxillary_nest = lambda_loopnest_new (depth, invariants, lambda_obstack);
 
   for (i = depth - 1; i >= 0; i--)
     {
@@ -509,7 +517,8 @@ compute_nest_using_fourier_motzkin (int size,
            {
              /* Any linear expression in the matrix with a coefficient less
                 than 0 becomes part of the new lower bound.  */ 
-             expression = lambda_linear_expression_new (depth, invariants);
+              expression = lambda_linear_expression_new (depth, invariants,
+                                                         lambda_obstack);
 
              for (k = 0; k < i; k++)
                LLE_COEFFICIENTS (expression)[k] = A[j][k];
@@ -533,7 +542,8 @@ compute_nest_using_fourier_motzkin (int size,
            {
              /* Any linear expression with a coefficient greater than 0
                 becomes part of the new upper bound.  */ 
-             expression = lambda_linear_expression_new (depth, invariants);
+              expression = lambda_linear_expression_new (depth, invariants,
+                                                         lambda_obstack);
              for (k = 0; k < i; k++)
                LLE_COEFFICIENTS (expression)[k] = -1 * A[j][k];
 
@@ -625,7 +635,8 @@ compute_nest_using_fourier_motzkin (int size,
 
 static lambda_loopnest
 lambda_compute_auxillary_space (lambda_loopnest nest,
-                               lambda_trans_matrix trans)
+                                lambda_trans_matrix trans,
+                                struct obstack * lambda_obstack)
 {
   lambda_matrix A, B, A1, B1;
   lambda_vector a, a1;
@@ -723,7 +734,7 @@ lambda_compute_auxillary_space (lambda_loopnest nest,
 
   /* Compute the lattice base x = base * y + origin, where y is the
      base space.  */
-  lattice = lambda_lattice_compute_base (nest);
+  lattice = lambda_lattice_compute_base (nest, lambda_obstack);
 
   /* Ax <= a + B then becomes ALy <= a+B - A*origin.  L is the lattice base  */
 
@@ -752,7 +763,7 @@ lambda_compute_auxillary_space (lambda_loopnest nest,
   lambda_matrix_mult (A1, invertedtrans, A, size, depth, depth);
 
   return compute_nest_using_fourier_motzkin (size, depth, invariants,
-                                            A, B1, a1);
+                                             A, B1, a1, lambda_obstack);
 }
 
 /* Compute the loop bounds for the target space, using the bounds of
@@ -765,7 +776,8 @@ lambda_compute_auxillary_space (lambda_loopnest nest,
 
 static lambda_loopnest
 lambda_compute_target_space (lambda_loopnest auxillary_nest,
-                            lambda_trans_matrix H, lambda_vector stepsigns)
+                             lambda_trans_matrix H, lambda_vector stepsigns,
+                             struct obstack * lambda_obstack)
 {
   lambda_matrix inverse, H1;
   int determinant, i, j;
@@ -796,7 +808,7 @@ lambda_compute_target_space (lambda_loopnest auxillary_nest,
   target = lambda_matrix_new (depth, depth);
   lambda_matrix_mult (H1, inverse, target, depth, depth, depth);
 
-  target_nest = lambda_loopnest_new (depth, invariants);
+  target_nest = lambda_loopnest_new (depth, invariants, lambda_obstack);
 
   for (i = 0; i < depth; i++)
     {
@@ -815,7 +827,8 @@ lambda_compute_target_space (lambda_loopnest auxillary_nest,
       for (j = 0; j < i; j++)
        target[i][j] = target[i][j] / gcd1;
 
-      expression = lambda_linear_expression_new (depth, invariants);
+      expression = lambda_linear_expression_new (depth, invariants,
+                                                 lambda_obstack);
       lambda_vector_copy (target[i], LLE_COEFFICIENTS (expression), depth);
       LLE_DENOMINATOR (expression) = determinant / gcd1;
       LLE_CONSTANT (expression) = 0;
@@ -838,7 +851,8 @@ lambda_compute_target_space (lambda_loopnest auxillary_nest,
       for (; auxillary_expr != NULL;
           auxillary_expr = LLE_NEXT (auxillary_expr))
        {
-         target_expr = lambda_linear_expression_new (depth, invariants);
+          target_expr = lambda_linear_expression_new (depth, invariants,
+                                                      lambda_obstack);
          lambda_vector_matrix_mult (LLE_COEFFICIENTS (auxillary_expr),
                                     depth, inverse, depth,
                                     LLE_COEFFICIENTS (target_expr));
@@ -895,7 +909,8 @@ lambda_compute_target_space (lambda_loopnest auxillary_nest,
       for (; auxillary_expr != NULL;
           auxillary_expr = LLE_NEXT (auxillary_expr))
        {
-         target_expr = lambda_linear_expression_new (depth, invariants);
+          target_expr = lambda_linear_expression_new (depth, invariants,
+                                                      lambda_obstack);
          lambda_vector_matrix_mult (LLE_COEFFICIENTS (auxillary_expr),
                                     depth, inverse, depth,
                                     LLE_COEFFICIENTS (target_expr));
@@ -1020,7 +1035,8 @@ lambda_compute_step_signs (lambda_trans_matrix trans, lambda_vector stepsigns)
    triangular portion.  */ 
 
 lambda_loopnest
-lambda_loopnest_transform (lambda_loopnest nest, lambda_trans_matrix trans)
+lambda_loopnest_transform (lambda_loopnest nest, lambda_trans_matrix trans,
+                           struct obstack * lambda_obstack)
 {
   lambda_loopnest auxillary_nest, target_nest;
 
@@ -1049,7 +1065,7 @@ lambda_loopnest_transform (lambda_loopnest nest, lambda_trans_matrix trans)
     }
 
   /* Compute the lattice base.  */
-  lattice = lambda_lattice_compute_base (nest);
+  lattice = lambda_lattice_compute_base (nest, lambda_obstack);
   trans1 = lambda_trans_matrix_new (depth, depth);
 
   /* Multiply the transformation matrix by the lattice base.  */
@@ -1065,7 +1081,7 @@ lambda_loopnest_transform (lambda_loopnest nest, lambda_trans_matrix trans)
 
   /* Compute the auxiliary loop nest's space from the unimodular
      portion.  */
-  auxillary_nest = lambda_compute_auxillary_space (nest, U);
+  auxillary_nest = lambda_compute_auxillary_space (nest, U, lambda_obstack);
 
   /* Compute the loop step signs from the old step signs and the
      transformation matrix.  */
@@ -1073,7 +1089,8 @@ lambda_loopnest_transform (lambda_loopnest nest, lambda_trans_matrix trans)
 
   /* Compute the target loop nest space from the auxiliary nest and
      the lower triangular matrix H.  */
-  target_nest = lambda_compute_target_space (auxillary_nest, H, stepsigns);
+  target_nest = lambda_compute_target_space (auxillary_nest, H, stepsigns,
+                                             lambda_obstack);
   origin = lambda_vector_new (depth);
   origin_invariants = lambda_matrix_new (depth, invariants);
   lambda_matrix_vector_mult (LTM_MATRIX (trans), depth, depth,
@@ -1111,14 +1128,15 @@ lambda_loopnest_transform (lambda_loopnest nest, lambda_trans_matrix trans)
 static lambda_linear_expression
 gcc_tree_to_linear_expression (int depth, tree expr,
                               VEC(tree,heap) *outerinductionvars,
-                              VEC(tree,heap) *invariants, int extra)
+                               VEC(tree,heap) *invariants, int extra,
+                               struct obstack * lambda_obstack)
 {
   lambda_linear_expression lle = NULL;
   switch (TREE_CODE (expr))
     {
     case INTEGER_CST:
       {
-       lle = lambda_linear_expression_new (depth, 2 * depth);
+        lle = lambda_linear_expression_new (depth, 2 * depth, lambda_obstack);
        LLE_CONSTANT (lle) = TREE_INT_CST_LOW (expr);
        if (extra != 0)
          LLE_CONSTANT (lle) += extra;
@@ -1135,7 +1153,8 @@ gcc_tree_to_linear_expression (int depth, tree expr,
            {
              if (SSA_NAME_VAR (iv) == SSA_NAME_VAR (expr))
                {
-                 lle = lambda_linear_expression_new (depth, 2 * depth);
+                  lle = lambda_linear_expression_new (depth, 2 * depth,
+                                                      lambda_obstack);
                  LLE_COEFFICIENTS (lle)[i] = 1;
                  if (extra != 0)
                    LLE_CONSTANT (lle) = extra;
@@ -1148,7 +1167,8 @@ gcc_tree_to_linear_expression (int depth, tree expr,
            {
              if (SSA_NAME_VAR (invar) == SSA_NAME_VAR (expr))
                {
-                 lle = lambda_linear_expression_new (depth, 2 * depth);
+                  lle = lambda_linear_expression_new (depth, 2 * depth,
+                                                      lambda_obstack);
                  LLE_INVARIANT_COEFFICIENTS (lle)[i] = 1;
                  if (extra != 0)
                    LLE_CONSTANT (lle) = extra;
@@ -1210,7 +1230,8 @@ gcc_loop_to_lambda_loop (struct loop *loop, int depth,
                         VEC(tree,heap) * outerinductionvars,
                         VEC(tree,heap) ** lboundvars,
                         VEC(tree,heap) ** uboundvars,
-                        VEC(int,heap) ** steps)
+                         VEC(int,heap) ** steps,
+                         struct obstack * lambda_obstack)
 {
   tree phi;
   tree exit_cond;
@@ -1335,14 +1356,14 @@ gcc_loop_to_lambda_loop (struct loop *loop, int depth,
       lboundvar = PHI_ARG_DEF (phi, 1);
       lbound = gcc_tree_to_linear_expression (depth, lboundvar,
                                              outerinductionvars, *invariants,
-                                             0);
+                                              0, lambda_obstack);
     }
   else
     {
       lboundvar = PHI_ARG_DEF (phi, 0);
       lbound = gcc_tree_to_linear_expression (depth, lboundvar,
                                              outerinductionvars, *invariants,
-                                             0);
+                                              0, lambda_obstack);
     }
   
   if (!lbound)
@@ -1390,7 +1411,7 @@ gcc_loop_to_lambda_loop (struct loop *loop, int depth,
   
   ubound = gcc_tree_to_linear_expression (depth, uboundvar,
                                          outerinductionvars,
-                                         *invariants, extra);
+                                          *invariants, extra, lambda_obstack);
   uboundresult = build2 (PLUS_EXPR, TREE_TYPE (uboundvar), uboundvar,
                         build_int_cst (TREE_TYPE (uboundvar), extra));
   VEC_safe_push (tree, heap, *uboundvars, uboundresult);
@@ -1456,7 +1477,8 @@ DEF_VEC_ALLOC_P(lambda_loop,heap);
 lambda_loopnest
 gcc_loopnest_to_lambda_loopnest (struct loop *loop_nest,
                                 VEC(tree,heap) **inductionvars,
-                                VEC(tree,heap) **invariants)
+                                 VEC(tree,heap) **invariants,
+                                 struct obstack * lambda_obstack)
 {
   lambda_loopnest ret = NULL;
   struct loop *temp = loop_nest;
@@ -1478,7 +1500,7 @@ gcc_loopnest_to_lambda_loopnest (struct loop *loop_nest,
       newloop = gcc_loop_to_lambda_loop (temp, depth, invariants,
                                         &inductionvar, *inductionvars,
                                         &lboundvars, &uboundvars,
-                                        &steps);
+                                         &steps, lambda_obstack);
       if (!newloop)
        goto fail;
 
@@ -1502,7 +1524,7 @@ gcc_loopnest_to_lambda_loopnest (struct loop *loop_nest,
                 "Successfully converted loop nest to perfect loop nest.\n");
     }
 
-  ret = lambda_loopnest_new (depth, 2 * depth);
+  ret = lambda_loopnest_new (depth, 2 * depth, lambda_obstack);
 
   for (i = 0; VEC_iterate (lambda_loop, loops, i, newloop); i++)
     LN_LOOPS (ret)[i] = newloop;
@@ -1671,7 +1693,8 @@ lambda_loopnest_to_gcc_loopnest (struct loop *old_loopnest,
                                 VEC(tree,heap) *old_ivs,
                                 VEC(tree,heap) *invariants,
                                 lambda_loopnest new_loopnest,
-                                lambda_trans_matrix transform)
+                                 lambda_trans_matrix transform,
+                                 struct obstack * lambda_obstack)
 {
   struct loop *temp;
   size_t i = 0;
@@ -1818,10 +1841,11 @@ lambda_loopnest_to_gcc_loopnest (struct loop *old_loopnest,
          /* Compute the new expression for the induction
             variable.  */
          depth = VEC_length (tree, new_ivs);
-         lbv = lambda_body_vector_new (depth);
+          lbv = lambda_body_vector_new (depth, lambda_obstack);
          LBV_COEFFICIENTS (lbv)[i] = 1;
          
-         newlbv = lambda_body_vector_compute_new (transform, lbv);
+          newlbv = lambda_body_vector_compute_new (transform, lbv,
+                                                   lambda_obstack);
 
          newiv = lbv_to_gcc_expression (newlbv, TREE_TYPE (oldiv),
                                         new_ivs, &stmts);
index f2ac6f1583774d658be9b7f1d5e9f2fe3a033867..e7a75fdb66f06bb6ca830302105826b875627f94 100644 (file)
@@ -97,7 +97,10 @@ typedef struct lambda_linear_expression_s
 #define LLE_DENOMINATOR(T) ((T)->denominator)
 #define LLE_NEXT(T) ((T)->next)
 
-lambda_linear_expression lambda_linear_expression_new (int, int);
+struct obstack;
+
+lambda_linear_expression lambda_linear_expression_new (int, int,
+                                                       struct obstack *);
 void print_lambda_linear_expression (FILE *, lambda_linear_expression, int,
                                     int, char);
 
@@ -137,8 +140,10 @@ typedef struct lambda_loopnest_s
 #define LN_DEPTH(T) ((T)->depth)
 #define LN_INVARIANTS(T) ((T)->invariants)
 
-lambda_loopnest lambda_loopnest_new (int, int);
-lambda_loopnest lambda_loopnest_transform (lambda_loopnest, lambda_trans_matrix);
+lambda_loopnest lambda_loopnest_new (int, int, struct obstack *);
+lambda_loopnest lambda_loopnest_transform (lambda_loopnest,
+                                           lambda_trans_matrix,
+                                           struct obstack *);
 struct loop;
 bool perfect_nest_p (struct loop *);
 void print_lambda_loopnest (FILE *, lambda_loopnest, char);
@@ -190,17 +195,19 @@ 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);
+lambda_body_vector lambda_body_vector_new (int, struct obstack *);
+lambda_body_vector lambda_body_vector_compute_new (lambda_trans_matrix,
+                                                   lambda_body_vector,
+                                                   struct obstack *);
 void print_lambda_body_vector (FILE *, lambda_body_vector);
 lambda_loopnest gcc_loopnest_to_lambda_loopnest (struct loop *,
                                                 VEC(tree,heap) **,
-                                                VEC(tree,heap) **);
+                                                 VEC(tree,heap) **,
+                                                 struct obstack *);
 void lambda_loopnest_to_gcc_loopnest (struct loop *,
                                      VEC(tree,heap) *, VEC(tree,heap) *,
-                                     lambda_loopnest, lambda_trans_matrix);
-
+                                      lambda_loopnest, lambda_trans_matrix,
+                                      struct obstack *);
 
 static inline void lambda_vector_negate (lambda_vector, lambda_vector, int);
 static inline void lambda_vector_mult_const (lambda_vector, lambda_vector, int, int);
index 3fb4d05dbe1d2c1ac0e3542d69dd25225f8153e2..d04045ded4fe30c4d9a3e9589c22e9fe1896355b 100644 (file)
@@ -30,6 +30,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "rtl.h"
 #include "basic-block.h"
 #include "diagnostic.h"
+#include "obstack.h"
 #include "tree-flow.h"
 #include "tree-dump.h"
 #include "timevar.h"
@@ -253,7 +254,7 @@ linear_transform_loops (void)
   VEC(tree,heap) *oldivs = NULL;
   VEC(tree,heap) *invariants = NULL;
   struct loop *loop_nest;
-  
+
   FOR_EACH_LOOP (li, loop_nest, 0)
     {
       unsigned int depth = 0;
@@ -263,6 +264,9 @@ linear_transform_loops (void)
       lambda_loopnest before, after;
       lambda_trans_matrix trans;
       bool problem = false;
+      struct obstack lambda_obstack;
+      gcc_obstack_init (&lambda_obstack);
+
       /* If it's not a loop nest, we don't want it.
          We also don't handle sibling loops properly, 
          which are loops of the following form:
@@ -327,7 +331,7 @@ linear_transform_loops (void)
        }
 
       before = gcc_loopnest_to_lambda_loopnest (loop_nest, &oldivs,
-                                               &invariants);
+                                                &invariants, &lambda_obstack);
 
       if (!before)
        goto free_and_continue;
@@ -338,7 +342,7 @@ linear_transform_loops (void)
          print_lambda_loopnest (dump_file, before, 'i');
        }
   
-      after = lambda_loopnest_transform (before, trans);
+      after = lambda_loopnest_transform (before, trans, &lambda_obstack);
 
       if (dump_file)
        {
@@ -347,13 +351,14 @@ linear_transform_loops (void)
        }
 
       lambda_loopnest_to_gcc_loopnest (loop_nest, oldivs, invariants,
-                                      after, trans);
+                                       after, trans, &lambda_obstack);
       modified = true;
 
       if (dump_file)
        fprintf (dump_file, "Successfully transformed loop.\n");
 
     free_and_continue:
+      obstack_free (&lambda_obstack, NULL);
       free_dependence_relations (dependence_relations);
       free_data_refs (datarefs);
     }