PR tree-optimization/47427
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 25 Jan 2011 12:01:54 +0000 (12:01 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 25 Jan 2011 12:01:54 +0000 (12:01 +0000)
PR tree-optimization/47428
* tree-ssa-copyrename.c (copy_rename_partition_coalesce): Don't
coalesce if the new root var would be TREE_READONLY.

* gcc.c-torture/compile/pr47427.c: New test.
* gcc.c-torture/compile/pr47428.c: New test.

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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr47427.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/compile/pr47428.c [new file with mode: 0644]
gcc/tree-ssa-copyrename.c

index 01211ed..14a9052 100644 (file)
@@ -1,3 +1,10 @@
+2011-01-25  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/47427
+       PR tree-optimization/47428
+       * tree-ssa-copyrename.c (copy_rename_partition_coalesce): Don't
+       coalesce if the new root var would be TREE_READONLY.
+
 2011-01-25  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/47414
index f45aea8..66ded37 100644 (file)
@@ -1,3 +1,10 @@
+2011-01-25  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/47427
+       PR tree-optimization/47428
+       * gcc.c-torture/compile/pr47427.c: New test.
+       * gcc.c-torture/compile/pr47428.c: New test.
+
 2011-01-25  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/47411
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr47427.c b/gcc/testsuite/gcc.c-torture/compile/pr47427.c
new file mode 100644 (file)
index 0000000..4f0b98e
--- /dev/null
@@ -0,0 +1,28 @@
+/* PR tree-optimization/47427 */
+
+char *g, *h;
+
+int
+bar (unsigned char x, const int y)
+{
+lab:
+  for (; h; g = h)
+    for (g = 0; h; h++)
+      {
+       int a = 1;
+       if (h)
+         {
+           if (a)
+             goto lab;
+           return y;
+         }
+      }
+  return x;
+}
+
+void
+foo (void)
+{
+  if (bar (0, 1))
+    bar (1, 0);
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr47428.c b/gcc/testsuite/gcc.c-torture/compile/pr47428.c
new file mode 100644 (file)
index 0000000..0c4ccc9
--- /dev/null
@@ -0,0 +1,42 @@
+/* PR tree-optimization/47428 */
+
+struct S
+{
+  int s;
+} a;
+int b;
+
+void bar (struct S);
+
+int
+baz (int x __attribute__((unused)), int y)
+{
+  int i;
+  for (i = 0; i < 1; i = 1)
+    for (y = 0; y < 1; y = 1);
+  return y;
+}
+
+void
+foo (void)
+{
+  fn (0);
+}
+
+int
+fn (const int x, int y __attribute__((unused)))
+{
+  if (baz (baz (0, x), 0))
+    return 0;
+  else
+    bar (a);
+  return 0;
+}
+
+void
+bar (struct S x)
+{
+  for (;;)
+    for (; x.s;)
+      b = 0 ? : baz (0, 0);
+}
index 9c51d11..dfc0b4e 100644 (file)
@@ -1,5 +1,5 @@
 /* Rename SSA copies.
-   Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010
+   Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
    Contributed by Andrew MacLeod <amacleod@redhat.com>
 
@@ -170,7 +170,7 @@ copy_rename_partition_coalesce (var_map map, tree var1, tree var2, FILE *debug)
       return false;
     }
 
-  /* Never attempt to coalesce 2 difference parameters.  */
+  /* Never attempt to coalesce 2 different parameters.  */
   if (TREE_CODE (root1) == PARM_DECL && TREE_CODE (root2) == PARM_DECL)
     {
       if (debug)
@@ -226,6 +226,18 @@ copy_rename_partition_coalesce (var_map map, tree var1, tree var2, FILE *debug)
       ign2 = false;
     }
 
+  /* Don't coalesce if the new chosen root variable would be read-only.
+     If both ign1 && ign2, then the root var of the larger partition
+     wins, so reject in that case if any of the root vars is TREE_READONLY.
+     Otherwise reject only if the root var, on which replace_ssa_name_symbol
+     will be called below, is readonly.  */
+  if ((TREE_READONLY (root1) && ign2) || (TREE_READONLY (root2) && ign1))
+    {
+      if (debug)
+       fprintf (debug, " : Readonly variable.  No coalesce.\n");
+      return false;
+    }
+
   /* Don't coalesce if the two variables aren't type compatible .  */
   if (!types_compatible_p (TREE_TYPE (root1), TREE_TYPE (root2))
       /* There is a disconnect between the middle-end type-system and