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] PR middle-end/19378: Fix AVR build failures


On Fri, 14 Jan 2005, Roger Sayle wrote:
> 2005-01-14  Roger Sayle  <roger@eyesopen.com>
>
> 	PR middle-end/19378
> 	* config/avr/avr.c (avr_hard_regno_mode_ok): Rewrite.


It's been over a week without comment, and given that Bjorn and I
agree that this is the correct fix to return AVR to "build-land",
I've gone ahead and committed this change to mainline.

For the record, here's the variant that I've just committed.



2005-01-22  Roger Sayle  <roger@eyesopen.com>

	PR middle-end/19378
	* config/avr/avr.c (avr_hard_regno_mode_ok): Rewrite.


Index: config/avr/avr.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/avr/avr.c,v
retrieving revision 1.125
diff -c -3 -p -r1.125 avr.c
*** config/avr/avr.c	25 Dec 2004 22:20:04 -0000	1.125
--- config/avr/avr.c	15 Jan 2005 01:42:58 -0000
*************** jump_over_one_insn_p (rtx insn, rtx dest
*** 5121,5143 ****
  int
  avr_hard_regno_mode_ok (int regno, enum machine_mode mode)
  {
!   /* Bug workaround: recog.c (peep2_find_free_register) and probably
!      a few other places assume that the frame pointer is a single hard
!      register, so r29 may be allocated and overwrite the high byte of
!      the frame pointer.  Do not allow any value to start in r29.  */
!   if (regno == REG_Y + 1)
!     return 0;

!   /* Reload can use r28:r29 for reload register and for frame pointer
!    in one insn. It's wrong. We must disable it.  */
!   if (mode != Pmode && reload_in_progress && frame_pointer_required_p ()
!       && regno <= REG_Y && (regno + GET_MODE_SIZE (mode)) >= (REG_Y + 1))
      return 0;

    if (mode == QImode)
      return 1;
!   /*  if (regno < 24 && !AVR_ENHANCED)
!       return 1;*/
    return !(regno & 1);
  }

--- 5121,5142 ----
  int
  avr_hard_regno_mode_ok (int regno, enum machine_mode mode)
  {
!   /* The only thing that can go into registers r28:r29 is a Pmode.  */
!   if (regno == REG_Y && mode == Pmode)
!     return 1;

!   /* Otherwise disallow all regno/mode combinations that span r28:r29.  */
!   if (regno <= (REG_Y + 1) && (regno + GET_MODE_SIZE (mode)) >= (REG_Y + 1))
      return 0;

    if (mode == QImode)
      return 1;
!
!   /* Modes larger than QImode occupy consecutive registers.  */
!   if (regno + GET_MODE_SIZE (mode) > FIRST_PSEUDO_REGISTER)
!     return 0;
!
!   /* All modes larger than QImode should start in an even register.  */
    return !(regno & 1);
  }


Roger
--


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