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