From 17d386e4a66078b713967828c9c265c47317f440 Mon Sep 17 00:00:00 2001 From: vmakarov Date: Thu, 31 Mar 2005 23:26:33 +0000 Subject: [PATCH] 2005-03-31 Vladimir Makarov PR target/20632 * genautomata.c (first_cycle_unit_presence): Check all alternative states for unit presence. * doc/md.texi: Remove remark about impossibility to query unit presence in non nondeterministic automaton state. * config/ia64/ia64.c (get_template): Change order of unit querying. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@97351 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 11 +++++++++ gcc/config/ia64/ia64.c | 60 +++++++++++++++++++++++++++----------------------- gcc/doc/md.texi | 4 +--- gcc/genautomata.c | 16 +++++++++----- 4 files changed, 55 insertions(+), 36 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8d53eb8d64f..9b9ff0d25ce 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2005-03-31 Vladimir Makarov + + PR target/20632 + * genautomata.c (first_cycle_unit_presence): Check all alternative + states for unit presence. + + * doc/md.texi: Remove remark about impossibility to query unit + presence in non nondeterministic automaton state. + + * config/ia64/ia64.c (get_template): Change order of unit querying. + 2005-03-31 Kazu Hirata * tree-ssa-dom.c (cprop_into_successor_phis): Remove an diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index 3d15f403632..fef37298364 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -6481,7 +6481,13 @@ get_max_pos (state_t state) /* The function returns code of a possible template for given position and state. The function should be called only with 2 values of - position equal to 3 or 6. */ + position equal to 3 or 6. We avoid generating F NOPs by putting + templates containing F insns at the end of the template search + because undocumented anomaly in McKinley derived cores which can + cause stalls if an F-unit insn (including a NOP) is issued within a + six-cycle window after reading certain application registers (such + as ar.bsp). Furthermore, power-considerations also argue against + the use of F-unit instructions unless they're really needed. */ static int get_template (state_t state, int pos) @@ -6489,22 +6495,22 @@ get_template (state_t state, int pos) switch (pos) { case 3: - if (cpu_unit_reservation_p (state, _0mii_)) - return 0; - else if (cpu_unit_reservation_p (state, _0mmi_)) + if (cpu_unit_reservation_p (state, _0mmi_)) return 1; - else if (cpu_unit_reservation_p (state, _0mfi_)) - return 2; - else if (cpu_unit_reservation_p (state, _0mmf_)) - return 3; - else if (cpu_unit_reservation_p (state, _0bbb_)) - return 4; - else if (cpu_unit_reservation_p (state, _0mbb_)) - return 5; - else if (cpu_unit_reservation_p (state, _0mib_)) - return 6; + else if (cpu_unit_reservation_p (state, _0mii_)) + return 0; else if (cpu_unit_reservation_p (state, _0mmb_)) return 7; + else if (cpu_unit_reservation_p (state, _0mib_)) + return 6; + else if (cpu_unit_reservation_p (state, _0mbb_)) + return 5; + else if (cpu_unit_reservation_p (state, _0bbb_)) + return 4; + else if (cpu_unit_reservation_p (state, _0mmf_)) + return 3; + else if (cpu_unit_reservation_p (state, _0mfi_)) + return 2; else if (cpu_unit_reservation_p (state, _0mfb_)) return 8; else if (cpu_unit_reservation_p (state, _0mlx_)) @@ -6512,22 +6518,22 @@ get_template (state_t state, int pos) else abort (); case 6: - if (cpu_unit_reservation_p (state, _1mii_)) - return 0; - else if (cpu_unit_reservation_p (state, _1mmi_)) + if (cpu_unit_reservation_p (state, _1mmi_)) return 1; - else if (cpu_unit_reservation_p (state, _1mfi_)) - return 2; - else if (_1mmf_ >= 0 && cpu_unit_reservation_p (state, _1mmf_)) - return 3; - else if (cpu_unit_reservation_p (state, _1bbb_)) - return 4; - else if (cpu_unit_reservation_p (state, _1mbb_)) - return 5; - else if (cpu_unit_reservation_p (state, _1mib_)) - return 6; + else if (cpu_unit_reservation_p (state, _1mii_)) + return 0; else if (cpu_unit_reservation_p (state, _1mmb_)) return 7; + else if (cpu_unit_reservation_p (state, _1mib_)) + return 6; + else if (cpu_unit_reservation_p (state, _1mbb_)) + return 5; + else if (cpu_unit_reservation_p (state, _1bbb_)) + return 4; + else if (_1mmf_ >= 0 && cpu_unit_reservation_p (state, _1mmf_)) + return 3; + else if (cpu_unit_reservation_p (state, _1mfi_)) + return 2; else if (cpu_unit_reservation_p (state, _1mfb_)) return 8; else if (cpu_unit_reservation_p (state, _1mlx_)) diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi index d3312f75bc5..608b0a8f0a6 100644 --- a/gcc/doc/md.texi +++ b/gcc/doc/md.texi @@ -6232,9 +6232,7 @@ the treatment of operator @samp{|} in the regular expressions. The usual treatment of the operator is to try the first alternative and, if the reservation is not possible, the second alternative. The nondeterministic treatment means trying all alternatives, some of them -may be rejected by reservations in the subsequent insns. You can not -query functional unit reservations in nondeterministic automaton -states. +may be rejected by reservations in the subsequent insns. @item @dfn{progress} means output of a progress bar showing how many states diff --git a/gcc/genautomata.c b/gcc/genautomata.c index e54cbbdaece..ac1f69cb285 100644 --- a/gcc/genautomata.c +++ b/gcc/genautomata.c @@ -6120,15 +6120,19 @@ copy_equiv_class (vla_ptr_t *to, const vla_ptr_t *from) static int first_cycle_unit_presence (state_t state, int unit_num) { - int presence_p; + alt_state_t alt_state; if (state->component_states == NULL) - presence_p = test_unit_reserv (state->reservs, 0, unit_num); + return test_unit_reserv (state->reservs, 0, unit_num); else - presence_p - = test_unit_reserv (state->component_states->state->reservs, - 0, unit_num); - return presence_p; + { + for (alt_state = state->component_states; + alt_state != NULL; + alt_state = alt_state->next_sorted_alt_state) + if (test_unit_reserv (alt_state->state->reservs, 0, unit_num)) + return true; + } + return false; } /* The function returns nonzero value if STATE is not equivalent to -- 2.11.4.GIT