Commit 36d59cf7 by Daniel Berlin Committed by Daniel Berlin

[multiple changes]

2004-08-26  Daniel Berlin  <dberlin@dberlin.org>

	* Makefile.in (lambda-code.o): New.
	(lambda-trans.o): Ditto.
	(TREE_DATA_REF_H): Ditto.
	(LAMBDA_H): Ditto.
	(lambda-mat.o): Use LAMBDA_H.
	(tree-data-ref.o): Ditto.
	* lambda-code.c: New file.  Lambda code generation algorithm.
	* lambda-trans.c: Ditto. Lambda transformation matrix support.
	* lambda.h: Add lambda loop structures.
	Add lambda loopnest structures.
	Add lambda body vector structure.
	Add lambda linear expression structures.
	Add prototypes for functions in new files.
	* lambda-mat.c: Include tree.h

2004-08-26  Daniel Berlin <dberlin@dberlin.org>
	    Sebastian Pop  <pop@cri.ensmp.fr>

	* tree-data-ref.h: Include lambda.h
	(free_dependence_relation): Declared here.
	(free_dependence_relations): Ditto.
	(free_data_refs): Ditto.
	* tree-data-ref.c (free_dependence_relation): New function.
	(free_dependence_relations): Ditto.
	(free_data_refs): Ditot.
	(analyze_all_data_dependences): Free datarefs and dependence_relations.
	(build_classic_dist_vector): Store in the dependence_relations the
	information. Each arc in the dependence_relations graph is labelled
	with the distance and direction vectors.
	(build_classic_dir_vector): Ditto.
	(compute_rw_wr_ww_dependences): Renamed again compute_all_dependences.
	Now computes again the whole dependence graph including read-read
	relations.
	(compute_data_dependences_for_loop): Now dependence_relations contains
	all the data, and thus it doesn't need to initialize the classic_dir
	and classic_dist vectors.
	(analyze_all_data_dependences): Adjusted for using the new interface of
	compute_data_dependences_for_loop.  Remove the statistics dump.

Co-Authored-By: Sebastian Pop <pop@cri.ensmp.fr>

