This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Patch for PR target/20632
- From: Vladimir Makarov <vmakarov at redhat dot com>
- To: James E Wilson <wilson at tuliptree dot org>
- Cc: David Mosberger <davidm at hpl dot hp dot com>, gcc-patches at gcc dot gnu dot org
- Date: Thu, 31 Mar 2005 18:30:38 -0500
- Subject: Re: Patch for PR target/20632
- References: <200503251745.j2PHjhD6029735@napali.hpl.hp.com> <424C3270.3060308@redhat.com> <1112299953.3679.3.camel@aretha.corp.specifixinc.com>
James E Wilson wrote:
You should add a comment to get_template explaining why we check
templates in that specific order, i.e. to prefer M/I nops over B nops
over F nops. It would also be helpful to note here that F nops can
cause stalls in Itanium2.
Ok with that change.
This is the final version patch has been committed into the mainline.
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.
Index: genautomata.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/genautomata.c,v
retrieving revision 1.61
diff -c -d -p -r1.61 genautomata.c
*** genautomata.c 21 Feb 2005 14:39:49 -0000 1.61
--- genautomata.c 31 Mar 2005 23:25:16 -0000
*************** copy_equiv_class (vla_ptr_t *to, const v
*** 6120,6134 ****
static int
first_cycle_unit_presence (state_t state, int unit_num)
{
! int presence_p;
if (state->component_states == NULL)
! presence_p = 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;
}
/* The function returns nonzero value if STATE is not equivalent to
--- 6120,6138 ----
static int
first_cycle_unit_presence (state_t state, int unit_num)
{
! alt_state_t alt_state;
if (state->component_states == NULL)
! return test_unit_reserv (state->reservs, 0, unit_num);
else
! {
! 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
Index: doc/md.texi
===================================================================
RCS file: /cvs/gcc/gcc/gcc/doc/md.texi,v
retrieving revision 1.126
diff -c -d -p -r1.126 md.texi
*** doc/md.texi 5 Mar 2005 19:56:29 -0000 1.126
--- doc/md.texi 31 Mar 2005 23:25:16 -0000
*************** the treatment of operator @samp{|} in th
*** 6232,6240 ****
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.
@item
@dfn{progress} means output of a progress bar showing how many states
--- 6232,6238 ----
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.
@item
@dfn{progress} means output of a progress bar showing how many states
Index: config/ia64/ia64.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/ia64/ia64.c,v
retrieving revision 1.352
diff -c -d -p -r1.352 ia64.c
*** config/ia64/ia64.c 30 Mar 2005 21:34:41 -0000 1.352
--- config/ia64/ia64.c 31 Mar 2005 23:25:16 -0000
*************** get_max_pos (state_t state)
*** 6481,6487 ****
/* 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. */
static int
get_template (state_t state, int pos)
--- 6481,6493 ----
/* 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. 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)
*************** get_template (state_t state, int pos)
*** 6489,6510 ****
switch (pos)
{
case 3:
! if (cpu_unit_reservation_p (state, _0mii_))
! return 0;
! else 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, _0mmb_))
return 7;
else if (cpu_unit_reservation_p (state, _0mfb_))
return 8;
else if (cpu_unit_reservation_p (state, _0mlx_))
--- 6495,6516 ----
switch (pos)
{
case 3:
! if (cpu_unit_reservation_p (state, _0mmi_))
return 1;
! 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_))
*************** get_template (state_t state, int pos)
*** 6512,6533 ****
else
abort ();
case 6:
! if (cpu_unit_reservation_p (state, _1mii_))
! return 0;
! else 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, _1mmb_))
return 7;
else if (cpu_unit_reservation_p (state, _1mfb_))
return 8;
else if (cpu_unit_reservation_p (state, _1mlx_))
--- 6518,6539 ----
else
abort ();
case 6:
! if (cpu_unit_reservation_p (state, _1mmi_))
return 1;
! 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_))