[gnu.gcc.bug] bug in m68k gcc 1.30

trq@moose.cita.utoronto.ca (Tom Quinn) (10/18/88)

The following code compiles incorrectly with the "-O
-finline-functions" flags.  This is gcc version 1.30 on a Sun 3/50
running SunOS 3.5.

Tom Quinn                 Canadian Institute for Theoretical Astrophysics
trq@moose.cita.utoronto.ca
UUCP   - decvax!utgpu!moose!trq
BITNET - quinn@utorphys.bitnet
ARPA   - trq%moose.cita.toronto.edu@relay.cs.net

The offending assembler:
LBB6:
	.stabd 68,0,54
	fmoves fp0,d0
	.stabd 68,0,56
	fcmps d2,fp0  	# d2 is never set before this point  !!
	fjnlt L95
	movel d2,d0
	jra L96
L95:
	fmoves d0,fp2
	fcmps d3,fp2	# same with d3 !!
	fjngt L97
	movel d3,d0

The compile:
gcc -g -v -S -O -finline-functions -c Scroll.c
gcc version 1.30
 /usr/local/lib/gcc-cpp -v -undef -D__GNU__ -D__GNUC__ -Dmc68000 -Dsun -Dunix -D__OPTIMIZE__ -D__HAVE_68881__ -Dmc68020 Scroll.c /tmp/cca02017.cpp
GNU CPP version 1.30
 /usr/local/lib/gcc-cc1 /tmp/cca02017.cpp -quiet -dumpbase Scroll.c -finline-functions -g -O -version -o Scroll.s
GNU C version 1.30 (68k, MIT syntax) compiled by GNU C version 1.30.

The code:
------------------------------------------------------------------------
typedef struct {
	struct _XDisplay *display; 
} Screen;
typedef struct _XDisplay {
	int fd;			 
} Display;
typedef struct {
	int type;		 
	int x, y;		 
} XKeyEvent;
typedef struct {
	int type;		 
	int x, y;		 
} XButtonEvent;
typedef struct {
	int type;		 
	int x, y;		 
} XMotionEvent;
typedef struct {
	int type;		 
	int x, y;		 
} XCrossingEvent;
typedef union _XEvent {
        int type;		 
	XKeyEvent xkey;
	XButtonEvent xbutton;
	XMotionEvent xmotion;
	XCrossingEvent xcrossing;
} XEvent;
typedef struct _WidgetRec *Widget;
typedef char	Boolean;
typedef int		Position;    
typedef unsigned int	Dimension;   
typedef struct _CorePart {
    Screen	    *screen;		 
    Position        x, y;		 
    Dimension       width, height;	 
} CorePart;
typedef struct _WidgetRec {
    CorePart    core;
 } WidgetRec;
typedef enum {XtorientHorizontal, XtorientVertical} XtOrientation;
typedef struct _ScrollbarRec	  *ScrollbarWidget;
typedef struct {
    XtOrientation orientation;	 
    float	  top;		 
    char	  direction;	 
} ScrollbarPart;
typedef struct _ScrollbarRec {
    CorePart		core;
    ScrollbarPart	scrollbar;
} ScrollbarRec;
static float FloatInRange(num, small, big)
float num, small, big;
{
    return (num < small) ? small : ((num > big) ? big : num);
}
static float FractionLoc(w, x, y)
  ScrollbarWidget w;
  int x, y;
{
    float   result;
    result = ((w->scrollbar.orientation == XtorientHorizontal) ?  (float) x/w->core.width : 
			(float) y/w->core.height) ;
    return FloatInRange(result, 0.0, 1.0);
}
static void ExtractPosition( event, x, y )
    XEvent *event;
    int *x, *y;			 
{
    switch( event->type ) {
      case 	6 :
		*x = event->xmotion.x;	 *y = event->xmotion.y;	  break;
      case 	4 :
      case 	5 :
		*x = event->xbutton.x;   *y = event->xbutton.y;   break;
      case 	2 :
      case 	3 :
		*x = event->xkey.x;      *y = event->xkey.y;	  break;
      case 	7 :
      case 	8 :
		*x = event->xcrossing.x; *y = event->xcrossing.y; break;
      default:
		*x = 0; *y = 0;
    }
}
void MoveThumb( gw, event, params, num_params )
   Widget gw;
   XEvent *event;
   {
    ScrollbarWidget w = (ScrollbarWidget) gw;
    Position x, y;
    if (w->scrollbar.direction == 0) return;  
    ExtractPosition( event, &x, &y );
    w->scrollbar.top = FractionLoc(w, x, y);
    PaintThumb(w);
    XFlush(((w)->core.screen->display) );	 
}

