OSDN Git Service

* local-alloc.c (contains_replace_regs): LO_SUM may contain
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 3 Apr 2002 02:06:26 +0000 (02:06 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 3 Apr 2002 02:06:26 +0000 (02:06 +0000)
        replace regs.

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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@51773 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/local-alloc.c
gcc/testsuite/gcc.c-torture/execute/20020402-2.c [new file with mode: 0644]

index 5caab19..f26b3c8 100644 (file)
@@ -1,5 +1,11 @@
 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.
 
 2002-04-02  Alan Modra  <amodra@bigpond.net.au>
index 4da7eac..cd216f9 100644 (file)
@@ -664,7 +664,6 @@ contains_replace_regs (x)
     case PC:
     case CC0:
     case HIGH:
-    case LO_SUM:
       return 0;
 
     case REG:
diff --git a/gcc/testsuite/gcc.c-torture/execute/20020402-2.c b/gcc/testsuite/gcc.c-torture/execute/20020402-2.c
new file mode 100644 (file)
index 0000000..e14233f
--- /dev/null
@@ -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;
+}