This is the mail archive of the gcc@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: Your change breaks MIPS.


On Thu, Jan 03, 2002 at 08:49:46AM -0800, H . J . Lu wrote:
> On Thu, Jan 03, 2002 at 02:47:14PM +0100, Jan Hubicka wrote:
> > > On Sun, Dec 30, 2001 at 12:44:31AM +0100, Jan Hubicka wrote:
> > > > >  > BTW, am I the only one seeing bootstrap failure on mips?
> > > > >  > Thanks.
> > > > >  > H.J.
> > > > > 
> > > > > No, I see it also on irix6.2.
> > > > I got it now too.  I hoped the problem to be cc0 issue related to jump threading,
> > > > but jump threading code appears to handle cc0 conservatively - in fact disable wast
> > > > majority of threading - I need to fix that separately.
> > > > 
> > > > Does someone have simplified testcase or can reproduce similar breakage on other target?
> > > > 
> > > 
> > > I am testing this patch on mips now. I don't know it will solve the
> > > mips bootstrap problem. But Jan, I blieve you really meant
> > > 
> > >   cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0)
> > > 	       | (flag_thread_jumps ? CLEANUP_THREADING : 0));
> > Yes, I did. Thanks for catching that!
> > if I read that properly, without the parenthesis and optimize set it should
> > not do any threading, but it definitly does - I need to check.
> ...
> > Uhm... I was catching this over an hour today... Silly me! and thanks
> > a lot for investigation!
> > 
> > I will re-start my MIPS bootstrap now!
> 
> It didn't work for me on mips. I am looking into it now.
> 

The stage1 compiler miscompiled parse_number in cppexp.c. It turns

  for(; p < end; p++)
    {
      c = *p;

      if (ISDIGIT (c)
          || (base == 16 && ISXDIGIT (c)))
        digit = hex_value (c);
      else
        break;

      if (largest_digit < digit)
        largest_digit = digit;
      nd = n * base + digit;
      overflow |= MAX_over_base < n || nd < n;
      n = nd;
    }

  if (p < end)
    {
      /* Check for a floating point constant.  Note that float constants

into

  for(; p < end; p++)
    {
      c = *p;

      if (ISDIGIT (c)
          || (base == 16 && ISXDIGIT (c)))
        digit = hex_value (c);
      else
        break;

      if (largest_digit < digit)
        largest_digit = digit;
      nd = n * base + digit;
      overflow |= MAX_over_base < n || nd < n;
      n = nd;
    }

    {
      /* Check for a floating point constant.  Note that float constants



H.J.


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