On Sun, Jun 17, 2007 at 01:03:03PM +0000, Debian Bug Tracking System wrote:

it seems to be a gcc optimisation bug in lisp_atan2()
(found in src/lisp.cpp)

compiling that file with -O0 instead of -O2 fixes it.


attached is a modified lisp_atan2() that gcc has no problems with.
(this one works OK if compiled with -02)

FWIW$ gcc --version
gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)

I've reporting the bug in gcc

Bye.
   Jasen

long lisp_atan2(long dy, long dx)
{
  if (dy==0)
  {
    if (dx>0) return 0;
    else return 180;
  } else if (dx==0)
  {
    if (dy>0) return 90;
    else return 270;
  } else
  {
    if (dx>0)
    {      
      if (dy>0)
      {
	if ((dx)>(dy))
	{
	  long a=dx*29/dy;
	  if (a>=TBS) return 0;
	  else return 45-atan_table[a];
	}
	else 
	{
	  long a=dy*29/dx;
	  if (a>=TBS) return 90;
	  else return 45+atan_table[a];
	}
      } else //  dy < 0 
      {
	if ((dx)>(-dy))
	{
	  long a=dx*29/(-dy);
	  if (a>=TBS)
	    return 0;
	  else
	    return 315+atan_table[a];
	}
	else
	{
	  long a=(-dy)*29/dx;
	  if (a>=TBS)
	    return 260;
	  else
	    return 315-atan_table[a];
	}
      } 
    } else //  dx < 0 
    {
      if (dy>0)
      {
	if ((-dx)>(dy))
	{
	  long a=-dx*29/dy;
	  if (a>=TBS)
	    return 135+45;
	  else
	    return 135+atan_table[a];
	}
	else 
	{
	  long a=dy*29/-dx;
	  if (a>=TBS)
	    return 135-45;
	  else
	    return 135-atan_table[a];
	} //  dy < 0 
      } else
      {
	if ((-dx)>(-dy))
	{
	  long a=-dx*29/(-dy);
	  if (a>=TBS)
	    return 225-45;
	  else return 225-atan_table[a];
	}
	else 
	{
	  long a=(-dy)*29/(-dx);
	  if (a>=TBS)
	    return 225+45;	  
	  else return 225+atan_table[a];
	}
      } 
    }
  }  
}

Reply via email to