summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlauras <lauras@138bc75d-0d04-0410-961f-82ee72b054a4>2010-04-22 12:42:15 +0000
committerlauras <lauras@138bc75d-0d04-0410-961f-82ee72b054a4>2010-04-22 12:42:15 +0000
commit1e33ad50b5d37f30af9e92c75a3d30f5d5b2d312 (patch)
tree378620453122ae49e7bf7e0d9a64259baa14bbcd
parent0ca212b8bd0fdb1d7d94c440a9b3c4ca66b242d5 (diff)
downloadgcc-1e33ad50b5d37f30af9e92c75a3d30f5d5b2d312.tar.gz
2010-04-22 Laurynas Biveinis <laurynas.biveinis@gmail.com>
* tree-parloops.c (loop_parallel_p): New argument parloop_obstack. Pass it down. (parallelize_loops): New variable parloop_obstack. Initialize it, pass it down, free it. * tree-loop-linear.c (linear_transform_loops): Pass down lambda_obstack. * tree-data-ref.h (lambda_compute_access_matrices): New argument of type struct obstack *. * tree-data-ref.c (analyze_subscript_affine_affine): New variable scratch_obstack. Initialize it, pass down, free it. * lambda.h (lambda_loop_new): Remove. (lambda_matrix_new, lambda_matrix_inverse) (lambda_trans_matrix_new, lambda_trans_matrix_inverse): New argument of type struct obstack *. * lambda-trans.c (lambda_trans_matrix_new): New argument lambda_obstack. Pass it down, use obstack allocation for ret. (lambda_trans_matrix_inverse): New argument lambda_obstack. Pass it down. * lambda-mat.c (lambda_matrix_get_column) (lambda_matrix_project_to_null): Remove. (lambda_matrix_new): New argument lambda_obstack. Use obstack allocation for mat. (lambda_matrix_inverse_hard, lambda_matrix_inverse): New argument lambda_obstack. * lambda-code.c (lambda_loop_new): New function. (lambda_lattice_new, compute_nest_using_fourier_motzkin) (lambda_compute_auxillary_space, lambda_compute_target_space) (lambda_loopnest_transform, gcc_loop_to_lambda_loop) (lambda_loopnest_to_gcc_loopnest): Pass down lambda_obstack. (build_access_matrix): New argument lambda_obstack. Use obstack allocation for am. (lambda_compute_step_signs, lambda_compute_access_matrices): New argument lambda_obstack. Pass it down. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158644 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog43
-rw-r--r--gcc/lambda-code.c84
-rw-r--r--gcc/lambda-mat.c73
-rw-r--r--gcc/lambda-trans.c16
-rw-r--r--gcc/lambda.h11
-rw-r--r--gcc/tree-data-ref.c10
-rw-r--r--gcc/tree-data-ref.h4
-rw-r--r--gcc/tree-loop-linear.c5
-rw-r--r--gcc/tree-parloops.c12
9 files changed, 143 insertions, 115 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 19f96be2bf4..3c765004350 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,46 @@
+2010-04-22 Laurynas Biveinis <laurynas.biveinis@gmail.com>
+
+ * tree-parloops.c (loop_parallel_p): New argument
+ parloop_obstack. Pass it down.
+ (parallelize_loops): New variable parloop_obstack. Initialize it,
+ pass it down, free it.
+
+ * tree-loop-linear.c (linear_transform_loops): Pass down
+ lambda_obstack.
+
+ * tree-data-ref.h (lambda_compute_access_matrices): New argument
+ of type struct obstack *.
+
+ * tree-data-ref.c (analyze_subscript_affine_affine): New variable
+ scratch_obstack. Initialize it, pass down, free it.
+
+ * lambda.h (lambda_loop_new): Remove.
+ (lambda_matrix_new, lambda_matrix_inverse)
+ (lambda_trans_matrix_new, lambda_trans_matrix_inverse): New
+ argument of type struct obstack *.
+
+ * lambda-trans.c (lambda_trans_matrix_new): New argument
+ lambda_obstack. Pass it down, use obstack allocation for ret.
+ (lambda_trans_matrix_inverse): New argument lambda_obstack. Pass
+ it down.
+
+ * lambda-mat.c (lambda_matrix_get_column)
+ (lambda_matrix_project_to_null): Remove.
+ (lambda_matrix_new): New argument lambda_obstack. Use obstack
+ allocation for mat.
+ (lambda_matrix_inverse_hard, lambda_matrix_inverse): New argument
+ lambda_obstack.
+
+ * lambda-code.c (lambda_loop_new): New function.
+ (lambda_lattice_new, compute_nest_using_fourier_motzkin)
+ (lambda_compute_auxillary_space, lambda_compute_target_space)
+ (lambda_loopnest_transform, gcc_loop_to_lambda_loop)
+ (lambda_loopnest_to_gcc_loopnest): Pass down lambda_obstack.
+ (build_access_matrix): New argument lambda_obstack. Use obstack
+ allocation for am.
+ (lambda_compute_step_signs, lambda_compute_access_matrices): New
+ argument lambda_obstack. Pass it down.
+
2010-04-22 Bernd Schmidt <bernds@codesourcery.com>
* optabs.h (expand_widening_mult): Declare.
diff --git a/gcc/lambda-code.c b/gcc/lambda-code.c
index b3143da8e38..fff6ff800f3 100644
--- a/gcc/lambda-code.c
+++ b/gcc/lambda-code.c
@@ -150,6 +150,17 @@ static lambda_lattice lambda_lattice_compute_base (lambda_loopnest,
static bool can_convert_to_perfect_nest (struct loop *);
+/* Create a new lambda loop in LAMBDA_OBSTACK. */
+
+static lambda_loop
+lambda_loop_new (struct obstack * lambda_obstack)
+{
+ lambda_loop result = (lambda_loop)
+ obstack_alloc (lambda_obstack, sizeof (struct lambda_loop_s));
+ memset (result, 0, sizeof (struct lambda_loop_s));
+ return result;
+}
+
/* Create a new lambda body vector. */
lambda_body_vector
@@ -157,7 +168,8 @@ lambda_body_vector_new (int size, struct obstack * lambda_obstack)
{
lambda_body_vector ret;
- ret = (lambda_body_vector)obstack_alloc (lambda_obstack, sizeof (*ret));
+ 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;
@@ -367,9 +379,10 @@ lambda_lattice_new (int depth, int invariants, struct obstack * lambda_obstack)
{
lambda_lattice ret
= (lambda_lattice)obstack_alloc (lambda_obstack, sizeof (*ret));
- LATTICE_BASE (ret) = lambda_matrix_new (depth, depth);
+ LATTICE_BASE (ret) = lambda_matrix_new (depth, depth, lambda_obstack);
LATTICE_ORIGIN (ret) = lambda_vector_new (depth);
- LATTICE_ORIGIN_INVARIANTS (ret) = lambda_matrix_new (depth, invariants);
+ LATTICE_ORIGIN_INVARIANTS (ret) = lambda_matrix_new (depth, invariants,
+ lambda_obstack);
LATTICE_DIMENSION (ret) = depth;
LATTICE_INVARIANTS (ret) = invariants;
return ret;
@@ -500,15 +513,15 @@ compute_nest_using_fourier_motzkin (int size,
lambda_vector swapvector, a1;
int newsize;
- A1 = lambda_matrix_new (128, depth);
- B1 = lambda_matrix_new (128, invariants);
+ A1 = lambda_matrix_new (128, depth, lambda_obstack);
+ B1 = lambda_matrix_new (128, invariants, lambda_obstack);
a1 = lambda_vector_new (128);
auxillary_nest = lambda_loopnest_new (depth, invariants, lambda_obstack);
for (i = depth - 1; i >= 0; i--)
{
- loop = lambda_loop_new ();
+ loop = lambda_loop_new (lambda_obstack);
LN_LOOPS (auxillary_nest)[i] = loop;
LL_STEP (loop) = 1;
@@ -654,12 +667,12 @@ lambda_compute_auxillary_space (lambda_loopnest nest,
/* Unfortunately, we can't know the number of constraints we'll have
ahead of time, but this should be enough even in ridiculous loop nest
cases. We must not go over this limit. */
- A = lambda_matrix_new (128, depth);
- B = lambda_matrix_new (128, invariants);
+ A = lambda_matrix_new (128, depth, lambda_obstack);
+ B = lambda_matrix_new (128, invariants, lambda_obstack);
a = lambda_vector_new (128);
- A1 = lambda_matrix_new (128, depth);
- B1 = lambda_matrix_new (128, invariants);
+ A1 = lambda_matrix_new (128, depth, lambda_obstack);
+ B1 = lambda_matrix_new (128, invariants, lambda_obstack);
a1 = lambda_vector_new (128);
/* Store the bounds in the equation matrix A, constant vector a, and
@@ -754,11 +767,11 @@ lambda_compute_auxillary_space (lambda_loopnest nest,
/* Now compute the auxiliary space bounds by first inverting U, multiplying
it by A1, then performing Fourier-Motzkin. */
- invertedtrans = lambda_matrix_new (depth, depth);
+ invertedtrans = lambda_matrix_new (depth, depth, lambda_obstack);
/* Compute the inverse of U. */
lambda_matrix_inverse (LTM_MATRIX (trans),
- invertedtrans, depth);
+ invertedtrans, depth, lambda_obstack);
/* A = A1 inv(U). */
lambda_matrix_mult (A1, invertedtrans, A, size, depth, depth);
@@ -795,18 +808,19 @@ lambda_compute_target_space (lambda_loopnest auxillary_nest,
depth = LN_DEPTH (auxillary_nest);
invariants = LN_INVARIANTS (auxillary_nest);
- inverse = lambda_matrix_new (depth, depth);
- determinant = lambda_matrix_inverse (LTM_MATRIX (H), inverse, depth);
+ inverse = lambda_matrix_new (depth, depth, lambda_obstack);
+ determinant = lambda_matrix_inverse (LTM_MATRIX (H), inverse, depth,
+ lambda_obstack);
/* H1 is H excluding its diagonal. */
- H1 = lambda_matrix_new (depth, depth);
+ H1 = lambda_matrix_new (depth, depth, lambda_obstack);
lambda_matrix_copy (LTM_MATRIX (H), H1, depth, depth);
for (i = 0; i < depth; i++)
H1[i][i] = 0;
/* Computes the linear offsets of the loop bounds. */
- target = lambda_matrix_new (depth, depth);
+ target = lambda_matrix_new (depth, depth, lambda_obstack);
lambda_matrix_mult (H1, inverse, target, depth, depth, depth);
target_nest = lambda_loopnest_new (depth, invariants, lambda_obstack);
@@ -815,7 +829,7 @@ lambda_compute_target_space (lambda_loopnest auxillary_nest,
{
/* Get a new loop structure. */
- target_loop = lambda_loop_new ();
+ target_loop = lambda_loop_new (lambda_obstack);
LN_LOOPS (target_nest)[i] = target_loop;
/* Computes the gcd of the coefficients of the linear part. */
@@ -982,7 +996,9 @@ lambda_compute_target_space (lambda_loopnest auxillary_nest,
result. */
static lambda_vector
-lambda_compute_step_signs (lambda_trans_matrix trans, lambda_vector stepsigns)
+lambda_compute_step_signs (lambda_trans_matrix trans,
+ lambda_vector stepsigns,
+ struct obstack * lambda_obstack)
{
lambda_matrix matrix, H;
int size;
@@ -992,7 +1008,7 @@ lambda_compute_step_signs (lambda_trans_matrix trans, lambda_vector stepsigns)
matrix = LTM_MATRIX (trans);
size = LTM_ROWSIZE (trans);
- H = lambda_matrix_new (size, size);
+ H = lambda_matrix_new (size, size, lambda_obstack);
newsteps = lambda_vector_new (size);
lambda_vector_copy (stepsigns, newsteps, size);
@@ -1067,7 +1083,7 @@ lambda_loopnest_transform (lambda_loopnest nest, lambda_trans_matrix trans,
/* Compute the lattice base. */
lattice = lambda_lattice_compute_base (nest, lambda_obstack);
- trans1 = lambda_trans_matrix_new (depth, depth);
+ trans1 = lambda_trans_matrix_new (depth, depth, lambda_obstack);
/* Multiply the transformation matrix by the lattice base. */
@@ -1075,25 +1091,27 @@ lambda_loopnest_transform (lambda_loopnest nest, lambda_trans_matrix trans,
LTM_MATRIX (trans1), depth, depth, depth);
/* Compute the Hermite normal form for the new transformation matrix. */
- H = lambda_trans_matrix_new (depth, depth);
- U = lambda_trans_matrix_new (depth, depth);
+ H = lambda_trans_matrix_new (depth, depth, lambda_obstack);
+ U = lambda_trans_matrix_new (depth, depth, lambda_obstack);
lambda_matrix_hermite (LTM_MATRIX (trans1), depth, LTM_MATRIX (H),
LTM_MATRIX (U));
/* Compute the auxiliary loop nest's space from the unimodular
portion. */
- auxillary_nest = lambda_compute_auxillary_space (nest, U, lambda_obstack);
+ auxillary_nest = lambda_compute_auxillary_space (nest, U,
+ lambda_obstack);
/* Compute the loop step signs from the old step signs and the
transformation matrix. */
- stepsigns = lambda_compute_step_signs (trans1, stepsigns);
+ stepsigns = lambda_compute_step_signs (trans1, stepsigns,
+ lambda_obstack);
/* 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,
lambda_obstack);
origin = lambda_vector_new (depth);
- origin_invariants = lambda_matrix_new (depth, invariants);
+ origin_invariants = lambda_matrix_new (depth, invariants, lambda_obstack);
lambda_matrix_vector_mult (LTM_MATRIX (trans), depth, depth,
LATTICE_ORIGIN (lattice), origin);
lambda_matrix_mult (LTM_MATRIX (trans), LATTICE_ORIGIN_INVARIANTS (lattice),
@@ -1424,7 +1442,7 @@ gcc_loop_to_lambda_loop (struct loop *loop, int depth,
return NULL;
}
- lloop = lambda_loop_new ();
+ lloop = lambda_loop_new (lambda_obstack);
LL_STEP (lloop) = stepint;
LL_LOWER_BOUND (lloop) = lbound;
LL_UPPER_BOUND (lloop) = ubound;
@@ -1702,7 +1720,7 @@ lambda_loopnest_to_gcc_loopnest (struct loop *old_loopnest,
tree oldiv;
gimple_stmt_iterator bsi;
- transform = lambda_trans_matrix_inverse (transform);
+ transform = lambda_trans_matrix_inverse (transform, lambda_obstack);
if (dump_file)
{
@@ -2801,9 +2819,12 @@ av_for_af (tree access_fun, lambda_vector cy, struct access_matrix *am)
static bool
build_access_matrix (data_reference_p data_reference,
- VEC (tree, heap) *parameters, VEC (loop_p, heap) *nest)
+ VEC (tree, heap) *parameters,
+ VEC (loop_p, heap) *nest,
+ struct obstack * lambda_obstack)
{
- struct access_matrix *am = GGC_NEW (struct access_matrix);
+ struct access_matrix *am = (struct access_matrix *)
+ obstack_alloc(lambda_obstack, sizeof (struct access_matrix));
unsigned i, ndim = DR_NUM_DIMENSIONS (data_reference);
unsigned nivs = VEC_length (loop_p, nest);
unsigned lambda_nb_columns;
@@ -2835,13 +2856,14 @@ build_access_matrix (data_reference_p data_reference,
bool
lambda_compute_access_matrices (VEC (data_reference_p, heap) *datarefs,
VEC (tree, heap) *parameters,
- VEC (loop_p, heap) *nest)
+ VEC (loop_p, heap) *nest,
+ struct obstack * lambda_obstack)
{
data_reference_p dataref;
unsigned ix;
for (ix = 0; VEC_iterate (data_reference_p, datarefs, ix, dataref); ix++)
- if (!build_access_matrix (dataref, parameters, nest))
+ if (!build_access_matrix (dataref, parameters, nest, lambda_obstack))
return false;
return true;
diff --git a/gcc/lambda-mat.c b/gcc/lambda-mat.c
index fb9098b20e1..50fdb699925 100644
--- a/gcc/lambda-mat.c
+++ b/gcc/lambda-mat.c
@@ -27,18 +27,16 @@ along with GCC; see the file COPYING3. If not see
#include "tree-flow.h"
#include "lambda.h"
-static void lambda_matrix_get_column (lambda_matrix, int, int,
- lambda_vector);
-
/* Allocate a matrix of M rows x N cols. */
lambda_matrix
-lambda_matrix_new (int m, int n)
+lambda_matrix_new (int m, int n, struct obstack * lambda_obstack)
{
lambda_matrix mat;
int i;
- mat = GGC_NEWVEC (lambda_vector, m);
+ mat = (lambda_matrix) obstack_alloc (lambda_obstack,
+ sizeof (lambda_vector *) * m);
for (i = 0; i < m; i++)
mat[i] = lambda_vector_new (n);
@@ -165,19 +163,6 @@ lambda_matrix_mult (lambda_matrix mat1, lambda_matrix mat2,
}
}
-/* Get column COL from the matrix MAT and store it in VEC. MAT has
- N rows, so the length of VEC must be N. */
-
-static void
-lambda_matrix_get_column (lambda_matrix mat, int n, int col,
- lambda_vector vec)
-{
- int i;
-
- for (i = 0; i < n; i++)
- vec[i] = mat[i][col];
-}
-
/* Delete rows r1 to r2 (not including r2). */
void
@@ -307,10 +292,12 @@ lambda_matrix_col_mc (lambda_matrix mat, int m, int c1, int const1)
When MAT is a 2 x 2 matrix, we don't go through the whole process, because
it is easily inverted by inspection and it is a very common case. */
-static int lambda_matrix_inverse_hard (lambda_matrix, lambda_matrix, int);
+static int lambda_matrix_inverse_hard (lambda_matrix, lambda_matrix, int,
+ struct obstack *);
int
-lambda_matrix_inverse (lambda_matrix mat, lambda_matrix inv, int n)
+lambda_matrix_inverse (lambda_matrix mat, lambda_matrix inv, int n,
+ struct obstack * lambda_obstack)
{
if (n == 2)
{
@@ -335,20 +322,21 @@ lambda_matrix_inverse (lambda_matrix mat, lambda_matrix inv, int n)
return det;
}
else
- return lambda_matrix_inverse_hard (mat, inv, n);
+ return lambda_matrix_inverse_hard (mat, inv, n, lambda_obstack);
}
/* If MAT is not a special case, invert it the hard way. */
static int
-lambda_matrix_inverse_hard (lambda_matrix mat, lambda_matrix inv, int n)
+lambda_matrix_inverse_hard (lambda_matrix mat, lambda_matrix inv, int n,
+ struct obstack * lambda_obstack)
{
lambda_vector row;
lambda_matrix temp;
int i, j;
int determinant;
- temp = lambda_matrix_new (n, n);
+ temp = lambda_matrix_new (n, n, lambda_obstack);
lambda_matrix_copy (mat, temp, n, n);
lambda_matrix_id (inv, n);
@@ -592,45 +580,6 @@ lambda_matrix_first_nz_vec (lambda_matrix mat, int rowsize, int colsize,
return rowsize;
}
-/* Calculate the projection of E sub k to the null space of B. */
-
-void
-lambda_matrix_project_to_null (lambda_matrix B, int rowsize,
- int colsize, int k, lambda_vector x)
-{
- lambda_matrix M1, M2, M3, I;
- int determinant;
-
- /* Compute c(I-B^T inv(B B^T) B) e sub k. */
-
- /* M1 is the transpose of B. */
- M1 = lambda_matrix_new (colsize, colsize);
- lambda_matrix_transpose (B, M1, rowsize, colsize);
-
- /* M2 = B * B^T */
- M2 = lambda_matrix_new (colsize, colsize);
- lambda_matrix_mult (B, M1, M2, rowsize, colsize, rowsize);
-
- /* M3 = inv(M2) */
- M3 = lambda_matrix_new (colsize, colsize);
- determinant = lambda_matrix_inverse (M2, M3, rowsize);
-
- /* M2 = B^T (inv(B B^T)) */
- lambda_matrix_mult (M1, M3, M2, colsize, rowsize, rowsize);
-
- /* M1 = B^T (inv(B B^T)) B */
- lambda_matrix_mult (M2, B, M1, colsize, rowsize, colsize);
- lambda_matrix_negate (M1, M1, colsize, colsize);
-
- I = lambda_matrix_new (colsize, colsize);
- lambda_matrix_id (I, colsize);
-
- lambda_matrix_add_mc (I, determinant, M1, 1, M2, colsize, colsize);
-
- lambda_matrix_get_column (M2, colsize, k - 1, x);
-
-}
-
/* Multiply a vector VEC by a matrix MAT.
MAT is an M*N matrix, and VEC is a vector with length N. The result
is stored in DEST which must be a vector of length M. */
diff --git a/gcc/lambda-trans.c b/gcc/lambda-trans.c
index d34a63e2e86..0cf1db96fa6 100644
--- a/gcc/lambda-trans.c
+++ b/gcc/lambda-trans.c
@@ -31,12 +31,14 @@ along with GCC; see the file COPYING3. If not see
/* Allocate a new transformation matrix. */
lambda_trans_matrix
-lambda_trans_matrix_new (int colsize, int rowsize)
+lambda_trans_matrix_new (int colsize, int rowsize,
+ struct obstack * lambda_obstack)
{
lambda_trans_matrix ret;
- ret = GGC_NEW (struct lambda_trans_matrix_s);
- LTM_MATRIX (ret) = lambda_matrix_new (rowsize, colsize);
+ ret = (lambda_trans_matrix)
+ obstack_alloc (lambda_obstack, sizeof (struct lambda_trans_matrix_s));
+ LTM_MATRIX (ret) = lambda_matrix_new (rowsize, colsize, lambda_obstack);
LTM_ROWSIZE (ret) = rowsize;
LTM_COLSIZE (ret) = colsize;
LTM_DENOMINATOR (ret) = 1;
@@ -57,14 +59,16 @@ lambda_trans_matrix_id_p (lambda_trans_matrix mat)
/* Compute the inverse of the transformation matrix MAT. */
lambda_trans_matrix
-lambda_trans_matrix_inverse (lambda_trans_matrix mat)
+lambda_trans_matrix_inverse (lambda_trans_matrix mat,
+ struct obstack * lambda_obstack)
{
lambda_trans_matrix inverse;
int determinant;
- inverse = lambda_trans_matrix_new (LTM_ROWSIZE (mat), LTM_COLSIZE (mat));
+ inverse = lambda_trans_matrix_new (LTM_ROWSIZE (mat), LTM_COLSIZE (mat),
+ lambda_obstack);
determinant = lambda_matrix_inverse (LTM_MATRIX (mat), LTM_MATRIX (inverse),
- LTM_ROWSIZE (mat));
+ LTM_ROWSIZE (mat), lambda_obstack);
LTM_DENOMINATOR (inverse) = determinant;
return inverse;
}
diff --git a/gcc/lambda.h b/gcc/lambda.h
index 189c1fc50b3..c819027f582 100644
--- a/gcc/lambda.h
+++ b/gcc/lambda.h
@@ -156,11 +156,9 @@ struct loop;
bool perfect_nest_p (struct loop *);
void print_lambda_loopnest (FILE *, lambda_loopnest, char);
-#define lambda_loop_new() (lambda_loop) ggc_alloc_cleared (sizeof (struct lambda_loop_s))
-
void print_lambda_loop (FILE *, lambda_loop, int, int, char);
-lambda_matrix lambda_matrix_new (int, int);
+lambda_matrix lambda_matrix_new (int, int, struct obstack *);
void lambda_matrix_id (lambda_matrix, int);
bool lambda_matrix_id_p (lambda_matrix, int);
@@ -182,7 +180,7 @@ void lambda_matrix_col_exchange (lambda_matrix, int, int, int);
void lambda_matrix_col_add (lambda_matrix, int, int, int, int);
void lambda_matrix_col_negate (lambda_matrix, int, int);
void lambda_matrix_col_mc (lambda_matrix, int, int, int);
-int lambda_matrix_inverse (lambda_matrix, lambda_matrix, int);
+int lambda_matrix_inverse (lambda_matrix, lambda_matrix, int, struct obstack *);
void lambda_matrix_hermite (lambda_matrix, int, lambda_matrix, lambda_matrix);
void lambda_matrix_left_hermite (lambda_matrix, int, int, lambda_matrix, lambda_matrix);
void lambda_matrix_right_hermite (lambda_matrix, int, int, lambda_matrix, lambda_matrix);
@@ -191,13 +189,14 @@ void lambda_matrix_project_to_null (lambda_matrix, int, int, int,
lambda_vector);
void print_lambda_matrix (FILE *, lambda_matrix, int, int);
-lambda_trans_matrix lambda_trans_matrix_new (int, int);
+lambda_trans_matrix lambda_trans_matrix_new (int, int, struct obstack *);
bool lambda_trans_matrix_nonsingular_p (lambda_trans_matrix);
bool lambda_trans_matrix_fullrank_p (lambda_trans_matrix);
int lambda_trans_matrix_rank (lambda_trans_matrix);
lambda_trans_matrix lambda_trans_matrix_basis (lambda_trans_matrix);
lambda_trans_matrix lambda_trans_matrix_padding (lambda_trans_matrix);
-lambda_trans_matrix lambda_trans_matrix_inverse (lambda_trans_matrix);
+lambda_trans_matrix lambda_trans_matrix_inverse (lambda_trans_matrix,
+ struct obstack *);
void print_lambda_trans_matrix (FILE *, lambda_trans_matrix);
void lambda_matrix_vector_mult (lambda_matrix, int, int, lambda_vector,
lambda_vector);
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c
index a89d151c261..9abb2a8422e 100644
--- a/gcc/tree-data-ref.c
+++ b/gcc/tree-data-ref.c
@@ -2176,6 +2176,7 @@ analyze_subscript_affine_affine (tree chrec_a,
unsigned nb_vars_a, nb_vars_b, dim;
HOST_WIDE_INT init_a, init_b, gamma, gcd_alpha_beta;
lambda_matrix A, U, S;
+ struct obstack scratch_obstack;
if (eq_evolutions_p (chrec_a, chrec_b))
{
@@ -2203,10 +2204,12 @@ analyze_subscript_affine_affine (tree chrec_a,
nb_vars_a = nb_vars_in_chrec (chrec_a);
nb_vars_b = nb_vars_in_chrec (chrec_b);
+ gcc_obstack_init (&scratch_obstack);
+
dim = nb_vars_a + nb_vars_b;
- U = lambda_matrix_new (dim, dim);
- A = lambda_matrix_new (dim, 1);
- S = lambda_matrix_new (dim, 1);
+ U = lambda_matrix_new (dim, dim, &scratch_obstack);
+ A = lambda_matrix_new (dim, 1, &scratch_obstack);
+ S = lambda_matrix_new (dim, 1, &scratch_obstack);
init_a = int_cst_value (initialize_matrix_A (A, chrec_a, 0, 1));
init_b = int_cst_value (initialize_matrix_A (A, chrec_b, nb_vars_a, -1));
@@ -2420,6 +2423,7 @@ analyze_subscript_affine_affine (tree chrec_a,
}
end_analyze_subs_aa:
+ obstack_free (&scratch_obstack, NULL);
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file, " (overlaps_a = ");
diff --git a/gcc/tree-data-ref.h b/gcc/tree-data-ref.h
index 678eb10cc18..eff53483116 100644
--- a/gcc/tree-data-ref.h
+++ b/gcc/tree-data-ref.h
@@ -584,7 +584,9 @@ bool lambda_transform_legal_p (lambda_trans_matrix, int,
void lambda_collect_parameters (VEC (data_reference_p, heap) *,
VEC (tree, heap) **);
bool lambda_compute_access_matrices (VEC (data_reference_p, heap) *,
- VEC (tree, heap) *, VEC (loop_p, heap) *);
+ VEC (tree, heap) *,
+ VEC (loop_p, heap) *,
+ struct obstack *);
/* In tree-data-ref.c */
void split_constant_offset (tree , tree *, tree *);
diff --git a/gcc/tree-loop-linear.c b/gcc/tree-loop-linear.c
index 04731c76820..047389c6e6a 100644
--- a/gcc/tree-loop-linear.c
+++ b/gcc/tree-loop-linear.c
@@ -358,14 +358,15 @@ linear_transform_loops (void)
goto free_and_continue;
lambda_collect_parameters (datarefs, &lambda_parameters);
- if (!lambda_compute_access_matrices (datarefs, lambda_parameters, nest))
+ if (!lambda_compute_access_matrices (datarefs, lambda_parameters,
+ nest, &lambda_obstack))
goto free_and_continue;
if (dump_file && (dump_flags & TDF_DETAILS))
dump_ddrs (dump_file, dependence_relations);
/* Build the transformation matrix. */
- trans = lambda_trans_matrix_new (depth, depth);
+ trans = lambda_trans_matrix_new (depth, depth, &lambda_obstack);
lambda_matrix_id (LTM_MATRIX (trans), depth);
trans = try_interchange_loops (trans, depth, dependence_relations,
datarefs, loop_nest);
diff --git a/gcc/tree-parloops.c b/gcc/tree-parloops.c
index c4ac89b001a..69a0b659616 100644
--- a/gcc/tree-parloops.c
+++ b/gcc/tree-parloops.c
@@ -248,7 +248,7 @@ name_to_copy_elt_hash (const void *aa)
in parallel). */
static bool
-loop_parallel_p (struct loop *loop)
+loop_parallel_p (struct loop *loop, struct obstack * parloop_obstack)
{
VEC (ddr_p, heap) * dependence_relations;
VEC (data_reference_p, heap) *datarefs;
@@ -273,7 +273,7 @@ loop_parallel_p (struct loop *loop)
if (dump_file && (dump_flags & TDF_DETAILS))
dump_data_dependence_relations (dump_file, dependence_relations);
- trans = lambda_trans_matrix_new (1, 1);
+ trans = lambda_trans_matrix_new (1, 1, parloop_obstack);
LTM_MATRIX (trans)[0][0] = -1;
if (lambda_transform_legal_p (trans, 1, dependence_relations))
@@ -1884,15 +1884,17 @@ parallelize_loops (void)
struct tree_niter_desc niter_desc;
loop_iterator li;
htab_t reduction_list;
+ struct obstack parloop_obstack;
HOST_WIDE_INT estimated;
LOC loop_loc;
-
+
/* Do not parallelize loops in the functions created by parallelization. */
if (parallelized_function_p (cfun->decl))
return false;
if (cfun->has_nonlocal_label)
return false;
+ gcc_obstack_init (&parloop_obstack);
reduction_list = htab_create (10, reduction_info_hash,
reduction_info_eq, free);
init_stmt_vec_info_vec ();
@@ -1950,7 +1952,8 @@ parallelize_loops (void)
if (!try_create_reduction_list (loop, reduction_list))
continue;
- if (!flag_loop_parallelize_all && !loop_parallel_p (loop))
+ if (!flag_loop_parallelize_all
+ && !loop_parallel_p (loop, &parloop_obstack))
continue;
changed = true;
@@ -1975,6 +1978,7 @@ parallelize_loops (void)
free_stmt_vec_info_vec ();
htab_delete (reduction_list);
+ obstack_free (&parloop_obstack, NULL);
/* Parallelization will cause new function calls to be inserted through
which local variables will escape. Reset the points-to solution