X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fcselib.h;h=96575f985e085d0d6c0b66f1810a1814c839d2af;hb=b48209d97d1a754d95c68970e95dde86ee7b5b7b;hp=5964a4487ceb6f8acd7c580959bf0c8a4e5abb9b;hpb=a641ee368e2614349084a9a7bda2ec2b0b2bc1cf;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/cselib.h b/gcc/cselib.h index 5964a4487ce..96575f985e0 100644 --- a/gcc/cselib.h +++ b/gcc/cselib.h @@ -1,6 +1,6 @@ /* Common subexpression elimination for GNU compiler. Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, - 1998, 1999, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 + 1998, 1999, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This file is part of GCC. @@ -51,12 +51,6 @@ struct elt_loc_list { rtx setting_insn; }; -/* A list of cselib_val structures. */ -struct elt_list { - struct elt_list *next; - cselib_val *elt; -}; - /* Describe a single set that is part of an insn. */ struct cselib_set { @@ -76,8 +70,10 @@ extern void (*cselib_discard_hook) (cselib_val *); extern void (*cselib_record_sets_hook) (rtx insn, struct cselib_set *sets, int n_sets); -extern cselib_val *cselib_lookup (rtx, enum machine_mode, int); -extern cselib_val *cselib_lookup_from_insn (rtx, enum machine_mode, int, rtx); +extern cselib_val *cselib_lookup (rtx, enum machine_mode, + int, enum machine_mode); +extern cselib_val *cselib_lookup_from_insn (rtx, enum machine_mode, + int, enum machine_mode, rtx); extern void cselib_init (int); extern void cselib_clear_table (void); extern void cselib_finish (void); @@ -91,7 +87,8 @@ extern rtx cselib_expand_value_rtx_cb (rtx, bitmap, int, cselib_expand_callback, void *); extern bool cselib_dummy_expand_value_rtx_cb (rtx, bitmap, int, cselib_expand_callback, void *); -extern rtx cselib_subst_to_values (rtx); +extern rtx cselib_subst_to_values (rtx, enum machine_mode); +extern rtx cselib_subst_to_values_from_insn (rtx, enum machine_mode, rtx); extern void cselib_invalidate_rtx (rtx); extern void cselib_reset_table (unsigned int); @@ -100,5 +97,25 @@ extern void cselib_preserve_value (cselib_val *); extern bool cselib_preserved_value_p (cselib_val *); extern void cselib_preserve_only_values (void); extern void cselib_preserve_cfa_base_value (cselib_val *, unsigned int); +extern void cselib_add_permanent_equiv (cselib_val *, rtx, rtx); +extern bool cselib_have_permanent_equivalences (void); extern void dump_cselib_table (FILE *); + +/* Return the canonical value for VAL, following the equivalence chain + towards the earliest (== lowest uid) equivalent value. */ + +static inline cselib_val * +canonical_cselib_val (cselib_val *val) +{ + cselib_val *canon; + + if (!val->locs || val->locs->next + || !val->locs->loc || GET_CODE (val->locs->loc) != VALUE + || val->uid < CSELIB_VAL_PTR (val->locs->loc)->uid) + return val; + + canon = CSELIB_VAL_PTR (val->locs->loc); + gcc_checking_assert (canonical_cselib_val (canon) == canon); + return canon; +}