trq@moose.cita.utoronto.ca (Tom Quinn) (10/19/88)

The following code prints "65135" instead of the expected "401" when
compiled with the "-O" flag.  The problem is at line 72: the shorts
are not signed extended before subtracting and stored in the int "adx".

This gcc version 1.30 on a Sun 3/50  running SunOS 3.5.

Tom Quinn                 Canadian Institute for Theoretical Astrophysics
trq@moose.cita.utoronto.ca
UUCP   - decvax!utgpu!moose!trq
BITNET - quinn@utorphys.bitnet
ARPA   - trq%moose.cita.toronto.edu@relay.cs.net

The compile:
gcc -g -v -O -c mfbline.c
gcc version 1.30
 /usr/local/lib/gcc-cpp -v -undef -D__GNU__ -D__GNUC__ -Dmc68000 -Dsun -Dunix -D__OPTIMIZE__ -D__HAVE_68881__ -Dmc68020 mfbline.c /tmp/cca02948.cpp
GNU CPP version 1.30
 /usr/local/lib/gcc-cc1 /tmp/cca02948.cpp -quiet -dumpbase mfbline.c -g -O -version -o /tmp/cca02948.s
GNU C version 1.30 (68k, MIT syntax) compiled by GNU C version 1.30.
 as -mc68020 /tmp/cca02948.s -o mfbline.o
gcc -v mfbline.o
gcc version 1.30
 ld /lib/crt0.o /lib/Mcrt1.o mfbline.o /usr/local/lib/gcc-gnulib -lc
150}a.out
65135

The code:
------------------------------------------------------------------------
typedef struct _DDXPoint *DDXPointPtr;
typedef struct _Box *BoxPtr;
typedef struct _DDXPoint {
    short x, y;
} DDXPointRec;
typedef struct _Box {
    short x1, y1, x2, y2;
} BoxRec;
main()
{
    DDXPointPtr ptinit;
    ptinit = (DDXPointPtr) malloc(2*sizeof(DDXPointRec));
    ptinit[0].x = -1;
    ptinit[1].x = 400;
    ptinit[0].y = 400;
    ptinit[1].y = 900;
    mfbLineSS(0, 2, ptinit);
}
mfbLineSS( mode, npt, pptInit)
    int mode;		 
    int npt;		 
    DDXPointPtr pptInit;
{
    int nboxInit;
    register int nbox;
    BoxPtr pboxInit;
    register BoxPtr pbox;
    int nptTmp;
    DDXPointPtr ppt;		 
    DDXPointRec pt1;
    DDXPointRec pt2;
    int xorg, yorg;		 
    int adx;		 
    int ady;
    int signdx;		 
    int signdy;
    int e, e1, e2;		 
    int axis;			 
    DDXPointRec pt1Orig;	 
    DDXPointRec pt2Orig;	 
    xorg = yorg = 0;
    ppt = pptInit;
    nptTmp = npt;
    if (mode == 	0	)
    {
	while(nptTmp--)
	{
	    ppt->x += xorg;
	    ppt++->y += yorg;
	}
    }
    else
    {
	ppt->x += xorg;
	ppt->y += yorg;
	nptTmp--;
	while(nptTmp--)
	{
	    ppt++;
	    ppt->x += (ppt-1)->x;
	    ppt->y += (ppt-1)->y;
	}
    }
    ppt = pptInit;
    while(--npt)
    {
	nbox = nboxInit;
	pbox = pboxInit;
	pt1 = *ppt++;
	pt2 = *ppt;
	{
	    adx = pt2.x - pt1.x;
	    ady = pt2.y - pt1.y;
	    signdx = ((adx) < 0 ? -1 : ((adx) > 0 ? 1 : 0)) ;
	    signdy = ((ady) < 0 ? -1 : ((ady) > 0 ? 1 : 0)) ;
	    adx = ((adx) > 0 ? (adx) : -(adx)) ;
	    ady = ((ady) > 0 ? (ady) : -(ady)) ;
	    if (adx > ady)
	    {
		axis = 0 ;
		e1 = ady*2;
		e2 = e1 - 2*adx;
		e = e1 - adx;
	    }
	    else
	    {
		axis = 1 ;
		e1 = adx*2;
		e2 = e1 - 2*ady;
		e = e1 - ady;
	    }
	    pt1Orig = pt1;
	    pt2Orig = pt2;
	    printf("%d\n", adx);
	}  
    }  
}

