From b9dd78fa1e85a6c0b2bc1256a529f5960e503d79 Mon Sep 17 00:00:00 2001 From: Laurynas Biveinis Date: Fri, 7 Sep 2007 01:33:41 +0000 Subject: [PATCH] tree-loop-linear.c: Include obstack.h. 2007-09-06 Laurynas Biveinis * 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 | 51 ++++++++++++++++++ gcc/Makefile.in | 4 +- gcc/lambda-code.c | 118 +++++++++++++++++++++++++---------------- gcc/lambda.h | 25 +++++---- gcc/tree-loop-linear.c | 13 +++-- 5 files changed, 149 insertions(+), 62 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b93723adf6a..7b0c48390f2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,54 @@ +2007-09-06 Laurynas Biveinis + + * 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 * ginclude/stdfix.h: New file. diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 1030d8eb1e1..93f277a3ac0 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -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) 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); diff --git a/gcc/lambda.h b/gcc/lambda.h index f2ac6f15837..e7a75fdb66f 100644 --- a/gcc/lambda.h +++ b/gcc/lambda.h @@ -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); diff --git a/gcc/tree-loop-linear.c b/gcc/tree-loop-linear.c index 3fb4d05dbe1..d04045ded4f 100644 --- a/gcc/tree-loop-linear.c +++ b/gcc/tree-loop-linear.c @@ -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); }