Fwd: Questions on PA machine description?

Richard Henderson rth@cygnus.com
Thu Mar 25 15:10:00 GMT 1999


On Thu, Mar 25, 1999 at 01:56:39PM -0800, Richard Henderson wrote:
> The following change seems to do the right thing for Alpha EV5
> wrt compare+cmove.

The previous patch wouldn't bootstrap the compiler.  I goofed on
stepping through the ready list insns.


r~



Index: haifa-sched.c
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/haifa-sched.c,v
retrieving revision 1.85
diff -c -p -d -r1.85 haifa-sched.c
*** haifa-sched.c	1999/03/13 17:38:17	1.85
--- haifa-sched.c	1999/03/25 23:08:02
*************** insn_cost (insn, link, used)
*** 3146,3160 ****
       and LINK_COST_ZERO.  */
  
    if (LINK_COST_FREE (link))
!     cost = 1;
  #ifdef ADJUST_COST
    else if (!LINK_COST_ZERO (link))
      {
        int ncost = cost;
  
        ADJUST_COST (used, link, insn, ncost);
!       if (ncost <= 1)
! 	LINK_COST_FREE (link) = ncost = 1;
        if (cost == ncost)
  	LINK_COST_ZERO (link) = 1;
        cost = ncost;
--- 3146,3163 ----
       and LINK_COST_ZERO.  */
  
    if (LINK_COST_FREE (link))
!     cost = 0;
  #ifdef ADJUST_COST
    else if (!LINK_COST_ZERO (link))
      {
        int ncost = cost;
  
        ADJUST_COST (used, link, insn, ncost);
!       if (ncost < 1)
! 	{
! 	  LINK_COST_FREE (link) = 1;
! 	  ncost = 0;
! 	}
        if (cost == ncost)
  	LINK_COST_ZERO (link) = 1;
        cost = ncost;
*************** schedule_insn (insn, ready, n_ready, clo
*** 4444,4450 ****
  	      if (current_nr_blocks > 1 && INSN_BB (next) != target_bb)
  		fprintf (dump, "/b%d ", INSN_BLOCK (next));
  
! 	      if (effective_cost <= 1)
  		fprintf (dump, "into ready\n");
  	      else
  		fprintf (dump, "into queue with cost=%d\n", effective_cost);
--- 4447,4453 ----
  	      if (current_nr_blocks > 1 && INSN_BB (next) != target_bb)
  		fprintf (dump, "/b%d ", INSN_BLOCK (next));
  
! 	      if (effective_cost < 1)
  		fprintf (dump, "into ready\n");
  	      else
  		fprintf (dump, "into queue with cost=%d\n", effective_cost);
*************** schedule_insn (insn, ready, n_ready, clo
*** 4453,4459 ****
  	  /* Adjust the priority of NEXT and either put it on the ready
  	     list or queue it.  */
  	  adjust_priority (next);
! 	  if (effective_cost <= 1)
  	    ready[n_ready++] = next;
  	  else
  	    queue_insn (next, effective_cost);
--- 4456,4462 ----
  	  /* Adjust the priority of NEXT and either put it on the ready
  	     list or queue it.  */
  	  adjust_priority (next);
! 	  if (effective_cost < 1)
  	    ready[n_ready++] = next;
  	  else
  	    queue_insn (next, effective_cost);
*************** schedule_block (bb, rgn_n_insns)
*** 6921,6941 ****
  	  debug_ready_list (ready, n_ready);
  	}
  
!       /* Issue insns from ready list.
!          It is important to count down from n_ready, because n_ready may change
!          as insns are issued.  */
        can_issue_more = issue_rate;
!       for (i = n_ready - 1; i >= 0 && can_issue_more; i--)
  	{
! 	  rtx insn = ready[i];
  	  int cost = actual_hazard (insn_unit (insn), insn, clock_var, 0);
  
! 	  if (cost > 1)
! 	    {
! 	      queue_insn (insn, cost);
! 	      ready[i] = ready[--n_ready];	/* remove insn from ready list */
! 	    }
! 	  else if (cost == 0)
  	    {
  	      /* an interblock motion? */
  	      if (INSN_BB (insn) != target_bb)
--- 6924,6940 ----
  	  debug_ready_list (ready, n_ready);
  	}
  
!       /* Issue insns from ready list.  */
        can_issue_more = issue_rate;
!       while (n_ready != 0 && can_issue_more)
  	{
! 	  /* Select and remove the insn from the ready list.  */
! 	  rtx insn = ready[--n_ready];
  	  int cost = actual_hazard (insn_unit (insn), insn, clock_var, 0);
  
! 	  if (cost >= 1)
! 	    queue_insn (insn, cost);
! 	  else
  	    {
  	      /* an interblock motion? */
  	      if (INSN_BB (insn) != target_bb)
*************** schedule_block (bb, rgn_n_insns)
*** 7010,7018 ****
  #endif
  
  	      n_ready = schedule_insn (insn, ready, n_ready, clock_var);
- 
- 	      /* remove insn from ready list */
- 	      ready[i] = ready[--n_ready];
  
  	      /* close this block after scheduling its jump */
  	      if (GET_CODE (last_scheduled_insn) == JUMP_INSN)
--- 7009,7014 ----


More information about the Gcc mailing list