Commit 96ddf8ef by Vladimir Makarov Committed by Vladimir Makarov

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
parent b08ee07e
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
......
......@@ -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_))
......
......@@ -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
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment