tree-ssa-pre.c (find_or_generate_expression): CALL_EXPR is okay too.
authorDaniel Berlin <dberlin@dberlin.org>
Wed, 18 May 2005 03:07:44 +0000 (03:07 +0000)
committerDaniel Berlin <dberlin@gcc.gnu.org>
Wed, 18 May 2005 03:07:44 +0000 (03:07 +0000)
2005-05-17  Daniel Berlin  <dberlin@dberlin.org>

* tree-ssa-pre.c (find_or_generate_expression): CALL_EXPR
is okay too.

From-SVN: r99882

gcc/ChangeLog
gcc/testsuite/gcc.dg/20050517-1.c [new file with mode: 0644]
gcc/tree-ssa-pre.c

index 4d9766b4dba653430f8f9fa8267e963cfef5856e..cd213f4e608e058430e87f447c5aa7d4f5be2eeb 100644 (file)
@@ -1,3 +1,8 @@
+2005-05-17  Daniel Berlin  <dberlin@dberlin.org>
+
+       * tree-ssa-pre.c (find_or_generate_expression): CALL_EXPR
+       is okay too.
+
 2005-05-17  Zdenek Dvorak  <dvorakz@suse.cz>
 
        * timevar.def (TV_SCEV_CONST): New timevar.
diff --git a/gcc/testsuite/gcc.dg/20050517-1.c b/gcc/testsuite/gcc.dg/20050517-1.c
new file mode 100644 (file)
index 0000000..856fda2
--- /dev/null
@@ -0,0 +1,8 @@
+/* Tree PRE is going to transform this so that it doesn't call cos on the 
+   d = 0 path, and in doing so, it needs to regenerate the cos call.
+   This was ICE'ing due to an overly strict check on what it knew how
+   to regenerate.   */
+/* { dg-do compile } */
+/* { dg-options "-O2 -ffast-math" } */
+double cos(double);
+double f(double d, double i, int j) { if (j == 1) d = 0; return d * cos(i); }
index 54cbf639b77c9b08de48a19ef6abe826e7cee5ac..2482a1329cfb9239b9265c2acad339ea831b958a 100644 (file)
@@ -1467,7 +1467,8 @@ find_or_generate_expression (basic_block block, tree expr, tree stmts)
       gcc_assert (UNARY_CLASS_P (genop)
                  || BINARY_CLASS_P (genop)
                  || COMPARISON_CLASS_P (genop)
-                 || REFERENCE_CLASS_P (genop));
+                 || REFERENCE_CLASS_P (genop)
+                 || TREE_CODE (genop) == CALL_EXPR);
       genop = create_expression_by_pieces (block, genop, stmts);
     }
   return genop;