trq@moose.cita.utoronto.ca (Tom Quinn) (11/04/88)

The following code is compiled in correctly with the "-O
-fstrength-reduce" flags.  This is gcc version 1.30 on a Sun 3/50
running SunOS 3.5.

The offending assembler is setting up a for loop:
L28:
	.stabd 68,0,135
	movel a6,d1
	addl #-304,d1
	movel d1,a6@(-316)
	movel a6,d1
	addl #-288,d1
	movel d1,a6@(-320)
	movel a6,d1
	addl #-256,d1
	movel d1,a6@(-324)
	moveq #-32,d1
	addl a6,d1
	movel d1,a6@(-328)
	moveq #-16,d1
	addl a6,d1
	movel d1,a6@(-332)
	movel a6@(32),d4
	negl d4
	movel a6@(28),d3
	negl d3
	moveq #-64,d5
	addl a6,d5
	moveq #16,d1
	addl d5,d1
	movel d1,a6@(-336)
	moveq #16,d6
	lea a5@(16),a3
	mulsl d6,d7		# d7 is not set before it is used here!!!!
	movel d7,a6@(-340)
	clrl d1
	addl d1,a6@(-340)
	jra L34

Tom Quinn                 Canadian Institute for Theoretical Astrophysics
trq@moose.cita.utoronto.ca
UUCP   - decvax!utgpu!moose!trq
BITNET - quinn@utorphys.bitnet
ARPA   - trq%moose.cita.toronto.edu@relay.cs.net

The compile:
gcc -S -g -v -O -fstrength-reduce -c milines.c
gcc version 1.30
 /usr/local/lib/gcc-cpp -v -undef -D__GNU__ -D__GNUC__ -Dmc68000 -Dsun -Dunix -D__OPTIMIZE__ -D__HAVE_68881__ -Dmc68020 milines.c /tmp/cca06828.cpp
GNU CPP version 1.30
 /usr/local/lib/gcc-cc1 /tmp/cca06828.cpp -quiet -dumpbase milines.c -fstrength-reduce -g -O -version -o milines.s
GNU C version 1.30 (68k, MIT syntax) compiled by GNU C version 1.30.

The code:
------------------------------------------------------------------------
typedef struct _DrawInfo *DrawablePtr;	
typedef struct _DrawInfo {
    short	type;
    int         depth;           
    unsigned long        serialNumber;
} DrawableRec;
typedef struct _GC    *GCPtr;
typedef struct _GC{
    int		lineWidth;          
    int		lineStyle;
    int		capStyle;
    int		joinStyle;
} GC;
typedef struct _SppPoint {
	double	x, y;
} SppPointRec, *SppPointPtr;
extern SppPointRec miExtendSegment();
extern void  miGetPts(), miRoundCap(), miOneSegWide();
static SppPointRec IntersectLines();
void
miMiter (pDraw, pGC, caps, npt, pPts, xOrg, yOrg)
    DrawablePtr pDraw;
    GCPtr	pGC;
    int		caps;
    int		npt;
    SppPointPtr pPts;
    int		xOrg, yOrg;
{
    int		width = (pGC->lineWidth ? pGC->lineWidth : 1);
    SppPointRec	PolyPoints[4], FirstEdge[3], Wedge[4];
    SppPointRec	p1, p2, p3, p4, p5, p6, p7, p8;
    int		edges_match, i,
		capStyle = pGC->capStyle;
    if(npt <= 2)
    {
        miOneSegWide(pDraw, pGC, npt, pPts, caps, xOrg, yOrg);
	return;
    }
    miGetPts(pPts[0], pPts[1], &p1, &p2, &p3, &p4, width);
    if ((((((pPts[0].x) - ( pPts[npt-1].x)) > 0.0 ? ((pPts[0].x) - ( pPts[npt-1].x)) : -((pPts[0].x) - ( pPts[npt-1].x)))	 <= 0.000001 )  && ((((pPts[0].y) - ( pPts[npt-1].y)) > 0.0 ? ((pPts[0].y) - ( pPts[npt-1].y)) : -((pPts[0].y) - ( pPts[npt-1].y)))	 <= 0.000001 ) ) )
    {
	edges_match = 1;
	miGetPts(pPts[npt-2], pPts[npt-1], &p5, &p6, &p7, &p8, width);
	PolyPoints[2] = IntersectLines(p3, p4, p7, p8);	 
	PolyPoints[3] = IntersectLines(p6, p5, p1, p2);	 
	if ((((PolyPoints[2]).x-( PolyPoints[3]).x)*((PolyPoints[2]).x-( PolyPoints[3]).x)+((PolyPoints[2]).y-( PolyPoints[3]).y)*((PolyPoints[2]).y-( PolyPoints[3]).y))  >
	    108.856472512142  * width * width)
	{			 
	    if ((((p5).x-( pPts[0]).x)*((p5).x-( pPts[0]).x)+((p5).y-( pPts[0]).y)*((p5).y-( pPts[0]).y))  - (((PolyPoints[3]).x-( pPts[0]).x)*((PolyPoints[3]).x-( pPts[0]).x)+((PolyPoints[3]).y-( pPts[0]).y)*((PolyPoints[3]).y-( pPts[0]).y)) 
		< 0.000001 )
	    {			 
		FirstEdge[2] = pPts[0];
		if ((((( pPts[0]).x - ( pPts[npt-2]).x) * (( pPts[1] ).y - ( pPts[0]).y) - (( pPts[1] ).x - ( pPts[0]).x) * (( pPts[0]).y - ( pPts[npt-2]).y))  > 0) )
		{		 
		    FirstEdge[0] = p4;
		    FirstEdge[1] = p7;
		    miFillSppPoly(pDraw, pGC, 3, FirstEdge, -xOrg, -yOrg, 0.0, 0.0);
		    FirstEdge[0] = p6;
		} else {	 
		    FirstEdge[0] = p6;
		    FirstEdge[1] = p1;
		    miFillSppPoly(pDraw, pGC, 3, FirstEdge, -xOrg, -yOrg, 0.0, 0.0);
		    FirstEdge[1] = p7;
		}
		PolyPoints[2] = p4;
		PolyPoints[3] = p1;
	    } else {		 
		if ((((( pPts[0]).x - ( pPts[npt-2]).x) * (( pPts[1] ).y - ( pPts[0]).y) - (( pPts[1] ).x - ( pPts[0]).x) * (( pPts[0]).y - ( pPts[npt-2]).y))  > 0) )
		{		 
		    FirstEdge[0] = PolyPoints[3];
		    FirstEdge[1] = p7;
		    FirstEdge[2] = p4;
		    PolyPoints[2] = p4;
		} else {	 
		    FirstEdge[0] = p6;
		    FirstEdge[1] = PolyPoints[2];
		    FirstEdge[2] = p1;
		    PolyPoints[3] = p1;
		}
		miFillSppPoly(pDraw, pGC, 3, FirstEdge, -xOrg, -yOrg, 0.0, 0.0);
	    }
	} else {		 
	    if ((((p5).x-( pPts[0]).x)*((p5).x-( pPts[0]).x)+((p5).y-( pPts[0]).y)*((p5).y-( pPts[0]).y))  - (((PolyPoints[3]).x-( pPts[0]).x)*((PolyPoints[3]).x-( pPts[0]).x)+((PolyPoints[3]).y-( pPts[0]).y)*((PolyPoints[3]).y-( pPts[0]).y)) 
		< 0.000001 )
	    {			 
		if ((((((PolyPoints[3].x) - ( p5.x)) > 0.0 ? ((PolyPoints[3].x) - ( p5.x)) : -((PolyPoints[3].x) - ( p5.x)))	 <= 0.000001 )  && ((((PolyPoints[3].y) - ( p5.y)) > 0.0 ? ((PolyPoints[3].y) - ( p5.y)) : -((PolyPoints[3].y) - ( p5.y)))	 <= 0.000001 ) ) )
		{		 
		    FirstEdge[0] = p6;
		    FirstEdge[1] = p7;
		    PolyPoints[3] = p1;
		} else {	 
		    if ((((( pPts[0]).x - ( pPts[npt-2]).x) * (( pPts[1] ).y - ( pPts[0]).y) - (( pPts[1] ).x - ( pPts[0]).x) * (( pPts[0]).y - ( pPts[npt-2]).y))  > 0) )
		    {		 
			Wedge[0] = p4;
			Wedge[2] = p7;
			Wedge[3] = PolyPoints[2];
		    } else {	 
			Wedge[0] = p6;
			Wedge[2] = p1;
			Wedge[3] = PolyPoints[3];
		    }
		    Wedge[1] = pPts[0];
		    miFillSppPoly(pDraw, pGC, 4, Wedge, -xOrg, -yOrg, 0.0, 0.0);
		    FirstEdge[1] = p7;
		    FirstEdge[0] = p6;
		    PolyPoints[3] = p1;
		    PolyPoints[2] = p4;
		}
	    } else {		 
		FirstEdge[0] = PolyPoints[3];
		FirstEdge[1] = PolyPoints[2];
	    }
	}
    }
    else
    {
	edges_match = 0;
	if (caps && capStyle == 	3 )
	{
	    pPts[0] = miExtendSegment(pPts[0], pPts[1], width/2);
	    miGetPts(pPts[0], pPts[1], &p1, &p2, &p3, &p4, width);
	    pPts[npt-1] = miExtendSegment(pPts[npt-1], pPts[npt-2], width/2);
	}
	else if (caps && capStyle == 	2 )
	{
	    miRoundCap(pDraw, pGC, pPts[0], pPts[1], p4, p1, 1 ,
	             xOrg, yOrg, 0.0, 0.0);
	    miGetPts(pPts[npt-1], pPts[npt-2], &p5, &p6, &p7, &p8, width);
	    miRoundCap(pDraw, pGC, pPts[npt-1], pPts[npt-2], p8, p5, 1 ,
	             xOrg, yOrg, 0.0, 0.0);
	}
	PolyPoints[3] = p1;
	PolyPoints[2] = p4;
    }
    for (i = 1; i < (npt - 1); i++)
    {
	miGetPts(pPts[i], pPts[i+1], &p5, &p6, &p7, &p8, width);
	PolyPoints[0] = PolyPoints[3];
	PolyPoints[1] = PolyPoints[2];
	PolyPoints[2] = IntersectLines(p4, p3, p7, p8);	 
	PolyPoints[3] = IntersectLines(p2, p1, p5, p6);	 
	if ((((PolyPoints[2]).x-( PolyPoints[3]).x)*((PolyPoints[2]).x-( PolyPoints[3]).x)+((PolyPoints[2]).y-( PolyPoints[3]).y)*((PolyPoints[2]).y-( PolyPoints[3]).y))  >
	    108.856472512142  * width * width)
	{			 
	    if ((((p1).x-( pPts[i]).x)*((p1).x-( pPts[i]).x)+((p1).y-( pPts[i]).y)*((p1).y-( pPts[i]).y))  - (((PolyPoints[3]).x-( pPts[i]).x)*((PolyPoints[3]).x-( pPts[i]).x)+((PolyPoints[3]).y-( pPts[i]).y)*((PolyPoints[3]).y-( pPts[i]).y)) 
		< 0.000001 )
	    {			 
		PolyPoints[2] = p3;
		PolyPoints[3] = p2;
		miFillSppPoly(pDraw, pGC, 4, PolyPoints, -xOrg, -yOrg, 0.0, 0.0);
		if ((((( pPts[i]).x - ( pPts[i-1]).x) * (( pPts[i+1] ).y - ( pPts[i]).y) - (( pPts[i+1] ).x - ( pPts[i]).x) * (( pPts[i]).y - ( pPts[i-1]).y))  > 0) )
		{		 
		    PolyPoints[1] = p8;
		    PolyPoints[3] = pPts[i];
		    miFillSppPoly(pDraw, pGC, 3, &PolyPoints[1], -xOrg, -yOrg, 0.0, 0.0);
		} else {	 
		    PolyPoints[1] = p5;
		    PolyPoints[2] = pPts[i];
		    miFillSppPoly(pDraw, pGC, 3, &PolyPoints[1], -xOrg, -yOrg, 0.0, 0.0);
		}
		PolyPoints[2] = p8;
		PolyPoints[3] = p5;
	    } else {		 
		if ((((( pPts[i]).x - ( pPts[i-1]).x) * (( pPts[i+1] ).y - ( pPts[i]).y) - (( pPts[i+1] ).x - ( pPts[i]).x) * (( pPts[i]).y - ( pPts[i-1]).y))  > 0) )
		{		 
		    PolyPoints[2] = p3;
		    miFillSppPoly(pDraw, pGC, 4, PolyPoints, -xOrg, -yOrg, 0.0, 0.0);
		    PolyPoints[1] = p8;
		    miFillSppPoly(pDraw, pGC, 3, &PolyPoints[1], -xOrg, -yOrg, 0.0, 0.0);
		    PolyPoints[2] = p8;
		} else {	 
		    PolyPoints[3] = p2;
		    miFillSppPoly(pDraw, pGC, 4, PolyPoints, -xOrg, -yOrg, 0.0, 0.0);
		    PolyPoints[1] = p5;
		    miFillSppPoly(pDraw, pGC, 3, &PolyPoints[1], -xOrg, -yOrg, 0.0, 0.0);
		    PolyPoints[3] = p5;
		}
	    }
	} else {		 
	    if ((((p1).x-( pPts[i]).x)*((p1).x-( pPts[i]).x)+((p1).y-( pPts[i]).y)*((p1).y-( pPts[i]).y))  - (((PolyPoints[3]).x-( pPts[i]).x)*((PolyPoints[3]).x-( pPts[i]).x)+((PolyPoints[3]).y-( pPts[i]).y)*((PolyPoints[3]).y-( pPts[i]).y)) 
		< 0.000001 )
	    {			 
		if ((((((PolyPoints[3].x) - ( p1.x)) > 0.0 ? ((PolyPoints[3].x) - ( p1.x)) : -((PolyPoints[3].x) - ( p1.x)))	 <= 0.000001 )  && ((((PolyPoints[3].y) - ( p1.y)) > 0.0 ? ((PolyPoints[3].y) - ( p1.y)) : -((PolyPoints[3].y) - ( p1.y)))	 <= 0.000001 ) ) )
		{		 
		    PolyPoints[3] = p2;
		    miFillSppPoly(pDraw, pGC, 4, PolyPoints, -xOrg, -yOrg, 0.0, 0.0);
		    PolyPoints[3] = p5;
		    PolyPoints[2] = p8;
		} else {	 
		    if ((((( pPts[i]).x - ( pPts[i-1]).x) * (( pPts[i+1] ).y - ( pPts[i]).y) - (( pPts[i+1] ).x - ( pPts[i]).x) * (( pPts[i]).y - ( pPts[i-1]).y))  > 0) )
		    {		 
			Wedge[0] = p8;
			Wedge[2] = p3;
			Wedge[3] = PolyPoints[2];
		    } else {	 
			Wedge[0] = p2;
			Wedge[2] = p5;
			Wedge[3] = PolyPoints[3];
		    }
		    Wedge[1] = pPts[i];
		    miFillSppPoly(pDraw, pGC, 4, Wedge, -xOrg, -yOrg, 0.0, 0.0);
		    PolyPoints[2] = p3;
		    PolyPoints[3] = p2;
		    miFillSppPoly(pDraw, pGC, 4, PolyPoints, -xOrg, -yOrg, 0.0, 0.0);
		    PolyPoints[3] = p5;
		    PolyPoints[2] = p8;
		}
	    } else		 
		miFillSppPoly(pDraw, pGC, 4, PolyPoints, -xOrg, -yOrg, 0.0, 0.0);
	}
	p1 = p5;  p2 = p6;  p3 = p7;  p4 = p8;
    }
    PolyPoints[0] = PolyPoints[3];
    PolyPoints[1] = PolyPoints[2];
    if (edges_match)
    {
	PolyPoints[2] = FirstEdge[1];
	PolyPoints[3] = FirstEdge[0];
    }
    else
    {
	miGetPts(pPts[npt-2], pPts[npt-1], &p5, &p6, &p7, &p8, width);
	PolyPoints[2] = p7;
	PolyPoints[3] = p6;
    }
    miFillSppPoly(pDraw, pGC, 4, PolyPoints, -xOrg, -yOrg, 0.0, 0.0);
}

trq@moose.cita.utoronto.ca (Tom Quinn) (11/07/88)

The following code causes gcc to get a fatal signal when compiled with
the -O option.  This is gcc v1.30 on a Sun 3/50 running SunOs 3.5.

Tom Quinn                 Canadian Institute for Theoretical Astrophysics
trq@moose.cita.utoronto.ca
UUCP   - decvax!utgpu!moose!trq
BITNET - quinn@utorphys.bitnet
ARPA   - trq%moose.cita.toronto.edu@relay.cs.net

The compile:
gcc -g -v -O -c mifpolycon.c
gcc version 1.30
 /usr/local/lib/gcc-cpp -v -undef -D__GNU__ -D__GNUC__ -Dmc68000 -Dsun -Dunix -D__OPTIMIZE__ -D__HAVE_68881__ -Dmc68020 mifpolycon.c /tmp/cca08664.cpp
GNU CPP version 1.30
 /usr/local/lib/gcc-cc1 /tmp/cca08664.cpp -quiet -dumpbase mifpolycon.c -g -O -version -o /tmp/cca08664.s
GNU C version 1.30 (68k, MIT syntax) compiled by GNU C version 1.30.
gcc: Program cc1 got fatal signal 6.

The code:
------------------------------------------------------------------------
typedef struct _GC    *GCPtr;
char *alloca();
typedef struct _DDXPoint *DDXPointPtr;
typedef struct _DDXPoint {
    short x, y;
} DDXPointRec;
typedef struct _DrawInfo *DrawablePtr;	
typedef struct _GC{
    int		miTranslate:1;		 
    void (* FillSpans)();
} GC;
typedef struct _Window *WindowPtr;
typedef struct _DrawInfo {
    short	type;
} DrawableRec;
typedef struct _Window {
	DDXPointRec  absCorner;
} WindowRec;
typedef struct _SppPoint {
	double	x, y;
} SppPointRec, *SppPointPtr;
static int GetFPolyYBounds();
void
miFillSppPoly(dst, pgc, count, ptsIn, xTrans, yTrans, xFtrans, yFtrans)
    DrawablePtr 	dst;
    GCPtr		pgc;
    int			count;           
    SppPointPtr 	ptsIn;   
    int			xTrans, yTrans;
    double		xFtrans, yFtrans;
{
    double		xl, xr, ml, mr, dy, i;
    int			y, j, imin, ymin, ymax, *width, *FirstWidth, *Marked; 
    register int	left, right, nextleft, nextright;
    DDXPointPtr 	ptsOut,
    			FirstPoint;	 
    if (pgc->miTranslate && (dst->type == 0 ) )
    {
	xTrans += ((WindowPtr)dst)->absCorner.x;
	yTrans += ((WindowPtr)dst)->absCorner.y;
    }
    imin = GetFPolyYBounds(ptsIn, count, yFtrans, &ymin, &ymax);
    y = ymax - ymin + 1;
    ptsOut = FirstPoint = (DDXPointPtr)alloca((int)(sizeof(DDXPointRec) * y)) ;
    width = FirstWidth = (int *) alloca((int)(sizeof(int) * y)) ;
    Marked = (int *) alloca((int)(sizeof(int) * count)) ;
    if(!ptsOut || !width || !Marked || (count < 3) || (y <= 0))
    {
	 ;
	 ;
	 ;
	return;
    }
    for(j = 0; j < count; j++)
	Marked[j] = 0;
    nextleft = nextright = imin;
    Marked[imin] = -1;
    y = (int) ({ double __value, __arg = (ptsIn[nextleft].y + yFtrans); int __fpcr; asm ("fmovel fpcr, %0": "=dm" (__fpcr)); asm volatile ("fmovel %1, fpcr": "=m" (*(char *)0): "dm" ((__fpcr & 0xffffffcf) | 0x30)); asm ("fintx %1, %0": "=f" (__value): "f" (__arg)); asm volatile ("fmovel %1, fpcr": "=m" (*(char *)0): "dm" (__fpcr)); __value; }) ;
    do
    {
        if ((y > (ptsIn[nextleft].y + yFtrans) ||
 	     ((((y) - ( ptsIn[nextleft].y + yFtrans)) > 0.0 ? ((y) - ( ptsIn[nextleft].y + yFtrans)) : -((y) - ( ptsIn[nextleft].y + yFtrans)))	 <= 0.000001 ) ) &&
	     Marked[nextleft] != 1)
	{
	    Marked[nextleft]++;
            left = nextleft++;
            if (nextleft >= count)
                nextleft = 0;
	    dy = ptsIn[nextleft].y - ptsIn[left].y;
	    if (dy != 0.0)
	    { 
		ml = (ptsIn[nextleft].x - ptsIn[left].x) / dy;
		dy = y - (ptsIn[left].y + yFtrans);
		xl = (ptsIn[left].x + xFtrans) + ml * (((dy) > ( 0)) ? (dy) : ( 0)) ; 
	    }
        }
        if ((y > ptsIn[nextright].y + yFtrans) ||
 	     ((((y) - ( ptsIn[nextright].y + yFtrans)) > 0.0 ? ((y) - ( ptsIn[nextright].y + yFtrans)) : -((y) - ( ptsIn[nextright].y + yFtrans)))	 <= 0.000001 ) 
	     && Marked[nextright] != 1)
	{
	    Marked[nextright]++;
            right = nextright--;
            if (nextright < 0)
                nextright = count - 1;
	    dy = ptsIn[nextright].y - ptsIn[right].y;
	    if (dy != 0.0) 
	    { 
		mr = (ptsIn[nextright].x - ptsIn[right].x) / dy;
		dy = y - (ptsIn[right].y + yFtrans); 
		xr = (ptsIn[right].x + xFtrans) + mr * (((dy) > ( 0)) ? (dy) : ( 0)) ;
	    }
        }
        i = ((((ptsIn[nextleft].y) < ( ptsIn[nextright].y)) ? (ptsIn[nextleft].y) : ( ptsIn[nextright].y))  + yFtrans) - y;
	if (i < 0.000001 )
	{
	    if(Marked[nextleft] && Marked[nextright])
	    {
	        break;
	    }
	    continue;
	}
	else
	{
		j = (int) i;
		if(!j)
		    j++;
	}
        while (j > 0) 
        {
            ptsOut->y = (y) + yTrans;
            if (xl < xr) 
            {
                *(width++) = ({ double __value, __arg = (xr); int __fpcr; asm ("fmovel fpcr, %0": "=dm" (__fpcr)); asm volatile ("fmovel %1, fpcr": "=m" (*(char *)0): "dm" ((__fpcr & 0xffffffcf) | 0x30)); asm ("fintx %1, %0": "=f" (__value): "f" (__arg)); asm volatile ("fmovel %1, fpcr": "=m" (*(char *)0): "dm" (__fpcr)); __value; })  - ({ double __value, __arg = (xl); int __fpcr; asm ("fmovel fpcr, %0": "=dm" (__fpcr)); asm volatile ("fmovel %1, fpcr": "=m" (*(char *)0): "dm" ((__fpcr & 0xffffffcf) | 0x30)); asm ("fintx %1, %0": "=f" (__value): "f" (__arg)); asm volatile ("fmovel %1, fpcr": "=m" (*(char *)0): "dm" (__fpcr)); __value; }) ;
                (ptsOut++)->x = ({ double __value, __arg = (xl); int __fpcr; asm ("fmovel fpcr, %0": "=dm" (__fpcr)); asm volatile ("fmovel %1, fpcr": "=m" (*(char *)0): "dm" ((__fpcr & 0xffffffcf) | 0x30)); asm ("fintx %1, %0": "=f" (__value): "f" (__arg)); asm volatile ("fmovel %1, fpcr": "=m" (*(char *)0): "dm" (__fpcr)); __value; })  + xTrans;
            }
            else 
            {
                *(width++) = ({ double __value, __arg = (xl); int __fpcr; asm ("fmovel fpcr, %0": "=dm" (__fpcr)); asm volatile ("fmovel %1, fpcr": "=m" (*(char *)0): "dm" ((__fpcr & 0xffffffcf) | 0x30)); asm ("fintx %1, %0": "=f" (__value): "f" (__arg)); asm volatile ("fmovel %1, fpcr": "=m" (*(char *)0): "dm" (__fpcr)); __value; })  - ({ double __value, __arg = (xr); int __fpcr; asm ("fmovel fpcr, %0": "=dm" (__fpcr)); asm volatile ("fmovel %1, fpcr": "=m" (*(char *)0): "dm" ((__fpcr & 0xffffffcf) | 0x30)); asm ("fintx %1, %0": "=f" (__value): "f" (__arg)); asm volatile ("fmovel %1, fpcr": "=m" (*(char *)0): "dm" (__fpcr)); __value; }) ;
                (ptsOut++)->x = ({ double __value, __arg = (xr); int __fpcr; asm ("fmovel fpcr, %0": "=dm" (__fpcr)); asm volatile ("fmovel %1, fpcr": "=m" (*(char *)0): "dm" ((__fpcr & 0xffffffcf) | 0x30)); asm ("fintx %1, %0": "=f" (__value): "f" (__arg)); asm volatile ("fmovel %1, fpcr": "=m" (*(char *)0): "dm" (__fpcr)); __value; })  + xTrans;
            }
            y++;
	    xl += ml;
	    xr += mr;
	    j--;
        }
    }  while (y <= ymax);
    (*pgc->FillSpans)(dst, pgc, 
		      ptsOut-FirstPoint, FirstPoint, FirstWidth, 1);
}