diff options
author | Vladimir Makarov <vmakarov@redhat.com> | 2005-03-31 23:26:33 +0000 |
---|---|---|
committer | Vladimir Makarov <vmakarov@gcc.gnu.org> | 2005-03-31 23:26:33 +0000 |
commit | 96ddf8ef2326b2da28955873ff0b5ab921f481c0 (patch) | |
tree | 15ba83c430e72fa4e12a0498791b5840382d54ee /gcc | |
parent | b08ee07eb26a89c19c5c245fbc04f3935f271363 (diff) | |
download | gcc-96ddf8ef2326b2da28955873ff0b5ab921f481c0.zip gcc-96ddf8ef2326b2da28955873ff0b5ab921f481c0.tar.gz gcc-96ddf8ef2326b2da28955873ff0b5ab921f481c0.tar.bz2 |
re PR target/20632 (GCC should avoid generating F- and B-unit NOPs)
2005-03-31 Vladimir Makarov <vmakarov@redhat.com>
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.
From-SVN: r97351
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.c | 60 | ||||
-rw-r--r-- | gcc/doc/md.texi | 4 | ||||
-rw-r--r-- | gcc/genautomata.c | 16 |
4 files changed, 55 insertions, 36 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8d53eb8..9b9ff0d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2005-03-31 Vladimir Makarov <vmakarov@redhat.com> + + 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 <kazu@cs.umass.edu> * 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 3d15f40..fef3729 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 d3312f7..608b0a8 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 e54cbbd..ac1f69c 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 |