re PR middle-end/89998 (ICE: verify_gimple failed in printf-return-value)
authorJakub Jelinek <jakub@redhat.com>
Tue, 9 Apr 2019 10:26:13 +0000 (12:26 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 9 Apr 2019 10:26:13 +0000 (12:26 +0200)
PR tree-optimization/89998
* gimple-ssa-sprintf.c (try_substitute_return_value): Use lhs type
instead of integer_type_node if possible, don't add ranges if return
type is not compatible with int.
* gimple-fold.c (gimple_fold_builtin_sprintf,
gimple_fold_builtin_snprintf): Use lhs type instead of hardcoded
integer_type_node.

* gcc.c-torture/compile/pr89998-1.c: New test.
* gcc.c-torture/compile/pr89998-2.c: New test.

From-SVN: r270224

gcc/ChangeLog
gcc/gimple-fold.c
gcc/gimple-ssa-sprintf.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr89998-1.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/compile/pr89998-2.c [new file with mode: 0644]

index fc013a661b042e5a99a9e81a61a35380390a1f39..d0d6abc7c58c779c6a025026b3f0d07ada357e46 100644 (file)
@@ -1,3 +1,13 @@
+2019-04-09  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/89998
+       * gimple-ssa-sprintf.c (try_substitute_return_value): Use lhs type
+       instead of integer_type_node if possible, don't add ranges if return
+       type is not compatible with int.
+       * gimple-fold.c (gimple_fold_builtin_sprintf,
+       gimple_fold_builtin_snprintf): Use lhs type instead of hardcoded
+       integer_type_node.
+
 2019-04-09  Martin Liska  <mliska@suse.cz>
 
        * Makefile.in: Use GENERATOR_CFLAGS for all generators.
index 62d2e0abc2648b16c1e9a011aa23b5f9cea93ff2..a9afc4b392f52e179c005cf99bb8d09e1619016c 100644 (file)
@@ -3231,11 +3231,10 @@ gimple_fold_builtin_sprintf (gimple_stmt_iterator *gsi)
        gimple_set_no_warning (repl, true);
 
       gimple_seq_add_stmt_without_update (&stmts, repl);
-      if (gimple_call_lhs (stmt))
+      if (tree lhs = gimple_call_lhs (stmt))
        {
-         repl = gimple_build_assign (gimple_call_lhs (stmt),
-                                     build_int_cst (integer_type_node,
-                                                    strlen (fmt_str)));
+         repl = gimple_build_assign (lhs, build_int_cst (TREE_TYPE (lhs),
+                                                         strlen (fmt_str)));
          gimple_seq_add_stmt_without_update (&stmts, repl);
          gsi_replace_with_seq_vops (gsi, stmts);
          /* gsi now points at the assignment to the lhs, get a
@@ -3285,12 +3284,12 @@ gimple_fold_builtin_sprintf (gimple_stmt_iterator *gsi)
        gimple_set_no_warning (repl, true);
 
       gimple_seq_add_stmt_without_update (&stmts, repl);
-      if (gimple_call_lhs (stmt))
+      if (tree lhs = gimple_call_lhs (stmt))
        {
-         if (!useless_type_conversion_p (integer_type_node,
+         if (!useless_type_conversion_p (TREE_TYPE (lhs),
                                          TREE_TYPE (orig_len)))
-           orig_len = fold_convert (integer_type_node, orig_len);
-         repl = gimple_build_assign (gimple_call_lhs (stmt), orig_len);
+           orig_len = fold_convert (TREE_TYPE (lhs), orig_len);
+         repl = gimple_build_assign (lhs, orig_len);
          gimple_seq_add_stmt_without_update (&stmts, repl);
          gsi_replace_with_seq_vops (gsi, stmts);
          /* gsi now points at the assignment to the lhs, get a
@@ -3370,10 +3369,10 @@ gimple_fold_builtin_snprintf (gimple_stmt_iterator *gsi)
       gimple_seq stmts = NULL;
       gimple *repl = gimple_build_call (fn, 2, dest, fmt);
       gimple_seq_add_stmt_without_update (&stmts, repl);
-      if (gimple_call_lhs (stmt))
+      if (tree lhs = gimple_call_lhs (stmt))
        {
-         repl = gimple_build_assign (gimple_call_lhs (stmt),
-                                     build_int_cst (integer_type_node, len));
+         repl = gimple_build_assign (lhs,
+                                     build_int_cst (TREE_TYPE (lhs), len));
          gimple_seq_add_stmt_without_update (&stmts, repl);
          gsi_replace_with_seq_vops (gsi, stmts);
          /* gsi now points at the assignment to the lhs, get a
@@ -3422,12 +3421,12 @@ gimple_fold_builtin_snprintf (gimple_stmt_iterator *gsi)
       gimple_seq stmts = NULL;
       gimple *repl = gimple_build_call (fn, 2, dest, orig);
       gimple_seq_add_stmt_without_update (&stmts, repl);
-      if (gimple_call_lhs (stmt))
+      if (tree lhs = gimple_call_lhs (stmt))
        {
-         if (!useless_type_conversion_p (integer_type_node,
+         if (!useless_type_conversion_p (TREE_TYPE (lhs),
                                          TREE_TYPE (orig_len)))
-           orig_len = fold_convert (integer_type_node, orig_len);
-         repl = gimple_build_assign (gimple_call_lhs (stmt), orig_len);
+           orig_len = fold_convert (TREE_TYPE (lhs), orig_len);
+         repl = gimple_build_assign (lhs, orig_len);
          gimple_seq_add_stmt_without_update (&stmts, repl);
          gsi_replace_with_seq_vops (gsi, stmts);
          /* gsi now points at the assignment to the lhs, get a
index ced1c4c577702e908add6c47f3862eebce0ce027..de60241379ad2cc0642d24b1a9649bb6a16fde0b 100644 (file)
@@ -3692,10 +3692,10 @@ try_substitute_return_value (gimple_stmt_iterator *gsi,
         are badly declared.  */
       && !stmt_ends_bb_p (info.callstmt))
     {
-      tree cst = build_int_cst (integer_type_node, retval[0]);
+      tree cst = build_int_cst (lhs ? TREE_TYPE (lhs) : integer_type_node,
+                               retval[0]);
 
-      if (lhs == NULL_TREE
-         && info.nowrite)
+      if (lhs == NULL_TREE && info.nowrite)
        {
          /* Remove the call to the bounded function with a zero size
             (e.g., snprintf(0, 0, "%i", 123)) if there is no lhs.  */
@@ -3736,7 +3736,7 @@ try_substitute_return_value (gimple_stmt_iterator *gsi,
            }
        }
     }
-  else if (lhs)
+  else if (lhs && types_compatible_p (TREE_TYPE (lhs), integer_type_node))
     {
       bool setrange = false;
 
index a91b447b01eb64a6482eca41e45eaf85291138fd..29d1a81c8d8260fa810579a34f5acd5663156478 100644 (file)
@@ -1,5 +1,9 @@
 2019-04-09  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/89998
+       * gcc.c-torture/compile/pr89998-1.c: New test.
+       * gcc.c-torture/compile/pr89998-2.c: New test.
+
        PR target/90015
        * gcc.target/riscv/interrupt-conflict-mode.c (foo): Adjust expected
        diagnostics.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr89998-1.c b/gcc/testsuite/gcc.c-torture/compile/pr89998-1.c
new file mode 100644 (file)
index 0000000..87be00c
--- /dev/null
@@ -0,0 +1,42 @@
+/* PR tree-optimization/89998 */
+
+unsigned int sprintf (char *str, const char *fmt, ...);
+unsigned int snprintf (char *str, __SIZE_TYPE__ len, const char *fmt, ...);
+
+int
+f1 (char *s)
+{
+  return sprintf (s, "foo");
+}
+
+int
+f2 (char *s)
+{
+  return sprintf (s, "%d", 123);
+}
+
+int
+f3 (int *p, char *s)
+{
+  const char *t = "bar";
+  return sprintf (s, "%s", t);
+}
+
+int
+f4 (char *s)
+{
+  return snprintf (s, 8, "foo");
+}
+
+int
+f5 (char *s)
+{
+  return snprintf (s, 8, "%d", 123);
+}
+
+int
+f6 (int *p, char *s)
+{
+  const char *t = "bar";
+  return snprintf (s, 8, "%s", t);
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr89998-2.c b/gcc/testsuite/gcc.c-torture/compile/pr89998-2.c
new file mode 100644 (file)
index 0000000..19e318b
--- /dev/null
@@ -0,0 +1,4 @@
+/* PR tree-optimization/89998 */
+/* { dg-additional-options "-fno-printf-return-value" } */
+
+#include "pr89998-1.c"