re PR tree-optimization/17273 (ICE in get_indirect_ref_operands)
authorDiego Novillo <dnovillo@redhat.com>
Fri, 17 Sep 2004 18:42:51 +0000 (18:42 +0000)
committerDiego Novillo <dnovillo@gcc.gnu.org>
Fri, 17 Sep 2004 18:42:51 +0000 (14:42 -0400)
PR tree-optimization/17273
* tree-ssa.c (replace_immediate_uses): Call fold_stmt if the
replacement is a constant.

testsuite/ChangeLog

PR tree-optimization/17273
* gcc.c-torture/compile/pr17273.c: New test.

From-SVN: r87662

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

index 04eec4c48d8c952a8f2d103a5e9695d31593b24d..2f32b50233dbceb9caaa02609160fb166aa509b1 100644 (file)
@@ -1,3 +1,9 @@
+2004-09-17  Diego Novillo  <dnovillo@redhat.com>
+
+       PR tree-optimization/17273
+       * tree-ssa.c (replace_immediate_uses): Call fold_stmt if the
+       replacement is a constant.
+
 2004-09-17  Joseph S. Myers  <jsm@polyomino.org.uk>
 
        * c-tree.h (enum c_typespec_keyword): New.
index 0a27ca6c57ed1777e162ce52a66ce3c2af639e7e..1eda48d7e44131e9e9db52f5d84ceb4fee01bc35 100644 (file)
@@ -1,3 +1,8 @@
+2004-09-17  Diego Novillo  <dnovillo@redhat.com>
+
+       PR tree-optimization/17273
+       * gcc.c-torture/compile/pr17273.c: New test.
+
 2004-09-17  Joseph S. Myers  <jsm@polyomino.org.uk>
 
        * gcc.dg/declspec-4.c, gcc.dg/declspec-5.c, gcc.dg/declspec-6.c:
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr17273.c b/gcc/testsuite/gcc.c-torture/compile/pr17273.c
new file mode 100644 (file)
index 0000000..42d318e
--- /dev/null
@@ -0,0 +1,22 @@
+struct A { int i; };
+struct B { struct A a; };
+
+void f(struct A*, struct A*);
+#define bool _Bool
+
+void bar(bool b)
+{
+  struct B * D1601;
+  struct A D1576;
+  struct A * D1593;
+  struct B * D1592;
+  struct B D1575;
+
+  D1575 = (struct B){};
+
+  if (b) D1592 = &D1575; else D1592 = &D1575;
+
+  D1593 = &D1592->a; // <-- we are prograting &D1575 into here.
+  D1576 = (struct A){};
+  f (D1593, &D1576);
+}
index 3e9b2134f9a4edf7e05a64a36a2de008d2b2d962..f79466da38a006513b26d276c7337613492676a8 100644 (file)
@@ -1018,6 +1018,25 @@ replace_immediate_uses (tree var, tree repl)
              propagate_value (use_p, repl);
        }
 
+      /* FIXME.  If REPL is a constant, we need to fold STMT.
+        However, fold_stmt wants a pointer to the statement, because
+        it may happen that it needs to replace the whole statement
+        with a new expression.  Since the current def-use machinery
+        does not return pointers to statements, we call fold_stmt
+        with the address of a local temporary, if that call changes
+        the temporary then we fall on our swords.
+
+        Note that all this will become unnecessary soon.  This
+        pass is being replaced with a proper copy propagation pass
+        for 4.1 (dnovillo, 2004-09-17).  */
+      if (TREE_CODE (repl) != SSA_NAME)
+       {
+         tree tmp = stmt;
+         fold_stmt (&tmp);
+         if (tmp != stmt)
+           abort ();
+       }
+
       /* If REPL is a pointer, it may have different memory tags associated
         with it.  For instance, VAR may have had a name tag while REPL
         only had a type tag.  In these cases, the virtual operands (if