OSDN Git Service

2013-02-15 Vladimir Makarov <vmakarov@redhat.com>
authorvmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 15 Feb 2013 19:17:02 +0000 (19:17 +0000)
committervmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 15 Feb 2013 19:17:02 +0000 (19:17 +0000)
PR rtl-optimization/56348
* lra-assigns.c (reload_pseudo_compare_func): Prefer bigger pseudos.

2013-02-15  Vladimir Makarov  <vmakarov@redhat.com>

PR rtl-optimization/56348
* gcc.target/i386/pr56348.c: New test.

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

gcc/ChangeLog
gcc/lra-assigns.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr56348.c [new file with mode: 0644]

index fda3189..928eef4 100644 (file)
@@ -1,3 +1,8 @@
+2013-02-15  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/56348
+       * lra-assigns.c (reload_pseudo_compare_func): Prefer bigger pseudos.
+
 2013-02-15  Steven Bosscher  <steven@gcc.gnu.org>
 
        * graph.c (start_graph_dump): Print dumpfile base as digraph label.
index 33666fd..b204513 100644 (file)
@@ -197,6 +197,12 @@ reload_pseudo_compare_func (const void *v1p, const void *v2p)
   if ((diff = (regno_assign_info[regno_assign_info[r2].first].freq
               - regno_assign_info[regno_assign_info[r1].first].freq)) != 0)
     return diff;
+  /* Allocate bigger pseudos first to avoid register file
+     fragmentation.  */
+  if ((diff
+       = (ira_reg_class_max_nregs[cl2][lra_reg_info[r2].biggest_mode]
+         - ira_reg_class_max_nregs[cl1][lra_reg_info[r1].biggest_mode])) != 0)
+    return diff;
   /* Put pseudos from the thread nearby.  */
   if ((diff = regno_assign_info[r1].first - regno_assign_info[r2].first) != 0)
     return diff;
index cbee8ae..8d7fabb 100644 (file)
@@ -1,3 +1,8 @@
+2013-02-15  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/56348
+       * gcc.target/i386/pr56348.c: New test.
+
 2012-02-15  Greta Yorsh  <Greta.Yorsh@arm.com>
 
         * gcc.target/arm/interrupt-1.c: Fix for thumb mode.
diff --git a/gcc/testsuite/gcc.target/i386/pr56348.c b/gcc/testsuite/gcc.target/i386/pr56348.c
new file mode 100644 (file)
index 0000000..af63828
--- /dev/null
@@ -0,0 +1,38 @@
+/* PR target/56348 */
+/* { dg-do compile { target { ia32 } } } */
+/* { dg-options "-O2 -fPIC -mfpmath=sse -msse2" } */
+
+typedef unsigned int size_t;
+
+extern double fabs (double __x) __attribute__ ((__nothrow__, __leaf__))
+  __attribute__ ((__const__));
+
+typedef struct cholmod_sparse_struct
+{
+  size_t ncol;
+  void *p;
+} cholmod_sparse;
+
+int cholmod_l_reallocate_sparse (size_t, cholmod_sparse *, void *);
+
+int
+cholmod_l_drop (double tol, cholmod_sparse * A)
+{
+  double aij;
+  double *Ax;
+  long long *Ap, *Ai, *Anz;
+  long long packed, i, j, nrow, ncol, p, pend, nz, values;
+  Ap = A->p;
+  ncol = A->ncol;
+  nz = 0;
+  for (j = 0; j < ncol; j++)
+    for (; p < pend; p++)
+      {
+        i = Ai[p];
+        aij = Ax[p];
+        if (i <= j && (fabs (aij) > tol || ((aij) != (aij))))
+          nz++;
+      }
+  Ap[ncol] = nz;
+  cholmod_l_reallocate_sparse (nz, A, 0);
+}