re PR middle-end/38981 (internal compiler error)
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 9 Feb 2009 11:09:25 +0000 (11:09 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 9 Feb 2009 11:09:25 +0000 (11:09 +0000)
PR middle-end/38981
* tree-ssa-coalesce.c (add_coalesce): Cap the costs of coalesce pairs
at MUST_COALESCE_COST-1 instead of MUST_COALESCE_COST.

From-SVN: r144032

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20090209-1.c [new file with mode: 0644]
gcc/tree-ssa-coalesce.c

index a6deff996a4dac4f791b224b997f93e637fc7c08..b1e2ae8b8754cefdb23229e0533fa2d6d8a65b34 100644 (file)
@@ -1,3 +1,9 @@
+2009-02-09  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR middle-end/38981
+       * tree-ssa-coalesce.c (add_coalesce): Cap the costs of coalesce pairs
+       at MUST_COALESCE_COST-1 instead of MUST_COALESCE_COST.
+
 2009-02-09  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/35202
index 7cde83d6c5e464db8c2b72e0487c8cd03a22b983..cd90ac8d78afb58d3d6a3f9f1527216233c5ec87 100644 (file)
@@ -1,3 +1,7 @@
+2009-02-09  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc.c-torture/compile/20090209-1.c: New test.
+
 2009-02-06  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/35147
diff --git a/gcc/testsuite/gcc.c-torture/compile/20090209-1.c b/gcc/testsuite/gcc.c-torture/compile/20090209-1.c
new file mode 100644 (file)
index 0000000..781a5e8
--- /dev/null
@@ -0,0 +1,61 @@
+/* PR middle-end/38981 */
+/* Reporter: Kamaraju Kusumanchi <kamaraju@gmail.com> */
+
+struct d_info
+{
+  int **subs;
+};
+
+static int *
+d_substitution (struct d_info *di, int prefix)
+{
+  char c;
+
+       c='_';
+
+  if (c == '_')
+    {
+      unsigned int id;
+
+      if (c != '_')
+       {
+         do
+           {
+             unsigned int new_id;
+
+             if (new_id < id)
+               return 0;
+             id = new_id;
+           }
+         while (c != '_');
+       }
+
+
+
+      return di->subs[id];
+    }
+  else
+    {
+      int verbose;
+      int code;
+      int simple_len;
+
+       code=0;
+       simple_len=0;
+       verbose=0;
+      if (! code && prefix)
+       {
+         char peek;
+               peek='A';
+
+         if (peek == 'C' || peek == 'D')
+           verbose = 1;
+       }
+
+             if (verbose)
+               {
+                 code = simple_len;
+               }
+
+    }
+}
index 3af0c3285d82ed0e291677e8d4305b78fd6771b7..8ac74f0c2906faa5ef8f9bc8b6b05333203f0ffb 100644 (file)
@@ -284,8 +284,7 @@ add_cost_one_coalesce (coalesce_list_p cl, int p1, int p2)
 /* Add a coalesce between P1 and P2 in list CL with a cost of VALUE.  */
 
 static inline void 
-add_coalesce (coalesce_list_p cl, int p1, int p2,
-             int value)
+add_coalesce (coalesce_list_p cl, int p1, int p2, int value)
 {
   coalesce_pair_p node;
 
@@ -295,13 +294,13 @@ add_coalesce (coalesce_list_p cl, int p1, int p2,
 
   node = find_coalesce_pair (cl, p1, p2, true);
 
-  /* Once the value is MUST_COALESCE_COST, leave it that way.  */
-  if (node->cost != MUST_COALESCE_COST)
+  /* Once the value is at least MUST_COALESCE_COST - 1, leave it that way.  */
+  if (node->cost < MUST_COALESCE_COST - 1)
     {
-      if (value == MUST_COALESCE_COST)
-       node->cost = value;
-      else
+      if (value < MUST_COALESCE_COST - 1)
        node->cost += value;
+      else
+       node->cost = value;
     }
 }