From-SVN: r86627
parent a46bbb5a
2004-08-26 Daniel Berlin <dberlin@dberlin.org>
* Makefile.in (lambda-code.o): New.
(lambda-trans.o): Ditto.
(TREE_DATA_REF_H): Ditto.
(LAMBDA_H): Ditto.
(lambda-mat.o): Use LAMBDA_H.
(tree-data-ref.o): Ditto.
* lambda-code.c: New file. Lambda code generation algorithm.
* lambda-trans.c: Ditto. Lambda transformation matrix support.
* lambda.h: Add lambda loop structures.
Add lambda loopnest structures.
Add lambda body vector structure.
Add lambda linear expression structures.
Add prototypes for functions in new files.
* lambda-mat.c: Include tree.h
2004-08-26 Daniel Berlin <dberlin@dberlin.org>
Sebastian Pop <pop@cri.ensmp.fr>
* tree-data-ref.h: Include lambda.h
(free_dependence_relation): Declared here.
(free_dependence_relations): Ditto.
(free_data_refs): Ditto.
* tree-data-ref.c (free_dependence_relation): New function.
(free_dependence_relations): Ditto.
(free_data_refs): Ditot.
(analyze_all_data_dependences): Free datarefs and dependence_relations.
(build_classic_dist_vector): Store in the dependence_relations the
information. Each arc in the dependence_relations graph is labelled
with the distance and direction vectors.
(build_classic_dir_vector): Ditto.
(compute_rw_wr_ww_dependences): Renamed again compute_all_dependences.
Now computes again the whole dependence graph including read-read
relations.
(compute_data_dependences_for_loop): Now dependence_relations contains
all the data, and thus it doesn't need to initialize the classic_dir
and classic_dist vectors.
(analyze_all_data_dependences): Adjusted for using the new interface of
compute_data_dependences_for_loop. Remove the statistics dump.
2004-08-26 Bob Wilson <bob.wilson@acm.org>
* config/xtensa/xtensa.c (xtensa_ld_opcodes, xtensa_st_opcodes): Delete.
......
......@@ -723,6 +723,8 @@ PRETTY_PRINT_H = pretty-print.h input.h $(OBSTACK_H)
DIAGNOSTIC_H = diagnostic.h diagnostic.def $(PRETTY_PRINT_H)
C_PRETTY_PRINT_H = c-pretty-print.h $(PRETTY_PRINT_H) $(C_COMMON_H) $(TREE_H)
SCEV_H = tree-scalar-evolution.h $(GGC_H) tree-chrec.h
LAMBDA_H = lambda.h tree.h vec.h $(GGC_H)
TREE_DATA_REF_H = tree-data-ref.h $(LAMBDA_H)
#
# Now figure out from those variables how to compile and link.
......@@ -915,7 +917,8 @@ OBJS-common = \
targhooks.o timevar.o toplev.o tracer.o tree.o tree-dump.o unroll.o \
varasm.o varray.o vec.o version.o vmsdbgout.o xcoffout.o alloc-pool.o \
et-forest.o cfghooks.o bt-load.o pretty-print.o $(GGC) web.o passes.o \
rtl-profile.o tree-profile.o rtlhooks.o cfgexpand.o lambda-mat.o
rtl-profile.o tree-profile.o rtlhooks.o cfgexpand.o lambda-mat.o \
lambda-trans.o lambda-code.o
OBJS-md = $(out_object_file)
OBJS-archive = $(EXTRA_OBJS) $(host_hook_obj) tree-inline.o \
......@@ -1737,7 +1740,7 @@ tree-scalar-evolution.o: tree-scalar-evolution.c $(CONFIG_H) $(SYSTEM_H) \
tree-data-ref.o: tree-data-ref.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
errors.h $(GGC_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) tree-pass.h lambda.h
tree-data-ref.h $(SCEV_H) tree-pass.h $(LAMBDA_H)
tree-vectorizer.o: tree-vectorizer.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
errors.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 \
......@@ -2137,7 +2140,12 @@ ifcvt.o : ifcvt.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
$(REGS_H) toplev.h $(FLAGS_H) insn-config.h function.h $(RECOG_H) $(TARGET_H) \
$(BASIC_BLOCK_H) $(EXPR_H) output.h except.h $(TM_P_H) real.h $(OPTABS_H) \
$(CFGLOOP_H)
lambda-mat.o : lambda-mat.c lambda.h $(GGC_H) $(SYSTEM_H) $(CONFIG_H) $(TM_H)
lambda-mat.o : lambda-mat.c $(LAMBDA_H) $(GGC_H) $(SYSTEM_H) $(CONFIG_H) $(TM_H)
lambda-trans.o: lambda-trans.c $(LAMBDA_H) $(GGC_H) $(SYSTEM_H) $(CONFIG_H) $(TM_H)
lambda-code.o: lambda-code.c $(LAMBDA_H) $(GGC_H) $(SYSTEM_H) $(CONFIG_H) \
errors.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)
params.o : params.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(PARAMS_H) toplev.h
hooks.o: hooks.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(HOOKS_H)
pretty-print.o: $(CONFIG_H) $(SYSTEM_H) pretty-print.c $(PRETTY_PRINT_H)
......
......@@ -24,6 +24,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "tm.h"
#include "ggc.h"
#include "varray.h"
#include "tree.h"
#include "lambda.h"
static void lambda_matrix_get_column (lambda_matrix, int, int,
......
/* Lambda matrix transformations.
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
Contributed by Daniel Berlin <dberlin@dberlin.org>.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING. If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "tm.h"
#include "errors.h"
#include "ggc.h"
#include "tree.h"
#include "target.h"
#include "varray.h"
#include "lambda.h"
/* Allocate a new transformation matrix. */
lambda_trans_matrix
lambda_trans_matrix_new (int colsize, int rowsize)
{
lambda_trans_matrix ret;
ret = ggc_alloc (sizeof (*ret));
LTM_MATRIX (ret) = lambda_matrix_new (rowsize, colsize);
LTM_ROWSIZE (ret) = rowsize;
LTM_COLSIZE (ret) = colsize;
LTM_DENOMINATOR (ret) = 1;
return ret;
}
/* Compute the inverse of the transformation. */
lambda_trans_matrix
lambda_trans_matrix_inverse (lambda_trans_matrix mat)
{
lambda_trans_matrix inverse;
int determinant;
inverse = lambda_trans_matrix_new (LTM_ROWSIZE (mat), LTM_COLSIZE (mat));
determinant = lambda_matrix_inverse (LTM_MATRIX (mat), LTM_MATRIX (inverse),
LTM_ROWSIZE (mat));
LTM_DENOMINATOR (inverse) = determinant;
return inverse;
}
/* Print out a transformation matrix. */
void
print_lambda_trans_matrix (FILE *outfile, lambda_trans_matrix mat)
{
print_lambda_matrix (outfile, LTM_MATRIX (mat), LTM_ROWSIZE (mat),
LTM_COLSIZE (mat));
}
......@@ -22,6 +22,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#ifndef LAMBDA_H
#define LAMBDA_H
#include "vec.h"
/* An integer vector. A vector formally consists of an element of a vector
space. A vector space is a set that is closed under vector addition
and scalar multiplication. In this vector space, an element is a list of
......@@ -31,6 +33,86 @@ typedef int *lambda_vector;
all vectors are the same length). */
typedef lambda_vector *lambda_matrix;
/* A transformation matrix. */
typedef struct
{
lambda_matrix matrix;
int rowsize;
int colsize;
int denominator;
} *lambda_trans_matrix;
#define LTM_MATRIX(T) ((T)->matrix)
#define LTM_ROWSIZE(T) ((T)->rowsize)
#define LTM_COLSIZE(T) ((T)->colsize)
#define LTM_DENOMINATOR(T) ((T)->denominator)
/* A vector representing a statement in the body of a loop. */
typedef struct
{
lambda_vector coefficients;
int size;
int denominator;
} *lambda_body_vector;
#define LBV_COEFFICIENTS(T) ((T)->coefficients)
#define LBV_SIZE(T) ((T)->size)
#define LBV_DENOMINATOR(T) ((T)->denominator)
/* Piecewise linear expression. */
typedef struct lambda_linear_expression_s
{
lambda_vector coefficients;
int constant;
lambda_vector invariant_coefficients;
int denominator;
struct lambda_linear_expression_s *next;
} *lambda_linear_expression;
#define LLE_COEFFICIENTS(T) ((T)->coefficients)
#define LLE_CONSTANT(T) ((T)->constant)
#define LLE_INVARIANT_COEFFICIENTS(T) ((T)->invariant_coefficients)
#define LLE_DENOMINATOR(T) ((T)->denominator)
#define LLE_NEXT(T) ((T)->next)
lambda_linear_expression lambda_linear_expression_new (int, int);
void print_lambda_linear_expression (FILE *, lambda_linear_expression, int,
int, char);
/* Loop structure. */
typedef struct lambda_loop_s
{
lambda_linear_expression lower_bound;
lambda_linear_expression upper_bound;
lambda_linear_expression linear_offset;
int step;
} *lambda_loop;
#define LL_LOWER_BOUND(T) ((T)->lower_bound)
#define LL_UPPER_BOUND(T) ((T)->upper_bound)
#define LL_LINEAR_OFFSET(T) ((T)->linear_offset)
#define LL_STEP(T) ((T)->step)
/* Loop nest structure. */
typedef struct
{
lambda_loop *loops;
int depth;
int invariants;
} *lambda_loopnest;
#define LN_LOOPS(T) ((T)->loops)
#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);
bool lambda_transform_legal_p (lambda_trans_matrix, int, varray_type);
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);
void lambda_matrix_id (lambda_matrix, int);
......@@ -61,9 +143,32 @@ 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);
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);
void print_lambda_trans_matrix (FILE *, lambda_trans_matrix);
void lambda_matrix_vector_mult (lambda_matrix, int, int, lambda_vector,
lambda_vector);
lambda_body_vector lambda_body_vector_new (int);
lambda_body_vector lambda_body_vector_compute_new (lambda_trans_matrix,
lambda_body_vector);
void print_lambda_body_vector (FILE *, lambda_body_vector);
struct loop;
lambda_loopnest gcc_loopnest_to_lambda_loopnest (struct loop *,
VEC(tree) **,
VEC(tree) **);
void lambda_loopnest_to_gcc_loopnest (struct loop *, VEC(tree) *,
VEC(tree) *,
lambda_loopnest,
lambda_trans_matrix);
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_add (lambda_vector, lambda_vector,
......
......@@ -22,11 +22,10 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#ifndef GCC_TREE_DATA_REF_H
#define GCC_TREE_DATA_REF_H
struct data_reference GTY(())
#include "lambda.h"
struct data_reference
{
/* An identifier. */
unsigned int id;
/* A pointer to the statement that contains this DR. */
tree stmt;
......@@ -47,7 +46,6 @@ struct data_reference GTY(())
};
#define DR_ID(DR) DR->id
#define DR_STMT(DR) DR->stmt
#define DR_REF(DR) DR->ref
#define DR_BASE_NAME(DR) DR->base_name
......@@ -74,7 +72,7 @@ enum data_dependence_direction {
are stored in the data_dependence_relation structure under the form
of an array of subscripts. */
struct subscript GTY(())
struct subscript
{
/* A description of the iterations for which the elements are
accessed twice. */
......@@ -91,11 +89,6 @@ struct subscript GTY(())
B. The distance is a tree scalar expression, ie. a constant or a
symbolic expression, but certainly not a chrec function. */
tree distance;
/* Direction (or sign) of the distance. This more abstract (less
precise) information is extracted from the distance field, for
the convenience of some analyzers. */
enum data_dependence_direction direction;
};
#define SUB_CONFLICTS_IN_A(SUB) SUB->conflicting_iterations_in_a
......@@ -103,12 +96,11 @@ struct subscript GTY(())
#define SUB_LAST_CONFLICT_IN_A(SUB) SUB->last_conflict_in_a
#define SUB_LAST_CONFLICT_IN_B(SUB) SUB->last_conflict_in_b
#define SUB_DISTANCE(SUB) SUB->distance
#define SUB_DIRECTION(SUB) SUB->direction
/* A data_dependence_relation represents a relation between two
data_references A and B. */
struct data_dependence_relation GTY(())
struct data_dependence_relation
{
struct data_reference *a;
......@@ -131,6 +123,12 @@ struct data_dependence_relation GTY(())
this array. This is the attribute that labels the edge A->B of
the data_dependence_relation. */
varray_type subscripts;
/* The classic direction vector. */
lambda_vector dir_vect;
/* The classic distance vector. */
lambda_vector dist_vect;
};
#define DDR_A(DDR) DDR->a
......@@ -141,6 +139,8 @@ struct data_dependence_relation GTY(())
VARRAY_GENERIC_PTR_INIT (DDR_SUBSCRIPTS (DDR), N, "subscripts_vector");
#define DDR_SUBSCRIPT(DDR, I) VARRAY_GENERIC_PTR (DDR_SUBSCRIPTS (DDR), I)
#define DDR_NUM_SUBSCRIPTS(DDR) VARRAY_ACTIVE_SIZE (DDR_SUBSCRIPTS (DDR))
#define DDR_DIR_VECT(DDR) DDR->dir_vect
#define DDR_DIST_VECT(DDR) DDR->dist_vect
......@@ -149,7 +149,6 @@ struct data_dependence_relation *initialize_data_dependence_relation
void compute_affine_dependence (struct data_dependence_relation *);
extern void analyze_all_data_dependences (struct loops *);
extern void compute_data_dependences_for_loop (unsigned, struct loop *,
varray_type *, varray_type *,
varray_type *, varray_type *);
extern struct data_reference * init_data_ref (tree, tree, tree, tree, bool);
extern struct data_reference *analyze_array (tree, tree, bool);
......@@ -163,6 +162,9 @@ extern void dump_data_dependence_direction (FILE *,
enum data_dependence_direction);
extern bool array_base_name_differ_p (struct data_reference *,
struct data_reference *, bool *p);
extern void free_dependence_relation (struct data_dependence_relation *);
extern void free_dependence_relations (varray_type);
extern void free_data_refs (varray_type);
......
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