Commit e602bbfc by Martin Sebor Committed by Martin Sebor

PR tree-optimization/80497 - ICE at -O1 and above on valid code on x86_64-linux-gnu in tree_to_uhwi

gcc/ChangeLog:

	PR tree-optimization/80497
	* gimple-ssa-sprintf.c (get_int_range): Avoid assuming all integer
	constants are representable in HOST_WIDE_INT.
	(parse_directive): Ditto.

gcc/testsuite/ChangeLog:

	PR tree-optimization/80497
	* gcc.dg/tree-ssa/builtin-sprintf-warn-17.c: New test.

From-SVN: r247262
parent 8e640712
2017-04-25 Martin Sebor <msebor@redhat.com> 2017-04-25 Martin Sebor <msebor@redhat.com>
PR tree-optimization/80497
* gimple-ssa-sprintf.c (get_int_range): Avoid assuming all integer
constants are representable in HOST_WIDE_INT.
(parse_directive): Ditto.
2017-04-25 Martin Sebor <msebor@redhat.com>
PR bootstrap/80486 PR bootstrap/80486
* dominance.c (dom_info::m_n_basic_blocks): Change type to unsigned. * dominance.c (dom_info::m_n_basic_blocks): Change type to unsigned.
(new_zero_array): Adjust signature. (new_zero_array): Adjust signature.
......
...@@ -948,7 +948,8 @@ get_int_range (tree arg, HOST_WIDE_INT *pmin, HOST_WIDE_INT *pmax, ...@@ -948,7 +948,8 @@ get_int_range (tree arg, HOST_WIDE_INT *pmin, HOST_WIDE_INT *pmax,
*pmin = tree_to_shwi (TYPE_MIN_VALUE (type)); *pmin = tree_to_shwi (TYPE_MIN_VALUE (type));
*pmax = tree_to_shwi (TYPE_MAX_VALUE (type)); *pmax = tree_to_shwi (TYPE_MAX_VALUE (type));
} }
else if (TREE_CODE (arg) == INTEGER_CST) else if (TREE_CODE (arg) == INTEGER_CST
&& TYPE_PRECISION (TREE_TYPE (arg)) <= TYPE_PRECISION (type))
{ {
/* For a constant argument return its value adjusted as specified /* For a constant argument return its value adjusted as specified
by NEGATIVE and NEGBOUND and return true to indicate that the by NEGATIVE and NEGBOUND and return true to indicate that the
...@@ -2916,7 +2917,9 @@ parse_directive (pass_sprintf_length::call_info &info, ...@@ -2916,7 +2917,9 @@ parse_directive (pass_sprintf_length::call_info &info,
if (width != -1) if (width != -1)
dollar = width + info.argidx; dollar = width + info.argidx;
else if (star_width else if (star_width
&& TREE_CODE (star_width) == INTEGER_CST) && TREE_CODE (star_width) == INTEGER_CST
&& (TYPE_PRECISION (TREE_TYPE (star_width))
<= TYPE_PRECISION (integer_type_node)))
dollar = width + tree_to_shwi (star_width); dollar = width + tree_to_shwi (star_width);
/* Bail when the numbered argument is out of range (it will /* Bail when the numbered argument is out of range (it will
......
2017-04-25 Martin Sebor <msebor@redhat.com>
PR tree-optimization/80497
* gcc.dg/tree-ssa/builtin-sprintf-warn-17.c: New test.
2017-04-25 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> 2017-04-25 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
Jakub Jelinek <jakub@redhat.com> Jakub Jelinek <jakub@redhat.com>
......
/* PR tree-optimization/80497 - ICE at -O1 and above on valid code on
x86_64-linux-gnu in "tree_to_uhwi"
{ dg-do compile }
{ dg-options "-O2 -Wall -Wformat-overflow" }
{ dg-require-effective-target int128 } */
extern char buf[];
const __int128_t sint128_max
= (__int128_t)1 << (sizeof sint128_max * __CHAR_BIT__ - 2);
void fn0 (void)
{
__int128_t si128 = 0;
__builtin_sprintf (buf, "%*i", si128, 0);
__builtin_sprintf (buf, "%.*i", si128, 0);
__builtin_sprintf (buf, "%i", si128);
__builtin_sprintf (buf, "%2$*1$i", si128, 0);
__builtin_sprintf (buf, "%2$.*1$i", si128, 0);
}
void fn1 (void)
{
__int128_t si128 = sint128_max;
__builtin_sprintf (buf, "%*i", si128, 0);
__builtin_sprintf (buf, "%.*i", si128, 0);
__builtin_sprintf (buf, "%i", si128);
__builtin_sprintf (buf, "%2$*1$i", si128, 0);
__builtin_sprintf (buf, "%2$.*1$i", si128, 0);
}
/* { dg-prune-output "expects argument of type .int." } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment