optimization/3452: Endless recursion in canon_rtx

Andreas Schwab schwab@suse.de
Thu Jun 28 02:06:00 GMT 2001


>Number:         3452
>Category:       optimization
>Synopsis:       Endless recursion in canon_rtx
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          ice-on-legal-code
>Submitter-Id:   net
>Arrival-Date:   Thu Jun 28 02:06:02 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator:     
>Release:        3.0.1 20010627 (prerelease)
>Organization:
>Environment:
System: Linux sykes 2.4.4-SMP #1 SMP Fri Jun 8 09:14:46 GMT 2001 ia64 unknown
Architecture: ia64

	
host: ia64-suse-linux-gnu
build: ia64-suse-linux-gnu
target: ia64-suse-linux-gnu
configured with: /cvs/branch/gcc/configure --host=ia64-suse-linux --enable-threads --enable-shared --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --with-gxx-include-dir=/usr/include/g++ --enable-nls : (reconfigured) /cvs/branch/gcc/configure --host=ia64-suse-linux --enable-threads --enable-shared --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --with-gxx-include-dir=/usr/include/g++ --enable-nls : (reconfigured)  : (reconfigured) 
>Description:
	canon_rtx is stuck in an endless recursion.  It is called with
	(plus:DI (reg/f:DI 364) (const_int 8 [0x8])), and
	reg_known_value[364] contains the same rtx.

>How-To-Repeat:
	$ cat LRGB.i
	typedef long unsigned int size_t;
	extern void *memcpy (void *__restrict __dest,
			     __const void *__restrict __src, size_t __n) ;
	typedef char *XPointer;
	typedef unsigned long XcmsColorFormat;
	typedef double XcmsFloat;
	typedef struct {
	    unsigned short red;
	    unsigned short green;
	    unsigned short blue;
	} XcmsRGB;
	typedef struct {
	    XcmsFloat red;
	    XcmsFloat green;
	    XcmsFloat blue;
	} XcmsRGBi;
	typedef struct {
	    XcmsFloat X;
	    XcmsFloat Y;
	    XcmsFloat Z;
	} XcmsCIEXYZ;
	typedef struct {
	    XcmsFloat u_prime;
	    XcmsFloat v_prime;
	    XcmsFloat Y;
	} XcmsCIEuvY;
	typedef struct {
	    XcmsFloat x;
	    XcmsFloat y;
	    XcmsFloat Y;
	} XcmsCIExyY;
	typedef struct {
	    XcmsFloat L_star;
	    XcmsFloat a_star;
	    XcmsFloat b_star;
	} XcmsCIELab;
	typedef struct {
	    XcmsFloat L_star;
	    XcmsFloat u_star;
	    XcmsFloat v_star;
	} XcmsCIELuv;
	typedef struct {
	    XcmsFloat H;
	    XcmsFloat V;
	    XcmsFloat C;
	} XcmsTekHVC;
	typedef struct {
	    XcmsFloat pad0;
	    XcmsFloat pad1;
	    XcmsFloat pad2;
	    XcmsFloat pad3;
	} XcmsPad;
	typedef struct {
	    union {
		XcmsRGB RGB;
		XcmsRGBi RGBi;
		XcmsCIEXYZ CIEXYZ;
		XcmsCIEuvY CIEuvY;
		XcmsCIExyY CIExyY;
		XcmsCIELab CIELab;
		XcmsCIELuv CIELuv;
		XcmsTekHVC TekHVC;
		XcmsPad Pad;
	    } spec;
	    unsigned long pixel;
	    XcmsColorFormat format;
	} XcmsColor;
	typedef struct _XcmsCCC *XcmsCCC;
	typedef int (*XcmsCompressionProc)(
	    XcmsCCC ,
	    XcmsColor* ,
	    unsigned int ,
	    unsigned int ,
	    int*
	);
	typedef int (*XcmsWhiteAdjustProc)(
	    XcmsCCC ,
	    XcmsColor* ,
	    XcmsColor* ,
	    XcmsColorFormat ,
	    XcmsColor* ,
	    unsigned int ,
	    int*
	);
	typedef struct _XcmsPerScrnInfo {
	    XcmsColor screenWhitePt;
	    XPointer functionSet;
	    XPointer screenData;
	    unsigned char state;
	    char pad[3];
	} XcmsPerScrnInfo;
	typedef struct _XcmsCCC {
	    void *dpy;
	    int screenNumber;
	    void *visual;
	    XcmsColor clientWhitePt;
	    XcmsCompressionProc gamutCompProc;
	    XPointer gamutCompClientData;
	    XcmsWhiteAdjustProc whitePtAdjProc;
	    XPointer whitePtAdjClientData;
	    XcmsPerScrnInfo *pPerScrnInfo;
	} XcmsCCCRec;
	typedef struct _IntensityRec {
	    unsigned short value;
	    XcmsFloat intensity;
	} IntensityRec;
	typedef struct _IntensityTbl {
	    IntensityRec *pBase;
	    unsigned int nEntries;
	} IntensityTbl;
	typedef struct {
	    XcmsFloat XYZtoRGBmatrix[3][3];
	    XcmsFloat RGBtoXYZmatrix[3][3];
	    IntensityTbl *pRedTbl;
	    IntensityTbl *pGreenTbl;
	    IntensityTbl *pBlueTbl;
	} LINEAR_RGB_SCCData;
	void _XcmsMatVec(pMat, pIn, pOut)
	    XcmsFloat *pMat, *pIn, *pOut;
	{
	    int i, j;
	    for (i = 0; i < 3; i++) {
		pOut[i] = 0.0;
		for (j = 0; j < 3; j++)
		    pOut[i] += *(pMat+(i*3)+j) * pIn[j];
	    }
	}
	int
	XcmsCIEXYZToRGBi(ccc, pXcmsColors_in_out, nColors, pCompressed)
	    XcmsCCC ccc;
	    XcmsColor *pXcmsColors_in_out;
	    unsigned int nColors;
	    int *pCompressed;
	{
	    LINEAR_RGB_SCCData *pScreenData;
	    XcmsFloat tmp[3];
	    int hasCompressed = 0;
	    unsigned int i;
	    XcmsColor *pColor = pXcmsColors_in_out;
	    if (ccc == ((void *)0)) {
		return(0);
	    }
	    pScreenData = (LINEAR_RGB_SCCData *)ccc->pPerScrnInfo->screenData;
	    for (i = 0; i < nColors; i++) {
		if (pColor->format != (XcmsColorFormat)0x00000001) {
		    return(0);
		}
		_XcmsMatVec((XcmsFloat *) pScreenData->XYZtoRGBmatrix,
			(XcmsFloat *) &pColor->spec, tmp);
		if ((((tmp[0]) > ((((tmp[1])) > ((tmp[2])) ? ((tmp[2])) : ((tmp[1])))) ? ((((tmp[1])) > ((tmp[2])) ? ((tmp[2])) : ((tmp[1])))) : (tmp[0])) < -0.001) ||
		    (((tmp[0]) > ((((tmp[1])) > ((tmp[2])) ? ((tmp[1])) : ((tmp[2])))) ? (tmp[0]) : ((((tmp[1])) > ((tmp[2])) ? ((tmp[1])) : ((tmp[2]))))) > (1.0 + 0.001))) {
		    if (ccc->gamutCompProc == ((void *)0)) {
			memcpy((char *)&pColor->spec, (char *)tmp, sizeof(tmp));
			pColor->format = (XcmsColorFormat)0x80000001;
			return(0);
		    } else if ((*ccc->gamutCompProc)(ccc, pXcmsColors_in_out, nColors,
			    i, pCompressed) == 0) {
			return(0);
		    }
		    if (pColor->format != (XcmsColorFormat)0x00000001) {
			return(0);
		    }
		    _XcmsMatVec((XcmsFloat *) pScreenData->XYZtoRGBmatrix,
			    (XcmsFloat *) &pColor->spec, tmp);
		    if ((((tmp[0]) > ((((tmp[1])) > ((tmp[2])) ? ((tmp[2])) : ((tmp[1])))) ? ((((tmp[1])) > ((tmp[2])) ? ((tmp[2])) : ((tmp[1])))) : (tmp[0])) < -0.001) ||
			(((tmp[0]) > ((((tmp[1])) > ((tmp[2])) ? ((tmp[1])) : ((tmp[2])))) ? (tmp[0]) : ((((tmp[1])) > ((tmp[2])) ? ((tmp[1])) : ((tmp[2]))))) > (1.0 + 0.001))) {
			return(0);
		    }
		    hasCompressed++;
		}
		memcpy((char *)&pColor->spec, (char *)tmp, sizeof(tmp));
		if (pColor->spec.RGBi.red < 0.0) {
			pColor->spec.RGBi.red = 0.0;
		} else if (pColor->spec.RGBi.red > 1.0) {
			pColor->spec.RGBi.red = 1.0;
		}
		if (pColor->spec.RGBi.green < 0.0) {
			pColor->spec.RGBi.green = 0.0;
		} else if (pColor->spec.RGBi.green > 1.0) {
			pColor->spec.RGBi.green = 1.0;
		}
		if (pColor->spec.RGBi.blue < 0.0) {
			pColor->spec.RGBi.blue = 0.0;
		} else if (pColor->spec.RGBi.blue > 1.0) {
			pColor->spec.RGBi.blue = 1.0;
		}
		(pColor++)->format = (XcmsColorFormat)0x80000001;
	    }
	    return (hasCompressed ? 2 : 1);
	}
	$ gcc -O2 LRGB.i
>Fix:
	
>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the Gcc-bugs mailing list