]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/17656 (internal compiler error: in replace_immediate_uses...
authorDiego Novillo <dnovillo@redhat.com>
Mon, 18 Oct 2004 17:39:47 +0000 (17:39 +0000)
committerDiego Novillo <dnovillo@gcc.gnu.org>
Mon, 18 Oct 2004 17:39:47 +0000 (13:39 -0400)
PR tree-optimization/17656
* tree-ssa.c (replace_immediate_uses): When replacing a
constant, if the call to fold_stmt produced a different
statement, get an appropriate statement pointer by scanning
STMT's basic block.

PR tree-optimization/17656
* testsuite/gcc.c-torture/compile/pr17656.c: New test.

From-SVN: r89233

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

index 8e461b8b306eb25fd307cc6ffea5f967aa04a3b9..c6bcd56d4ce769233685acfb6e367fff5f198486 100644 (file)
@@ -1,3 +1,11 @@
+2004-10-18  Diego Novillo  <dnovillo@redhat.com>
+
+       PR tree-optimization/17656
+       * tree-ssa.c (replace_immediate_uses): When replacing a
+       constant, if the call to fold_stmt produced a different
+       statement, get an appropriate statement pointer by scanning
+       STMT's basic block.
+
 2004-10-18  Richard Henderson  <rth@redhat.com>
 
        * pointer-set.c (hash1): Don't use libm functions in fallback case.
index 146312b98b204f3da74b58cbf9e9892c2017c6ee..0cf098bf76ffb537229845406124fd22d4c638fa 100644 (file)
@@ -1,3 +1,8 @@
+2004-10-18  Diego Novillo  <dnovillo@redhat.com>
+
+       PR tree-optimization/17656
+       * testsuite/gcc.c-torture/compile/pr17656.c: New test.
+
 2004-10-18  Nathan Sidwell  <nathan@codesourcery.com>
 
        * g++.dg/eh/shadow1.C: New.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr17656.c b/gcc/testsuite/gcc.c-torture/compile/pr17656.c
new file mode 100644 (file)
index 0000000..0acb71f
--- /dev/null
@@ -0,0 +1,18 @@
+int sprintf (char *s, const char *format, ...);
+
+int foo(int i, int j)
+{
+   char *buf, *str;
+
+   if (i)
+     str = "";
+   else if (j)
+     str = "";
+   else
+     return 1;
+
+   /* We were propagating &""[0] here and not calling fold_stmt with a
+      proper statement pointer.  */
+   sprintf(buf, str);
+   return 0;
+}
index affa30474200814941964a8b92cd31836042e5d8..4362e01aff8d6e93979c4d14bdd71b2e769aad1f 100644 (file)
@@ -1093,7 +1093,8 @@ replace_immediate_uses (tree var, tree repl)
         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.
+        the temporary then we fallback on looking for a proper
+        pointer to STMT by scanning STMT's basic block.
 
         Note that all this will become unnecessary soon.  This
         pass is being replaced with a proper copy propagation pass
@@ -1103,7 +1104,22 @@ replace_immediate_uses (tree var, tree repl)
          tree tmp = stmt;
          fold_stmt (&tmp);
          if (tmp != stmt)
-           abort ();
+           {
+             basic_block bb = bb_for_stmt (stmt);
+             block_stmt_iterator si;
+
+             /* Start iterating at the start of the basic block
+                holding STMT until we reach it.  This is slow, but
+                it's the only way to get a statement pointer
+                reliably.  */
+             for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
+               if (bsi_stmt (si) == stmt)
+                 {
+                   fold_stmt (bsi_stmt_ptr (si));
+                   stmt = bsi_stmt (si);
+                   break;
+                 }
+           }
        }
 
       /* If REPL is a pointer, it may have different memory tags associated