re PR middle-end/89998 (ICE: verify_gimple failed in printf-return-value)

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
This commit is contained in:
Jakub Jelinek 2019-04-09 12:26:13 +02:00 committed by Jakub Jelinek
parent 1c67e69c0d
commit a73468e8c7
6 changed files with 78 additions and 19 deletions

View 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.

View 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

View 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;

View 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.

View File

@ -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);
}

View File

@ -0,0 +1,4 @@
/* PR tree-optimization/89998 */
/* { dg-additional-options "-fno-printf-return-value" } */
#include "pr89998-1.c"