diff options
author | Sergey Grechanik <mouseentity@ispras.ru> | 2011-08-11 11:53:51 +0000 |
---|---|---|
committer | Alexander Monakov <amonakov@gcc.gnu.org> | 2011-08-11 15:53:51 +0400 |
commit | f0898307231190ca62014affb960f8f1f2fced59 (patch) | |
tree | 5353ca6b284d07d91d9df7b8a04a2242b23de59e /gcc | |
parent | 0d9439b07cce79ee8e822481f75331dc70399826 (diff) | |
download | gcc-f0898307231190ca62014affb960f8f1f2fced59.zip gcc-f0898307231190ca62014affb960f8f1f2fced59.tar.gz gcc-f0898307231190ca62014affb960f8f1f2fced59.tar.bz2 |
sched-deps.c (sched_get_condition_with_rev): Rename to ...
2011-08-11 Sergey Grechanik <mouseentity@ispras.ru>
Alexander Monakov <amonakov@ispras.ru>
* sched-deps.c (sched_get_condition_with_rev): Rename to ...
(sched_get_condition_with_rev_uncached): ... this. Factor out
condition caching logic into ...
(sched_get_condition_with_rev): ... this. Reimplement. Do not
attempt to use cache for instructions with zero luid.
(sched_analyze_insn): Use INSN_CACHED_COND instead of INSN_COND.
* sched-int.h (INSN_COND): Rename to INSN_CACHED_COND.
Co-Authored-By: Alexander Monakov <amonakov@ispras.ru>
From-SVN: r177657
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/sched-deps.c | 71 | ||||
-rw-r--r-- | gcc/sched-int.h | 2 |
3 files changed, 54 insertions, 30 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 50c9378..0ea71d9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,15 @@ 2011-08-11 Sergey Grechanik <mouseentity@ispras.ru> + Alexander Monakov <amonakov@ispras.ru> + + * sched-deps.c (sched_get_condition_with_rev): Rename to ... + (sched_get_condition_with_rev_uncached): ... this. Factor out + condition caching logic into ... + (sched_get_condition_with_rev): ... this. Reimplement. Do not + attempt to use cache for instructions with zero luid. + (sched_analyze_insn): Use INSN_CACHED_COND instead of INSN_COND. + * sched-int.h (INSN_COND): Rename to INSN_CACHED_COND. + +2011-08-11 Sergey Grechanik <mouseentity@ispras.ru> * sel-sched-ir.c (get_seqno_of_a_pred): Rename to get_seqno_for_a_jump. Update the caller. diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c index ba4f1bb..2961cca 100644 --- a/gcc/sched-deps.c +++ b/gcc/sched-deps.c @@ -499,27 +499,13 @@ deps_may_trap_p (const_rtx mem) /* Find the condition under which INSN is executed. If REV is not NULL, it is set to TRUE when the returned comparison should be reversed - to get the actual condition. - We only do actual work the first time we come here for an insn; the - results are cached in INSN_COND and INSN_REVERSE_COND. */ + to get the actual condition. */ static rtx -sched_get_condition_with_rev (const_rtx insn, bool *rev) +sched_get_condition_with_rev_uncached (const_rtx insn, bool *rev) { rtx pat = PATTERN (insn); rtx src; - if (INSN_COND (insn) == const_true_rtx) - return NULL_RTX; - - if (INSN_COND (insn) != NULL_RTX) - { - if (rev) - *rev = INSN_REVERSE_COND (insn); - return INSN_COND (insn); - } - - INSN_COND (insn) = const_true_rtx; - INSN_REVERSE_COND (insn) = false; if (pat == 0) return 0; @@ -527,10 +513,7 @@ sched_get_condition_with_rev (const_rtx insn, bool *rev) *rev = false; if (GET_CODE (pat) == COND_EXEC) - { - INSN_COND (insn) = COND_EXEC_TEST (pat); - return COND_EXEC_TEST (pat); - } + return COND_EXEC_TEST (pat); if (!any_condjump_p (insn) || !onlyjump_p (insn)) return 0; @@ -538,10 +521,7 @@ sched_get_condition_with_rev (const_rtx insn, bool *rev) src = SET_SRC (pc_set (insn)); if (XEXP (src, 2) == pc_rtx) - { - INSN_COND (insn) = XEXP (src, 0); - return XEXP (src, 0); - } + return XEXP (src, 0); else if (XEXP (src, 1) == pc_rtx) { rtx cond = XEXP (src, 0); @@ -552,14 +532,47 @@ sched_get_condition_with_rev (const_rtx insn, bool *rev) if (rev) *rev = true; - INSN_COND (insn) = cond; - INSN_REVERSE_COND (insn) = true; return cond; } return 0; } +/* Caching variant of sched_get_condition_with_rev_uncached. + We only do actual work the first time we come here for an insn; the + results are cached in INSN_CACHED_COND and INSN_REVERSE_COND. */ +static rtx +sched_get_condition_with_rev (const_rtx insn, bool *rev) +{ + bool tmp; + + if (INSN_LUID (insn) == 0) + return sched_get_condition_with_rev_uncached (insn, rev); + + if (INSN_CACHED_COND (insn) == const_true_rtx) + return NULL_RTX; + + if (INSN_CACHED_COND (insn) != NULL_RTX) + { + if (rev) + *rev = INSN_REVERSE_COND (insn); + return INSN_CACHED_COND (insn); + } + + INSN_CACHED_COND (insn) = sched_get_condition_with_rev_uncached (insn, &tmp); + INSN_REVERSE_COND (insn) = tmp; + + if (INSN_CACHED_COND (insn) == NULL_RTX) + { + INSN_CACHED_COND (insn) = const_true_rtx; + return NULL_RTX; + } + + if (rev) + *rev = INSN_REVERSE_COND (insn); + return INSN_CACHED_COND (insn); +} + /* True when we can find a condition under which INSN is executed. */ static bool sched_has_condition_p (const_rtx insn) @@ -2910,9 +2923,9 @@ sched_analyze_insn (struct deps_desc *deps, rtx x, rtx insn) for (list = reg_last->uses; list; list = XEXP (list, 1)) { rtx other = XEXP (list, 0); - if (INSN_COND (other) != const_true_rtx - && refers_to_regno_p (i, i + 1, INSN_COND (other), NULL)) - INSN_COND (other) = const_true_rtx; + if (INSN_CACHED_COND (other) != const_true_rtx + && refers_to_regno_p (i, i + 1, INSN_CACHED_COND (other), NULL)) + INSN_CACHED_COND (other) = const_true_rtx; } } } diff --git a/gcc/sched-int.h b/gcc/sched-int.h index 2eee49d..1e5c71e 100644 --- a/gcc/sched-int.h +++ b/gcc/sched-int.h @@ -875,7 +875,7 @@ extern VEC(haifa_deps_insn_data_def, heap) *h_d_i_d; #define INSN_RESOLVED_FORW_DEPS(INSN) (HDID (INSN)->resolved_forw_deps) #define INSN_HARD_BACK_DEPS(INSN) (HDID (INSN)->hard_back_deps) #define INSN_SPEC_BACK_DEPS(INSN) (HDID (INSN)->spec_back_deps) -#define INSN_COND(INSN) (HDID (INSN)->cond) +#define INSN_CACHED_COND(INSN) (HDID (INSN)->cond) #define INSN_REVERSE_COND(INSN) (HDID (INSN)->reverse_cond) #define CANT_MOVE(INSN) (HDID (INSN)->cant_move) #define CANT_MOVE_BY_LUID(LUID) (VEC_index (haifa_deps_insn_data_def, h_d_i_d, \ |