On 05/25/11 02:29, Vladimir Makarov wrote: >> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00750.html > Ok. But changelog entry for sched_change_pattern is absent.
I've committed this with a slight change in sched_change_pattern; another patch I'm working on showed a need to also clear the cached cost for resolved dependencies. Bernd
Index: gcc/ChangeLog =================================================================== --- gcc/ChangeLog (revision 176225) +++ gcc/ChangeLog (working copy) @@ -1,3 +1,11 @@ +2011-07-13 Bernd Schmidt <ber...@codesourcery.com> + + * sched-int.h (struct _dep): Add member cost. + (DEP_COST, UNKNOWN_DEP_COST): New macros. + * sched-deps.c (init_dep_1): Initialize DEP_COST. + * haifa-sched.c (dep_cost_1): Use and set DEP_COST. + (sched_change_pattern): Reset it for dependent insns. + 2011-07-13 Rainer Orth <r...@cebitec.uni-bielefeld.de> * Makefile.in (CRT0STUFF_T_CFLAGS): Remove. Index: gcc/haifa-sched.c =================================================================== --- gcc/haifa-sched.c (revision 176171) +++ gcc/haifa-sched.c (working copy) @@ -854,6 +854,9 @@ dep_cost_1 (dep_t link, dw_t dw) rtx used = DEP_CON (link); int cost; + if (DEP_COST (link) != UNKNOWN_DEP_COST) + return DEP_COST (link); + /* A USE insn should never require the value used to be computed. This allows the computation of a function's result and parameter values to overlap the return and call. We don't care about the @@ -911,6 +914,7 @@ dep_cost_1 (dep_t link, dw_t dw) cost = 0; } + DEP_COST (link) = cost; return cost; } @@ -4864,11 +4868,21 @@ fix_recovery_deps (basic_block rec) void sched_change_pattern (rtx insn, rtx new_pat) { + sd_iterator_def sd_it; + dep_t dep; int t; t = validate_change (insn, &PATTERN (insn), new_pat, 0); gcc_assert (t); dfa_clear_single_insn_cache (insn); + + for (sd_it = sd_iterator_start (insn, (SD_LIST_FORW | SD_LIST_BACK + | SD_LIST_RES_BACK)); + sd_iterator_cond (&sd_it, &dep);) + { + DEP_COST (dep) = UNKNOWN_DEP_COST; + sd_iterator_next (&sd_it); + } } /* Change pattern of INSN to NEW_PAT. Invalidate cached haifa Index: gcc/sched-deps.c =================================================================== --- gcc/sched-deps.c (revision 176171) +++ gcc/sched-deps.c (working copy) @@ -107,6 +107,7 @@ init_dep_1 (dep_t dep, rtx pro, rtx con, DEP_CON (dep) = con; DEP_TYPE (dep) = type; DEP_STATUS (dep) = ds; + DEP_COST (dep) = UNKNOWN_DEP_COST; } /* Init DEP with the arguments. Index: gcc/sched-int.h =================================================================== --- gcc/sched-int.h (revision 176171) +++ gcc/sched-int.h (working copy) @@ -215,6 +215,9 @@ struct _dep /* Dependency status. This field holds all dependency types and additional information for speculative dependencies. */ ds_t status; + + /* Cached cost of the dependency. */ + int cost; }; typedef struct _dep dep_def; @@ -224,6 +227,9 @@ typedef dep_def *dep_t; #define DEP_CON(D) ((D)->con) #define DEP_TYPE(D) ((D)->type) #define DEP_STATUS(D) ((D)->status) +#define DEP_COST(D) ((D)->cost) + +#define UNKNOWN_DEP_COST INT_MIN /* Functions to work with dep. */