local-alloc.c (contains_replace_regs): LO_SUM may contain replace regs.

* local-alloc.c (contains_replace_regs): LO_SUM may contain
        replace regs.

	* gcc.c-torture/execute/20020402-2.c: New.

From-SVN: r51773
This commit is contained in:
Richard Henderson 2002-04-02 18:06:26 -08:00 committed by Richard Henderson
parent d32c91705d
commit 7a145e929d
3 changed files with 236 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2002-04-02 Richard Henderson <rth@redhat.com>
PR opt/3967
* local-alloc.c (contains_replace_regs): LO_SUM may contain
replace regs.
2002-04-02 Richard Henderson <rth@redhat.com>
* doc/standards.texi: Document required freestanding libc entry points.

View File

@ -664,7 +664,6 @@ contains_replace_regs (x)
case PC:
case CC0:
case HIGH:
case LO_SUM:
return 0;
case REG:

View File

@ -0,0 +1,230 @@
/* PR 3967
local-alloc screwed up consideration of high+lo_sum and created
reg_equivs that it shouldn't have, resulting in lo_sum with
uninitialized data, resulting in segv. The test has to remain
relatively large, since register spilling is required to twig
the bug. */
unsigned long *Local1;
unsigned long *Local2;
unsigned long *Local3;
unsigned long *RDbf1;
unsigned long *RDbf2;
unsigned long *RDbf3;
unsigned long *IntVc1;
unsigned long *IntVc2;
unsigned long *IntCode3;
unsigned long *IntCode4;
unsigned long *IntCode5;
unsigned long *IntCode6;
unsigned long *Lom1;
unsigned long *Lom2;
unsigned long *Lom3;
unsigned long *Lom4;
unsigned long *Lom5;
unsigned long *Lom6;
unsigned long *Lom7;
unsigned long *Lom8;
unsigned long *Lom9;
unsigned long *Lom10;
unsigned long *RDbf11;
unsigned long *RDbf12;
typedef struct
{
long a1;
unsigned long n1;
unsigned long local1;
unsigned long local2;
unsigned long local3;
unsigned long rdbf1;
unsigned long rdbf2;
unsigned long milli;
unsigned long frames1;
unsigned long frames2;
unsigned long nonShared;
long newPrivate;
long freeLimit;
unsigned long cache1;
unsigned long cache2;
unsigned long cache3;
unsigned long cache4;
unsigned long cache5;
unsigned long time6;
unsigned long frames7;
unsigned long page8;
unsigned long ot9;
unsigned long data10;
unsigned long bm11;
unsigned long misc12;
}
ShrPcCommonStatSType;
typedef struct
{
unsigned long sharedAttached;
unsigned long totalAttached;
long avgPercentShared;
unsigned long numberOfFreeFrames;
unsigned long localDirtyPageCount;
unsigned long globalDirtyPageCount;
long wakeupInterval;
unsigned long numActiveProcesses;
unsigned long numRecentActiveProcesses;
unsigned long gemDirtyPageKinds[10];
unsigned long stoneDirtyPageKinds[10];
unsigned long gemsInCacheCount;
long targetFreeFrameCount;
}
ShrPcMonStatSType;
typedef struct
{
unsigned long c1;
unsigned long c2;
unsigned long c3;
unsigned long c4;
unsigned long c5;
unsigned long c6;
unsigned long c7;
unsigned long c8;
unsigned long c9;
unsigned long c10;
unsigned long c11;
unsigned long c12;
unsigned long a1;
unsigned long a2;
unsigned long a3;
unsigned long a4;
unsigned long a5;
unsigned long a6;
unsigned long a7;
unsigned long a8;
unsigned long a9;
unsigned long a10;
unsigned long a11;
unsigned long a12;
unsigned long a13;
unsigned long a14;
unsigned long a15;
unsigned long a16;
unsigned long a17;
unsigned long a18;
unsigned long a19;
unsigned long sessionStats[40];
}
ShrPcGemStatSType;
union ShrPcStatUnion
{
ShrPcMonStatSType monitor;
ShrPcGemStatSType gem;
};
typedef struct
{
int processId;
int sessionId;
ShrPcCommonStatSType cmn;
union ShrPcStatUnion u;
} ShrPcStatsSType;
typedef struct
{
unsigned long *p1;
unsigned long *p2;
unsigned long *p3;
unsigned long *p4;
unsigned long *p5;
unsigned long *p6;
unsigned long *p7;
unsigned long *p8;
unsigned long *p9;
unsigned long *p10;
unsigned long *p11;
}
WorkEntrySType;
WorkEntrySType Workspace;
static void
setStatPointers (ShrPcStatsSType * statsPtr, long sessionId)
{
statsPtr->sessionId = sessionId;
statsPtr->cmn.a1 = 0;
statsPtr->cmn.n1 = 5;
Local1 = &statsPtr->cmn.local1;
Local2 = &statsPtr->cmn.local2;
Local3 = &statsPtr->cmn.local3;
RDbf1 = &statsPtr->cmn.rdbf1;
RDbf2 = &statsPtr->cmn.rdbf2;
RDbf3 = &statsPtr->cmn.milli;
*RDbf3 = 1;
IntVc1 = &statsPtr->u.gem.a1;
IntVc2 = &statsPtr->u.gem.a2;
IntCode3 = &statsPtr->u.gem.a3;
IntCode4 = &statsPtr->u.gem.a4;
IntCode5 = &statsPtr->u.gem.a5;
IntCode6 = &statsPtr->u.gem.a6;
{
WorkEntrySType *workSpPtr;
workSpPtr = &Workspace;
workSpPtr->p1 = &statsPtr->u.gem.a7;
workSpPtr->p2 = &statsPtr->u.gem.a8;
workSpPtr->p3 = &statsPtr->u.gem.a9;
workSpPtr->p4 = &statsPtr->u.gem.a10;
workSpPtr->p5 = &statsPtr->u.gem.a11;
workSpPtr->p6 = &statsPtr->u.gem.a12;
workSpPtr->p7 = &statsPtr->u.gem.a13;
workSpPtr->p8 = &statsPtr->u.gem.a14;
workSpPtr->p9 = &statsPtr->u.gem.a15;
workSpPtr->p10 = &statsPtr->u.gem.a16;
workSpPtr->p11 = &statsPtr->u.gem.a17;
}
Lom1 = &statsPtr->u.gem.c1;
Lom2 = &statsPtr->u.gem.c2;
Lom3 = &statsPtr->u.gem.c3;
Lom4 = &statsPtr->u.gem.c4;
Lom5 = &statsPtr->u.gem.c5;
Lom6 = &statsPtr->u.gem.c6;
Lom7 = &statsPtr->u.gem.c7;
Lom8 = &statsPtr->u.gem.c8;
Lom9 = &statsPtr->u.gem.c9;
Lom10 = &statsPtr->u.gem.c10;
RDbf11 = &statsPtr->u.gem.c11;
RDbf12 = &statsPtr->u.gem.c12;
}
typedef struct
{
ShrPcStatsSType stats;
} ShrPcPteSType;
ShrPcPteSType MyPte;
static void
initPte (void *shrpcPtr, long sessionId)
{
ShrPcPteSType *ptePtr;
ptePtr = &MyPte;
setStatPointers (&ptePtr->stats, sessionId);
}
void
InitCache (int sessionId)
{
initPte (0, sessionId);
}
int
main (int argc, char *argv[])
{
InitCache (5);
return 0;
}