Makefile.in (OBJS-common): Add tree-chrec.o.
* Makefile.in (OBJS-common): Add tree-chrec.o. (tree-chrec.o): New rule. (GTFILES): Add tree-chrec.h. * gengtype.c (open_base_files): Add tree-chrec.h. * tree-chrec.c: New file. * tree-chrec.h: New file. * tree.def (SCEV_KNOWN, SCEV_NOT_KNOWN, POLYNOMIAL_CHREC): New nodes. From-SVN: r83909
This commit is contained in:
parent
64b8935d48
commit
c8a2ab6d0c
@ -1,3 +1,13 @@
|
||||
2004-06-30 Sebastian Pop <pop@cri.ensmp.fr>
|
||||
|
||||
* Makefile.in (OBJS-common): Add tree-chrec.o.
|
||||
(tree-chrec.o): New rule.
|
||||
(GTFILES): Add tree-chrec.h.
|
||||
* gengtype.c (open_base_files): Add tree-chrec.h.
|
||||
* tree-chrec.c: New file.
|
||||
* tree-chrec.h: New file.
|
||||
* tree.def (SCEV_KNOWN, SCEV_NOT_KNOWN, POLYNOMIAL_CHREC): New nodes.
|
||||
|
||||
2004-06-30 Roger Sayle <roger@eyesopen.com>
|
||||
|
||||
* combine.c: Include "output.h" to define dump_file.
|
||||
|
@ -885,6 +885,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-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 \
|
||||
@ -1699,6 +1700,8 @@ gimple-low.o : gimple-low.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) errors.h \
|
||||
tree-browser.o : tree-browser.c tree-browser.def $(CONFIG_H) $(SYSTEM_H) \
|
||||
$(TREE_H) errors.h tree-inline.h diagnostic.h $(HASHTAB_H) \
|
||||
$(TM_H) coretypes.h
|
||||
tree-chrec.o: tree-chrec.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
|
||||
errors.h $(GGC_H) $(TREE_H) tree-chrec.h tree-pass.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 \
|
||||
@ -2339,6 +2342,7 @@ GTFILES = $(srcdir)/input.h $(srcdir)/coretypes.h \
|
||||
$(srcdir)/tree-iterator.c $(srcdir)/gimplify.c \
|
||||
$(srcdir)/tree-alias-type.h $(srcdir)/tree-alias-common.h \
|
||||
$(srcdir)/tree-alias-type.c $(srcdir)/tree-alias-common.c \
|
||||
$(srcdir)/tree-chrec.h \
|
||||
$(srcdir)/tree-ssa-operands.h $(srcdir)/tree-ssa-operands.c \
|
||||
$(srcdir)/tree-profile.c $(srcdir)/rtl-profile.c $(srcdir)/tree-nested.c \
|
||||
$(out_file) \
|
||||
|
@ -1110,6 +1110,7 @@ open_base_files (void)
|
||||
"libfuncs.h", "debug.h", "ggc.h", "cgraph.h",
|
||||
"tree-alias-type.h", "tree-flow.h", "reload.h",
|
||||
"cpp-id-data.h",
|
||||
"tree-chrec.h",
|
||||
NULL
|
||||
};
|
||||
const char *const *ifp;
|
||||
|
1019
gcc/tree-chrec.c
Normal file
1019
gcc/tree-chrec.c
Normal file
File diff suppressed because it is too large
Load Diff
206
gcc/tree-chrec.h
Normal file
206
gcc/tree-chrec.h
Normal file
@ -0,0 +1,206 @@
|
||||
/* Chains of recurrences.
|
||||
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_CHREC_H
|
||||
#define GCC_TREE_CHREC_H
|
||||
|
||||
/* Accessors for the chains of recurrences. */
|
||||
#define CHREC_VAR(NODE) TREE_OPERAND (NODE, 0)
|
||||
#define CHREC_LEFT(NODE) TREE_OPERAND (NODE, 1)
|
||||
#define CHREC_RIGHT(NODE) TREE_OPERAND (NODE, 2)
|
||||
#define CHREC_VARIABLE(NODE) TREE_INT_CST_LOW (CHREC_VAR (NODE))
|
||||
|
||||
|
||||
|
||||
/* The following trees are unique elements. Thus the comparison of another
|
||||
element to these elements should be done on the pointer to these trees,
|
||||
and not on their value. */
|
||||
|
||||
extern tree chrec_not_analyzed_yet;
|
||||
extern GTY(()) tree chrec_dont_know;
|
||||
extern GTY(()) tree chrec_known;
|
||||
|
||||
/* After having added an automatically generated element, please
|
||||
include it in the following function. */
|
||||
|
||||
static inline bool
|
||||
automatically_generated_chrec_p (tree chrec)
|
||||
{
|
||||
return (chrec == chrec_not_analyzed_yet
|
||||
|| chrec == chrec_dont_know
|
||||
|| chrec == chrec_known);
|
||||
}
|
||||
|
||||
/* The tree nodes aka. CHRECs. */
|
||||
|
||||
static inline bool
|
||||
tree_is_chrec (tree expr)
|
||||
{
|
||||
if (TREE_CODE (expr) == POLYNOMIAL_CHREC
|
||||
|| automatically_generated_chrec_p (expr))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Chrec folding functions. */
|
||||
extern tree chrec_fold_plus (tree, tree, tree);
|
||||
extern tree chrec_fold_minus (tree, tree, tree);
|
||||
extern tree chrec_fold_multiply (tree, tree, tree);
|
||||
extern tree chrec_convert (tree, tree);
|
||||
extern tree count_ev_in_wider_type (tree, tree);
|
||||
extern tree chrec_type (tree);
|
||||
|
||||
/* Operations. */
|
||||
extern tree chrec_apply (unsigned, tree, tree);
|
||||
extern tree chrec_replace_initial_condition (tree, tree);
|
||||
extern tree update_initial_condition_to_origin (tree);
|
||||
extern tree initial_condition (tree);
|
||||
extern tree evolution_part_in_loop_num (tree, unsigned);
|
||||
extern tree hide_evolution_in_other_loops_than_loop (tree, unsigned);
|
||||
extern tree reset_evolution_in_loop (unsigned, tree, tree);
|
||||
extern tree chrec_merge (tree, tree);
|
||||
|
||||
/* Observers. */
|
||||
extern bool is_multivariate_chrec (tree);
|
||||
extern bool chrec_is_positive (tree, bool *);
|
||||
extern bool chrec_contains_symbols (tree);
|
||||
extern bool chrec_contains_symbols_defined_in_loop (tree, unsigned);
|
||||
extern bool chrec_contains_undetermined (tree);
|
||||
extern bool tree_contains_chrecs (tree);
|
||||
extern bool evolution_function_is_affine_multivariate_p (tree);
|
||||
extern bool evolution_function_is_univariate_p (tree);
|
||||
|
||||
|
||||
|
||||
/* Build a polynomial chain of recurrence. */
|
||||
|
||||
static inline tree
|
||||
build_polynomial_chrec (unsigned loop_num,
|
||||
tree left,
|
||||
tree right)
|
||||
{
|
||||
if (left == chrec_dont_know
|
||||
|| right == chrec_dont_know)
|
||||
return chrec_dont_know;
|
||||
|
||||
return build (POLYNOMIAL_CHREC, TREE_TYPE (left),
|
||||
build_int_2 (loop_num, 0), left, right);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Observers. */
|
||||
|
||||
/* Determines whether CHREC is equal to zero. */
|
||||
|
||||
static inline bool
|
||||
chrec_zerop (tree chrec)
|
||||
{
|
||||
if (chrec == NULL_TREE)
|
||||
return false;
|
||||
|
||||
if (TREE_CODE (chrec) == INTEGER_CST)
|
||||
return integer_zerop (chrec);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Determines whether the expression CHREC is a constant. */
|
||||
|
||||
static inline bool
|
||||
evolution_function_is_constant_p (tree chrec)
|
||||
{
|
||||
if (chrec == NULL_TREE)
|
||||
return false;
|
||||
|
||||
switch (TREE_CODE (chrec))
|
||||
{
|
||||
case INTEGER_CST:
|
||||
case REAL_CST:
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/* Determine whether the given tree is an affine evolution function or not. */
|
||||
|
||||
static inline bool
|
||||
evolution_function_is_affine_p (tree chrec)
|
||||
{
|
||||
if (chrec == NULL_TREE)
|
||||
return false;
|
||||
|
||||
switch (TREE_CODE (chrec))
|
||||
{
|
||||
case POLYNOMIAL_CHREC:
|
||||
if (evolution_function_is_constant_p (CHREC_LEFT (chrec))
|
||||
&& evolution_function_is_constant_p (CHREC_RIGHT (chrec)))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/* Determine whether the given tree is an affine or constant evolution
|
||||
function. */
|
||||
|
||||
static inline bool
|
||||
evolution_function_is_affine_or_constant_p (tree chrec)
|
||||
{
|
||||
return evolution_function_is_affine_p (chrec)
|
||||
|| evolution_function_is_constant_p (chrec);
|
||||
}
|
||||
|
||||
/* Determines whether EXPR does not contains chrec expressions. */
|
||||
|
||||
static inline bool
|
||||
tree_does_not_contain_chrecs (tree expr)
|
||||
{
|
||||
return !tree_contains_chrecs (expr);
|
||||
}
|
||||
|
||||
/* Determines whether CHREC is a loop invariant with respect to LOOP_NUM.
|
||||
Set the result in RES and return true when the property can be computed. */
|
||||
|
||||
static inline bool
|
||||
no_evolution_in_loop_p (tree chrec, unsigned loop_num, bool *res)
|
||||
{
|
||||
tree scev;
|
||||
|
||||
if (chrec == chrec_not_analyzed_yet
|
||||
|| chrec == chrec_dont_know
|
||||
|| chrec_contains_symbols_defined_in_loop (chrec, loop_num))
|
||||
return false;
|
||||
|
||||
scev = hide_evolution_in_other_loops_than_loop (chrec, loop_num);
|
||||
*res = !tree_is_chrec (scev);
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif /* GCC_TREE_CHREC_H */
|
12
gcc/tree.def
12
gcc/tree.def
@ -898,6 +898,18 @@ DEFTREECODE (CATCH_EXPR, "catch_expr", 's', 2)
|
||||
expanding. */
|
||||
DEFTREECODE (EH_FILTER_EXPR, "eh_filter_expr", 's', 2)
|
||||
|
||||
/* Node used for describing a property that is known at compile
|
||||
time. */
|
||||
DEFTREECODE (SCEV_KNOWN, "scev_known", 'e', 0)
|
||||
|
||||
/* Node used for describing a property that is not known at compile
|
||||
time. */
|
||||
DEFTREECODE (SCEV_NOT_KNOWN, "scev_not_known", 'e', 0)
|
||||
|
||||
/* Polynomial chains of recurrences.
|
||||
Under the form: cr = {CHREC_LEFT (cr), +, CHREC_RIGHT (cr)}. */
|
||||
DEFTREECODE (POLYNOMIAL_CHREC, "polynomial_chrec", 'e', 3)
|
||||
|
||||
/* Used to chain children of container statements together.
|
||||
Use the interface in tree-iterator.h to access this node. */
|
||||
DEFTREECODE (STATEMENT_LIST, "statement_list", 'x', 0)
|
||||
|
Loading…
Reference in New Issue
Block a user