diff options
author | lauras <lauras@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-09-07 01:33:41 +0000 |
---|---|---|
committer | lauras <lauras@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-09-07 01:33:41 +0000 |
commit | 3026d558160171c8e324325f3e31e2a4e5b1a41d (patch) | |
tree | 90465e7e91a5775e8c20ea92e5e97726c297376d /gcc/lambda-code.c | |
parent | 68a556d6cb1ebf7290514725565d2cf4723ab59f (diff) | |
download | gcc-3026d558160171c8e324325f3e31e2a4e5b1a41d.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@128219 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/lambda-code.c')
-rw-r--r-- | gcc/lambda-code.c | 118 |
1 files changed, 71 insertions, 47 deletions
diff --git a/gcc/lambda-code.c b/gcc/lambda-code.c index 0391f19e41e..c5734375c29 100644 --- a/gcc/lambda-code.c +++ b/gcc/lambda-code.c @@ -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); |