Commit 56cf8686 by Sebastian Pop Committed by Sebastian Pop

Makefile.in (OBJS-common): Add tree-data-ref.o.

	* Makefile.in (OBJS-common): Add tree-data-ref.o.
	(tree-scalar-evolution.o): Add missing dependences on tree-pass.h flags.h.
	(tree-data-ref.o): New rule.
	* lambda.h: New file.
	* tree-data-ref.c: New file.
	* tree-data-ref.h: New file.
	* tree.c (int_cst_value, tree_fold_gcd): New functions.
	* tree.h (int_cst_value, tree_fold_gcd): Declared here.

From-SVN: r84630
parent 39fb05d0
2004-07-13 Sebastian Pop <pop@cri.ensmp.fr>
* Makefile.in (OBJS-common): Add tree-data-ref.o.
(tree-scalar-evolution.o): Add missing dependences on tree-pass.h flags.h.
(tree-data-ref.o): New rule.
* lambda.h: New file.
* tree-data-ref.c: New file.
* tree-data-ref.h: New file.
* tree.c (int_cst_value, tree_fold_gcd): New functions.
* tree.h (int_cst_value, tree_fold_gcd): Declared here.
2004-07-13 Eric Botcazou <ebotcazou@libertysurf.fr>
PR target/13926
......
......@@ -888,7 +888,7 @@ C_OBJS = c-parse.o c-lang.o stub-objc.o $(C_AND_OBJC_OBJS)
# Language-independent object files.
OBJS-common = \
tree-chrec.o tree-scalar-evolution.o \
tree-chrec.o tree-scalar-evolution.o tree-data-ref.o \
tree-cfg.o tree-dfa.o tree-eh.o tree-ssa.o tree-optimize.o tree-gimple.o \
tree-alias-type.o gimplify.o tree-pretty-print.o tree-into-ssa.o \
tree-outof-ssa.o tree-alias-common.o tree-ssa-ccp.o tree-vn.o \
......@@ -1722,7 +1722,11 @@ tree-chrec.o: tree-chrec.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
tree-scalar-evolution.o: tree-scalar-evolution.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 $(SCEV_H)
$(TIMEVAR_H) cfgloop.h $(SCEV_H) tree-pass.h flags.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-gimple.o : tree-gimple.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(EXPR_H) \
$(RTL_H) $(TREE_GIMPLE_H) $(TM_H) coretypes.h bitmap.h $(GGC_H)
tree-mudflap.o : $(CONFIG_H) errors.h $(SYSTEM_H) $(TREE_H) tree-inline.h \
......
/* Lambda matrix interface.
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. */
#ifndef LAMBDA_H
#define LAMBDA_H
typedef int *lambda_vector;
/* Allocate a new vector of given SIZE. */
static inline lambda_vector
lambda_vector_new (int size)
{
return ggc_alloc_cleared (size * sizeof(int));
}
/* Clear out vector VEC1 of length SIZE. */
static inline void
lambda_vector_clear (lambda_vector vec1, int size)
{
memset (vec1, 0, size * sizeof (int));
}
/* Print out a vector VEC of length N to OUTFILE. */
static inline void
print_lambda_vector (FILE * outfile, lambda_vector vector, int n)
{
int i;
for (i = 0; i < n; i++)
fprintf (outfile, "%3d ", vector[i]);
fprintf (outfile, "\n");
}
#endif /* LAMBDA_H */
/* Data references and dependences detectors.
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
Contributed by Sebastian Pop <s.pop@laposte.net>
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. */
#ifndef GCC_TREE_DATA_REF_H
#define GCC_TREE_DATA_REF_H
struct data_reference GTY(())
{
/* An identifier. */
unsigned int id;
/* A pointer to the statement that contains this DR. */
tree stmt;
/* A pointer to the ARRAY_REF node. */
tree ref;
/* The name of the array. */
tree base_name;
/* A list of chrecs. */
varray_type access_fns;
/* Auxiliary info specific to a pass. */
int aux;
/* True when the data reference is in RHS of a stmt. */
bool is_read;
};
#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
#define DR_ACCESS_FNS(DR) DR->access_fns
#define DR_ACCESS_FN(DR, I) VARRAY_TREE (DR_ACCESS_FNS (DR), I)
#define DR_NUM_DIMENSIONS(DR) VARRAY_ACTIVE_SIZE (DR_ACCESS_FNS (DR))
#define DR_IS_READ(DR) DR->is_read
enum data_dependence_direction {
dir_positive,
dir_negative,
dir_equal,
dir_positive_or_negative,
dir_positive_or_equal,
dir_negative_or_equal,
dir_star,
dir_independent
};
/* What is a subscript? Given two array accesses a subscript is the
tuple composed of the access functions for a given dimension.
Example: Given A[f1][f2][f3] and B[g1][g2][g3], there are three
subscripts: (f1, g1), (f2, g2), (f3, g3). These three subscripts
are stored in the data_dependence_relation structure under the form
of an array of subscripts. */
struct subscript GTY(())
{
/* A description of the iterations for which the elements are
accessed twice. */
tree conflicting_iterations_in_a;
tree conflicting_iterations_in_b;
/* These fields store the information about the iteration domain
validity of the dependence relation. */
tree last_conflict_in_a;
tree last_conflict_in_b;
/* Distance from the iteration that access a conflicting element in
A to the iteration that access this same conflicting element in
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
#define SUB_CONFLICTS_IN_B(SUB) SUB->conflicting_iterations_in_b
#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_reference *a;
struct data_reference *b;
/* A "yes/no/maybe" field for the dependence relation:
- when "ARE_DEPENDENT == NULL_TREE", there exist a dependence
relation between A and B, and the description of this relation
is given in the SUBSCRIPTS array,
- when "ARE_DEPENDENT == chrec_known", there is no dependence and
SUBSCRIPTS is empty,
- when "ARE_DEPENDENT == chrec_dont_know", there may be a dependence,
but the analyzer cannot be more specific. */
tree are_dependent;
/* For each subscript in the dependence test, there is an element in
this array. This is the attribute that labels the edge A->B of
the data_dependence_relation. */
varray_type subscripts;
};
#define DDR_A(DDR) DDR->a
#define DDR_B(DDR) DDR->b
#define DDR_ARE_DEPENDENT(DDR) DDR->are_dependent
#define DDR_SUBSCRIPTS(DDR) DDR->subscripts
#define DDR_SUBSCRIPTS_VECTOR_INIT(DDR, N) \
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))
struct data_dependence_relation *initialize_data_dependence_relation
(struct data_reference *, struct data_reference *);
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);
extern struct data_reference *analyze_array (tree, tree, bool);
extern void dump_data_reference (FILE *, struct data_reference *);
extern void dump_data_references (FILE *, varray_type);
extern void dump_data_dependence_relation (FILE *,
struct data_dependence_relation *);
extern void dump_data_dependence_relations (FILE *, varray_type);
extern void dump_data_dependence_direction (FILE *,
enum data_dependence_direction);
/* Inline functions. */
/* This is the simplest data dependence test: determines whether the
data references A and B access the same array. */
static inline bool
array_base_name_differ_p (struct data_reference *a,
struct data_reference *b)
{
if (DR_BASE_NAME (a) == DR_BASE_NAME (b))
return false;
if (TREE_CODE (DR_BASE_NAME (a)) == INDIRECT_REF
&& TREE_CODE (DR_BASE_NAME (b)) == INDIRECT_REF
&& TREE_OPERAND (DR_BASE_NAME (a), 0)
== TREE_OPERAND (DR_BASE_NAME (b), 0))
return false;
return true;
}
#endif /* GCC_TREE_DATA_REF_H */
......@@ -5737,5 +5737,66 @@ find_compatible_field (tree record, tree orig_field)
return orig_field;
}
/* Return value of a constant X. */
HOST_WIDE_INT
int_cst_value (tree x)
{
unsigned bits = TYPE_PRECISION (TREE_TYPE (x));
unsigned HOST_WIDE_INT val = TREE_INT_CST_LOW (x);
bool negative = ((val >> (bits - 1)) & 1) != 0;
if (bits > HOST_BITS_PER_WIDE_INT)
abort ();
if (negative)
val |= (~(unsigned HOST_WIDE_INT) 0) << (bits - 1) << 1;
else
val &= ~((~(unsigned HOST_WIDE_INT) 0) << (bits - 1) << 1);
return val;
}
/* Returns the greatest common divisor of A and B, which must be
INTEGER_CSTs. */
tree
tree_fold_gcd (tree a, tree b)
{
tree a_mod_b;
tree type = TREE_TYPE (a);
#if defined ENABLE_CHECKING
if (TREE_CODE (a) != INTEGER_CST
|| TREE_CODE (b) != INTEGER_CST)
abort ();
#endif
if (integer_zerop (a))
return b;
if (integer_zerop (b))
return a;
if (tree_int_cst_sgn (a) == -1)
a = fold (build (MULT_EXPR, type, a,
convert (type, integer_minus_one_node)));
if (tree_int_cst_sgn (b) == -1)
b = fold (build (MULT_EXPR, type, b,
convert (type, integer_minus_one_node)));
while (1)
{
a_mod_b = fold (build (CEIL_MOD_EXPR, type, a, b));
if (!TREE_INT_CST_LOW (a_mod_b)
&& !TREE_INT_CST_HIGH (a_mod_b))
return b;
a = b;
b = a_mod_b;
}
}
#include "gt-tree.h"
......@@ -3480,6 +3480,8 @@ extern void build_common_tree_nodes (int);
extern void build_common_tree_nodes_2 (int);
extern tree build_nonstandard_integer_type (unsigned HOST_WIDE_INT, int);
extern tree build_range_type (tree, tree, tree);
extern HOST_WIDE_INT int_cst_value (tree);
extern tree tree_fold_gcd (tree, tree);
extern bool fields_compatible_p (tree, tree);
extern tree find_compatible_field (tree, tree);
......
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