[gnu.g++.bug] GNU C++ on Sparc

tiemann@SUN.COM (Michael Tiemann) (09/09/89)

You need to put this patch into combine.c in order to compile Fix.cc:

Return-Path: <rms@ai.mit.edu>
Date: Fri, 8 Sep 89 19:15:06 EDT
From: rms@ai.mit.edu
To: tiemann@lurch.stanford.edu
In-Reply-To: Michael Tiemann's message of Fri, 8 Sep 89 10:47:21 PDT <8909081747.AA02901@teacake.sun.com>
Subject: combine.c bug

    Do you need more information than this?

It was enough, this time.  Since the whole point is just an optimization,
it isn't crucial what is done when i3 is not a SET.  So try this
(and delete the old declaration of i3dest):

	      && XEXP (XVECEXP (PATTERN (i3), 0, i), 0) == i1dest)
	    return 0;
    }

  /* If it is better that two different modes keep two different pseudos,
     avoid combining them.  */
+  if (GET_CODE (PATTERN (i3)) == SET)
+    {
!      rtx i3dest = SET_DEST (PATTERN (i3));
!      while (GET_CODE (i3dest) == SUBREG
!	     || GET_CODE (i3dest) == STRICT_LOW_PART
!	     || GET_CODE (i3dest) == SIGN_EXTRACT
!	     || GET_CODE (i3dest) == ZERO_EXTRACT)
!	i3dest = SUBREG_REG (i3dest);
!
!      if (SET_SRC (PATTERN (i3)) == i2dest
!	  && GET_CODE (i3dest) == REG
!	  && ! MODES_TIEABLE_P (GET_MODE (i2dest), GET_MODE (i3dest)))
!	return 0;
!    }

  /* If I2 contains anything volatile, reject, unless nothing
     volatile comes between it and I3.  */
  if (volatile_refs_p (PATTERN (i2)))

Michael