]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR middle-end/89998 (ICE: verify_gimple failed in printf-return-value)
authorJakub Jelinek <jakub@redhat.com>
Fri, 30 Aug 2019 12:35:05 +0000 (14:35 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 30 Aug 2019 12:35:05 +0000 (14:35 +0200)
Backported from mainline
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.

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

From-SVN: r275146

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 ad1c2881b53d5702cb707a6b20fddd0ddcf35637..64c0a8829947dc170b2476ac1bc06ba832470c25 100644 (file)
@@ -1,6 +1,16 @@
 2019-08-30  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       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-03-29  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/89872
index 7238e2d96ef1467ba9c79467288906ae5aa1ce5b..4325aaeb3c9b01e5fc330cb3088f0c40320333de 100644 (file)
@@ -2718,11 +2718,10 @@ gimple_fold_builtin_sprintf (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,
-                                                    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
@@ -2766,12 +2765,12 @@ gimple_fold_builtin_sprintf (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
@@ -2853,10 +2852,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
@@ -2905,12 +2904,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 28b672133ec2c4ae7a40f099a0c6215618e29785..ea6c9c3302917b1ea82c7c0ab7113aa5e73a0e1b 100644 (file)
@@ -3353,10 +3353,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, minretval);
+      tree cst = build_int_cst (lhs ? TREE_TYPE (lhs) : integer_type_node,
+                               minretval);
 
-      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.  */
@@ -3397,7 +3397,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 458115358c34eb6c0bae248561c0bd742a5574a0..57818737747470acf2f5d7572401409ac814ee5b 100644 (file)
@@ -1,6 +1,12 @@
 2019-08-30  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       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.
+
        2019-03-29  Jakub Jelinek  <jakub@redhat.com>
 
        PR sanitizer/89869
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"