Commit b9dd78fa by Laurynas Biveinis Committed by Laurynas Biveinis

tree-loop-linear.c: Include obstack.h.

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