This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Patch for PR target/20632


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_))

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]